Можно ли повторно использовать буферы с аудиовходом Windows wave?

Я использую мультимедийные API Windows для записи и обработки волнового аудио (waveInOpen и друзья). Я хотел бы использовать небольшое количество буферов в циклическом режиме.

Я знаю, что вы должны использовать waveInPrepareHeader перед добавлением буфера в устройство, и что вы должны вызывать waveInUnprepareHeader после того, как волновое устройство "вернет буфер приложению" и до того, как вы освободите его.

Мой вопрос: нужно ли мне готовиться и повторно готовиться, чтобы повторно использовать буфер? Или я могу просто добавить ранее использованный буфер обратно на устройство?

Кроме того, имеет ли значение, в какой теме я это делаю? Я использую функцию обратного вызова, которая, похоже, вызывается в рабочем потоке, принадлежащем аудиосистеме. Могу ли я вызвать waveInUnprepareHeader, waveInPrepareHeader и waveInAddBuffer в этом потоке во время обратного вызова?


person Adrian McCarthy    schedule 21.11.2010    source источник


Ответы (2)


Да, по моему опыту, вам нужно каждый раз звонить «подготовиться» и «неподготовиться». По памяти возвращает ошибку, если вы пытаетесь повторно использовать один и тот же.

И вы обычно вызываете prepare и unprepare в любом потоке, в котором вы обрабатываете обратные вызовы.

person Mark Heath    schedule 21.11.2010
comment
Спасибо. Похоже, что попытка вызвать waveInUnprepare во время обратного вызова является проблемой во время waveInReset — это приводит к тупиковой ситуации. - person Adrian McCarthy; 22.11.2010
comment
да, взаимоблокировки в waveInReset (и waveOutReset) — это боль, и они зависят от того, какой у вас драйвер звуковой карты. - person Mark Heath; 22.11.2010

Когда вы создаете буферы, вызовите waveInPrepareHeader. Затем вы можете просто установить флаг prepared, прежде чем вызывать waveInAddBuffer для буфера, который был возвращен с устройства.

pHdr->dwFlags = WHDR_PREPARED;

Вы можете сделать это в потоке обратного вызова (или в обработчике сообщений).

person Han    schedule 21.11.2010
comment
В моих тестах поле dwFlags имеет значение WHDR_PREPARED даже после того, как устройство завершило работу с буфером, поэтому я точно не знаю, какое значение имеет это поле. Я полагаю, что это может варьироваться в зависимости от звукового драйвера. - person Adrian McCarthy; 24.11.2010
comment
Он также может различаться в разных версиях Windows AFAIK. Во всяком случае, у меня никогда не было проблем с вызовом waveInAddBuffer без вызовов waveInUnprepareHeader и waveInPrepareHeader. - person Han; 26.11.2010