gpt4 book ai didi

c - 掌握Windows 10的声音管理

转载 作者:太空宇宙 更新时间:2023-11-04 01:49:27 27 4
gpt4 key购买 nike

我需要在 Windows 10 中更改主音量,但我只能更改我的应用程序的音量。有人知道如何在 C 中做到这一点吗?

也许使用 Windows API?

最佳答案

自 Windows Vista 以来,我们有:

  1. 流量
  2. 简单卷
  3. channel 流量
  4. 端点量

您需要更改 endpoint volume .所以你需要 IAudioEndpointVolume界面。

下面代码中的步骤是获取一个IMMDeviceEnumerator。使用枚举器,您可以使用 GetDefaultAudioEndpoint 获取默认音频端点。在IAudioEndpointVolume界面中找到Get/SetMasterVolumeLevel

以下示例代码摘自Larry Osterman's blog .请注意,没有错误检查。

#include <stdio.h>
#include <windows.h>
#include <tchar.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>

void Usage()
{
printf("Usage: \n");
printf(" SetVolume [Reports the current volume]\n");
printf(" SetVolume -d <new volume in decibels> [Sets the current default render device volume to the new volume]\n");
printf(" SetVolume -f <new volume as an amplitude scalar> [Sets the current default render device volume to the new volume]\n");

}
int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hr;
bool decibels = false;
bool scalar = false;
double newVolume;
if (argc != 3 && argc != 1)
{
Usage();
return -1;
}
if (argc == 3)
{
if (argv[1][0] == '-')
{
if (argv[1][1] == 'f')
{
scalar = true;
}
else if (argv[1][1] == 'd')
{
decibels = true;
}
}
else
{
Usage();
return -1;
}

newVolume = _tstof(argv[2]);
}

// -------------------------
CoInitialize(NULL);
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;

// -------------------------
float currentVolume = 0;
endpointVolume->GetMasterVolumeLevel(&currentVolume);
printf("Current volume in dB is: %f\n", currentVolume);

hr = endpointVolume->GetMasterVolumeLevelScalar(&currentVolume);
printf("Current volume as a scalar is: %f\n", currentVolume);
if (decibels)
{
hr = endpointVolume->SetMasterVolumeLevel((float)newVolume, NULL);
}
else if (scalar)
{
hr = endpointVolume->SetMasterVolumeLevelScalar((float)newVolume, NULL);
}
endpointVolume->Release();

CoUninitialize();
return 0;
}

关于c - 掌握Windows 10的声音管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46905861/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com