#if FUSION_WEAVER
namespace Photon.Voice.Fusion
{
using global::Fusion;
using Unity;
using UnityEngine;
using LogLevel = Photon.Voice.LogLevel;
[AddComponentMenu("Photon Voice/Fusion/Voice Network Object")]
public class VoiceNetworkObject : NetworkBehaviour
{
#region Private Fields
// VoiceComponentImpl instance instead if VoiceComponent inheritance
private VoiceComponentImpl voiceComponentImpl = new VoiceComponentImpl();
private VoiceConnection voiceConnection;
#endregion
#region Properties
protected Voice.ILogger Logger => voiceComponentImpl.Logger;
// to set logging level from code
public VoiceLogger VoiceLogger => voiceComponentImpl.VoiceLogger;
/// The Recorder component currently used by this VoiceNetworkObject
public Recorder RecorderInUse { get; private set; }
/// The Speaker component currently used by this VoiceNetworkObject
public Speaker SpeakerInUse { get; private set; }
/// If true, this VoiceNetworkObject has a Speaker that is currently playing received audio frames from remote audio source
public bool IsSpeaking => this.SpeakerInUse != null && this.SpeakerInUse.IsPlaying;
/// If true, this VoiceNetworkObject has a Recorder that is currently transmitting audio stream from local audio source
public bool IsRecording => this.RecorderInUse != null && this.RecorderInUse.IsCurrentlyTransmitting;
#if FUSION2
public bool IsLocal => Runner.Topology == Topologies.Shared ? this.Object.HasStateAuthority : this.Object.HasInputAuthority;
#else
public bool IsLocal => Runner.Topology == SimulationConfig.Topologies.Shared ? this.Object.HasStateAuthority : this.Object.HasInputAuthority;
#endif
#endregion
#region Private Methods
private void SetupRecorder()
{
Recorder recorder = null;
Recorder[] recorders = this.GetComponentsInChildren();
if (recorders.Length > 0)
{
if (recorders.Length > 1)
{
this.Logger.Log(LogLevel.Warning, "Multiple Recorder components found attached to the GameObject or its children.");
}
recorder = recorders[0];
}
if (null == recorder && null != this.voiceConnection.PrimaryRecorder)
{
recorder = this.voiceConnection.PrimaryRecorder;
}
if (null == recorder)
{
this.Logger.Log(LogLevel.Warning, "Cannot find Recorder. Assign a Recorder to VoiceNetworkObject object or set up FusionVoiceClient.PrimaryRecorder.");
}
else
{
recorder.UserData = this.GetUserData();
this.voiceConnection.AddRecorder(recorder);
}
this.RecorderInUse = recorder;
}
private void SetupSpeaker()
{
Speaker speaker = null;
Speaker[] speakers = this.GetComponentsInChildren(true);
if (speakers.Length > 0)
{
speaker = speakers[0];
if (speakers.Length > 1)
{
this.Logger.Log(LogLevel.Warning, "Multiple Speaker components found attached to the GameObject or its children. Using the first one we found.");
}
}
if (null == speaker && null != this.voiceConnection.SpeakerPrefab)
{
speaker = this.voiceConnection.InstantiateSpeakerPrefab(this.gameObject, false);
}
if (null == speaker)
{
this.Logger.Log(LogLevel.Error, "No Speaker component or prefab found. Assign a Speaker to VoiceNetworkObject object or set up FusionVoiceClient.SpeakerPrefab.");
}
else
{
this.Logger.Log(LogLevel.Info, "Speaker instantiated.");
}
this.SpeakerInUse = speaker;
}
private object GetUserData()
{
return this.Object.Id;
}
public override void Spawned()
{
voiceComponentImpl.Awake(this);
this.voiceConnection = this.Runner.GetComponent();
if (this.IsLocal)
{
this.SetupRecorder();
if (this.RecorderInUse == null)
{
this.Logger.Log(LogLevel.Warning, "Recorder not setup for VoiceNetworkObject: playback may not work properly.");
}
else
{
if (!this.RecorderInUse.TransmitEnabled)
{
this.Logger.Log(LogLevel.Warning, "VoiceNetworkObject.RecorderInUse.TransmitEnabled is false, don't forget to set it to true to enable transmission.");
}
}
}
this.SetupSpeaker();
if (this.SpeakerInUse == null)
{
this.Logger.Log(LogLevel.Warning, "Speaker not setup for VoiceNetworkObject: voice chat will not work.");
}
else
{
this.voiceConnection.AddSpeaker(this.SpeakerInUse, this.GetUserData());
}
}
public override void Despawned(NetworkRunner runner, bool hasState)
{
this.voiceConnection.RemoveRecorder(this.RecorderInUse);
}
#endregion
}
}
#endif