C++设置音量合成器应用音量

先说一下大概思路,然后再贴出代码:
首先,获取扬声器音量,根据扬声器音量和需要设置的音量计算一个音量值(例如,扬声器50%,需要设置当前程序音量为50%,所以最终设置音量合成器中的数值为50% * 50% = 25%)

然后,设置其他程序静音,在设置静音之前需要保存音量值
设置当前程序音量

最后,在播放完声音之后,还原其他程序音量,这个时候要用到第二步保存的音量值。
下面给出每个步骤代码,以下代码本人亲测有效

// 获取扬声器音量
void GetSpeakerAudio()
{
	 CComPtr<IMMDeviceEnumerator> pIMMEnumerator = NULL;
	 CComPtr<IMMDevice> pIMMDeivce = NULL;
	 CComPtr<IAudioEndpointVolume> pIAudioEndpointVolume = NULL;

	 HRESULT hr = S_OK;
	 hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator), (void**)&pIMMEnumerator);
	 if(SUCCEEDED(hr))
	 {
		 hr = pIMMEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pIMMDeivce);
		 if(SUCCEEDED(hr))
		 {
			 hr = pIMMDeivce->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL, (void**)&pIAudioEndpointVolume);
			 if(SUCCEEDED(hr))
			 {
				 hr = pIAudioEndpointVolume->GetMasterVolumeLevelScalar(&m_fVolum);
			 }
		 }
	 }
}

