XAudio2学习三之获取输出设备信息

 XAudio2学习三之获取输出设备信息

徐冬冬

输出设备信息包括输出设备支持的音频格式、设备ID、设备名称、以及扮演角色。
音频格式:通道数、采样率、有效位、音频类型等等。
设备ID:每个设备独一无二的标识,
扮演角色:用来表明音频设备的用途,下面会详细说明。
设备名称:就是指音频输出设备的全称。打开自己的音频合成器,点击设备中的下拉按钮,可以看到所有设备以及全称。如下图:

XAudio2学习三之获取输出设备信息_第1张图片

要获取输出设备的信息,首先我们需要知道输出设备的个数,因为获取信息是通过整型index来索引的。
HRESULT GetDeviceDetails(
         UINT32 Index,
         XAUDIO2_DEVICE_DETAILS *pDeviceDetails
)
Index表示第几个设备。
pDeviceDetails包含了我们需要的设备信息。

pDeviceDetails是一个XAUDIO2_DEVICE_DETAILS类型的结构体指针。
typedef struct XAUDIO2_DEVICE_DETAILS {
    WCHAR DeviceID[256];
    WCHAR DisplayName[256];
    XAUDIO2_DEVICE_ROLE Role;
    WAVEFORMATEXTENSIBLE OutputFormat;
} XAUDIO2_DEVICE_DETAILS;
结构体中包含设备ID,名称,角色和扩展输出格式。
对于扩展输出格式:
typedef struct {
    WAVEFORMATEX Format;//输出格式
    union {
        WORD wValidBitsPerSample;
        WORD wSamplesPerBlock;
        WORD wReserved;
    }Samples;//有效位数
    DWORD dwChannelMask;//通道对应
    GUID SubFormat;//标识
} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE, *LPPWAVEFORMATEXTENSIBLE;

其中通道对应,就是指左声道、右声道等等:
XAudio2学习三之获取输出设备信息_第2张图片

数据的子格式,唯一标识,比如  KSDATAFORMAT_SUBTYPE_PCM.

typedef struct tWAVEFORMATEX {
    WORD wFormatTag;//类型
    WORD nChannels;//通道数
    DWORD nSamplesPerSec;//采样率
    DWORD nAvgBytesPerSec;//每秒钟字节数
    WORD nBlockAlign;//字节块
    WORD wBitsPerSample;//位宽
    WORD cbSize;//结构体大小
} WAVEFORMATEX, *PWAVEFORMATEX, *LPWAVEFORMATEX;
其中类型是指微软为众多压缩算法注册的标识。

设备角色:
typedef enum XAUDIO2_DEVICE_ROLE
{
    NotDefaultDevice = 0x0,//设备不用于程序的默认输出设备
    DefaultConsoleDevice = 0x1,//设备用于控制台音频程序
    DefaultMultimediaDevice = 0x2,//设备用于多媒体回放
    DefaultCommunicationsDevice = 0x4,//设备用于语音交流程序
    DefaultGameDevice = 0x8,//设备用于游戏音频
    GlobalDefaultDevice = 0xf,//上面所说的所有情况
    InvalidDeviceRole = ~GlobalDefaultDevice//不合法
} XAUDIO2_DEVICE_ROLE;


获取输出设备个数与上一篇一样,在此基础上添加获取设备信息方法:
获取结果如下:
第一个设备:
XAudio2学习三之获取输出设备信息_第3张图片

第二个设备:
XAudio2学习三之获取输出设备信息_第4张图片 XAudio2学习三之获取输出设备信息_第5张图片


完整程序:
#include "XAudio2.h"
#include <stdio.h>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
	HRESULT hr =  CoInitialize(0);//初始化COM组件
	if (FAILED(hr))
		return -1;

	IXAudio2 *pEngine = NULL;
	hr = XAudio2Create(&pEngine);//创建一个IXAudio2对象
	if (FAILED(hr))
		return -1;

	UINT uPlayer = 0;
	hr = pEngine->GetDeviceCount(&uPlayer);//获取音频输出设备个数
	if (FAILED(hr))
		return -1;

	cout << uPlayer << endl;

	XAUDIO2_DEVICE_DETAILS deviceInfo;
	for (int i = 0; i < uPlayer; i++)
	{
		pEngine->GetDeviceDetails(i, &deviceInfo);//获取设备信息
	}

	pEngine->Release();//释放资源
	CoUninitialize();//释放资源

	return 0;
}

备注:请尊重版权,转载请联系作者QQ:1245178753。

交流请加:

群名称:XAudio2 交流群

群   号:233537460


本文链接:http://blog.csdn.net/u011417605/article/details/50561691
源码下载:http://download.csdn.net/detail/u011417605/9451860


你可能感兴趣的:(XAudio2)