2009-11-26 77 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