//dwVolume:可以忽略,IsRecover:true恢复其他程序音量,false是设置当前程序音量
BOOL SetCurrentProcessVolume(DWORD dwVolume,BOOL IsRecover)  
{  
	if(!IsRecover)
		m_mapAppVolum.clear();

	HRESULT hr = S_OK;  
	IMMDeviceCollection *pMultiDevice       = NULL;  
	IMMDevice *pDevice              = NULL;  
	IAudioSessionEnumerator *pSessionEnum       = NULL;  
	IAudioSessionManager2 *pASManager       = NULL;  
	IMMDeviceEnumerator *m_pEnumerator      = NULL;  
	const IID IID_ISimpleAudioVolume        = __uuidof(ISimpleAudioVolume);  
	const IID IID_IAudioSessionControl2     = __uuidof(IAudioSessionControl2);  
	GUID m_guidMyContext;
	CoInitialize(NULL);  
	hr = CoCreateGuid(&m_guidMyContext);  
	if(FAILED(hr))  
		return FALSE;  
	// Get enumerator for audio endpoint devices.  
	hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),  
		NULL, CLSCTX_ALL,  
		__uuidof(IMMDeviceEnumerator),  
		(void**)&m_pEnumerator);  
	if(FAILED(hr))  
		return FALSE;  

	/*if (IsMixer)  
	{  
		hr = m_pEnumerator->EnumAudioEndpoints(eRender,DEVICE_STATE_ACTIVE, &pMultiDevice);  
	}   
	else  
	{  
		hr = m_pEnumerator->EnumAudioEndpoints(eCapture,DEVICE_STATE_ACTIVE, &pMultiDevice);  
	} */ 
	hr = m_pEnumerator->EnumAudioEndpoints(eRender,DEVICE_STATE_ACTIVE, &pMultiDevice);  
	if(FAILED(hr))  
		return FALSE; 

	UINT deviceCount = 0;  
	hr = pMultiDevice->GetCount(&deviceCount);        
	if(FAILED(hr))  
		return FALSE;    

	if((int)dwVolume < 0)  
		dwVolume = 0;  
	if((int)dwVolume > 100)  
		dwVolume = 100;  
	for (UINT ii=0; ii<deviceCount; ii++)  
	{  
		pDevice = NULL;        
		hr = pMultiDevice->Item(ii,&pDevice);      
		if(FAILED(hr))  
			return FALSE;   
		hr = pDevice->Activate(__uuidof(IAudioSessionManager),CLSCTX_ALL, NULL,(void**)&pASManager);  

		if(FAILED(hr))  
			return FALSE;   
		hr = pASManager->GetSessionEnumerator(&pSessionEnum);  
		if(FAILED(hr))  
			return FALSE;   
		int nCount;  
		hr = pSessionEnum->GetCount(&nCount);  
		for (int i = 0; i < nCount; i++)   
		{  
			IAudioSessionControl *pSessionCtrl;  
			hr = pSessionEnum->GetSession(i, &pSessionCtrl);  
			if (FAILED(hr))   
				continue;  
			IAudioSessionControl2 *pSessionCtrl2;  
			hr = pSessionCtrl->QueryInterface(IID_IAudioSessionControl2, (void **)&pSessionCtrl2);  
			if(FAILED(hr))  
				continue;  
			ULONG pid;  
			hr = pSessionCtrl2->GetProcessId(&pid);  
			if (FAILED(hr))  
				continue;  

			ISimpleAudioVolume *pSimplevol;  
			hr = pSessionCtrl2->QueryInterface(IID_ISimpleAudioVolume, (void **)&pSimplevol);  
			if (FAILED(hr))   
				continue;
			ULONG currentId = GetCurrentProcessId();
			if (pid == currentId)  
			{                 
				//pSimplevol->SetMasterVolume((float)dwVolume/100, NULL);  
			}  
			else  
			{  
				if(IsRecover)
				{
					auto iter = m_mapAppVolum.find(currentId);
					if(iter != m_mapAppVolum.end())
					{
						pSimplevol->SetMasterVolume(iter->second,NULL);
					}
				}
				else
				{
					float fLevel;
					pSimplevol->GetMasterVolume(&fLevel);
					m_mapAppVolum.insert(make_pair(currentId, fLevel));
					pSimplevol->SetMasterVolume((float)0/100, NULL); 
				}
			}  

		}         
	}    
	m_pEnumerator->Release();
	return TRUE;  
} 
//设置当前程序音量
void SetApplicationVolume(int size)
{
	CComPtr<IMMDeviceEnumerator >	pIMMEnumerator = NULL;	//主要用于枚举设备接口
	CComPtr<ISimpleAudioVolume>	pRenderSimpleVol = NULL;	//扬声器的会话音量控制接口
	HRESULT hr = S_OK;
	hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator), (void**)&pIMMEnumerator); 
	if(SUCCEEDED(hr))
	{
		CComPtr<IMMDevice> pIMMDeivce = NULL;
		hr = pIMMEnumerator->GetDefaultAudioEndpoint(eRender,eConsole,&pIMMDeivce);
		if(SUCCEEDED(hr))
		{
			CComPtr<IAudioSessionManager> pSessionManager = NULL;
			hr = pIMMDeivce->Activate(__uuidof(IAudioSessionManager), CLSCTX_INPROC_SERVER, NULL, (void **)(&pSessionManager));
			if(SUCCEEDED(hr))
			{
				hr = pSessionManager->GetSimpleAudioVolume(NULL, FALSE, &pRenderSimpleVol);
				if(SUCCEEDED(hr))
				{
					float fLevel = (float)size/100;
					fLevel += 0.000001;
					if(fLevel >= 1.000)
						fLevel = 1.000;
					hr = pRenderSimpleVol->SetMasterVolume(fLevel, NULL);
				}
			}
		}
	}
}
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: C Mic 是指麦克风的音量调节。在使用麦克风时,我们经常会需要调整音量大小以适应不同的环境和需求。 首先,在调节 C Mic 音量之前,我们需要确定使用的是内部麦克风还是外部插入的麦克风。如果是内部麦克风,我们可以直接通过操作系统或设备的设置来进行调节。例如,对于手机和电脑等设备,可以进入音频设置音量控制面板,找到麦克风选项,并通过滑块或按钮来增加或减小音量。 如果是外部插入的麦克风,我们需要通过调节麦克风本身的音量控制或使用额外的音频设备来进行操作。常见的麦克风音量控制方式有旋钮、滑块或按钮。我们可以根据麦克风的型号和说明书来找到相应的音量调节方法。 在进行 C Mic 音量调节时,需要注意以下几点。首先,调节麦克风音量时要谨慎,尽量保持在合适范围内,避免出现音频失真或噪音问题。其次,根据实际需求,我们可以根据具体场景和应用来调整麦克风音量,确保音频的清晰度和质量。最后,如果发现调节后仍然存在问题,我们可以尝试检查连接线是否松动或更换麦克风设备。 总之,C Mic 音量调节是为了保证在使用麦克风时能够获取到清晰的声音,并根据不同需求进行灵活调整。我们可以通过操作设备的设置或调节麦克风本身的音量控制来实现。 ### 回答2: C mic 音量调节指的是调节麦克风的音量,其中 "C" 表示 "Change",意为改变或调节的意思。麦克风是一种将声音转换成电信号的设备,在各种场合中被广泛使用,包括职业演讲、语音识别、语音通话等。 要调节麦克风的音量,可以参考以下步骤: 1. 检查麦克风的连接:确保麦克风正确连接到电脑、音频设备或扬声器。确认插头是否插入正确的麦克风插孔,并紧固好。 2. 调整音量控制器:根据不同的设备,麦克风通常有一个音量控制器。它可以是物理按钮、旋钮或软件控制面板。根据麦克风的类型和设备的不同,可通过这些控制器来调节麦克风的音量。 3. 设置操作系统的麦克风音量:在电脑或移动设备上,可以通过操作系统的设置来调节麦克风音量。在 Windows 操作系统中,可以打开"声音设置",找到"录音"选项卡,并选择麦克风设备。然后通过滑动音量调节杆来改变麦克风的音量大小。在 iOS 或 Android 设备上,可以打开设置,找到"声音"或"声音设置",进而调整麦克风的音量。 4. 测试麦克风音量:调节麦克风音量后,建议进行测试以确保音量调整合适。可以尝试录制一段语音或使用语音通话软件,进行测试。 总的来说,调节 C mic 音量是一个简单的过程,根据不同设备的具体情况,可以通过麦克风的音量控制器和操作系统的设置来调节麦克风音量。 ### 回答3: C mic音量调节是指对麦克风的音量进行调整。在实际操作中,我们可以通过以下几种方式来调节C mic音量。 首先,我们可以使用操作系统提供的音量控制功能。在Windows系统中,我们可以通过系统托盘上的音量图标或者进入控制面板的声音设置来调节麦克风的音量。在调节界面中,通常会有一个滑动条或者百分比表示麦克风的音量,我们可以通过拖动滑动条或者更改百分比的方式来调整音量大小。同样,我们也可以通过快捷键进行音量调节,默认情况下,通常是通过F1至F12的功能键中的某个键来控制麦克风音量的增减。 其次,如果我们使用的是外部麦克风,它通常会有自身的音量调节功能。我们可以通过查看麦克风设备的说明书或者网上搜索来了解具体的操作方法。一般情况下,麦克风上会有一个或多个旋钮,我们可以通过旋转来调节音量大小。这些旋钮一般会标有“Gain”或“Volume”的字样。 另外,一些音频软件也提供了音量调节的功能。例如,在一些语音通信软件或者音频编辑软件中,我们可以通过软件的设置界面来调节麦克风的音量。一般来说,这些软件会把音量调节作为一个独立的参数,并提供相应的滑动条或者百分比选择来进行调节。 总结起来,C mic音量调节包括通过操作系统提供的音量控制功能、外部麦克风自身的调节功能以及音频软件的设置界面来进行。我们可以根据需求选择合适的调节方式来调整麦克风的音量大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值