Example #1
0
    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
        }
    }
Example #2
0
 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);
     }
 }
Example #3
0
    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));
    }