精华内容
下载资源
问答
  • windows代码设置默认音频输出设备

    万次阅读 2017-11-24 11:14:09
    1.windows音频输入设备与输出设备 ...2.有些时候,windows音频播放设备可能有多个,那么如何通过代码设置默认的音频输出设备呢? 法1:利用wave系列函数 新建windows控制台程序,加入如下代码: #include "stdafx.h" #i

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

    这里可以枚举出所有的播放设备,但是要设置默认的播放设备,暂时不知道怎么弄,网上说用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 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
    };
    

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

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



    展开全文
  • windows系统上,设置系统默认音频输出设备。指定音频通过某一固定设备播放
  • 外部接口只能是创建adm时,设置stereo 来改变channel 不过,我实测好像没有效果,mix还是会双声道输出? 默认设置 G:\GERRIT\src\third_party\webrtc\modules\audio_device\win\audio_device_core_win.cc 实际在...

    • 外部接口只能是创建adm时,设置stereo 来改变channel
    • 不过,我实测好像没有效果,mix还是会双声道输出?

    默认设置

    • G:\GERRIT\src\third_party\webrtc\modules\audio_device\win\audio_device_core_win.cc
      在这里插入图片描述
    • 实际在AudioDeviceWindowsCore::InitPlayout 设置:

    在这里插入图片描述

    扬声器和麦克风都是混音器

    • G:\GERRIT\src\third_party\webrtc\modules\audio_device\audio_device_impl.h
      在这里插入图片描述

    InitPlayout 初始化声音输出

    int32_t AudioDeviceModuleImpl::InitPlayout() {
      RTC_LOG(INFO) << __FUNCTION__;
      CHECKinitialized_();
      if (PlayoutIsInitialized()) {
        return 0;
      }
      int32_t result = audio_device_->InitPlayout();
      RTC_LOG(INFO) << "output: " << result;
      RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.InitPlayoutSuccess",
                            static_cast<int>(result == 0));
      return result;
    }
    

    首先,初始化扬声器 InitSpeaker

    在这里插入图片描述

    • G:\GERRIT\src\third_party\webrtc\modules\audio_device\win\audio_device_core_win.cc
    int32_t AudioDeviceWindowsCore::InitSpeaker() {
      rtc::CritScope lock(&_critSect);
      RTC_LOG_T_F(LS_INFO);
      if (_playing) {
        RTC_LOG_T_F(LS_ERROR) << " is already playing now.";
        return -1;
      }
    
      if (_ptrDeviceOut == NULL) {
        RTC_LOG_T_F(LS_ERROR) << " _ptrDeviceOut is NULL.";
        return -1;
      }
    
      if (_usingOutputDeviceIndex) {
        int16_t nDevices = PlayoutDevices();
        if (_outputDeviceIndex > (nDevices - 1)) {
          RTC_LOG(LS_ERROR) << "current device selection is invalid => unable to"
                            << " initialize";
          return -1;
        }
      }
    
      int32_t ret(0);
    
      SAFE_RELEASE(_ptrDeviceOut);
      if (_usingOutputDeviceIndex) {
        // Refresh the selected rendering endpoint device using current index
        ret = _GetListDevice(eRender, _outputDeviceIndex, &_ptrDeviceOut);
      } else {
        ERole role;
        (_outputDevice == AudioDeviceModule::kDefaultDevice)
            ? role = eConsole
            : role = eCommunications;
        // Refresh the selected rendering endpoint device using role
        ret = _GetDefaultDevice(eRender, role, &_ptrDeviceOut);
      }
    
      if (ret != 0 || (_ptrDeviceOut == NULL)) {
        RTC_LOG(LS_ERROR) << "failed to initialize the rendering enpoint device";
        SAFE_RELEASE(_ptrDeviceOut);
        return -1;
      }
    
      IAudioSessionManager* pManager = NULL;
      ret = _ptrDeviceOut->Activate(__uuidof(IAudioSessionManager), CLSCTX_ALL,
                                    NULL, (void**)&pManager);
      if (ret != 0 || pManager == NULL) {
        RTC_LOG(LS_ERROR) << "failed to initialize the render manager";
        SAFE_RELEASE(pManager);
        return -1;
      }
    
      SAFE_RELEASE(_ptrRenderSimpleVolume);
      ret = pManager->GetSimpleAudioVolume(NULL, FALSE, &_ptrRenderSimpleVolume);
      if (ret != 0 || _ptrRenderSimpleVolume == NULL) {
        RTC_LOG(LS_ERROR) << "failed to initialize the render simple volume";
        SAFE_RELEASE(pManager);
        SAFE_RELEASE(_ptrRenderSimpleVolume);
        return -1;
      }
      SAFE_RELEASE(pManager);
    
      _speakerIsInitialized = true;
    
      return 0;
    }
    

    输出wav 混音

    -wav 16位采样

      // Set wave format
      Wfx.wFormatTag = WAVE_FORMAT_PCM;
      Wfx.wBitsPerSample = 16;
      Wfx.cbSize = 0;
    

    在这里插入图片描述

    支持的输出频率

      const int freqs[] = {48000, 44100, 16000, 96000, 32000, 8000};
    

    单声道设置

    在这里插入图片描述

    adm webrtc::AudioDeviceModule 默认创建

    • WebRtcVoiceEngine::Init()
    • 在这里插入图片描述
    • webrtc::AudioDeviceModule

    StereoPlayoutIsAvailable

    • G:\GERRIT\src\third_party\webrtc\modules\audio_device\win\audio_device_module_win.cc
    • 一般获取到都是Available的
      int32_t StereoPlayoutIsAvailable(bool* available) const override {
        // TODO(henrika): improve support.
        RTC_LOG(INFO) << __FUNCTION__;
        RTC_DCHECK_RUN_ON(&thread_checker_);
        *available = true;
        return 0;
      }
    
    展开全文
  •  Windows NT:包含一个以NULL结尾的字符串,如“Service Pack 3”,就表明系统上安装了最新的Service Pack。如果没有安装Service Pack,该字符串为空。  Windows 95:包含一个以NULL结尾的字符串,提供了对操作...

    一、获取设备音量

    不同系统获取音量的方法是有差别的,比如vista和win7获取音量的方式就是不同的,因此,我们应该首先获取系统的信息,然后根据系统信息,用其对应的方法获取音量。

    1、OSVERSIONINFO

    系统信息结构体

    以下结构体均用于检索或设置系统信息。

    ANIMATIONINFO
    HW_PROFILE_INFO
    MINIMIZEDMETRICS
    NONCLIENTMETRICS
    OSVERSIONINFO
    SYSTEM_INFO 

    使用说明
           在OSVERSIONINFO数据结构中包含操作系统版本信息。这些信息包括主要和次要版本号,一个内部版本号,一个平台标识符,以及操作系统的说明性文本。GetVersionEx函数将使用这个结构体。
     
    结构体原型:

    typedef struct _OSVERSIONINFO
    {
        DWORD dwOSVersionInfoSize;
        DWORD dwMajorVersion;
        DWORD dwMinorVersion;
        DWORD dwBuildNumber;
        DWORD dwPlatformId;
        TCHAR szCSDVersion[ 128 ];
    } OSVERSIONINFO;
     

    成员说明:
    1)dwOSVersionInfoSize
           以字节为单位,指定这个数据结构的大小。须在调用GetVersionEx(OSVERSIONINFO)函数之前,将这个成员设置为sizeof(OSVERSIONINFO)。
    2)dwMajorVersion
           标识操作系统的主版本号。例如,对于Windows NT 3.51版,其主版本号为3;对于Windows NT 4.0版,其主版本号为4。
    3)dwMinorVersion
           标识操作系统的次要版本号。例如,对于Windows NT 3.51版,其次要版本号为51;对于Windows NT 4.0版本,其次要版本号为0。
    4)dwBuildNumber
           Windows NT:标识操作系统的内部版本号。
    Windows 95:低位字标识操作系统数的内部版本号。高位字包含了主要和次要版本号。
    5)dwPlatformId
           标识操作系统平台。这个成员可以是下列值之一:
    6)szCSDVersion
           Windows NT:包含一个以NULL结尾的字符串,如“Service Pack 3”,就表明系统上安装了最新的Service Pack。如果没有安装Service Pack,该字符串为空。
         Windows 95:包含一个以NULL结尾的字符串,提供了对操作系统的任意补充信息。


    应用:

    OSVERSIONINFO osVer;
    	osVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    	::GetVersionEx( &osVer );
    	if( osVer.dwMajorVersion==6 )
    	{
            GetAudioOuputVolum_Vita();
        }
        else
        {
            GetAudioOuputVolum_Win7();
        }

    2、vista下获取设备音量

    int GetAudioOutputVolumn_Vista(const std::string &deviceName)
    {
        IMMDeviceEnumerator* pEnumerator;
        IMMDeviceCollection* pCollection = NULL;
        IMMDevice *pDevice = NULL;
        IPropertyStore *pProperties=NULL;  
        IAudioEndpointVolume *pVolumeAPI=NULL;  
        UINT deviceCount = 0;
    
        float fVolume = -1;
    
        CoInitializeEx( NULL , COINIT_MULTITHREADED );
    
        HRESULT hr=CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL,CLSCTX_ALL, __uuidof(IMMDeviceEnumerator),(void**)&pEnumerator);
        if (hr != S_OK)  
        {  
            printf("CoCreateInstance Failed!\n");  
            return 0;  
        }  
    
        //hr = pEnumerator->EnumAudioEndpoints(eCapture /*eRender*/, DEVICE_STATE_ACTIVE, &pCollection);
        hr = pEnumerator->EnumAudioEndpoints( eRender , DEVICE_STATE_ACTIVE , &pCollection );
        if (hr != S_OK)  
        {  
            printf("EnumAudioEndpoints Failed!\n");  
            goto releasepEnumerator;  
        }  
    
        hr = pCollection->GetCount(&deviceCount);  
        if (hr != S_OK)  
        {  
            printf("GetCount Failed!\n");  
            goto releasepCollection;  
        }  
    
        for (UINT dev=0;dev<deviceCount;dev++)  
        {  
            pDevice = NULL;  
            hr = pCollection->Item(dev,&pDevice);  
            if (hr == S_OK)  
            {  
    
                hr = pDevice->OpenPropertyStore(STGM_READ,&pProperties);  
                if (hr == S_OK)  
                {  
                    PROPVARIANT varName;  
                    PropVariantInit(&varName);  
                    hr = pProperties->GetValue(PKEY_Device_FriendlyName, &varName); 
                    if( SUCCEEDED(hr) )
                    {
                        if (varName.vt != VT_LPWSTR || 
                            (wstr2str(varName.pwszVal).find(deviceName) != 0)) //传入的值可能不完整,需要前部分匹配
                        {
                            continue;
                        }
                        hr=pDevice->Activate(__uuidof(IAudioEndpointVolume),CLSCTX_ALL,NULL,(void **)(&pVolumeAPI));  
                        if (hr==S_OK)  
                        {  
                            hr = pVolumeAPI->GetMasterVolumeLevelScalar( &fVolume );
                            if (S_OK == hr) break;
                        } 
                    }
    
                    SAFE_RELEASE(pProperties);  
                }  
    
                SAFE_RELEASE(pDevice);  
            }  
        }  
    
    releasepCollection:  
        SAFE_RELEASE(pCollection);  
    releasepEnumerator:  
        SAFE_RELEASE(pEnumerator);  
        return  fVolume*100;
    }

    3、win7下获取设备音量

    windows下主要有这几个API:

    mixerOpen和mixerClose函数用来打开和关闭混音器设备 

    mixerGetNumDevs可以确定系统中有多少混音器设备 

    mixerGetDevCaps函数可以确定混音器设备的能力 

    mixerGetLineInfo可以检索指定音频线路的信息 

    mixerGetLineControls用于检索一个或者多个与音频线路相关的控制的通用信息 

    mixerGetControlDetails用于检索与某个音频线路相关的一个控制的属性 

    mixerSetControlDetails用于设置制定控制的属性。


    int GetAudioOutputVolumn_Win7(const std::string &deviceName)
    {
        MMRESULT          rc;     // 多媒体函数返回结果变量
        HMIXER            hMixer; // 混合器设备句柄
        MIXERLINE         mxl;    // 音频线路标准状态信息结构体
        MIXERLINECONTROLS mxlc;   // 音频线路控制器集合信息结构体
        MIXERCONTROL      mxc;    // 单个音频线路控制器信息结构体
    
        // 打开混合器设备
        rc = mixerOpen(&hMixer, // 返回的设备句柄
            0,       // 单声卡的设备ID为零
            0,       // 不使用回调机制
            0,       // 回调函数参数
            0);      // MIXER_OBJECTF_MIXER宏的值,表示任选有效设备ID
    
        // 打开混合器设备无错的话,则
        if (MMSYSERR_NOERROR == rc)
        {
            // MIXERLINE 结构体变量清零
            ZeroMemory(&mxl, sizeof(MIXERLINE));
    
            mxl.cbStruct = sizeof(MIXERLINE); // 微软用此办法判断版本
            // 指出需要获取的通道,声卡的音频输出用MIXERLINE_COMPONENTTYPE_DST_SPEAKERS
            mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
    
            // 取得混合器设备的指定线路信息
            rc = mixerGetLineInfo((HMIXEROBJ)hMixer,
                &mxl,
                // 取得MIXERLINE::dwComponentType指定类型的第一个音频线路信息
                MIXER_GETLINEINFOF_COMPONENTTYPE);
    
            // 取得混合器设备的指定线路信息成功的话,则
            if (MMSYSERR_NOERROR == rc)
            {
                // MIXERCONTROL 结构体变量清零
                ZeroMemory(&mxc, sizeof(MIXERCONTROL));
    
                mxc.cbStruct = sizeof(mxc); // 微软用此办法判断版本
    
                // MIXERLINECONTROLS 结构体变量清零
                ZeroMemory(&mxlc, sizeof(MIXERLINECONTROLS));
    
                mxlc.cbStruct = sizeof(mxlc); // 微软用此办法判断版本
    
                mxlc.dwLineID = mxl.dwLineID; // 上面取得的声卡音频输出线路标识
                // 控制类型为控制音量
                mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
                mxlc.cControls = 1;          // 使用 MIXERCONTROL 结构体变量个数
                mxlc.pamxctrl = &mxc;        // MIXERCONTROL 结构体变量指针
                mxlc.cbmxctrl = sizeof(mxc); // MIXERCONTROL 结构体变量字节大小
    
                // 取得控制器信息
                rc = mixerGetLineControls((HMIXEROBJ)hMixer,
                    &mxlc,
                    MIXER_GETLINECONTROLSF_ONEBYTYPE);
    
                // 取得控制器信息成功的话,则
                if (MMSYSERR_NOERROR == rc)
                {
                    // 获取控制器中的值的音量范围:mxc.Bounds.lMinimum到mxc.Bounds.lMaximum.
                    MIXERCONTROLDETAILS        mxcd;      // 控制器的状态信息
                    MIXERCONTROLDETAILS_SIGNED volStruct; // 音量结构体变量(就一个成员量)
    
                    // MIXERCONTROLDETAILS 结构体变量清零
                    ZeroMemory(&mxcd, sizeof(mxcd));
    
                    mxcd.cbStruct = sizeof(mxcd);       // 微软用此办法判断版本
                    mxcd.dwControlID = mxc.dwControlID; // 上面取得的控制器标识
                    mxcd.paDetails = &volStruct;        // 音量结构体变量指针
                    mxcd.cbDetails = sizeof(volStruct); // 音量结构体变量字节大小
                    mxcd.cChannels = 1;                 // 取得或设置全部通道
    
                    //  获取控制器中的值的音量范围:mxc.Bounds.lMinimum到mxc.Bounds.lMaximum. 
    
                    // 获得音量值
                    rc = mixerGetControlDetails((HMIXEROBJ)hMixer,
                        &mxcd,
                        MIXER_GETCONTROLDETAILSF_VALUE);
    
                    if (MMSYSERR_NOERROR == rc)
                    {
                        long step = ( mxc.Bounds.lMaximum - mxc.Bounds.lMinimum ) /100;
    
                        int index = ( volStruct.lValue - mxc.Bounds.lMinimum) /step ;
                        printf("音量:%X", volStruct.lValue);
                        return index;
                    }
                }
            }
        }
    }

    二、设置设备音量

    设置音量和获取音量大部分代码都是相同的,就几句不一样。

    1、Vista下设置设备音量

    int SetAudioOutputVolum_Vista(int volumnIndex)
    {
        IMMDeviceEnumerator* pEnumerator;
        IMMDeviceCollection* pCollection = NULL;
        IMMDevice *pDevice = NULL;
        IPropertyStore *pProperties=NULL;  
        IAudioEndpointVolume *pVolumeAPI=NULL;  
        UINT deviceCount = 0;
    
        float fVolume = -1;
    
        CoInitializeEx( NULL , COINIT_MULTITHREADED );
    
        HRESULT hr=CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL,CLSCTX_ALL, __uuidof(IMMDeviceEnumerator),(void**)&pEnumerator);
        if (hr != S_OK)  
        {  
            printf("CoCreateInstance Failed!\n");  
            return 0;  
        }  
    
        //hr = pEnumerator->EnumAudioEndpoints(eCapture /*eRender*/, DEVICE_STATE_ACTIVE, &pCollection);
        hr = pEnumerator->EnumAudioEndpoints( eRender , DEVICE_STATE_ACTIVE , &pCollection );
        if (hr != S_OK)  
        {  
            printf("EnumAudioEndpoints Failed!\n");  
            goto releasepEnumerator;  
        }  
    
        hr = pCollection->GetCount(&deviceCount);  
        if (hr != S_OK)  
        {  
            printf("GetCount Failed!\n");  
            goto releasepCollection;  
        }  
    
        for (UINT dev=0;dev<deviceCount;dev++)  
        {  
            pDevice = NULL;  
            hr = pCollection->Item(dev,&pDevice);  
            if (hr == S_OK)  
            {  
    
                hr = pDevice->OpenPropertyStore(STGM_READ,&pProperties);  
                if (hr == S_OK)  
                {  
                    PROPVARIANT varName;  
                    PropVariantInit(&varName);  
                    hr = pProperties->GetValue(PKEY_Device_FriendlyName, &varName); 
                    if( SUCCEEDED(hr) )
                    {
                        hr=pDevice->Activate(__uuidof(IAudioEndpointVolume),CLSCTX_ALL,NULL,(void **)(&pVolumeAPI));  
                        if (hr==S_OK)  
                        {  
                            float volumnLevel = (float)volumnIndex /100;
                            hr = <span style="color:#ff6666;">pVolumeAPI->SetMasterVolumeLevelScalar( volumnLevel, NULL );</span>
                        } 
                    }
                    SAFE_RELEASE(pProperties);  
                }  
                SAFE_RELEASE(pDevice);  
            }  
        }  
    releasepCollection:  
        SAFE_RELEASE(pCollection);  
    releasepEnumerator:  
    
        SAFE_RELEASE(pEnumerator);  
        return  fVolume*100;
    }


    2、Win7下设置设备音量

    int SetAudioOutputVolum_Win7(int volumnIndex)
    {
    
        MMRESULT          rc;     // 多媒体函数返回结果变量
        HMIXER            hMixer; // 混合器设备句柄
        MIXERLINE         mxl;    // 音频线路标准状态信息结构体
        MIXERLINECONTROLS mxlc;   // 音频线路控制器集合信息结构体
        MIXERCONTROL      mxc;    // 单个音频线路控制器信息结构体
    
        // 打开混合器设备
        rc = mixerOpen(&hMixer, // 返回的设备句柄
            0,       // 单声卡的设备ID为零
            0,       // 不使用回调机制
            0,       // 回调函数参数
            0);      // MIXER_OBJECTF_MIXER宏的值,表示任选有效设备ID
    
        // 打开混合器设备无错的话,则
        if (MMSYSERR_NOERROR == rc)
        {
            // MIXERLINE 结构体变量清零
            ZeroMemory(&mxl, sizeof(MIXERLINE));
    
            mxl.cbStruct = sizeof(MIXERLINE); // 微软用此办法判断版本
            // 指出需要获取的通道,声卡的音频输出用MIXERLINE_COMPONENTTYPE_DST_SPEAKERS
            mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
    
            // 取得混合器设备的指定线路信息
            rc = mixerGetLineInfo((HMIXEROBJ)hMixer,
                &mxl,
                // 取得MIXERLINE::dwComponentType指定类型的第一个音频线路信息
                MIXER_GETLINEINFOF_COMPONENTTYPE);
    
            // 取得混合器设备的指定线路信息成功的话,则
            if (MMSYSERR_NOERROR == rc)
            {
                // MIXERCONTROL 结构体变量清零
                ZeroMemory(&mxc, sizeof(MIXERCONTROL));
    
                mxc.cbStruct = sizeof(mxc); // 微软用此办法判断版本
    
                // MIXERLINECONTROLS 结构体变量清零
                ZeroMemory(&mxlc, sizeof(MIXERLINECONTROLS));
    
                mxlc.cbStruct = sizeof(mxlc); // 微软用此办法判断版本
    
                mxlc.dwLineID = mxl.dwLineID; // 上面取得的声卡音频输出线路标识
                // 控制类型为控制音量
                mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
                mxlc.cControls = 1;          // 使用 MIXERCONTROL 结构体变量个数
                mxlc.pamxctrl = &mxc;        // MIXERCONTROL 结构体变量指针
                mxlc.cbmxctrl = sizeof(mxc); // MIXERCONTROL 结构体变量字节大小
    
                // 取得控制器信息
                rc = mixerGetLineControls((HMIXEROBJ)hMixer,
                    &mxlc,
                    MIXER_GETLINECONTROLSF_ONEBYTYPE);
    
                // 取得控制器信息成功的话,则
                if (MMSYSERR_NOERROR == rc)
                {
                    // 获取控制器中的值的音量范围:mxc.Bounds.lMinimum到mxc.Bounds.lMaximum.
                    MIXERCONTROLDETAILS        mxcd;      // 控制器的状态信息
                    MIXERCONTROLDETAILS_SIGNED volStruct; // 音量结构体变量(就一个成员量)
    
                    // MIXERCONTROLDETAILS 结构体变量清零
                    ZeroMemory(&mxcd, sizeof(mxcd));
    
                    mxcd.cbStruct = sizeof(mxcd);       // 微软用此办法判断版本
                    mxcd.dwControlID = mxc.dwControlID; // 上面取得的控制器标识
                    mxcd.paDetails = &volStruct;        // 音量结构体变量指针
                    mxcd.cbDetails = sizeof(volStruct); // 音量结构体变量字节大小
                    mxcd.cChannels = 1;                 // 取得或设置全部通道
    
                    //  获取控制器中的值的音量范围:mxc.Bounds.lMinimum到mxc.Bounds.lMaximum. 
    
                    // 获得音量值
                    rc = mixerGetControlDetails((HMIXEROBJ)hMixer,
                        &mxcd,
                        MIXER_GETCONTROLDETAILSF_VALUE);
    
                    if (MMSYSERR_NOERROR == rc)
                    {
                        long step = ( mxc.Bounds.lMaximum - mxc.Bounds.lMinimum ) /100;
                       <span style="color:#ff6666;"> volStruct.lValue = volumnIndex*step;	 // 想要设置的值  
                        rc = mixerSetControlDetails((HMIXEROBJ)hMixer,  
                            &mxcd,  
                            MIXER_SETCONTROLDETAILSF_VALUE);  
    </span>
                        if (MMSYSERR_NOERROR == rc)  
                        {  
                            return 1;
                        }  
                    }
                }
            }
        }
    }

    
    



    展开全文
  • 自动获取音频输入输出设备,选择特定设备后设置成默认自动获取音频输入输出设备,选择特定设备后设置成默认自动获取音频输入输出设备,选择特定设备后设置成默认
  • 自动获取音频输入输出设备,选择特定设备后设置成默认
  • Adobe Audition 找不到所支持的音频设备 请检查您的音频设置  解决方案:  运行regedit,打开注册表编辑器,定位到 HKEY_CLASSES_ROOT\CLSID\{AB7EE7CD-AD07-4A27-B986-C7D5A31C8098}\InprocServer32 ...

     

    Adobe Audition 找不到所支持的音频设备 请检查您的音频设置

     

    解决方案:

     

    运行regedit,打开注册表编辑器,定位到

    HKEY_CLASSES_ROOT\CLSID\{AB7EE7CD-AD07-4A27-B986-C7D5A31C8098}\InprocServer32

     

    你会发现,在Windows系统下,Audition Asio.dll的位置默认填写的是

     

    X:\users\用户名\AppData\Local\Temp\Audition Asio.dll(X是你的系统盘符,用户是指你的用户名),

     

    也就是说,它把Audition Asio.dll定位在了临时文件夹下面,这样就会找不到这个文件,报错也是在所难免的了。既然找到了症结所在,那么解决也就非常简单了:将默认的路径改为X:\Program Files\Adobe\Adobe Audition 3.0\en_us\Audition Asio.dll(或者你的安装路径)

     

    保存重启一下就行了。

     

    文章来源:刘俊涛的博客

    欢迎关注,有问题一起学习欢迎留言、评论。

    展开全文
  •  如果你用过windows的音频设备,比如播放音乐或者录音,聊天,调节麦克或者声音的大小,以及设置静音,都可以通过控制面板中的音频设置面板来调节,你对于下面的两个设置面板肯定不陌生。  播放时调节音量大小...
  • 用Mixer API函数实现音频设置

    千次阅读 2007-12-18 21:51:00
    如果你用过windows的音频设备,比如播放音乐或者录音,聊天,调节麦克或者声音的大小,以及设置静音,都可以通过控制面板中的音频设置面板来调节,你对于下面的两个设置面板肯定不陌生。 3、下面演示一下如何设置...
  • 我的windows版本是 使用钉钉视频会议的时候,发现麦克风无效 ...经过搜索,其解决方案是windows+X 设置>>>隐私>>>麦克风中,将麦克风的隐私选项打开 结果设置>>>隐私>>...
  • 关键词:Mixer函数,控制面板,音频设备调节 如果你用过windows的音频设备,比如播放音乐或者录音,聊天,调节麦克或者声音的大小,以及设置静音,都可以通过控制面板中的音频设置面板来调节,你对于下面的两个设置...
  • 模块音频 目录 什么是拱网 ... 所有模块都是免费和开源的!...该模块是您项目的简单音频设置管理。 获取github HTTPS项目URL并将其加载到Unity Package Manager窗口中 在Unity中:Windows->程序包管理器-> +->从
  • 背景描述作为一个播放器, 除了能播放视频和声音外,音量控制是绝对不能缺少的功能; 本文在音视频播放的基础上,增加对音量的控制;...获取和设置音量; DWORD GetVolume(); int SetVolume(DWORD vol);
  • 首先在Sd卡上新建一个Ringstones的文件夹 向文件内放一些MP3格式的音频文件 再将文件重命名为“.yumi”格式的文件 第 1 步: 指定功能 在应用程序清单文件中,WMAppManifest.xml,指定访问 SD 卡的ID_CAP_...
  • 三耳音频字幕设置

    2009-12-22 07:21:00
    VMware Workstation-通电-虚拟机-设置-HARDDISK-ADD-创建一个虚拟磁盘-Windows XP Professional-2.vmdk-OK 我的电脑-管理-磁盘管理-操作-重新扫描磁盘-新盘出现-选中没有初始化-右击-初始化磁盘-新建磁盘分区-扩展...
  • 内容索引:C#源码,系统相关,多媒体,声卡 VisualStudio 2008环境开发的一个C#应用程序实例,功能是实现声卡的检测及声音、音频设备属性的设置,调用的是Windows系统的音频属性面板,适合C#初级用户参考。
  • 上期我们讲解了FL Studio中音频的相关设置,今天我们来进一步讲解音频设置中的ASIO4ALL的设置,FL Studio安装包括FL Studio ASIO和第三方ASIO驱动程序ASIO4ALL,那么大家是否知道ASIO有什么优点吗? 图1:ASIO ...
  • 需求在安防行业应用中,除了在本地看到摄像机的视频和进行音频监听外,还有一个重要的功能,那就是对讲. EasyPlayerPro-win为了减轻二次开发者的工作量,将本地音频采集也进行了集成;功能特点 支持获取本地所有音频...
  • Windows XP 系统中没有音频设备,怎么办? USB免驱音箱,不许要驱动。 检查发现,服务里Windows Audio服务没有启动,启动服务设置自动启动。 系统重启后声音正常。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,026
精华内容 410
关键字:

windows音频设置