2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > windows代码设置默认音频输出设备

windows代码设置默认音频输出设备

时间:2019-11-04 18:57:10

相关推荐

windows代码设置默认音频输出设备

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();}

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。