using Byn.Media;
using Byn.Net;
using UnityEngine;
using System;
namespace Byn.Unity.Examples
{
/// <summary>
/// Minimal conference call example.
/// Note that this feature is still in development and not yet fully stable.
/// Use at your own risk.
///
/// This example shows the use of the ICall interface for conference calls. By
/// setting NetworkConfig.IsConference to true and using the signaling server
/// flag "address_sharing" it allows to create N to N connections using a single address.
/// All users in the conference are treated equally.
/// </summary>
public class MinimalConference : MonoBehaviour
{
ICall[] calls;
NetworkConfig netConf;
private string address;
void Start()
{
calls = new ICall[3];
address = Application.productName + "_MinimalConference";
netConf = new NetworkConfig();
//watch out the signaling server needs to be configured properly for this to work:
//flag "address_sharing" needs to be set to true in config.json
//e.g. "ws://signaling.because-why-not.com/testshared"
netConf.SignalingUrl = ExampleGlobals.SharedSignaling;
//
netConf.IsConference = true;
//The current version doesn't deal well with failed direct connections
//thus a turn server is used to ensure users can connect.
//
netConf.IceServers.Add(new IceServer(ExampleGlobals.TurnUrl,
ExampleGlobals.TurnUser,
ExampleGlobals.TurnPass));
SetupCalls();
}
private void SetupCalls()
{
MediaConfig mediaConf1 = new MediaConfig();
mediaConf1.Video = false;
mediaConf1.Audio = true;
for (int i = 0; i < calls.Length; i++)
{
Debug.Log(i + " setup");
calls[i] = UnityCallFactory.Instance.Create(netConf);
calls[i].CallEvent += OnCallEvent;
calls[i].Configure(mediaConf1);
}
}
private void OnCallEvent(object src, CallEventArgs args)
{
ICall call = src as ICall;
int index = Array.IndexOf(calls, call);
if (args.Type == CallEventType.ConfigurationComplete)
{
Debug.Log(index + ": configuration done. Listening on address " + address);
//ALL connections will call listen. The current conference call version
//will connect all users that listen to the same address
//resulting in an N to N / full mesh topology
call.Listen(address);
}
else if (args.Type == CallEventType.CallAccepted)
{
Debug.Log(index + ": CallAccepted");
}
else if (args.Type == CallEventType.ConfigurationFailed || args.Type == CallEventType.ListeningFailed)
{
Debug.LogError(index + ": failed");
}
}
private void OnDestroy()
{
for (int i = 0; i < calls.Length; i++)
{
if (calls[i] != null)
{
calls[i].Dispose();
calls[i] = null;
}
}
}
void Update()
{
for (int i = 0; i < calls.Length; i++)
{
if (calls[i] != null)
{
calls[i].Update();
}
}
}
}
}