2

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

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

使用它的更多细节:代码在调用而不是 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,但它可能在我有挂钩之前就已经被调用了。

4

2 回答 2

1

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

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

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

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

于 2009-12-25T02:14:19.577 回答
0

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

myWaveOutOpen.pwfx.wFormatTag

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

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

于 2009-12-22T18:24:00.580 回答