2009-11-26 2 views
2

Контекст: У меня есть фрагмент кода, который знает значение дескриптора waveOut (HWAVEOUT). Однако код не создавал дескриптор, поэтому WAVEFORMATEX, который был передан waveOutOpen при создании дескриптора, неизвестен.Формат волны запроса для дескриптора HWAVEOUT

Я хочу узнать содержимое этой структуры WAVEFORMATEX, которая была передана вызову waveOutOpen.

Дополнительные сведения о том, где это используется: Код работает в функции 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

Вы получаете доступ к элементу pwfx структуры waveOutOpen так же, как и к любой другой структуре.

myWaveOutOpen.pwfx.wFormatTag 

Или эквивалентный формат на вашем языке.

Ваш вопрос трудно понять. Я не уверен, чего вы хотите ...?

+0

Это часть проекта, соединяющего waveOut API для захвата воспроизводимого звука. Параметры воспроизводимой волны можно получить, перехватив waveOutOpen. Однако есть случай, когда вызов waveOutOpen не будет пойман (то есть, когда соединение происходит после вызова waveOutOpen). НТН. Dan –

1

Вы не можете получить эту информацию от волнового API. Вы должны получить его от того, кто открыл волновое устройство.

Вы можете получить скорость воспроизведения, используя waveOutGetPlaybackRate(), и зная, что вы могли (теоретически) знать размер ячейки по времени, сколько времени потребуется, чтобы сыграть буфер известного размера. (0 - это всегда тишина). Но 8-битное стерео в конечном итоге займет столько же времени, что и 16-битное моно. то же, что и с поплавковым/32-битным моно и 16-битным стерео.

Я бы сказал, что 99% времени 16 бит стерео будет правильным ответом, но если вы ошибаетесь, результат звучит очень плохо (и громко!), Поэтому угадать может быть не очень хорошая идея.

Вы также можете использовать waveOutMessage() для отправки пользовательских сообщений на волновой драйвер. Вполне возможно, что есть сообщение custom_query_wave_format, но нет такого сообщения, как определено в стандарте. Предполагается, что тот, кто открыл волновое устройство, будет следить за тем, с каким форматом он его открыл.

+0

Хороший ответ, +1, я попробую. Если это соответствует моим потребностям, я тоже скоро его приму. Благодарю. Дан. –