Волновой формат запроса для дескриптора HWAVEOUT - PullRequest
2 голосов
/ 26 ноября 2009

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

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

Еще несколько подробностей, где это используется: код запускается в функции ловушки, которая вызывается вместо 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, но он уже может быть вызван до того, как у меня будет перехват.

Ответы [ 2 ]

1 голос
/ 25 декабря 2009

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

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

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

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

0 голосов
/ 22 декабря 2009

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

myWaveOutOpen.pwfx.wFormatTag

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

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

...