void OnDestroy() { if (this.voice != Voice.LocalVoiceAudio.Dummy) // photonView.isMine does not work { this.voice.RemoveSelf(); // TODO: IAudioReader allready destroyed? if (this.audioSource != null) { this.audioSource.Dispose(); this.audioSource = null; } // no need to send PhotonVoiceRemoved since object is destroyed } }
protected virtual Voice.LocalVoice createLocalVoiceAudio(Voice.VoiceInfo voiceInfo, Voice.IAudioSource source) { if (source is Voice.IAudioPusher <float> ) { if (forceShort) { throw new NotImplementedException("Voice.IAudioPusher<float> at 'short' voice is not supported currently"); } else { var localVoice = PhotonVoiceNetwork.VoiceClient.CreateLocalVoiceAudio <float>(voiceInfo); ((Voice.IAudioPusher <float>)source).SetCallback(buf => localVoice.PushDataAsync(buf), localVoice); return(localVoice); } } else if (source is Voice.IAudioPusher <short> ) { var localVoice = PhotonVoiceNetwork.VoiceClient.CreateLocalVoiceAudio <short>(voiceInfo); ((Voice.IAudioPusher <short>)source).SetCallback(buf => localVoice.PushDataAsync(buf), localVoice); return(localVoice); } else if (source is Voice.IAudioReader <float> ) { if (forceShort) { if (PhotonVoiceSettings.Instance.DebugInfo) { Debug.LogFormat("PUNVoice: Creating local voice with source samples type conversion from float to short."); } var localVoice = PhotonVoiceNetwork.VoiceClient.CreateLocalVoiceAudio <short>(voiceInfo); localVoice.LocalUserServiceable = new Voice.BufferReaderPushAdapterAsyncPoolFloatToShort(localVoice, source as Voice.IAudioReader <float>); return(localVoice); } else { var localVoice = PhotonVoiceNetwork.VoiceClient.CreateLocalVoiceAudio <float>(voiceInfo); localVoice.LocalUserServiceable = new Voice.BufferReaderPushAdapterAsyncPool <float>(localVoice, source as Voice.IAudioReader <float>); return(localVoice); } } else if (source is Voice.IAudioReader <short> ) { var localVoice = PhotonVoiceNetwork.VoiceClient.CreateLocalVoiceAudio <short>(voiceInfo); localVoice.LocalUserServiceable = new Voice.BufferReaderPushAdapterAsyncPool <short>(localVoice, source as Voice.IAudioReader <short>); return(localVoice); } else { Debug.LogErrorFormat("PUNVoice: PhotonVoiceRecorder createLocalVoiceAudio does not support Voice.IAudioReader of type {0}", source.GetType()); return(Voice.LocalVoiceAudio.Dummy); } }
private Voice.LocalVoice createLocalVoiceAudioAndSource() { var pvs = PhotonVoiceSettings.Instance; switch (Source) { case AudioSource.Microphone: { Application.RequestUserAuthorization(UserAuthorization.Microphone); if (this.MicrophoneType == MicAudioSourceType.Settings && pvs.MicrophoneType == PhotonVoiceSettings.MicAudioSourceType.Photon || this.MicrophoneType == MicAudioSourceType.Photon) { var hwMicDev = this.PhotonMicrophoneDeviceID != -1 ? this.PhotonMicrophoneDeviceID : PhotonVoiceNetwork.PhotonMicrophoneDeviceID; #if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN if (PhotonVoiceSettings.Instance.DebugInfo) { Debug.LogFormat("PUNVoice: Setting recorder's source to Photon microphone device {0}", hwMicDev); } audioSource = new WindowsAudioInPusher(hwMicDev); if (PhotonVoiceSettings.Instance.DebugInfo) { Debug.LogFormat("PUNVoice: Setting recorder's source to WindowsAudioInPusher"); } break; #elif UNITY_IOS && !UNITY_EDITOR || (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX) audioSource = new AppleAudioInPusher(hwMicDev); if (PhotonVoiceSettings.Instance.DebugInfo) { Debug.LogFormat("PUNVoice: Setting recorder's source to AppleAudioInPusher"); } break; #elif UNITY_ANDROID && !UNITY_EDITOR audioSource = new AndroidAudioInAEC(); if (PhotonVoiceSettings.Instance.DebugInfo) { Debug.LogFormat("PUNVoice: Setting recorder's source to AndroidAudioInAEC"); } break; #else Debug.LogFormat("PUNVoice: Photon microphone type is not supported for the current platform. Using Unity microphone."); #endif } if (Microphone.devices.Length < 1) { // Error already logged in PhotonVoiceNetwork.Start() return(Voice.LocalVoiceAudio.Dummy); } var micDev = this.MicrophoneDevice != null ? this.MicrophoneDevice : PhotonVoiceNetwork.MicrophoneDevice; if (PhotonVoiceSettings.Instance.DebugInfo) { Debug.LogFormat("PUNVoice: Setting recorder's source to microphone device {0}", micDev); } // mic can ignore passed sampling rate and set it's own var mic = new MicWrapper(micDev, (int)pvs.SamplingRate); audioSource = mic; } break; case AudioSource.AudioClip: { if (AudioClip == null) { Debug.LogErrorFormat("PUNVoice: AudioClip property must be set for AudioClip audio source"); return(Voice.LocalVoiceAudio.Dummy); } audioSource = new AudioClipWrapper(AudioClip); if (this.LoopAudioClip) { ((AudioClipWrapper)audioSource).Loop = true; } } break; case AudioSource.Factory: { if (PhotonVoiceNetwork.AudioSourceFactory == null) { Debug.LogErrorFormat("PUNVoice: PhotonVoiceNetwork.AudioSourceFactory must be specified if PhotonVoiceRecorder.Source set to Factory"); return(Voice.LocalVoiceAudio.Dummy); } audioSource = PhotonVoiceNetwork.AudioSourceFactory(this); } break; default: Debug.LogErrorFormat("PUNVoice: unknown Source value {0}", Source); return(Voice.LocalVoiceAudio.Dummy); } Voice.VoiceInfo voiceInfo = Voice.VoiceInfo.CreateAudioOpus(pvs.SamplingRate, audioSource.SamplingRate, audioSource.Channels, pvs.FrameDuration, pvs.Bitrate, photonView.viewID); return(createLocalVoiceAudio(voiceInfo, audioSource)); }