//
//  SetVolumeOnSession()
//
HRESULT WASAPIRenderer::SetVolumeOnSession( UINT32 volume )
{
    if (volume > 100)
    {
        return E_INVALIDARG;
    }

    HRESULT hr = S_OK;
    ISimpleAudioVolume *SessionAudioVolume = nullptr;
    float ChannelVolume = 0.0;

    hr = m_AudioClient->GetService( __uuidof(ISimpleAudioVolume), reinterpret_cast<void**>(&SessionAudioVolume) );
    if (FAILED( hr ))
    {
        goto exit;
    }

    ChannelVolume = volume / (float)100.0;

    // Set the session volume on the endpoint
    hr = SessionAudioVolume->SetMasterVolume( ChannelVolume, nullptr );

exit:
    SAFE_RELEASE( SessionAudioVolume );
    return hr;
}
//设置应用程序静音
bool CCoreAudioVolume::SetMute(BOOL bMute)
{
    //IAudioSessionControl *pAudioSection = NULL;
    ISimpleAudioVolume	 *pAudioVolume = NULL;
    IAudioSessionManager *pManager = NULL;
    IMMDevice			 *pDevice = NULL;
    HRESULT hr;

    std::vector<IMMDevice*>::iterator iter = m_vArrayDevice.begin();
    for(; iter != m_vArrayDevice.end(); iter++)
    {
        pDevice = *iter;
        ATLASSERT(pDevice != NULL);

        hr = pDevice->Activate(__uuidof(IAudioSessionManager),
                               CLSCTX_INPROC_SERVER, NULL,
                               (void**)&pManager);

        if(FAILED(hr)) continue;

        hr = pManager->GetAudioSessionControl(NULL, 0, &m_pAudioSection);
        CMutedSessionEvents* pMutedse=new CMutedSessionEvents(pManager);
        hr = m_pAudioSection->RegisterAudioSessionNotification(pMutedse);
        hr = pManager->GetSimpleAudioVolume(NULL, 0, &pAudioVolume);

        if(SUCCEEDED(hr))
        {
            pAudioVolume->SetMute(bMute, &GUID_NULL);
            //pAudioVolume->SetMasterVolume()
        }
        else
        {
            ATLASSERT(FALSE);
        }
    }

    SAFE_RELEASE(pManager);
    SAFE_RELEASE(pAudioVolume);

    return true;
}
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 #4
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();
}