您的位置:首页 > 其它

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

2016-01-22 17:06 483 查看

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

徐冬冬

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



要获取输出设备的信息,首先我们需要知道输出设备的个数,因为获取信息是通过整型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;
    W***EFORMATEXTENSIBLE OutputFormat;
} XAUDIO2_DEVICE_DETAILS;
结构体中包含设备ID,名称,角色和扩展输出格式。
对于扩展输出格式:
typedef struct {
    W***EFORMATEX Format;//输出格式
    union {
        WORD wValidBitsPerSample;
        WORD wSamplesPerBlock;
        WORD wReserved;
    }Samples;//有效位数
    DWORD dwChannelMask;//通道对应
    GUID SubFormat;//标识
} W***EFORMATEXTENSIBLE, *PW***EFORMATEXTENSIBLE, *LPPW***EFORMATEXTENSIBLE;


其中通道对应,就是指左声道、右声道等等:



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

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



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


获取输出设备个数与上一篇一样,在此基础上添加获取设备信息方法:
获取结果如下:
第一个设备:







第二个设备:







完整程序:
#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

本文链接:/article/3704296.html
源码下载:http://download.csdn.net/detail/u011417605/9451860
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: