win7 系统下实现音量控制
2012-12-25 15:05
603 查看
win7对audio做了改进,除了有总音量控制, 每个程序又有自己的音量控制。通常XP下控制音量的函数只能控制自己的音量而无法控制主音量。(比如函数 :mixerGetLineInfo 、mixerGetLineControls 等). 所以使用这些函数无法实现音量控制的功能, 改进的做法是使用audio endpoint .
在win7下使用COM 获得 audio endpoint 从而实现音量控制demo code :
下面分别解释每一步的意义:
应用程序调用com库函数(除CoGetMalloc和内存分配函数)之前必须初始化com库。
CoInitialize 是 Windows提供的API函数,用来告诉 Windows以单线程的方式创建com对象。(CoInitializeEX是多线程方式)使用 CoInitialize 创建可以使对象直接与线程连接,得到最高的性能。CoInitialize并不装载COM 库,它只用来初始化当前线程使用什么样的套间。使用这个函数后,线程就和一个套间建立了对应关系。线程的套间模式决定了该线程如何调用COM对象,是否需要列集等。 CoInitialize ()并不会干扰客户和服务器之间的通信,它所做的事情是让线程注册一个套间,而线程运行过程中必然在此套间。
CoInitialize
和 CoUninitialize 必须成对使用在每个线程函数里。
COM中所有的类、接口、类型库都用GUID来唯一标识. GUID是一个128位的字串 .COM组件的创建,查询接口都是通过注册表进行的。有了注册表,应用程序就不需要知道组件的DLL文件名、位置,只需要根据CLSID查就可以了。
CoCreateInstance(....) // 函数内部实现
{
.......
IClassFactory*pClassFactory=NULL;
CoGetClassObject(CLSID_Object,CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (void **)&pClassFactory); //创建类厂
pClassFactory->CreateInstance(NULL,IID_IUnknown, (void**)&pUnk);//创建com对象
pClassFactory->Release();
........
}
到这里就可以使用这个com实例了 ............
// 第一个参数代表设备 ,eRender是输出设备,eCapture是输入设备。
//第二个参数是erole ,用来指定具体设备。有三个选择 :eConsole eMultimedia eCommunications .详情看这里
http://technet.microsoft.com/zh-cn/library/dd371401
//生成一个指定类型的com接口实例
//___uuidof : 用来获得一个接口的ID .
在win7下使用COM 获得 audio endpoint 从而实现音量控制demo code :
HRESULT hr = S_OK; hr = CoInitialize(NULL); //保留参数,必须为NULL GUID g_guidMyContext = GUID_NULL; hr = CoCreateGuid(&g_guidMyContext); // 生成一个GUID码 用来识别 CLSIDs and interface IMMDeviceEnumerator *deviceEnumerator = NULL; hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator), (LPVOID *)&deviceEnumerator); IMMDevice *defaultDevice = NULL; hr = deviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &defaultDevice); deviceEnumerator->Release(); deviceEnumerator = NULL; IAudioEndpointVolume *endpointVolume = NULL; hr = defaultDevice->Activate(__uuidof(IAudioEndpointVolume),CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume); defaultDevice->Release(); defaultDevice = NULL; UINT uStep = 0; UINT uStepCount = 0; endpointVolume->GetVolumeStepInfo(&uStep,&uStepCount) ; // step range from 0 to*pStepCount– 1 endpointVolume->SetMasterVolumeLevel(fVolume,&g_guidMyContext) ; // in decibel endpointVolume->SetMasterVolumeLevelScalar(fVolume,&g_guidMyContext) ; endpointVolume->SetMute(0,&g_guidMyContext); //mute
下面分别解释每一步的意义:
HRESULT hr = S_OK; hr = CoInitialize(NULL); //保留参数,必须为NULL
应用程序调用com库函数(除CoGetMalloc和内存分配函数)之前必须初始化com库。
CoInitialize 是 Windows提供的API函数,用来告诉 Windows以单线程的方式创建com对象。(CoInitializeEX是多线程方式)使用 CoInitialize 创建可以使对象直接与线程连接,得到最高的性能。CoInitialize并不装载COM 库,它只用来初始化当前线程使用什么样的套间。使用这个函数后,线程就和一个套间建立了对应关系。线程的套间模式决定了该线程如何调用COM对象,是否需要列集等。 CoInitialize ()并不会干扰客户和服务器之间的通信,它所做的事情是让线程注册一个套间,而线程运行过程中必然在此套间。
CoInitialize
和 CoUninitialize 必须成对使用在每个线程函数里。
GUID g_guidMyContext = GUID_NULL; hr = CoCreateGuid(&g_guidMyContext); // 生成一个GUID码 用来识别 CLSIDs and interface
COM中所有的类、接口、类型库都用GUID来唯一标识. GUID是一个128位的字串 .COM组件的创建,查询接口都是通过注册表进行的。有了注册表,应用程序就不需要知道组件的DLL文件名、位置,只需要根据CLSID查就可以了。
IMMDeviceEnumerator *deviceEnumerator = NULL; hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator), (LPVOID *)&deviceEnumerator);
CoCreateInstance(....) // 函数内部实现
{
.......
IClassFactory*pClassFactory=NULL;
CoGetClassObject(CLSID_Object,CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (void **)&pClassFactory); //创建类厂
pClassFactory->CreateInstance(NULL,IID_IUnknown, (void**)&pUnk);//创建com对象
pClassFactory->Release();
........
}
到这里就可以使用这个com实例了 ............
IMMDevice *defaultDevice = NULL; hr = deviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &defaultDevice);
// 第一个参数代表设备 ,eRender是输出设备,eCapture是输入设备。
//第二个参数是erole ,用来指定具体设备。有三个选择 :eConsole eMultimedia eCommunications .详情看这里
http://technet.microsoft.com/zh-cn/library/dd371401
deviceEnumerator->Release(); deviceEnumerator = NULL; IAudioEndpointVolume *endpointVolume = NULL; hr = defaultDevice->Activate(__uuidof(IAudioEndpointVolume),CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume);
//生成一个指定类型的com接口实例
//___uuidof : 用来获得一个接口的ID .
defaultDevice->Release(); defaultDevice = NULL; UINT uStep = 0; UINT uStepCount = 0; endpointVolume->GetVolumeStepInfo(&uStep,&uStepCount) ; // step range from 0 to*pStepCount– 1 endpointVolume->SetMasterVolumeLevel(fVolume,&g_guidMyContext) ; // in decibel endpointVolume->SetMasterVolumeLevelScalar(fVolume,&g_guidMyContext) ; // The volume level is expressed as a normalized in the range from 0.0 to 1.0. endpointVolume->SetMute(0,&g_guidMyContext); //mute
相关文章推荐
- Linux系统桌面下实现远程控制win7
- C代码实现控制Win 7系统音量
- 用C# 控制Windows系统音量的实现方法
- 通过winform实现电脑音量控制
- 恢复系统托盘上的喇叭图标(音量控制)
- WIN7安装Oracle VM VirtualBox虚拟机,安装XP实现双系统详细图文教程!
- Python 实现控制一阶惯性系统
- javascript实现可键盘控制的抽奖系统
- android6.0系统 Doze模式(DeviceIdle)实现与控制逻辑
- 如何实现win7和VirtualBox中Ubuntu系统共享文件夹
- 在家看孩子,10分钟生成一个业务管理系统【能支持多数据库,大数据,流程审批,权限控制,即时提醒】,视频讲解详细实现步骤
- 使用tinymini210开发远程的温度监控系统,实现C#和安卓客户端显示数据和控制
- 在前后端分离的项目中,后台使用shiro框架时,怎样使用它的会话管理系统(session),从而实现权限控制
- 在Xcode当中用slider和switch控件实现音乐的开关和音量控制
- Java 实现系统权限控制思路
- win7或win8、win8.1系统下安装ubuntu实现双系统图文教程
- Win7中利用系统权限控制禁止USB设备的自动运行
- 用win7的启动菜单实现linux系统引导
- 如何实现让WIN7、Winserver2008开机不输入密码直接进入系统