void AudioInput::setMaxBandwidth(int bitspersec) { if (bitspersec == g.iMaxBandwidth) return; int frames; int bitrate; adjustBandwidth(bitspersec, bitrate, frames); g.iMaxBandwidth = bitspersec; if (bitspersec != -1) { if ((bitrate != g.s.iQuality) || (frames != g.s.iFramesPerPacket)) g.mw->msgBox(tr("Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms)").arg(bitspersec / 1000).arg(bitrate / 1000).arg(frames*10)); } AudioInputPtr ai = g.ai; if (ai) { g.iAudioBandwidth = getNetworkBandwidth(bitrate, frames); ai->iAudioQuality = bitrate; ai->iAudioFrames = frames; return; } ai.reset(); Audio::stopInput(); Audio::startInput(); }
void AudioInput::adjustBandwidth(int bitspersec, int &bitrate, int &frames) { frames = g.s.iFramesPerPacket; bitrate = g.s.iQuality; if (bitspersec == -1) { // No limit } else { if (getNetworkBandwidth(bitrate, frames) > bitspersec) { if ((frames <= 4) && (bitspersec <= 32000)) frames = 4; else if ((frames == 1) && (bitspersec <= 64000)) frames = 2; else if ((frames == 2) && (bitspersec <= 48000)) frames = 4; if (getNetworkBandwidth(bitrate, frames) > bitspersec) { do { bitrate -= 1000; } while ((bitrate > 8000) && (getNetworkBandwidth(bitrate, frames) > bitspersec)); } } } if (bitrate <= 8000) bitrate = 8000; }
AudioInput::AudioInput() : opusBuffer(g.s.iFramesPerPacket * (SAMPLE_RATE / 100)) { adjustBandwidth(g.iMaxBandwidth, iAudioQuality, iAudioFrames); g.iAudioBandwidth = getNetworkBandwidth(iAudioQuality, iAudioFrames); umtType = MessageHandler::UDPVoiceCELTAlpha; cCodec = NULL; ceEncoder = NULL; iSampleRate = SAMPLE_RATE; iFrameSize = SAMPLE_RATE / 100; #ifdef USE_OPUS opusState = opus_encoder_create(SAMPLE_RATE, 1, OPUS_APPLICATION_VOIP, NULL); opus_encoder_ctl(opusState, OPUS_SET_VBR(0)); // CBR #endif qWarning("AudioInput: %d bits/s, %d hz, %d sample", iAudioQuality, iSampleRate, iFrameSize); iEchoFreq = iMicFreq = iSampleRate; iFrameCounter = 0; iSilentFrames = 0; iHoldFrames = 0; iBufferedFrames = 0; bResetProcessor = true; bEchoMulti = false; sppPreprocess = NULL; sesEcho = NULL; srsMic = srsEcho = NULL; iJitterSeq = 0; iMinBuffered = 1000; psMic = new short[iFrameSize]; psClean = new short[iFrameSize]; psSpeaker = NULL; iEchoChannels = iMicChannels = 0; iEchoFilled = iMicFilled = 0; eMicFormat = eEchoFormat = SampleFloat; iMicSampleSize = iEchoSampleSize = 0; bPreviousVoice = false; bResetEncoder = true; pfMicInput = pfEchoInput = pfOutput = NULL; iBitrate = 0; dPeakSignal = dPeakSpeaker = dPeakMic = dPeakCleanMic = 0.0; if (g.uiSession) { setMaxBandwidth(g.iMaxBandwidth); } bRunning = true; connect(this, SIGNAL(doDeaf()), g.mw->qaAudioDeaf, SLOT(trigger()), Qt::QueuedConnection); connect(this, SIGNAL(doMute()), g.mw->qaAudioMute, SLOT(trigger()), Qt::QueuedConnection); }
AudioInput::AudioInput() { adjustBandwidth(g.iMaxBandwidth, iAudioQuality, iAudioFrames); g.iAudioBandwidth = getNetworkBandwidth(iAudioQuality, iAudioFrames); if (preferCELT(iAudioQuality, iAudioFrames)) umtType = MessageHandler::UDPVoiceCELTAlpha; else umtType = MessageHandler::UDPVoiceSpeex; cCodec = NULL; ceEncoder = NULL; if (umtType != MessageHandler::UDPVoiceSpeex) { iSampleRate = SAMPLE_RATE; iFrameSize = SAMPLE_RATE / 100; esSpeex = NULL; qWarning("AudioInput: %d bits/s, %d hz, %d sample CELT", iAudioQuality, iSampleRate, iFrameSize); } else { iAudioFrames /= 2; speex_bits_init(&sbBits); speex_bits_reset(&sbBits); esSpeex = speex_encoder_init(speex_lib_get_mode(SPEEX_MODEID_UWB)); speex_encoder_ctl(esSpeex,SPEEX_GET_FRAME_SIZE,&iFrameSize); speex_encoder_ctl(esSpeex,SPEEX_GET_SAMPLING_RATE,&iSampleRate); int iArg=1; speex_encoder_ctl(esSpeex,SPEEX_SET_VBR, &iArg); iArg = 0; speex_encoder_ctl(esSpeex,SPEEX_SET_VAD, &iArg); speex_encoder_ctl(esSpeex,SPEEX_SET_DTX, &iArg); float fArg=8.0; speex_encoder_ctl(esSpeex,SPEEX_SET_VBR_QUALITY, &fArg); iArg = iAudioQuality; speex_encoder_ctl(esSpeex, SPEEX_SET_VBR_MAX_BITRATE, &iArg); iArg = 5; speex_encoder_ctl(esSpeex,SPEEX_SET_COMPLEXITY, &iArg); qWarning("AudioInput: %d bits/s, %d hz, %d sample Speex-UWB", iAudioQuality, iSampleRate, iFrameSize); } iEchoFreq = iMicFreq = iSampleRate; iFrameCounter = 0; iSilentFrames = 0; iHoldFrames = 0; bResetProcessor = true; bEchoMulti = false; sppPreprocess = NULL; sesEcho = NULL; srsMic = srsEcho = NULL; iJitterSeq = 0; iMinBuffered = 1000; psMic = new short[iFrameSize]; psClean = new short[iFrameSize]; psSpeaker = NULL; iEchoChannels = iMicChannels = 0; iEchoFilled = iMicFilled = 0; eMicFormat = eEchoFormat = SampleFloat; iMicSampleSize = iEchoSampleSize = 0; bPreviousVoice = false; pfMicInput = pfEchoInput = pfOutput = NULL; iBitrate = 0; dPeakSignal = dPeakSpeaker = dPeakMic = dPeakCleanMic = 0.0; if (g.uiSession) { setMaxBandwidth(g.iMaxBandwidth); } bRunning = true; connect(this, SIGNAL(doDeaf()), g.mw->qaAudioDeaf, SLOT(trigger()), Qt::QueuedConnection); }