1.windows音频输入设备与输出设备

1)windows中音频输入设备是指麦克风,如下图:

2)windows中音频输出设备是指扬声器,如下图:

2.有些时候,windows音频播放设备可能有多个,那么如何通过代码设置默认的音频输出设备呢?

法1:利用wave系列函数

新建windows控制台程序,加入如下代码:

#include "stdafx.h"
#include <windows.h>
#include <mmsystem.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "Winmm.lib")#ifdef UNICODE
#define tcout wcout
#else
#define tcout cout
#endifint _tmain(int argc, _TCHAR* argv[])
{int nSoundCardCount = waveOutGetNumDevs();for (int i = 0; i < nSoundCardCount; i++){WAVEOUTCAPS woc;waveOutGetDevCaps(i, &woc, sizeof(woc));tcout << woc.szPname << endl;}//waveOutMessage((HWAVEOUT)WAVE_MAPPER,WAVE_MAPPED_DEFAULT_COMMUNICATION_DEVICE,1,0);system("pause");return 0;
}

这里可以枚举出所有的播放设备,但是要设置默认的播放设备,暂时不知道怎么弄,网上说用waveOutMessage发送一个消息,但是那个消息windows中找不到,而且还是winCE的,所以只好放弃

法2:利用微软未公布的api实现

这里要用到PolicyConfig.h和SetDefaultAudioPlaybackDevice,自行添加.h文件和接口即可

1)PolicyConfig.h内容

// ----------------------------------------------------------------------------
// PolicyConfig.h
// Undocumented COM-interface IPolicyConfig.
// Use for set default audio render endpoint
// @author EreTIk
// ----------------------------------------------------------------------------#pragma onceinterface DECLSPEC_UUID("f8679f50-850a-41cf-9c72-430f290290c8")
IPolicyConfig;
class DECLSPEC_UUID("870af99c-171d-4f9e-af0d-e63df40c2bc9")
CPolicyConfigClient;
// ----------------------------------------------------------------------------
// class CPolicyConfigClient
// {870af99c-171d-4f9e-af0d-e63df40c2bc9}
//
// interface IPolicyConfig
// {f8679f50-850a-41cf-9c72-430f290290c8}
//
// Query interface:
// CComPtr<IPolicyConfig> PolicyConfig;
// PolicyConfig.CoCreateInstance(__uuidof(CPolicyConfigClient));
//
// @compatible: Windows 7 and Later
// ----------------------------------------------------------------------------
interface IPolicyConfig : public IUnknown
{
public:virtual HRESULT GetMixFormat(PCWSTR,WAVEFORMATEX **);virtual HRESULT STDMETHODCALLTYPE GetDeviceFormat(PCWSTR,INT,WAVEFORMATEX **);virtual HRESULT STDMETHODCALLTYPE ResetDeviceFormat(PCWSTR);virtual HRESULT STDMETHODCALLTYPE SetDeviceFormat(PCWSTR,WAVEFORMATEX *,WAVEFORMATEX *);virtual HRESULT STDMETHODCALLTYPE GetProcessingPeriod(PCWSTR,INT,PINT64,PINT64);virtual HRESULT STDMETHODCALLTYPE SetProcessingPeriod(PCWSTR,PINT64);virtual HRESULT STDMETHODCALLTYPE GetShareMode(PCWSTR,struct DeviceShareMode *);virtual HRESULT STDMETHODCALLTYPE SetShareMode(PCWSTR,struct DeviceShareMode *);virtual HRESULT STDMETHODCALLTYPE GetPropertyValue(PCWSTR,const PROPERTYKEY &,PROPVARIANT *);virtual HRESULT STDMETHODCALLTYPE SetPropertyValue(PCWSTR,const PROPERTYKEY &,PROPVARIANT *);virtual HRESULT STDMETHODCALLTYPE SetDefaultEndpoint(__in PCWSTR wszDeviceId,__in ERole eRole );virtual HRESULT STDMETHODCALLTYPE SetEndpointVisibility(PCWSTR,INT);
};interface DECLSPEC_UUID("568b9108-44bf-40b4-9006-86afe5b5a620")
IPolicyConfigVista;
class DECLSPEC_UUID("294935CE-F637-4E7C-A41B-AB255460B862")
CPolicyConfigVistaClient;
// ----------------------------------------------------------------------------
// class CPolicyConfigVistaClient
// {294935CE-F637-4E7C-A41B-AB255460B862}
//
// interface IPolicyConfigVista
// {568b9108-44bf-40b4-9006-86afe5b5a620}
//
// Query interface:
// CComPtr<IPolicyConfigVista> PolicyConfig;
// PolicyConfig.CoCreateInstance(__uuidof(CPolicyConfigVistaClient));
//
// @compatible: Windows Vista and Later
// ----------------------------------------------------------------------------
interface IPolicyConfigVista : public IUnknown
{
public:virtual HRESULT GetMixFormat(PCWSTR,WAVEFORMATEX **);  // not available on Windows 7, use method from IPolicyConfigvirtual HRESULT STDMETHODCALLTYPE GetDeviceFormat(PCWSTR,INT,WAVEFORMATEX **);virtual HRESULT STDMETHODCALLTYPE SetDeviceFormat(PCWSTR,WAVEFORMATEX *,WAVEFORMATEX *);virtual HRESULT STDMETHODCALLTYPE GetProcessingPeriod(PCWSTR,INT,PINT64,PINT64);  // not available on Windows 7, use method from IPolicyConfigvirtual HRESULT STDMETHODCALLTYPE SetProcessingPeriod(PCWSTR,PINT64);  // not available on Windows 7, use method from IPolicyConfigvirtual HRESULT STDMETHODCALLTYPE GetShareMode(PCWSTR,struct DeviceShareMode *);  // not available on Windows 7, use method from IPolicyConfigvirtual HRESULT STDMETHODCALLTYPE SetShareMode(PCWSTR,struct DeviceShareMode *);  // not available on Windows 7, use method from IPolicyConfigvirtual HRESULT STDMETHODCALLTYPE GetPropertyValue(PCWSTR,const PROPERTYKEY &,PROPVARIANT *);virtual HRESULT STDMETHODCALLTYPE SetPropertyValue(PCWSTR,const PROPERTYKEY &,PROPVARIANT *);virtual HRESULT STDMETHODCALLTYPE SetDefaultEndpoint(__in PCWSTR wszDeviceId,__in ERole eRole );virtual HRESULT STDMETHODCALLTYPE SetEndpointVisibility(PCWSTR,INT);  // not available on Windows 7, use method from IPolicyConfig
};

