2009-11-26 120 views
2

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

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

更多细节在何处使用:代码运行在调用的hook函数中,而不是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 ,但它可能已经被调用之前,我有一个钩子。

回答

0

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

myWaveOutOpen.pwfx.wFormatTag 

或您的语言的等效格式。

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

+0

这是为了捕获正在播放的声音而挂接waveOut API的项目的一部分。正在回放的波形的参数可以通过截取waveOutOpen获得。但是,有一种情况是waveOutOpen的调用不会被捕获(即在调用waveOutOpen之后发生挂钩)。 HTH。 Dan – 2009-12-27 13:18:27

1

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

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

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

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

+0

好的答案,+1,我会试试看。如果它适合我​​的需求,我很快也会接受它。谢谢。担。 – 2009-12-27 13:19:19