| /* |
| * 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 "examples/unityplugin/unity_plugin_apis.h" |
| |
| #include <map> |
| #include <string> |
| |
| #include "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(const char** turn_urls, |
| const int no_of_urls, |
| const char* username, |
| const char* credential, |
| bool mandatory_receive_video) { |
| g_peer_connection_map[g_peer_connection_id] = |
| new rtc::RefCountedObject<SimplePeerConnection>(); |
| |
| if (!g_peer_connection_map[g_peer_connection_id]->InitializePeerConnection( |
| turn_urls, no_of_urls, username, credential, mandatory_receive_video)) |
| 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; |
| } |
| |
| bool SetRemoteDescription(int peer_connection_id, |
| const char* type, |
| const char* sdp) { |
| if (!g_peer_connection_map.count(peer_connection_id)) |
| return false; |
| |
| return g_peer_connection_map[peer_connection_id]->SetRemoteDescription(type, |
| sdp); |
| } |
| |
| bool AddIceCandidate(const int peer_connection_id, |
| const char* candidate, |
| const int sdp_mlineindex, |
| const char* sdp_mid) { |
| if (!g_peer_connection_map.count(peer_connection_id)) |
| return false; |
| |
| return g_peer_connection_map[peer_connection_id]->AddIceCandidate( |
| candidate, sdp_mlineindex, sdp_mid); |
| } |
| |
| // Register callback functions. |
| bool RegisterOnLocalI420FrameReady(int peer_connection_id, |
| I420FRAMEREADY_CALLBACK callback) { |
| if (!g_peer_connection_map.count(peer_connection_id)) |
| return false; |
| |
| g_peer_connection_map[peer_connection_id]->RegisterOnLocalI420FrameReady( |
| callback); |
| return true; |
| } |
| |
| bool RegisterOnRemoteI420FrameReady(int peer_connection_id, |
| I420FRAMEREADY_CALLBACK callback) { |
| if (!g_peer_connection_map.count(peer_connection_id)) |
| return false; |
| |
| g_peer_connection_map[peer_connection_id]->RegisterOnRemoteI420FrameReady( |
| 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; |
| } |