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 (%3ms)").arg(bitspersec / 1000).arg(bitrate / 1000).arg(frames*10)); } AudioInputPtr ai = g.ai; if (ai && (preferCELT(bitrate, frames) == (ai->umtType != MessageHandler::UDPVoiceSpeex))) { g.iAudioBandwidth = getNetworkBandwidth(bitrate, frames); ai->iAudioQuality = bitrate; ai->iAudioFrames = frames; return; } ai.reset(); Audio::stopInput(); Audio::startInput(); }
//初始化编解码器 AudioInput::AudioInput() { bEcho = true; iLevel = 0; //celt or speex iAudioFrames = g_struct.s.iFramesPerPacket; iAudioQuality = g_struct.s.iQuality; if (preferCELT(iAudioQuality, iAudioFrames)) umtType = MessageHandler::UDPVoiceCELT; else umtType = MessageHandler::UDPVoiceSpeex; cCodec = NULL; ceEncoder = NULL; if (umtType != MessageHandler::UDPVoiceSpeex) { iSampleRate = SAMPLE_RATE; iFrameSize = SAMPLE_RATE / 100; esSpeex = NULL; Trace("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_WB)); 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); Trace("AudioInput: %d bits/s, %d hz, %d sample Speex-UWB", iAudioQuality, iSampleRate, iFrameSize); } iEchoFreq = iMicFreq = iSampleRate; //mumble_drft_init(&fftTable, iFrameSize); 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; dPeakMic = dPeakSignal = dPeakSpeaker = 0.0; bRunning = false; }
//初始化编解码器 AudioInput::AudioInput() { bEcho = true; m_de_cdDecoder = NULL; iLevel = 0; //celt or speex iAudioFrames = g_struct.s.iFramesPerPacket; iAudioQuality = g_struct.s.iQuality; if (preferCELT(iAudioQuality, iAudioFrames)) umtType = MessageHandler::UDPVoiceCELT; else umtType = MessageHandler::UDPVoiceSpeex; cCodec = NULL; ceEncoder = NULL; if (umtType == MessageHandler::UDPVoiceCELT) { iSampleRate = SAMPLE_RATE; iFrameSize = SAMPLE_RATE / 50; esSpeex = NULL; Trace("AudioInput: %d bits/s, %d hz, %d sample CELT", iAudioQuality, iSampleRate, iFrameSize); } else { assert(0); } iEchoFreq = iMicFreq = iSampleRate; //mumble_drft_init(&fftTable, iFrameSize); 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*2];//2个声道 psClean = new short[iFrameSize*2]; psSpeaker = NULL; iEchoChannels = iMicChannels = 0; iEchoFilled = iMicFilled = 0; eMicFormat = eEchoFormat = SampleFloat; iMicSampleSize = iEchoSampleSize = 0; bPreviousVoice = false; pfMicInput = pfEchoInput = pfOutput = NULL; iBitrate = 0; dPeakMic = dPeakSignal = dPeakSpeaker = 0.0; bRunning = false; WAVEFORMATEX wfx; ZeroMemory(&wfx, sizeof(wfx)); wfx.wFormatTag = WAVE_FORMAT_PCM; wfx.nChannels = 2; wfx.nSamplesPerSec = iSampleRate; wfx.nBlockAlign = 4; wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; wfx.wBitsPerSample = 16; if (FAILED(g_pWaveFile.Open(L"c:\\mywave.wav", &wfx, WAVEFILE_WRITE))) { g_pWaveFile.Close(); } }
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); }