bool CMutedSessionEvents::TxSetMuted(bool bMuted)
{
    HRESULT hr = S_FALSE;

    // 获得音量、静音控制接口
    ISimpleAudioVolume   *pAudioVolume = NULL;
    hr = m_AudioSessionManager->GetSimpleAudioVolume(NULL,0,&pAudioVolume);
    if (FAILED(hr)) return false;

    if(SUCCEEDED(hr))
    {
        pAudioVolume->SetMute(bMuted, &GUID_NULL);

        // 更改全局静音状态
        g_bMuted = bMuted;
    }

    if (pAudioVolume != NULL)
    {
        pAudioVolume->Release();
        pAudioVolume = NULL;
    }
    return true;
}
Exemple #2
0
HRESULT CVistaVolume::SetMute(BOOL bMute)
{
	if (m_bMute == bMute)
		return S_OK;

	HRESULT hr = E_FAIL;

	IMMDevice* pDevice;
	hr = m_pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDevice);
	if (FAILED(hr))
		return hr;

	IAudioSessionManager2* pasm = NULL;
	hr = pDevice->Activate(__uuidof(IAudioSessionManager2), CLSCTX_ALL, NULL, (void**)&pasm);
	if (FAILED(hr))
		return hr;

	IAudioSessionEnumerator* audio_session_enumerator;
	if(SUCCEEDED(pasm->GetSessionEnumerator(&audio_session_enumerator)))
	{
		int count;
		
		if(SUCCEEDED(audio_session_enumerator->GetCount(&count)))
		{
			for (int i = 0; i < count; i++)  
			{
				IAudioSessionControl* audio_session_control;
				IAudioSessionControl2* audio_session_control2;

				if(SUCCEEDED(audio_session_enumerator->GetSession(i, &audio_session_control)))
				{
					if(SUCCEEDED(audio_session_control->QueryInterface(__uuidof(IAudioSessionControl2), (void**)&audio_session_control2)))
					{
						DWORD processid;
						
						if(SUCCEEDED(audio_session_control2->GetProcessId(&processid)))
						{
							if (processid == GetCurrentProcessId())
							{
								ISimpleAudioVolume* pSAV;
								hr = audio_session_control2->QueryInterface(__uuidof(ISimpleAudioVolume), (void**) &pSAV);
								if (SUCCEEDED(hr))
								{
									hr = pSAV->SetMute(bMute, NULL);
									if (SUCCEEDED(hr))
									{
										m_bMute = bMute;
									}
									pSAV->Release();
								}
							}
							audio_session_control->Release();
							audio_session_control2->Release();
						}
					}
				}
			}
			audio_session_enumerator->Release();
		}
	} 

	pasm->Release();

	return hr;
}
void changeFGWindowVolume()
{
	if (soundOption == dncItemID) return;

	char titleBuff[128];
	HWND activeHWND = GetForegroundWindow();
	GetWindowText(activeHWND, titleBuff, 128);

	UINT count = sizeof(mediaCommands) / sizeof(mediaCommands[0]);
	for (UINT i = 0; i < count; i++)
	{
		if (strstr(titleBuff, mediaCommands[i].title) > 0) return;
	}

	IMMDevice *mmDevice;
	IMMDeviceEnumerator *mmDeviceEnum;
	IAudioSessionManager2 *sessionManager;
	IAudioSessionEnumerator *sessionEnum;
	IAudioSessionControl *sessionControl;
	IAudioSessionControl2 *sessionControl2;
	ISimpleAudioVolume *audioVolume;

	CoCreateInstance(__uuidof(MMDeviceEnumerator), 0, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&mmDeviceEnum);
	mmDeviceEnum->GetDefaultAudioEndpoint(eRender, eMultimedia, &mmDevice);
	mmDevice->Activate(__uuidof(IAudioSessionManager2), CLSCTX_ALL, 0, (void**)&sessionManager);
	sessionManager->GetSessionEnumerator(&sessionEnum);

	DWORD activePid;
	GetWindowThreadProcessId(activeHWND, &activePid);

	int sessionCount;
	sessionEnum->GetCount(&sessionCount);
	for (int i = 0; i < sessionCount; i++)
	{
		sessionEnum->GetSession(i, &sessionControl);
		sessionControl->QueryInterface(__uuidof(IAudioSessionControl2), (void**)&sessionControl2);

		DWORD pid;
		sessionControl2->GetProcessId(&pid);
		if (activePid == pid)
		{
			sessionControl->QueryInterface(__uuidof(ISimpleAudioVolume), (void**)&audioVolume);

			BOOL muted;
			audioVolume->GetMute(&muted);

			float volumeLevel;
			audioVolume->GetMasterVolume(&volumeLevel);

			if (soundOption == muteItemID)
			{
				audioVolume->SetMute(!muted, 0);

				if (volumeLevel != 1.0f)
				{
					audioVolume->SetMasterVolume(1.0f, 0);
				}
			}
			else
			{
				float newVolumeLevel = (soundOption - sBaseItemID) / 100.0f;
				audioVolume->SetMasterVolume(volumeLevel == 1.0f ? newVolumeLevel : 1.0f, 0);

				if (muted)
				{
					audioVolume->SetMute(false, 0);
				}
			}

			audioVolume->Release();
		}

		sessionControl->Release();
		sessionControl2->Release();
	}

	sessionEnum->Release();
	sessionManager->Release();
	mmDevice->Release();
	mmDeviceEnum->Release();
}