void SendVoiceIfReady()
        {
            int currentPosition = Microphone.GetPosition(_currentMic);

            //Debug.Log(currentPosition + " " + Microphone.IsRecording(_currentMic));

            if (currentPosition < _previousPosition)
            {
                _numTimesLooped++;
            }

            //int numSourceSamples = !_mumbleClient.UseSyntheticSource ? NumSamplesInMicBuffer : TestingClipToUse.samples;

            int totalSamples = currentPosition + _numTimesLooped * NumSamplesInMicBuffer;

            //int totalSamples = currentPosition + _numTimesLooped * numSourceSamples;
            _previousPosition = currentPosition;

            while (totalSamples - _totalNumSamplesSent >= NumSamplesPerOutgoingPacket)
            {
                PcmArray newData = _mumbleClient.GetAvailablePcmArray();

                if (!_mumbleClient.UseSyntheticSource)
                {
                    SendAudioClip.GetData(newData.Pcm, _totalNumSamplesSent % NumSamplesInMicBuffer);
                }
                else
                {
                    TestingClipToUse.GetData(newData.Pcm, _totalNumSamplesSent % TestingClipToUse.samples);
                }
                //Debug.Log(Time.frameCount + " " + currentPosition);

                _totalNumSamplesSent += NumSamplesPerOutgoingPacket;

                if (VoiceSendingType == MicType.Amplitude)
                {
                    if (AmplitudeHigherThan(MinAmplitude, newData.Pcm))
                    {
                        _sampleNumberOfLastMinAmplitudeVoice = _totalNumSamplesSent;
                        _mumbleClient.SendVoicePacket(newData);
                    }
                    else
                    {
                        if (_totalNumSamplesSent > _sampleNumberOfLastMinAmplitudeVoice + _voiceHoldSamples)
                        {
                            _mumbleClient.ReleasePcmArray(newData);
                            continue;
                        }
                        _mumbleClient.SendVoicePacket(newData);
                        // If this is the sample before the hold turns off, stop sending after it's sent
                        if (_totalNumSamplesSent + NumSamplesPerOutgoingPacket > _sampleNumberOfLastMinAmplitudeVoice + _voiceHoldSamples)
                        {
                            _mumbleClient.StopSendingVoice();
                        }
                    }
                }
                else
                {
                    _mumbleClient.SendVoicePacket(newData);
                }
            }
        }
Beispiel #2
0
 public void StopSendingAudio()
 {
     Microphone.End(_currentMic);
     _mumbleClient.StopSendingVoice();
     isRecording = false;
 }
        void SendVoiceIfReady()
        {
            int currentPosition = Microphone.GetPosition(_currentMic);

            //Debug.Log(currentPosition + " " + Microphone.IsRecording(_currentMic));

            //Debug.Log(currentPosition);
            if (currentPosition < _previousPosition)
            {
                _numTimesLooped++;
            }

            //Debug.Log("mic position: " + currentPosition + " was: " + _previousPosition + " looped: " + _numTimesLooped);

            int  totalSamples  = currentPosition + _numTimesLooped * NumSamplesInMicBuffer;
            bool isEmpty       = currentPosition == 0 && _previousPosition == 0;
            bool isFirstSample = _numTimesLooped == 0 && _previousPosition == 0;

            _previousPosition = currentPosition;
            if (isEmpty)
            {
                _secondsWithoutMicSamples += Time.deltaTime;
            }
            else
            {
                _secondsWithoutMicSamples = 0;
            }

            if (_secondsWithoutMicSamples > MaxSecondsWithoutMicData)
            {
                // For 5 times in a row, we received no usable data
                // this normally means that the mic we were using disconnected
                Debug.Log("Mic has disconnected!");
                StopSendingAudio();
                if (OnMicDisconnect != null)
                {
                    OnMicDisconnect();
                }
                return;
            }

            // We drop the first sample, because it generally starts with
            // a lot of pre-existing, stale, audio data which we couldn't
            // use b/c it's too old
            if (isFirstSample)
            {
                _totalNumSamplesSent = totalSamples;
                return;
            }

            while (totalSamples - _totalNumSamplesSent >= NumSamplesPerOutgoingPacket)
            {
                PcmArray newData = _mumbleClient.GetAvailablePcmArray();

                if (!_mumbleClient.UseSyntheticSource)
                {
                    SendAudioClip.GetData(newData.Pcm, _totalNumSamplesSent % NumSamplesInMicBuffer);
                }
                else
                {
                    TestingClipToUse.GetData(newData.Pcm, _totalNumSamplesSent % TestingClipToUse.samples);
                }
                //Debug.Log(Time.frameCount + " " + currentPosition);

                _totalNumSamplesSent += NumSamplesPerOutgoingPacket;

                if (VoiceSendingType == MicType.Amplitude)
                {
                    if (AmplitudeHigherThan(MinAmplitude, newData.Pcm))
                    {
                        _sampleNumberOfLastMinAmplitudeVoice = _totalNumSamplesSent;
                        if (OnMicData != null)
                        {
                            OnMicData(newData);
                        }
                        if (_writePositionalDataFunc != null)
                        {
                            _writePositionalDataFunc(ref newData.PositionalData, ref newData.PositionalDataLength);
                        }
                        else
                        {
                            newData.PositionalDataLength = 0;
                        }
                        _mumbleClient.SendVoicePacket(newData);
                    }
                    else
                    {
                        if (_totalNumSamplesSent > _sampleNumberOfLastMinAmplitudeVoice + _voiceHoldSamples)
                        {
                            newData.UnRef();
                            continue;
                        }
                        if (OnMicData != null)
                        {
                            OnMicData(newData);
                        }
                        if (_writePositionalDataFunc != null)
                        {
                            _writePositionalDataFunc(ref newData.PositionalData, ref newData.PositionalDataLength);
                        }
                        else
                        {
                            newData.PositionalDataLength = 0;
                        }
                        _mumbleClient.SendVoicePacket(newData);
                        // If this is the sample before the hold turns off, stop sending after it's sent
                        if (_totalNumSamplesSent + NumSamplesPerOutgoingPacket > _sampleNumberOfLastMinAmplitudeVoice + _voiceHoldSamples)
                        {
                            _mumbleClient.StopSendingVoice();
                        }
                    }
                }
                else
                {
                    if (OnMicData != null)
                    {
                        OnMicData(newData);
                    }
                    if (_writePositionalDataFunc != null)
                    {
                        _writePositionalDataFunc(ref newData.PositionalData, ref newData.PositionalDataLength);
                    }
                    else
                    {
                        newData.PositionalDataLength = 0;
                    }
                    _mumbleClient.SendVoicePacket(newData);
                }
            }
        }