【问题标题】:Query wave format for a HWAVEOUT handle查询 HWAVEOUT 句柄的波形格式
【发布时间】:2010-12-20 17:42:20
【问题描述】:

上下文:我有一段代码知道 waveOut 句柄 (HWAVEOUT) 的值。但是代码并没有创建句柄,因此创建句柄时传递给 waveOutOpen 的 WAVEFORMATEX 是未知的。

我想找出传递给 waveOutOpen 调用的那个 WAVEFORMATEX 结构的内容。

使用 this 的更多细节:代码在调用而不是 waveOutWrite 的挂钩函数中运行。因此代码知道句柄值,但不知道句柄创建的细节。

只是为了让人们不需要查找它:
waveOutOpen 的签名是

MMRESULT waveOutOpen(
  LPHWAVEOUT phwo,
  UINT uDeviceID,
  LPWAVEFORMATEX pwfx,
  DWORD dwCallback,
  DWORD dwInstance,
  DWORD fdwOpen
);

waveOutWrite 的签名是:

MMRESULT waveOutWrite(
  HWAVEOUT hwo,
  LPWAVEHDR pwh, 
  UINT cbwh
); 

注意:我也在挂钩 waveOutOpen,但在我有挂钩之前它可能已经被调用了。

【问题讨论】:

    标签: winapi waveout waveoutwrite


    【解决方案1】:

    您无法从 wave API 获取此信息。您必须从打开 wave 设备的人那里获得它。

    您可以使用waveOutGetPlaybackRate() 获得播放速率,并且知道,您可以(理论上)通过计时播放已知大小的缓冲区所需的时间来了解单元格大小。 (0 总是静音)但是 8 位立体声最终将花费与 16 位单声道相同的时间来播放。与浮动/32 位单声道和 16 位立体声相同。

    我会说 99% 的时间 16 位立体声会是正确的答案,但是当您猜错时,结果听起来很糟糕(而且声音很大!)所以猜测可能不是一个好主意。

    您还可以使用waveOutMessage() 向波形驱动程序发送自定义消息。可能有一些 custom_query_wave_format 消息,但没有标准中定义的消息。假设打开 Wave 设备的人会跟踪他打开它的格式。

    【讨论】:

    • 好答案,+1,我会试一试。如果它适合我​​的需要,我也会很快接受。谢谢。丹。
    【解决方案2】:

    您可以访问waveOutOpen 结构的pwfx 项,就像访问任何其他结构一样。

    myWaveOutOpen.pwfx.wFormatTag
    

    或您的语言中的等效格式。

    你的问题很难理解。我不确定你想要什么...?

    【讨论】:

    • 这是一个挂钩 waveOut API 的项目的一部分,以捕获正在播放的声音。可以通过截取waveOutOpen来获取正在播放的波形的参数。但是,在某些情况下,不会捕获对 waveOutOpen 的调用(即在调用 waveOutOpen 之后发生挂钩时)。 HTH。丹
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    相关资源
    最近更新 更多