예제 #1
0
BOOL CAudioMixerManager::IsMuted(UINT nId)
{
	CAudioMixerControl* pMixer = GetMixer(nId);
	if (pMixer)
		return pMixer->IsMuted();
	return FALSE;
}
예제 #2
0
int CAudioMixerManager::GetVolume(UINT nId)
{
	CAudioMixerControl* pMixer = GetMixer(nId);
	if (pMixer)
		return pMixer->GetVolume();
	return 0;
}
예제 #3
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;
}
예제 #4
0
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");
	}
}
예제 #5
0
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;
}
예제 #6
0
void CAudioMixerManager::SetMute(UINT nId, BOOL bMute)
{
	CAudioMixerControl* pMixer = GetMixer(nId);
	if (pMixer)
		pMixer->SetMute(bMute);
}
예제 #7
0
void CAudioMixerManager::SetVolume(UINT nId, int nVolume)
{
	CAudioMixerControl* pMixer = GetMixer(nId);
	if (pMixer)
		pMixer->SetVolume(nVolume);
}
예제 #8
0
// 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);
			}
		}
	}
}