windows声卡统一配置(采样率等参数)

思路

  1. 首先枚举Capture、Render声卡设备;
  2. 在注册表SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\MMDevices\\Audio\\下对上述声卡设备进行属性设置,主要有两个属性键{f19f064d-082c-4e27-bc73-6882a1bb8e4c},0和{e4870e26-3cc5-4cd2-ba46-ca0a9a70ed04},0,MSDN对上述两键值结构的描述为WAVEFORMATEXTENSIBLE。通过观察发现,键值长度为48bytes,而WAVEFORMATEXTENSIBLE结构长度为40bytes,对于键值的前8bytes的具体含义暂时还没有搞清楚,通过观察不同电脑不同声卡的上述两键值,猜测前8bytes为一种标识。
  3. 本意想通过RegSetValueEx直接对键值进行修改来实现统一配置,后来发现无法获得写的权限(至少我没发现该如何提权获得写入权限)。后发现人为手动编辑注册表是可以修改写入的,通过编写注册表文件并运行也可以修改写入。故采用此法来达到声卡统一配置。

代码

//-----------------------------------------------------------
// This function enumerates all active (plugged in) audio
// rendering endpoint devices. It prints the friendly name
// and endpoint ID string of each endpoint device.
//-----------------------------------------------------------
#include <mmdeviceapi.h>
#include <FunctionDiscoveryKeys_devpkey.h>
#include <iostream>
#include <string>
#include <map>
#include <tchar.h>
#include <queue>
#include <AccCtrl.h>
#include <AclAPI.h>
#include <fstream>

using namespace std;

#define EXIT_ON_ERROR(hres)  \
	if (FAILED(hres)) { goto Exit; }
#define SAFE_RELEASE(punk)  \
	if ((punk) != NULL)  \
{ (punk)->Release(); (punk) = NULL; }

const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator);
const IID IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator);

map<string,string> render,capture,parameters;//render存放录音器的名称和CLSID,capture存放播放器的名称和CLSID,parameters存放相应设备CLSID的配置文件标识(8bytes)

#define MAX_KEY_LENGTH 255  
#define MAX_VALUE_NAME 16383  
DWORD dwType = REG_BINARY | REG_DWORD | REG_EXPAND_SZ | REG_MULTI_SZ | REG_NONE | REG_SZ;
std::queue<std::wstring> keystack;

//#define COMMAND_OUTPUT
void query(HKEY rootKey, const wchar_t* path , string clsid)
{
#ifdef COMMAND_OUTPUT
	_tprintf(TEXT("\nProcess: %s :\n"), path);
#endif

	HKEY hKey;
	if (RegOpenKeyEx(rootKey, path, 0, KEY_READ, &hKey) != ERROR_SUCCESS)
	{
		RegCloseKey(hKey);
		return;
	}

	TCHAR    achKey[MAX_KEY_LENGTH];   // buffer for subkey name  
	DWORD    cbName;                   // size of name string   
	TCHAR    achClass[MAX_PATH] = TEXT("");  // buffer for class name   
	DWORD    cchClassName = MAX_PATH;  // size of class string   
	DWORD    cSubKeys = 0;               // number of subkeys   
	DWORD    cbMaxSubKey;              // longest subkey size   
	DWORD    cchMaxClass;              // longest class string   
	DWORD    cValues;              // number of values for key   
	DWORD    cchMaxValue;          //
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值