| Index: webrtc/examples/unityplugin/README
|
| diff --git a/webrtc/examples/unityplugin/README b/webrtc/examples/unityplugin/README
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..eade9ef5fac15090e98ce532ac361126ad0c22e0
|
| --- /dev/null
|
| +++ b/webrtc/examples/unityplugin/README
|
| @@ -0,0 +1,204 @@
|
| +This directory contains an example Unity native plugin for Windows OS.
|
| +The APIs use Platform Invoke (P/Invoke) technology as required by Unity native plugin.
|
| +This plugin dll can also be used by Windows C# applications other than Unity.
|
| +
|
| +An example of wrapping native plugin into a C# managed class in Unity is given as following:
|
| +
|
| +using System;
|
| +using System.Runtime.InteropServices;
|
| +
|
| +namespace SimplePeerConnectionM {
|
| + // This is a managed wrap up class for the native c style peer connection APIs.
|
| + public class PeerConnectionM {
|
| + //private const string dll_path = "SimplePeerConnection";
|
| + private const string dll_path = "webrtc_unity_plugin";
|
| +
|
| + [DllImport(dll_path, CallingConvention = CallingConvention.Cdecl)]
|
| + private static extern int CreatePeerConnection();
|
| +
|
| + [DllImport(dll_path, CallingConvention = CallingConvention.Cdecl)]
|
| + private static extern bool ClosePeerConnection(int peer_connection_id);
|
| +
|
| + [DllImport(dll_path, CallingConvention = CallingConvention.Cdecl)]
|
| + private static extern bool AddStream(int peer_connection_id, bool audio_only);
|
| +
|
| + [DllImport(dll_path, CallingConvention = CallingConvention.Cdecl)]
|
| + private static extern bool AddDataChannel(int peer_connection_id);
|
| +
|
| + [DllImport(dll_path, CallingConvention = CallingConvention.Cdecl)]
|
| + private static extern bool CreateOffer(int peer_connection_id);
|
| +
|
| + [DllImport(dll_path, CallingConvention = CallingConvention.Cdecl)]
|
| + private static extern bool CreateAnswer(int peer_connection_id);
|
| +
|
| + [DllImport(dll_path, CallingConvention = CallingConvention.Cdecl)]
|
| + private static extern bool SendDataViaDataChannel(int peer_connection_id, string data);
|
| +
|
| + [DllImport(dll_path, CallingConvention = CallingConvention.Cdecl)]
|
| + private static extern bool SetAudioControl(int peer_connection_id, bool is_mute, bool is_record);
|
| +
|
| + [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
| + private delegate void LocalDataChannelReadyInternalDelegate();
|
| + public delegate void LocalDataChannelReadyDelegate(int id);
|
| + [DllImport(dll_path, CallingConvention = CallingConvention.Cdecl)]
|
| + private static extern bool RegisterOnLocalDataChannelReady(int peer_connection_id, LocalDataChannelReadyInternalDelegate callback);
|
| +
|
| + [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
| + private delegate void DataFromDataChannelReadyInternalDelegate(string s);
|
| + public delegate void DataFromDataChannelReadyDelegate(int id, string s);
|
| + [DllImport(dll_path, CallingConvention = CallingConvention.Cdecl)]
|
| + private static extern bool RegisterOnDataFromDataChannelReady(int peer_connection_id, DataFromDataChannelReadyInternalDelegate callback);
|
| +
|
| + [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
| + private delegate void FailureMessageInternalDelegate(string msg);
|
| + public delegate void FailureMessageDelegate(int id, string msg);
|
| + [DllImport(dll_path, CallingConvention = CallingConvention.Cdecl)]
|
| + private static extern bool RegisterOnFailure(int peer_connection_id, FailureMessageInternalDelegate callback);
|
| +
|
| + [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
| + private delegate void AudioBusReadyInternalDelegate(IntPtr data, int bits_per_sample,
|
| + int sample_rate, int number_of_channels, int number_of_frames);
|
| + public delegate void AudioBusReadyDelegate(int id, IntPtr data, int bits_per_sample,
|
| + int sample_rate, int number_of_channels, int number_of_frames);
|
| + [DllImport(dll_path, CallingConvention = CallingConvention.Cdecl)]
|
| + private static extern bool RegisterOnAudioBusReady(int peer_connection_id, AudioBusReadyInternalDelegate callback);
|
| +
|
| + [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
| + private delegate void LocalSdpReadytoSendInternalDelegate(string s);
|
| + public delegate void LocalSdpReadytoSendDelegate(int id, string s);
|
| + [DllImport(dll_path, CallingConvention = CallingConvention.Cdecl)]
|
| + private static extern bool RegisterOnLocalSdpReadytoSend(int peer_connection_id, LocalSdpReadytoSendInternalDelegate callback);
|
| +
|
| + [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
| + private delegate void IceCandiateReadytoSendInternalDelegate(string s);
|
| + public delegate void IceCandiateReadytoSendDelegate(int id, string s);
|
| + [DllImport(dll_path, CallingConvention = CallingConvention.Cdecl)]
|
| + private static extern bool RegisterOnIceCandiateReadytoSend(int peer_connection_id, IceCandiateReadytoSendInternalDelegate callback);
|
| +
|
| + [DllImport(dll_path, CallingConvention = CallingConvention.Cdecl)]
|
| + private static extern int ReceivedSdp(int peer_connection_id, string sdp);
|
| +
|
| + [DllImport(dll_path, CallingConvention = CallingConvention.Cdecl)]
|
| + private static extern bool ReceivedIceCandidate(int peer_connection_id, string ice_candidate);
|
| +
|
| + public void CreatePeerConnectionM() {
|
| + peer_connection_id_ = CreatePeerConnection();
|
| + RegisterCallbacks();
|
| + }
|
| +
|
| + private void RegisterCallbacks() {
|
| + localDataChannelReadyDelegate_ = new LocalDataChannelReadyInternalDelegate(RaiseLocalDataChannelReady);
|
| + RegisterOnLocalDataChannelReady(peer_connection_id_, localDataChannelReadyDelegate_);
|
| +
|
| + dataFromDataChannelReadyDelegate_ = new DataFromDataChannelReadyInternalDelegate(RaiseDataFromDataChannelReady);
|
| + RegisterOnDataFromDataChannelReady(peer_connection_id_, dataFromDataChannelReadyDelegate_);
|
| +
|
| + failureMessageDelegate_ = new FailureMessageInternalDelegate(RaiseFailureMessage);
|
| + RegisterOnFailure(peer_connection_id_, failureMessageDelegate_);
|
| +
|
| + audioBusReadyDelegate_ = new AudioBusReadyInternalDelegate(RaiseAudioBusReady);
|
| + RegisterOnAudioBusReady(peer_connection_id_, audioBusReadyDelegate_);
|
| +
|
| + localSdpReadytoSendDelegate_ = new LocalSdpReadytoSendInternalDelegate(RaiseLocalSdpReadytoSend);
|
| + RegisterOnLocalSdpReadytoSend(peer_connection_id_, localSdpReadytoSendDelegate_);
|
| +
|
| + iceCandiateReadytoSendDelegate_ = new IceCandiateReadytoSendInternalDelegate(RaiseIceCandiateReadytoSend);
|
| + RegisterOnIceCandiateReadytoSend(peer_connection_id_, iceCandiateReadytoSendDelegate_);
|
| + }
|
| +
|
| + public void ClosePeerConnectionM() {
|
| + ClosePeerConnection(peer_connection_id_);
|
| + peer_connection_id_ = -1;
|
| + }
|
| +
|
| + // Return -1 if Peerconnection is not available.
|
| + public int GetUniqueId() {
|
| + return peer_connection_id_;
|
| + }
|
| +
|
| + public void AddStreamM(bool audio_only) {
|
| + AddStream(peer_connection_id_, audio_only);
|
| + }
|
| +
|
| + public void AddDataChannelM() {
|
| + AddDataChannel(peer_connection_id_);
|
| + }
|
| +
|
| + public void CreateOfferM() {
|
| + CreateOffer(peer_connection_id_);
|
| + }
|
| +
|
| + public void CreateAnswerM() {
|
| + CreateAnswer(peer_connection_id_);
|
| + }
|
| +
|
| + public void SendDataViaDataChannelM(string data) {
|
| + SendDataViaDataChannel(peer_connection_id_, data);
|
| + }
|
| +
|
| + public void SetAudioControl(bool is_mute, bool is_record) {
|
| + SetAudioControl(peer_connection_id_, is_mute, is_record);
|
| + }
|
| +
|
| + public void ReceivedSdpM(string sdp) {
|
| + peer_connection_id_ = ReceivedSdp(peer_connection_id_, sdp);
|
| + RegisterCallbacks();
|
| + }
|
| +
|
| + public void ReceivedIceCandidateM(string ice_candidate) {
|
| + ReceivedIceCandidate(peer_connection_id_, ice_candidate);
|
| + }
|
| +
|
| + private void RaiseLocalDataChannelReady() {
|
| + if (OnLocalDataChannelReady != null)
|
| + OnLocalDataChannelReady(peer_connection_id_);
|
| + }
|
| +
|
| + private void RaiseDataFromDataChannelReady(string data) {
|
| + if (OnDataFromDataChannelReady != null)
|
| + OnDataFromDataChannelReady(peer_connection_id_, data);
|
| + }
|
| +
|
| + private void RaiseFailureMessage(string msg) {
|
| + if (OnFailureMessage != null)
|
| + OnFailureMessage(peer_connection_id_, msg);
|
| + }
|
| +
|
| + private void RaiseAudioBusReady(IntPtr data, int bits_per_sample,
|
| + int sample_rate, int number_of_channels, int number_of_frames) {
|
| + if (OnAudioBusReady != null)
|
| + OnAudioBusReady(peer_connection_id_, data, bits_per_sample, sample_rate,
|
| + number_of_channels, number_of_frames);
|
| + }
|
| +
|
| + private void RaiseLocalSdpReadytoSend(string msg) {
|
| + if (OnLocalSdpReadytoSend != null)
|
| + OnLocalSdpReadytoSend(peer_connection_id_, msg);
|
| + }
|
| +
|
| + private void RaiseIceCandiateReadytoSend(string msg) {
|
| + if (OnIceCandiateReadytoSend != null)
|
| + OnIceCandiateReadytoSend(peer_connection_id_, msg);
|
| + }
|
| +
|
| + private LocalDataChannelReadyInternalDelegate localDataChannelReadyDelegate_ = null;
|
| + public event LocalDataChannelReadyDelegate OnLocalDataChannelReady;
|
| +
|
| + private DataFromDataChannelReadyInternalDelegate dataFromDataChannelReadyDelegate_ = null;
|
| + public event DataFromDataChannelReadyDelegate OnDataFromDataChannelReady;
|
| +
|
| + private FailureMessageInternalDelegate failureMessageDelegate_ = null;
|
| + public event FailureMessageDelegate OnFailureMessage;
|
| +
|
| + private AudioBusReadyInternalDelegate audioBusReadyDelegate_ = null;
|
| + public event AudioBusReadyDelegate OnAudioBusReady;
|
| +
|
| + private LocalSdpReadytoSendInternalDelegate localSdpReadytoSendDelegate_ = null;
|
| + public event LocalSdpReadytoSendDelegate OnLocalSdpReadytoSend;
|
| +
|
| + private IceCandiateReadytoSendInternalDelegate iceCandiateReadytoSendDelegate_ = null;
|
| + public event IceCandiateReadytoSendDelegate OnIceCandiateReadytoSend;
|
| +
|
| + private int peer_connection_id_ = -1;
|
| + }
|
| +}
|
|
|