DirectSound---输出设备基本操作(枚举、查询等)

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. 输出设备操作

在DirectSound中,四个装置对象就代表八个音频设备,播放设备对象对应播放设备,输入设备对象对应输入设备。因为DirectSound使用COM公约,由此各类设备对象都用接口来代表。这里IDirectSound8那个接口就象征了三个输出设备对象,应用程序可以对同一个音频设备创建几个2020欧洲杯官方投注-2020欧洲杯官方投注网址,设施对象来进行音频输出操作。旧版本的DirectSound使用的是IDirectSound接口,比较前面二个差了一些效果。

2. 运转结果

此次咱们用GUI分界面来展现实例运营的结果(出于方便思量,现在小编会用调节台来彰显示例),为防守顾客误操作更换展现的数目本人将多数控件都disable了:

2020欧洲杯官方投注-2020欧洲杯官方投注网址 1

总体代码见链接。

  • 广播音频低延迟
  • 硬件财富调节
  • 同时播放多个声音。
  • 调节硬件缓冲区的利用优先级(DirectSound使用缓冲区来播音音频)。
  • 模拟3D节奏景况。
  • 动态改造音响效果(回声、和声等)。
  • 抓获音频输入设备声音位wav(多为PCM数据,未经压缩)。

DirectSound是DirectX组件之风度翩翩,提供了对音频设备的捕获和播音技能,同一时间它也是唯后生可畏多少个援救Xp系统的音频技能之风度翩翩。 DirectSound首要有以下特点:

优点:

  • 不得不播放wav音频文件。

那边大家说说设备操作那大器晚成道。

缺点:

1.4 设备能力

HRESULT IDirectSound8::GetCaps(LPDSCAPS pDSCaps)

现在和过去很分歧样的韵律播放设备具有差异的手艺,DirectSound允许我们询问设备的力量:

  • 是或不是通过Microsoft认证。
  • 知道还是不知道帮忙最小最大采集样板率之间的具有采集样本率。
  • 当未有DirectSound驱动时模拟驱动。
  • 次第缓冲区格式(拾陆个人、8位)。
  • 前后相继缓冲区声道协理(单声道、立体声即多声道)。
  • 不精准的多少(有个别声卡不扶助):
    • 缓冲区(静态缓冲区、流缓冲区、3D缓冲区)最大数、空闲数。
    • 声卡上的总内部存款和储蓄器数量、空闲内部存款和储蓄器数量、最大空闲块大小,

大家传给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)

播放器配置只好是以下之风流浪漫:

  • DSSPEAKER_5POINT1_SURROUNDDSSPEAKER_5POINT1_BACK: 家庭影院配置,5个围绕扬声器,1个低音炮。
  • DSSPEAKER_DIRECTOUT:间接播放。
  • DSSPEAKER_HEADPHONE:头戴式耳麦。
  • DSSPEAKER_MONO:单声道扬声器。
  • DSSPEAKER_QUAD:4声道播放器。
  • DSSPEAKER_STEREO:立体声播放器。
  • DSSPEAKER_SURROUND:环绕播放器。
  • DSSPEAKER_7POINT1_WIDEDSSPEAKER_7POINT1_SURROUND:家庭影院配置,7个围绕扬声器,1个低音炮。

即使MSDN文档未有写清楚,不过经过查以上宏定义我们开掘它们是按大小顺序定义的,因而不也许由此OSportage|来含有多种只怕,例子中即便调用出错直接再次回到TRUE表示大家继续枚举设备并连任合检查询这一个设备技巧:

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

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.3 设置设备对象优先级

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

在使用设备对象创制缓冲区(用来捕获、播放音频)以前,我们须要安装设备对象的合营等第。那几个合营等级相当于客户对设施开展操作的优先级,分为:

  • DSSCL_EXCLUSIVE: 互斥等第。对于DirectX8.0原先版本,仅播放当下接纳的节奏数据,其余应用的响动不会被广播;对于DirectX8.0级之后版本,同DSSCL_PRIORITY版本。

  • DSSCL_NORMAL: 普通等级,这种等第下的应用程序具备最坦荡的多职分和财富分享展现,不过这种使用不可能改造主缓冲区音频数据格式,输出音频格式被限制为8位数据。在DirectSound中,次缓冲区用来填充应用程序须求播放的鸣响,主缓冲区会对八个次缓冲区(也许是本金和利息用的,也大概是任何应用的)进行混音,然后用声卡输出播放。

  • DSSCL_PRIORITY: 优先等第,可以改动主缓冲区数据格式。
  • DSSCL_WRITEPRIMARY:写主缓冲区等第,应用能够一向写入主缓冲区,此时怀有次缓冲区不会被广播(尽管设备的驱动是DirectSound模拟出来的,则无法设置该等级)。

小心该函数须要传入多个窗口句柄,因为大家明日只介绍DirectSound的基本操作,笔者向来传入桌面窗口的句柄并设固定DSSCL_NORMAL优先级:

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

本文由2020欧洲杯官方投注-2020欧洲杯官方投注网址发布于win7,转载请注明出处:DirectSound---输出设备基本操作(枚举、查询等)

相关阅读