c语言声音控制大小,C语言 如何将系统音量级别设置为从0到100的标量?
我目前正在研究“音量混音器”来控制我电脑上每个程序的音量(
Windows 10).
如何将每个节目/音频会话的音量级别设置为0到100的标量?
如您所见,在下面的代码中,我找到了GetPeakValue函数,但它返回的值如0.0812654或0.021352.
我确信这些值是标量中从1.0到0.0的每个音频会话的音量.但我想要的是音量限制,你可以在Windows音频混音器中设置,例如,而不是当前级别.因此,如果我将程序音量设置为50%,我想要一个像0.5的值.
在第二个函数(getVolume)中,您将看到我已经在0-100标量中获得了主卷,但是端点设备已经具有标量级别的函数.所以我至少需要相同的函数或计算,以便为每个音频会话获得这样的标量.
void getSessions() {
CoInitialize(NULL);
IMMDeviceEnumerator *pDeviceEnumerator = NULL;
IMMDevice *pDevice = NULL;
IAudioSessionManager2 *pAudioSessionManager2 = NULL;
IAudioSessionEnumerator *pAudioSessionEnumerator = NULL;
CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator), (LPVOID *)&pDeviceEnumerator);
pDeviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDevice);
pDevice->Activate(__uuidof(IAudioSessionManager2), CLSCTX_ALL, NULL, (void **) &pAudioSessionManager2);
pAudioSessionManager2->GetSessionEnumerator(&pAudioSessionEnumerator);
int nSessionCount;
pAudioSessionEnumerator->GetCount(&nSessionCount);
std::cout << "Session Count: " << nSessionCount << std::endl;
while (true) {
for (int nSessionIndex = 0; nSessionIndex < nSessionCount; nSessionIndex++) {
IAudioSessionControl *pSessionControl = NULL;
if (FAILED(pAudioSessionEnumerator->GetSession(nSessionIndex, &pSessionControl)))
continue;
IAudioMeterInformation *pAudioMeterInformation = NULL;
pSessionControl->QueryInterface(&pAudioMeterInformation);
float fPeak = NULL;
pAudioMeterInformation->GetPeakValue(&fPeak);
std::cout << "fPeak Value: " << fPeak << std::endl;
}
std::cout << "\n\n";
Sleep(1000);
}
CoUninitialize();
}
double getVolume() {
float currentVolume = 0;
CoInitialize(NULL);
IMMDeviceEnumerator *deviceEnumerator = NULL;
CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator), (LPVOID *)&deviceEnumerator);
IMMDevice *defaultDevice = NULL;
deviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &defaultDevice);
deviceEnumerator->Release();
deviceEnumerator = NULL;
IAudioEndpointVolume *endpointVolume = NULL;
defaultDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume);
defaultDevice->Release();
defaultDevice = NULL;
float fLevel;
endpointVolume->GetMasterVolumeLevel(&fLevel);
qDebug() << "FLevel: ";
qDebug() << fLevel;
endpointVolume->GetMasterVolumeLevelScalar(¤tVolume);
endpointVolume->Release();
CoUninitialize();
return (double)(currentVolume * 100);
}
好的,我找到了解决问题的方法!
我不得不在SessionControl上调用QueryInterface来访问ISimpleAudioVolume,您可以在其中使用GetMasterVolume和SetMasterVolume函数.它是0-1标量,但你可以将它乘以100得到0-100标量.如果系统的主音量为50%,如果程序音量也为50%,则输出为1,因此输出基于系统的主音量!
感谢您的每一条评论和帮助!
这里的工作代码:
void getSessions() {
CoInitialize(NULL);
IMMDeviceEnumerator *pDeviceEnumerator;
IMMDevice *pDevice;
IAudioSessionManager2 *pAudioSessionManager2;
IAudioSessionEnumerator *pAudioSessionEnumerator;
CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator), (LPVOID *)&pDeviceEnumerator);
pDeviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDevice);
pDevice->Activate(__uuidof(IAudioSessionManager2), CLSCTX_ALL, NULL, (void **) &pAudioSessionManager2);
pAudioSessionManager2->GetSessionEnumerator(&pAudioSessionEnumerator);
int nSessionCount;
pAudioSessionEnumerator->GetCount(&nSessionCount);
while (true) {
for (int nSessionIndex = 0; nSessionIndex < nSessionCount; nSessionIndex++) {
IAudioSessionControl *pSessionControl;
if (FAILED(pAudioSessionEnumerator->GetSession(nSessionIndex, &pSessionControl)))
continue;
ISimpleAudioVolume *pSimpleAudioVolume;
pSessionControl->QueryInterface(&pSimpleAudioVolume);
float fLevel;
pSimpleAudioVolume->GetMasterVolume(&fLevel);
std::cout << "fLevel Value: " << fLevel << std::endl;
}
Sleep(1000);
}
CoUninitialize();
}
c语言声音控制大小,C语言 如何将系统音量级别设置为从0到100的标量?相关推荐
- c语言循环次数控制,3 C语言 流程控制 循环 跳转
3 C语言 流程控制 循环 跳转 选择: if switch 循环 while,do while ,for ,嵌套 跳转 break goto continue 第3章流程控制 学习目标 u掌握选 ...
- c语言单精度比大小,c语言单精度和双精度的区别.pdf
c 语言单精度和双精度的区别 c 语言单精度和双精度的区别单精度是这样的格式, 1 位符号, 8 位指数, 23 位小数. 双精度是 1 位符号, 11 位指数, 52 位小数. 区别就是它所能存储的 ...
- c语言比较当前日期大小,C语言判断两个日期只差的方法
C语言判断两个日期只差的方法 尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以 ...
- C语言精度控制整形,C语言 凑算式 控制精度问题
想问一下,if语句中为什么写上*1.0之后,输出的就是对的个数29,但把*1.0删掉后,输出的个数就远大于29了? 还想讨教一下各位高手,除了这种暴力求法,还有其他的比较好的方法吗?非常感谢 /* 凑 ...
- C语言比较法排大小,c语言 比较法排序区别
匿名用户 1级 2009-10-25 回答 下面是C语言里面常用的三种比较排序方法: 一.冒泡法(起泡法) 算法要求:用起泡法对10个整数按升序排序. 算法分析:如果有n个数,则要进行n-1趟比较.在 ...
- 如何c语言看字节大小,C语言字节大小day5
计算字节大小 int, float, double 和 char 字节大小 F11运行 注解: 长度就是有几个字符,字节就是这个字符数组共有几个元素. 2.一个字节的长度为8bit,数据的长度由数据的 ...
- c语言union内存大小,C语言、C++中的union用法总结
开始的话 已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台.忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市.大家都在纠结这 ...
- c语言 switch语句大小,C语言switch语句(板式整齐)
<C语言switch语句(板式整齐)>由会员分享,可在线阅读,更多相关<C语言switch语句(板式整齐)(38页珍藏版)>请在人人文库网上搜索. 1.switch 语句,1, ...
- c语言测试时间片大小,C语言模拟实现时间片轮转算法和优先级调度算法
一.目的和要求 进程调度是处理机管理的核心内容.本实验要求用高级语言编写模拟进程调度程序,以便加深理解有关进程控制快.进程队列等概念,并体会和了解优先数算法和时间片轮转算法的具体实施办法. 二.实验内 ...
- 易语言 ftp控制html,易语言做的FTP验证系统。功能基本实现。
本帖最后由 164984654 于 2014-1-27 09:33 编辑 235736t7qruh000q0k5y5y[1].jpg (36.72 KB, 下载次数: 14) 2014-1-26 16 ...
最新文章
- 给在读研究生的一封信(强烈推荐)
- mysql数据库备份 dump_MySQL数据库备份之mysqldump
- webkit中对incomplete type指针的处理技巧
- Linux 监控命令 iostat
- JProfiler 解决 Java 服务器的性能跟踪
- 奇怪的车次,你信不信
- Java Web提交任务到Spark Spark通过Java Web提交任务
- 16.进程间的通信:管道
- ADNI数据集下载(详细)
- ORACLE计算同比环比
- Wi-Fi:802.11ac new feature Beamforming
- google 新功能 快讯
- 怎么找回手机相册里删除的照片?这些技巧不知道太亏了!
- 【电路】电容(一)——浅析大小电容的高低频滤波、并联问题
- c#往结构体里面读数据_C# 结构体和ListT类型数据转Json数据保存和读取
- AntV-G6:画直角树形图
- 非递归,不用栈实现二叉树中序遍历
- 商城业务-nginx-搭建域名访问环境一(反向代理配置)
- android多平台打包,Android美团多渠道打包Walle集成
- 多态和接口(6)——回首ADO.Net