当前位置:   article > 正文

windows代码设置默认音频输出设备_代码 更改windows音频输入设备

代码 更改windows音频输入设备

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

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


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



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

法1:利用wave系列函数

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

  1. #include "stdafx.h"
  2. #include <windows.h>
  3. #include <mmsystem.h>
  4. #include <iostream>
  5. using namespace std;
  6. #pragma comment(lib, "Winmm.lib")
  7. #ifdef UNICODE
  8. #define tcout wcout
  9. #else
  10. #define tcout cout
  11. #endif
  12. int _tmain(int argc, _TCHAR* argv[])
  13. {
  14. int nSoundCardCount = waveOutGetNumDevs();
  15. for (int i = 0; i < nSoundCardCount; i++)
  16. {
  17. WAVEOUTCAPS woc;
  18. waveOutGetDevCaps(i, &woc, sizeof(woc));
  19. tcout << woc.szPname << endl;
  20. }
  21. //waveOutMessage((HWAVEOUT)WAVE_MAPPER,WAVE_MAPPED_DEFAULT_COMMUNICATION_DEVICE,1,0);
  22. system("pause");
  23. return 0;
  24. }

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

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

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

1)PolicyConfig.h内容

  1. // ----------------------------------------------------------------------------
  2. // PolicyConfig.h
  3. // Undocumented COM-interface IPolicyConfig.
  4. // Use for set default audio render endpoint
  5. // @author EreTIk
  6. // ----------------------------------------------------------------------------
  7. #pragma once
  8. interface DECLSPEC_UUID("f8679f50-850a-41cf-9c72-430f290290c8")
  9. IPolicyConfig;
  10. class DECLSPEC_UUID("870af99c-171d-4f9e-af0d-e63df40c2bc9")
  11. CPolicyConfigClient;
  12. // ----------------------------------------------------------------------------
  13. // class CPolicyConfigClient
  14. // {870af99c-171d-4f9e-af0d-e63df40c2bc9}
  15. //
  16. // interface IPolicyConfig
  17. // {f8679f50-850a-41cf-9c72-430f290290c8}
  18. //
  19. // Query interface:
  20. // CComPtr<IPolicyConfig> PolicyConfig;
  21. // PolicyConfig.CoCreateInstance(__uuidof(CPolicyConfigClient));
  22. //
  23. // @compatible: Windows 7 and Later
  24. // ----------------------------------------------------------------------------
  25. interface IPolicyConfig : public IUnknown
  26. {
  27. public:
  28. virtual HRESULT GetMixFormat(
  29. PCWSTR,
  30. WAVEFORMATEX **
  31. );
  32. virtual HRESULT STDMETHODCALLTYPE GetDeviceFormat(
  33. PCWSTR,
  34. INT,
  35. WAVEFORMATEX **
  36. );
  37. virtual HRESULT STDMETHODCALLTYPE ResetDeviceFormat(
  38. PCWSTR
  39. );
  40. virtual HRESULT STDMETHODCALLTYPE SetDeviceFormat(
  41. PCWSTR,
  42. WAVEFORMATEX *,
  43. WAVEFORMATEX *
  44. );
  45. virtual HRESULT STDMETHODCALLTYPE GetProcessingPeriod(
  46. PCWSTR,
  47. INT,
  48. PINT64,
  49. PINT64
  50. );
  51. virtual HRESULT STDMETHODCALLTYPE SetProcessingPeriod(
  52. PCWSTR,
  53. PINT64
  54. );
  55. virtual HRESULT STDMETHODCALLTYPE GetShareMode(
  56. PCWSTR,
  57. struct DeviceShareMode *
  58. );
  59. virtual HRESULT STDMETHODCALLTYPE SetShareMode(
  60. PCWSTR,
  61. struct DeviceShareMode *
  62. );
  63. virtual HRESULT STDMETHODCALLTYPE GetPropertyValue(
  64. PCWSTR,
  65. const PROPERTYKEY &,
  66. PROPVARIANT *
  67. );
  68. virtual HRESULT STDMETHODCALLTYPE SetPropertyValue(
  69. PCWSTR,
  70. const PROPERTYKEY &,
  71. PROPVARIANT *
  72. );
  73. virtual HRESULT STDMETHODCALLTYPE SetDefaultEndpoint(
  74. __in PCWSTR wszDeviceId,
  75. __in ERole eRole
  76. );
  77. virtual HRESULT STDMETHODCALLTYPE SetEndpointVisibility(
  78. PCWSTR,
  79. INT
  80. );
  81. };
  82. interface DECLSPEC_UUID("568b9108-44bf-40b4-9006-86afe5b5a620")
  83. IPolicyConfigVista;
  84. class DECLSPEC_UUID("294935CE-F637-4E7C-A41B-AB255460B862")
  85. CPolicyConfigVistaClient;
  86. // ----------------------------------------------------------------------------
  87. // class CPolicyConfigVistaClient
  88. // {294935CE-F637-4E7C-A41B-AB255460B862}
  89. //
  90. // interface IPolicyConfigVista
  91. // {568b9108-44bf-40b4-9006-86afe5b5a620}
  92. //
  93. // Query interface:
  94. // CComPtr<IPolicyConfigVista> PolicyConfig;
  95. // PolicyConfig.CoCreateInstance(__uuidof(CPolicyConfigVistaClient));
  96. //
  97. // @compatible: Windows Vista and Later
  98. // ----------------------------------------------------------------------------
  99. interface IPolicyConfigVista : public IUnknown
  100. {
  101. public:
  102. virtual HRESULT GetMixFormat(
  103. PCWSTR,
  104. WAVEFORMATEX **
  105. ); // not available on Windows 7, use method from IPolicyConfig
  106. virtual HRESULT STDMETHODCALLTYPE GetDeviceFormat(
  107. PCWSTR,
  108. INT,
  109. WAVEFORMATEX **
  110. );
  111. virtual HRESULT STDMETHODCALLTYPE SetDeviceFormat(
  112. PCWSTR,
  113. WAVEFORMATEX *,
  114. WAVEFORMATEX *
  115. );
  116. virtual HRESULT STDMETHODCALLTYPE GetProcessingPeriod(
  117. PCWSTR,
  118. INT,
  119. PINT64,
  120. PINT64
  121. ); // not available on Windows 7, use method from IPolicyConfig
  122. virtual HRESULT STDMETHODCALLTYPE SetProcessingPeriod(
  123. PCWSTR,
  124. PINT64
  125. ); // not available on Windows 7, use method from IPolicyConfig
  126. virtual HRESULT STDMETHODCALLTYPE GetShareMode(
  127. PCWSTR,
  128. struct DeviceShareMode *
  129. ); // not available on Windows 7, use method from IPolicyConfig
  130. virtual HRESULT STDMETHODCALLTYPE SetShareMode(
  131. PCWSTR,
  132. struct DeviceShareMode *
  133. ); // not available on Windows 7, use method from IPolicyConfig
  134. virtual HRESULT STDMETHODCALLTYPE GetPropertyValue(
  135. PCWSTR,
  136. const PROPERTYKEY &,
  137. PROPVARIANT *
  138. );
  139. virtual HRESULT STDMETHODCALLTYPE SetPropertyValue(
  140. PCWSTR,
  141. const PROPERTYKEY &,
  142. PROPVARIANT *
  143. );
  144. virtual HRESULT STDMETHODCALLTYPE SetDefaultEndpoint(
  145. __in PCWSTR wszDeviceId,
  146. __in ERole eRole
  147. );
  148. virtual HRESULT STDMETHODCALLTYPE SetEndpointVisibility(
  149. PCWSTR,
  150. INT
  151. ); // not available on Windows 7, use method from IPolicyConfig
  152. };

2)添加头文件和接口

  1. #include "Mmdeviceapi.h"
  2. #include "PolicyConfig.h"
  3. #include "Propidl.h"
  4. #include "Functiondiscoverykeys_devpkey.h"

  1. HRESULT SetDefaultAudioPlaybackDevice( LPCWSTR devID )
  2. {
  3. IPolicyConfigVista *pPolicyConfig;
  4. ERole reserved = eConsole;
  5. HRESULT hr = CoCreateInstance(__uuidof(CPolicyConfigVistaClient),
  6. NULL, CLSCTX_ALL, __uuidof(IPolicyConfigVista), (LPVOID *)&pPolicyConfig);
  7. if (SUCCEEDED(hr))
  8. {
  9. hr = pPolicyConfig->SetDefaultEndpoint(devID, reserved);
  10. pPolicyConfig->Release();
  11. }
  12. return hr;
  13. }

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

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

  1. //设置默认音频播放设备
  2. #define DEF_AUDIO_NAME _T("扬声器")
  3. void InitDefaultAudioDevice()
  4. {
  5. HRESULT hr = CoInitialize(NULL);
  6. if (SUCCEEDED(hr))
  7. {
  8. IMMDeviceEnumerator *pEnum = NULL;
  9. // Create a multimedia device enumerator.
  10. hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL,
  11. CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pEnum);
  12. if (SUCCEEDED(hr))
  13. {
  14. //判断是否是默认的音频设备,是就退出
  15. bool bExit = false;
  16. IMMDevice *pDefDevice = NULL;
  17. hr = pEnum->GetDefaultAudioEndpoint(eRender, eMultimedia,&pDefDevice);
  18. if (SUCCEEDED(hr))
  19. {
  20. IPropertyStore *pStore;
  21. hr = pDefDevice->OpenPropertyStore(STGM_READ, &pStore);
  22. if (SUCCEEDED(hr))
  23. {
  24. PROPVARIANT friendlyName;
  25. PropVariantInit(&friendlyName);
  26. hr = pStore->GetValue(PKEY_Device_FriendlyName, &friendlyName);
  27. if (SUCCEEDED(hr))
  28. {
  29. CString strTmp = friendlyName.pwszVal;
  30. if (strTmp.Find(DEF_AUDIO_NAME) != -1)
  31. {
  32. bExit = true;
  33. }
  34. PropVariantClear(&friendlyName);
  35. }
  36. pStore->Release();
  37. }
  38. pDefDevice->Release();
  39. }
  40. if (bExit)
  41. {
  42. pEnum->Release();
  43. return;
  44. }
  45. IMMDeviceCollection *pDevices;
  46. // Enumerate the output devices.
  47. hr = pEnum->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &pDevices);
  48. if (SUCCEEDED(hr))
  49. {
  50. UINT count;
  51. pDevices->GetCount(&count);
  52. if (SUCCEEDED(hr))
  53. {
  54. for (int i = 0; i < count; i++)
  55. {
  56. bool bFind = false;
  57. IMMDevice *pDevice;
  58. hr = pDevices->Item(i, &pDevice);
  59. if (SUCCEEDED(hr))
  60. {
  61. LPWSTR wstrID = NULL;
  62. hr = pDevice->GetId(&wstrID);
  63. if (SUCCEEDED(hr))
  64. {
  65. IPropertyStore *pStore;
  66. hr = pDevice->OpenPropertyStore(STGM_READ, &pStore);
  67. if (SUCCEEDED(hr))
  68. {
  69. PROPVARIANT friendlyName;
  70. PropVariantInit(&friendlyName);
  71. hr = pStore->GetValue(PKEY_Device_FriendlyName, &friendlyName);
  72. if (SUCCEEDED(hr))
  73. {
  74. // if no options, print the device
  75. // otherwise, find the selected device and set it to be default
  76. CString strTmp = friendlyName.pwszVal;
  77. if (strTmp.Find(DEF_AUDIO_NAME) != -1)
  78. {
  79. SetDefaultAudioPlaybackDevice(wstrID);
  80. bFind = true;
  81. }
  82. PropVariantClear(&friendlyName);
  83. }
  84. pStore->Release();
  85. }
  86. }
  87. pDevice->Release();
  88. }
  89. if (bFind)
  90. {
  91. break;
  92. }
  93. }
  94. }
  95. pDevices->Release();
  96. }
  97. pEnum->Release();
  98. }
  99. }
  100. CoUninitialize();
  101. }

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



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/742477
推荐阅读
相关标签
  

闽ICP备14008679号