win7音频 audio service调节单个程序音量控制
以下代码的作用是控制当前程序的声音,并将其他程序的声音关闭。
代码如下:
[cpp] view plain copy
- BOOL SetCurrentProcessVolume(DWORD dwVolume,BOOL IsMixer/*TRUE*/)
- {
- HRESULT hr <span style="white-space:pre"> </span>= 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);
- 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);
- }
- 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;
- if (pid == GetCurrentProcessId())
- {
- pSimplevol->SetMasterVolume((float)dwVolume/100, NULL);
- }
- else
- {
- pSimplevol->SetMasterVolume((float)0/100, NULL);
- }
- }
- }
- SAFE_RELEASE(m_pEnumerator);
- return TRUE;
- }
说明:
1.IMMDeviceEnumerator::EnumAudioEndpoints
EnumAudioEndpoints 方法用于生成符合指定标准的终端设备的一个合集。
第一个参数为枚举值,包括以下三个:
eRender:音频渲染流,从应用程序到设备终端的流。设置为eRender,获取播放设备。
eCapture:音频捕捉流,从设备终端到应用程序的流。设置为eCapture,获取录音设备。
eAll:获取以上两种。
第二个参数也是枚举值,包括以下几个:
DEVICE_STATE_ACTIVE:当前激活的设备
DEVICE_STATE_DISABLED:当前禁用的设备
DEVICE_STATE_NOTPRESENT:不存在的终端设备,即已经中系统中删除的设备,或者在设备管理器中禁用的设备。
DEVICE_STATE_UNPLUGGED:未插电的设备。
第三个参数,指向设备集合对象的接口。
2.用GetCount函数获取设备总数量
3.用Item函数索引单个设备。
4.用获取到的设备指针,激活应用程序音量管理指针。
Activate函数
第一个参数:设备标示符。是对GUID的一个引用,标示请求激活的接口。调用者将使用这个接口与COM对象通信。
第二个参数:用于管理将要执行的对象,可以将多个枚举值相或来设置,也可以使用CLSCTX_ALL,可以通过指定CLSCTX_ALL避免上下文的限制。
第三个参数:当用来激活设备的IAudioClient、IAudioEndpointVolume IAudioMeterInformation IAudioSessionManager或IDeviceTopology这些接口时,设置为NULL。
第四个参数:指向指定接口参数地址的指针。
5.用GetSessionEnumerator获取IAudioSessionEnumerator指针。其中包含了所有应用程序音量的控制指针。同样可以用GetCount来获取到总数。
6.用GetSession获取IAudioSessionControl指针。以上文的Item函数相似。
7.用QueryInterface通过IAudioSessionControl指针查询到IAudioSessionControl2指针,根据第一个参数设置的IID的值去查询相应的指针。
8.获取到该应用程序的PID
9.用QueryInterface获取音量控制指针
10.如果当前应用程序的PID与IAudioSessionControl2指针获取到的PID相等,则设备当前应用程序的音量。自然,也可以指定PID来控制特定应用程序的音量。
win7音频 audio service调节单个程序音量控制相关推荐
- Windows 7单个程序音量控制
以下代码的作用是控制当前程序的声音,并将其他程序的声音关闭. 代码如下: BOOL SetCurrentProcessVolume(DWORD dwVolume,BOOL IsMixer/*TRUE* ...
- c语言m62429音量控制程序,音量控制M62446的驱动C程序
音量控制M62446的驱动C程序音量控制M62446m62446 pdf //------------------------------------------------------------- ...
- android 声卡 音量控制,android audio 音量调节
这次的分析是从setting设置开始,进入声音设置,然后进入音量设置! 先上传上来,后期进行整理吧 调用流程: -------------------------------------------- ...
- 【Linux】Linux 怎么调节音频的扬声器和麦克风的音量
Linux 怎么调节音频的扬声器和麦克风的音量 Linux一般有alsamixer和amixer两个命令 alsamixer带有界面调节功能 而amixer可以通过命令进行设置从而达到调节 按F2 系 ...
- android音频系统(4):AudioService之音量管理
前言:AudioService这个系统服务包含或者使用了几乎所有与音频有关的内容,AudioService是音频系统在java层的大本营: android音频系统,分为两个部分:数据流和策略: 数据流 ...
- android音量界面,android 音量调节以及媒体音量界面
播放音乐类软件,用户在调节音量的时候,弹出系统的媒体音量界面,与项目的设计风格格格不入. 于是,调节音量,同时显示自己定义的媒体音量界面很有必要. 1)调整音乐音量 private AudioMana ...
- win7 系统下实现音量控制
win7对audio做了改进,除了有总音量控制, 每个程序又有自己的音量控制.通常XP下控制音量的函数只能控制自己的音量而无法控制主音量.(比如函数 :mixerGetLineInfo .mixerG ...
- Android9 framework 按键音调用流程及自定义按键音(替换原生按键音)和调节按键音音量的方法
一.按键音调用流程 摘要:按键音播放的总体逻辑是先找到系统中按键音的资源,然后调用SoundPool.load让系统加载音频资源,加载成功后在onLoadComplete回调中会返回一个非0的soun ...
- Nubia Z5S官方4.4 UI2.0音频Audio部分简单分析(也适用于其它8974/8064机型)以及降低破音出现几率的方法...
转载请注明出处和网址链接: http://blog.csdn.net/syhost/article/details/31419749 此篇本是在Z5S的官方4.4内測版出来时写的, 主要是看到其在au ...
最新文章
- Netflix 官方技术博客:个性化分发与推荐,走在前列的 Netflix 是怎么做的?
- linux 信号灯超时时间到,急!!信号灯超时时间已到错误又出来了!!!!
- Centos MySql基础
- 2021-08-10 HDFS Web报错Couldn‘t preview the file.
- Rsync、Inotify-tools简介
- 呼叫转移流程分析(一)
- 电磁铁轭铁和极头收缩角
- FlowNet 2.0的阅读笔记
- android手机之-------64位操作系统 与 64位处理器
- 磁盘smart错误日志重点关注信息
- 启用Win11原生支持的DoH(DNS over HTTPS)和配置自定义的DoH服务
- 实战 | flink sql 实时 TopN
- 华炎魔方平台基本分析
- 现场直击汶川地震都江堰灾情(图)
- iOS对接Facebook:登录,分享,邀请,游戏排行榜功能
- 通联支付“当面付”有哪些优势?
- 莱宝真空泵品牌中国华东区一级授权
- 我的世界服务器给个人修改前缀,我的世界怎么给名字添加前后缀_给玩家添加名字前后缀方法介绍_3DM网游...
- 软件工程 瀑布模型、原型模型、喷泉模型和V模型的优缺点及适用场景
- jarjar:方便的java打包工具