2)添加头文件和接口

#include "Mmdeviceapi.h"
#include "PolicyConfig.h"
#include "Propidl.h"
#include "Functiondiscoverykeys_devpkey.h"
HRESULT SetDefaultAudioPlaybackDevice( LPCWSTR devID )
{IPolicyConfigVista *pPolicyConfig;ERole reserved = eConsole;HRESULT hr = CoCreateInstance(__uuidof(CPolicyConfigVistaClient), NULL, CLSCTX_ALL, __uuidof(IPolicyConfigVista), (LPVOID *)&pPolicyConfig);if (SUCCEEDED(hr)){hr = pPolicyConfig->SetDefaultEndpoint(devID, reserved);pPolicyConfig->Release();}return hr;
}

3)利用上面的接口自己写函数来设置默认输出设备

这里是自己添加的设置默认输出设备函数(MFC工程)

//设置默认音频播放设备
#define  DEF_AUDIO_NAME _T("扬声器")void InitDefaultAudioDevice()
{HRESULT hr = CoInitialize(NULL);if (SUCCEEDED(hr)){IMMDeviceEnumerator *pEnum = NULL;// Create a multimedia device enumerator.hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL,CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pEnum);if (SUCCEEDED(hr)){//判断是否是默认的音频设备,是就退出bool bExit = false;IMMDevice  *pDefDevice = NULL;hr = pEnum->GetDefaultAudioEndpoint(eRender, eMultimedia,&pDefDevice);if (SUCCEEDED(hr)){IPropertyStore *pStore;hr = pDefDevice->OpenPropertyStore(STGM_READ, &pStore);if (SUCCEEDED(hr)){PROPVARIANT friendlyName;PropVariantInit(&friendlyName);hr = pStore->GetValue(PKEY_Device_FriendlyName, &friendlyName);if (SUCCEEDED(hr)){CString strTmp = friendlyName.pwszVal;if (strTmp.Find(DEF_AUDIO_NAME) != -1){bExit = true;}PropVariantClear(&friendlyName);}pStore->Release();}pDefDevice->Release();}if (bExit){pEnum->Release();return;}IMMDeviceCollection *pDevices;// Enumerate the output devices.hr = pEnum->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &pDevices);if (SUCCEEDED(hr)){UINT count;pDevices->GetCount(&count);if (SUCCEEDED(hr)){for (int i = 0; i < count; i++){bool bFind = false;IMMDevice *pDevice;hr = pDevices->Item(i, &pDevice);if (SUCCEEDED(hr)){LPWSTR wstrID = NULL;hr = pDevice->GetId(&wstrID);if (SUCCEEDED(hr)){IPropertyStore *pStore;hr = pDevice->OpenPropertyStore(STGM_READ, &pStore);if (SUCCEEDED(hr)){PROPVARIANT friendlyName;PropVariantInit(&friendlyName);hr = pStore->GetValue(PKEY_Device_FriendlyName, &friendlyName);if (SUCCEEDED(hr)){// if no options, print the device// otherwise, find the selected device and set it to be defaultCString strTmp = friendlyName.pwszVal;if (strTmp.Find(DEF_AUDIO_NAME) != -1){SetDefaultAudioPlaybackDevice(wstrID);bFind = true;}PropVariantClear(&friendlyName);}pStore->Release();}}pDevice->Release();}if (bFind){break;}}}pDevices->Release();}pEnum->Release();}}CoUninitialize();
}

需要设置哪一个输出设备,自己修改宏的内容即可

windows代码设置默认音频输出设备相关推荐

  1. 金蝶KIS专业版旗舰版 如何将物料属性中的科目代码设置默认值

    如何将物料属性中的科目代码设置默认值? 请按下列步骤操作: 1.打开[基础设置]→[核算项目]:2.单击[核算项目资料]列表下的[物料],单击工具条[修改]: 3.在[核算项目类别-修改]窗口,单击[ ...

  2. 如何在Windows中设置默认的Web浏览器

    It's not an enjoyable experience when you click a link and the wrong browser loads. To avoid this ex ...

  3. WIN10系统新升级电脑没声音+扬声器红叉+Windows“未安装任何音频输出设备“,+扬声器安装程序unkonw+电脑没有声音(外送显卡修复+BIOS放电)

    综合百度谷歌+个人奋战5小时,终于有声音了,避免了重做系统,给大家做个参考 前因 修显卡导致音频没了 2021-08-21晚上11点左右 电脑突然死机,悲催!系统开机过完点点转圈,系统黑屏进不去,键盘 ...

  4. 获取默认音频输出设备 vc_Vector 3 for Mac(音频编辑和录音软件) v3.5和谐版

    Vector 3 Mac和谐版是一款非常优秀的音频编辑软件,它经常更新,操作简单.如果您需要录制音频书籍,收音机,电视和电影的配音或者您需要记录现场钢琴音乐和编辑表演.Vector 3 Mac会成为您 ...

  5. K3 如何将物料属性中的科目代码设置默认值

    请按下列步骤操作: 1.打开[基础设置]→[核算项目]:2.单击[核算项目资料]列表下的[物料],右击核算项目修改: 3.在[核算项目类别-修改]窗口,单击[属性维护]列表下的[存货科目代码],然后单 ...

  6. Windows 10设置默认输入法为英文

    Windows 10默认是中文输入法,对于程序员来讲不是太方便,默认添加的语言里只能是添加英语[英国]等,输入法切换的时候也有点麻烦. 创建一个注册表文件,比如"win10默认英文输入法.r ...

  7. windows如何设置默认“大图标”显示

    在使用Windows10系统的时候,每次打开文件夹,其中的文件都以"详细信息"的方式显示出来,想要查看"大图标"每次都需重新设置,查看文件很不方便. 能不能每次 ...

  8. java 默认打印机_JavaScript代码 设置默认打印机!

    New Document function init() { try { var nt = new ActiveXObject("WScript.Network");//alert ...

  9. 程序代码初学者_初学者极客:在Windows 7和Vista中设置默认程序

    程序代码初学者 If you've ever installed a program and suddenly found certain file types opening with it ins ...

最新文章

  1. 5300亿NLP模型“威震天-图灵”发布,由4480块A100训练,微软英伟达联合出品
  2. 【windwos bat】批量把windows下的wav文件转为raw文件
  3. 每个程序员都应该学习使用Python或Ruby
  4. 常用计算机服务,常用计算机端口对应的服务(The commonly used computer port corresponding service).doc...
  5. adb shell命令_[Android]adb的使用
  6. python中range和arange的区别_Python3中range , arange 和linspace 的异同
  7. div图片垂直居中 如何使div中图片垂直居中
  8. day47 Pyhton 数据库Mysql 04
  9. JSP的9种基本内置组件
  10. 计算机无法预览文件,win10系统百度网盘文件无法预览的解决方法
  11. java 遍历所有文件夹名_Java遍历文件夹下所有文件并重新命名
  12. 电脑无线网卡安装不了驱动怎么办?
  13. 简易四六级成绩管理系统
  14. wordpress添加百度Ping加快百度收录
  15. BNN - 基于low-bits量化压缩的跨平台深度学习框架
  16. 最新GraphPad Prism Mac直装版(医学绘图软件)v9.4.1
  17. Android获取设备内存数据信息
  18. 制作一个简单HTML抗疫逆行者网页作业(HTML+CSS)
  19. JavaScript学习笔记之入门篇
  20. 用化学绘图软件写带括号的分子式的方法

热门文章

  1. Linux系统安全及应用-grub菜单启用密码限制10
  2. 蒲公英wifi怎么卸载干净_蒲公英WiFi广告怎么彻底删除
  3. 网络安全自学笔记04 - 路由器技术
  4. Monte Carlo Counterfactual Regret Minimization
  5. 用SurfaceView绘制正弦曲线
  6. 嵌入式linux之yocto(六)devtool往返开发
  7. 海康监控视频无插件开发3.2版本运行demo
  8. Error creating bean with name ‘sqlSessionFactory‘ defined in class path resource [applicationContext
  9. 《北京DRGs系统的研究与应用》学习笔记
  10. 分享即时通讯开发之实时音视频技术基础知识