blob: 7b510bdf09706f8dc30bbd36c5e53eb3ed0fdd07 [file] [log] [blame]
/*
* Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "webrtc/examples/unityplugin/unity_plugin_apis.h"
#include <map>
#include <string>
#include "webrtc/examples/unityplugin/simple_peer_connection.h"
namespace {
static int g_peer_connection_id = 1;
static std::map<int, rtc::scoped_refptr<SimplePeerConnection>>
g_peer_connection_map;
} // namespace
int CreatePeerConnection() {
g_peer_connection_map[g_peer_connection_id] =
new rtc::RefCountedObject<SimplePeerConnection>();
if (!g_peer_connection_map[g_peer_connection_id]->InitializePeerConnection(
false))
return -1;
return g_peer_connection_id++;
}
bool ClosePeerConnection(int peer_connection_id) {
if (!g_peer_connection_map.count(peer_connection_id))
return false;
g_peer_connection_map[peer_connection_id]->DeletePeerConnection();
g_peer_connection_map.erase(peer_connection_id);
return true;
}
bool AddStream(int peer_connection_id, bool audio_only) {
if (!g_peer_connection_map.count(peer_connection_id))
return false;
g_peer_connection_map[peer_connection_id]->AddStreams(audio_only);
return true;
}
bool AddDataChannel(int peer_connection_id) {
if (!g_peer_connection_map.count(peer_connection_id))
return false;
return g_peer_connection_map[peer_connection_id]->CreateDataChannel();
}
bool CreateOffer(int peer_connection_id) {
if (!g_peer_connection_map.count(peer_connection_id))
return false;
return g_peer_connection_map[peer_connection_id]->CreateOffer();
}
bool CreateAnswer(int peer_connection_id) {
if (!g_peer_connection_map.count(peer_connection_id))
return false;
return g_peer_connection_map[peer_connection_id]->CreateAnswer();
}
bool SendDataViaDataChannel(int peer_connection_id, const char* data) {
if (!g_peer_connection_map.count(peer_connection_id))
return false;
std::string s(data);
g_peer_connection_map[peer_connection_id]->SendDataViaDataChannel(s);
return true;
}
bool SetAudioControl(int peer_connection_id, bool is_mute, bool is_record) {
if (!g_peer_connection_map.count(peer_connection_id))
return false;
g_peer_connection_map[peer_connection_id]->SetAudioControl(is_mute,
is_record);
return true;
}
// Register callback functions.
bool RegisterOnVideoFramReady(int peer_connection_id,
VIDEOFRAMEREADY_CALLBACK callback) {
if (!g_peer_connection_map.count(peer_connection_id))
return false;
g_peer_connection_map[peer_connection_id]->RegisterOnVideoFramReady(callback);
return true;
}
bool RegisterOnLocalDataChannelReady(int peer_connection_id,
LOCALDATACHANNELREADY_CALLBACK callback) {
if (!g_peer_connection_map.count(peer_connection_id))
return false;
g_peer_connection_map[peer_connection_id]->RegisterOnLocalDataChannelReady(
callback);
return true;
}
bool RegisterOnDataFromDataChannelReady(
int peer_connection_id,
DATAFROMEDATECHANNELREADY_CALLBACK callback) {
if (!g_peer_connection_map.count(peer_connection_id))
return false;
g_peer_connection_map[peer_connection_id]->RegisterOnDataFromDataChannelReady(
callback);
return true;
}
bool RegisterOnFailure(int peer_connection_id, FAILURE_CALLBACK callback) {
if (!g_peer_connection_map.count(peer_connection_id))
return false;
g_peer_connection_map[peer_connection_id]->RegisterOnFailure(callback);
return true;
}
bool RegisterOnAudioBusReady(int peer_connection_id,
AUDIOBUSREADY_CALLBACK callback) {
if (!g_peer_connection_map.count(peer_connection_id))
return false;
g_peer_connection_map[peer_connection_id]->RegisterOnAudioBusReady(callback);
return true;
}
// Singnaling channel related functions.
bool RegisterOnLocalSdpReadytoSend(int peer_connection_id,
LOCALSDPREADYTOSEND_CALLBACK callback) {
if (!g_peer_connection_map.count(peer_connection_id))
return false;
g_peer_connection_map[peer_connection_id]->RegisterOnLocalSdpReadytoSend(
callback);
return true;
}
bool RegisterOnIceCandiateReadytoSend(
int peer_connection_id,
ICECANDIDATEREADYTOSEND_CALLBACK callback) {
if (!g_peer_connection_map.count(peer_connection_id))
return false;
g_peer_connection_map[peer_connection_id]->RegisterOnIceCandiateReadytoSend(
callback);
return true;
}
int ReceivedSdp(int peer_connection_id, const char* sdp) {
// Create a peer_connection if no one exists.
int id = -1;
if (g_peer_connection_map.count(peer_connection_id)) {
id = peer_connection_id;
} else {
id = g_peer_connection_id++;
g_peer_connection_map[id] =
new rtc::RefCountedObject<SimplePeerConnection>();
if (!g_peer_connection_map[id]->InitializePeerConnection(true))
return -1;
}
g_peer_connection_map[id]->ReceivedSdp(sdp);
return id;
}
bool ReceivedIceCandidate(int peer_connection_id, const char* ice_candidate) {
if (!g_peer_connection_map.count(peer_connection_id))
return false;
return g_peer_connection_map[peer_connection_id]->ReceivedIceCandidate(
ice_candidate);
}