BOOL CAudioMixerManager::IsMuted(UINT nId) { CAudioMixerControl* pMixer = GetMixer(nId); if (pMixer) return pMixer->IsMuted(); return FALSE; }
int CAudioMixerManager::GetVolume(UINT nId) { CAudioMixerControl* pMixer = GetMixer(nId); if (pMixer) return pMixer->GetVolume(); return 0; }
BOOL CAudioMixerManager::AddMixer(UINT nId, const GUID* pGuid, BOOL bCaptureDevice, int nInput, BOOL bRealMixer) { CAudioMixerControl* pMixer = GetMixer(nId); if (pMixer != NULL) { return pMixer->OpenDevice(pGuid, bCaptureDevice, nInput, bRealMixer); } pMixer = new CAudioMixerControl; if (!pMixer) return FALSE; do { if (!pMixer->CreateInstance(nId, m_pCallback, m_pvParam)) break; if (!pMixer->OpenDevice(pGuid, bCaptureDevice, nInput, bRealMixer)) break; m_mapAudioMixer.insert(CAudioMixerMap::value_type(nId, pMixer)); return TRUE; } while (0); delete pMixer; return FALSE; }
void SoundStream::StartLogAudio(const char *filename) { if (!m_logAudio) { m_logAudio = true; g_wave_writer.Start(filename, GetMixer()->GetSampleRate()); g_wave_writer.SetSkipSilence(false); NOTICE_LOG(AUDIO, "Starting Audio logging"); } else { WARN_LOG(AUDIO, "Audio logging already started"); } }
HRESULT CALLBACK EnumInputCallBack( const char* pName/*返回值*/, IPin * pin /*设备*/, LPVOID lp/*参数*/, BOOL& bCancel/*是否退出循环*/ ) { char* p = (char*)lp; if( strcmp( p, pName )==0 ) { bCancel = TRUE; IAMAudioInputMixer * pMixer = GetMixer(pin); if( pMixer->put_Enable(TRUE)==S_OK ) { if( pMixer->put_MixLevel(AMF_AUTOMATICGAIN) != S_OK ) { return S_FALSE; } } else return S_FALSE; } return S_OK; }
void CAudioMixerManager::SetMute(UINT nId, BOOL bMute) { CAudioMixerControl* pMixer = GetMixer(nId); if (pMixer) pMixer->SetMute(bMute); }
void CAudioMixerManager::SetVolume(UINT nId, int nVolume) { CAudioMixerControl* pMixer = GetMixer(nId); if (pMixer) pMixer->SetVolume(nVolume); }
// The audio thread. void SoundStream::SoundLoop() { Common::SetCurrentThreadName("Audio thread"); InitializeSoundLoop(); bool surroundSupported = SupportSurroundOutput() && SConfig::GetInstance().bDPL2Decoder; memset(realtimeBuffer, 0, SOUND_MAX_FRAME_SIZE * sizeof(u16)); memset(dpl2buffer, 0, SOUND_MAX_FRAME_SIZE * sizeof(soundtouch::SAMPLETYPE)); memset(samplebuffer, 0, SOUND_MAX_FRAME_SIZE * sizeof(soundtouch::SAMPLETYPE)); u32 channelmultiplier = surroundSupported ? SOUND_SAMPLES_SURROUND : SOUND_SAMPLES_STEREO; CMixer* mixer = GetMixer(); if (SConfig::GetInstance().bTimeStretching) { float ratemultiplier = 1.0f; soundtouch::SoundTouch sTouch; sTouch.setChannels(2); sTouch.setSampleRate(mixer->GetSampleRate()); sTouch.setTempo(1.0); sTouch.setSetting(SETTING_USE_QUICKSEEK, 0); sTouch.setSetting(SETTING_USE_AA_FILTER, 1); while (threadData.load()) { u32 availablesamples = mixer->AvailableSamples(); u32 numsamples = std::min(availablesamples, 400u); if (numsamples == 400u) { float rate = mixer->GetCurrentSpeed(); if (rate <= 0) { rate = 1.0f; } numsamples = mixer->Mix(samplebuffer, numsamples); rate *= ratemultiplier; rate = rate < 0.5f ? 0.5f : rate; rate = roundf(rate * 16.0f) / 16.0f; sTouch.setTempo(rate); sTouch.putSamples(samplebuffer, numsamples); } u32 samplesneeded = SamplesNeeded(); availablesamples = sTouch.numSamples(); if (samplesneeded >= SOUND_FRAME_SIZE && availablesamples > 0) { ratemultiplier = std::fmaxf(std::fminf((float)availablesamples / (float)samplesneeded, 1.1f), 0.9f); numsamples = std::min(availablesamples, SOUND_FRAME_SIZE); if (surroundSupported) { numsamples = sTouch.receiveSamples(dpl2buffer, numsamples); DPL2Decode(dpl2buffer, numsamples, samplebuffer); } else { numsamples = sTouch.receiveSamples(samplebuffer, numsamples); } floatTos16(realtimeBuffer, samplebuffer, numsamples, channelmultiplier); WriteSamples(realtimeBuffer, numsamples); } else { Common::SleepCurrentThread(1); } } } else { while (threadData.load()) { u32 neededsamples = std::min(SamplesNeeded(), SOUND_FRAME_SIZE); u32 availablesamples = mixer->AvailableSamples() & (~(0xF)); if (neededsamples == SOUND_FRAME_SIZE && availablesamples > 0) { u32 numsamples = std::min(availablesamples, neededsamples); if (surroundSupported) { numsamples = mixer->Mix(dpl2buffer, numsamples); DPL2Decode(dpl2buffer, numsamples, samplebuffer); floatTos16(realtimeBuffer, samplebuffer, numsamples, channelmultiplier); } else { numsamples = mixer->Mix(realtimeBuffer, numsamples); } WriteSamples(realtimeBuffer, numsamples); } else { Common::SleepCurrentThread(1); } } } }