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); } } }
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); } } }