DirectSound---输出设备基本操作(枚举、查询等卡塔 尔(英语:State of Qatar)

优点:

缺点:

这里我们说说设备操作这八只。

2. 周转结果

此次大家用GUI分界面来显示实例运转的结果(出于方便思考,现在笔者会用调节台来体现示例卡塔尔国,为堤防客商误操作校勘呈现的数额本身将好多控件都disable了:

图片 1

总体代码见链接。

1.1 枚举

HRESULT WINAPI DirectSoundEnumerateW(In LPDSENUMCALLBACKW pDSEnumCallback, In_opt LPVOID pContext);
typedef BOOL (CALLBACK *LPDSENUMCALLBACKW)(LPGUID, LPCWSTR, LPCWSTR, LPVOID);

笔者们因而DirectSoundEnumerateW那个函数来枚举,该函数需求传入叁个回调函数(原型见上卡塔尔国,当枚举到三个配备时该回调会被调用。如若大家想世袭枚举,供给在此个回调用中回到TRUE来告诉系统,不然重临FALSE。另二个参数pContext允许顾客传入额外的参数,传入回调函数的终极二个实参正是其风流倜傥pContext。枚举时,DirectSound会将暗许也认作八个独自的设备来对待,由此暗中认可设备会被重新枚举三回。当设备被当做暗中同意设备枚举时,它的GUID和设备描述字符串都为空,须要小心管理,这里本身直接跳过了该次枚举:

if (DirectSoundEnumerateW(enumerateCallback, nullptr) != DS_OK) {
    ...
}

BOOL CALLBACK DirectSoundBasic::enumerateCallback(LPGUID guid,
                                              LPCWSTR deviceDescription,
                                              LPCWSTR deviceDriverModule,
                                              LPVOID context)
{
    Q_UNUSED(context);

    //  if primary device, skip it
    if (guid == nullptr)        return TRUE;

    ...
}

1.2 成立设备对象

HRESULT WINAPI DirectSoundCreate8(In_opt LPCGUID pcGuidDevice, Outptr LPDIRECTSOUND8 *ppDS8, Pre_null LPUNKNOWN pUnkOuter);

调用DirectSoundCreate8函数,我们得以创设多少个道具对象,通过传播三个枚举设备时拿到的GUID,函数会返给大家多个IDirectSound8接口代表设备对象:

IDirectSound8* directSound8;
if (DirectSoundCreate8(guid, &directSound8, NULL) != DS_OK) {
    std::wcout << L"[error] DirectSoundCreate8 call error!";
    return TRUE;    //  if error, skip this device
}

1.4 设备本事

HRESULT IDirectSound8::GetCaps(LPDSCAPS pDSCaps)

今是昨非的节拍播放设备具有差别的力量,DirectSound允许大家询问设备的力量:

大家传给GetCaps二个DSCAPS结构体地址,然后系统就帮大家填充相应的多寡,调用GetCaps前需求将DSCAPS结构体的dwSize设置为DSCAPS的大小:

DSCAPS deviceCapability = { sizeof(deviceCapability) };
if (directSound8->GetCaps(&deviceCapability) != DS_OK) {
    std::wcout << L"[error] GetCaps call error!";
    return TRUE;
}

1.5 播放器配置

HRESULT IDirectSound8::GetSpeakerConfig(LPDWORD pdwSpeakerConfig)
HRESULT IDirectSound8::SetSpeakerConfig(LPDWORD pdwSpeakerConfig)

播放器配置只可以是以下之黄金年代:

虽说MSDN文书档案未有写清楚,不过经过查以上宏定义大家发掘它们是按大小顺序定义的,由此不容许通过O途观|来含有八种也许,例子中风流倜傥旦调用出错直接回到TRUE表示我们三翻五次枚举设备并继续查询那一个设备技能:

DWORD deviceSpeakerConfiguration;
if (directSound8->GetSpeakerConfig(&deviceSpeakerConfiguration) != DS_OK) {
    std::wcout << L"[error] GetSpeakerConfig call error!";
    return TRUE;
}

DirectSound是DirectX组件之生机勃勃,提供了对音频设备的抓获和播放技术,同一时候它也是唯风流浪漫多少个支持Xp系统的点子手艺之大器晚成。 DirectSound重要有以下特征:

1. 输出设备操作

在DirectSound中,二个装置对象就代表叁个音频设备,播放设备对象对应播放设备,输入设备对象对应输入设备。因为DirectSound使用COM左券,因此各类设备对象都用接口来表示。这里IDirectSound8其意气风发接口就象征了二个输出设备对象,应用程序能够对同一个音频设备创办三个设施对象来举行音频输出操作。旧版本的DirectSound使用的是IDirectSound接口,相比较后者差一些功力。

1.3 设置设备对象优先级

HRESULT IDirectSound8::SetCooperativeLevel(HWND hwnd, DWORD dwLevel)

在应用设备对象制造缓冲区(用来捕获、播放音频卡塔 尔(英语:State of Qatar)早前,大家须求设置设备对象的经济协作等第。这些合营等级也正是客户对设备开展操作的优先级,分为:

只顾该函数需求传入一个窗口句柄,因为大家今日只介绍DirectSound的基本操作,笔者一直传入桌面窗口的句柄并设固定DSSCL_NORMAL优先级:

if (directSound8->SetCooperativeLevel(GetDesktopWindow(), DSSCL_NORMAL) != DS_OK) {
    std::wcout << L"[error] SetCooperativeLevel call error!";
    return TRUE;
}