赞
踩
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
- #endif
-
- int _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;
- }

法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 once
-
-
- interface 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 IPolicyConfig
-
- virtual 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 IPolicyConfig
-
- virtual HRESULT STDMETHODCALLTYPE SetProcessingPeriod(
- PCWSTR,
- PINT64
- ); // not available on Windows 7, use method from IPolicyConfig
-
- virtual HRESULT STDMETHODCALLTYPE GetShareMode(
- PCWSTR,
- struct DeviceShareMode *
- ); // not available on Windows 7, use method from IPolicyConfig
-
- virtual HRESULT STDMETHODCALLTYPE SetShareMode(
- PCWSTR,
- struct DeviceShareMode *
- ); // not available on Windows 7, use method from IPolicyConfig
-
- 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
- ); // not available on Windows 7, use method from IPolicyConfig
- };

- #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;
- }
这里是自己添加的设置默认输出设备函数(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 default
- CString 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();
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。