Обработка звука: следует ли использовать DirectSound или непосредственно Win32 API?

Я делаю приложение, в котором я буду:

  • Записывайте с микрофона и обрабатывайте вход в реальном времени.
  • Воспроизведение файла MP3 (обычная песня), но управление выводом в реальном времени
  • Время от времени мне нужно будет воспроизвести дополнительные звуки поверх этой песни, но я думаю, что могу сделать это, просто добавив буферы.

Короче говоря, мне нужно иметь циклические буферы как для записи, так и для воспроизведения, и мне нужно «кормить» выходной буфер каждые 20 мс или около того новыми данными, которые вот-вот будут воспроизведены.

Я смотрел на DirectSound, и это, похоже, не очень помогает. Чтение и запись в выходные буферы кажутся очень похожими на Win32, единственное место, где это может помочь, - это воспроизведение «дополнительных звуков» поверх основной песни.

Должен ли я использовать DirectSound, или я должен сразу перейти к необработанным Windows API?
Будет ли мне DirectSound что-нибудь делать?

Заранее спасибо!


person Daniel Magliola    schedule 11.02.2009    source источник


Ответы (4)


API Directsound дает вам лучший контроль в реальном времени. Они также являются поддерживаемым способом использования звука в Windows. У меня сложилось впечатление, что API-интерфейсы win32 устарели, но я могу ошибаться.

Этот вопрос близок к вашему

https://stackoverflow.com/questions/314522/what-is-the-best-c-sound-api-for-windows

также

Является ли DirectSound лучшим уровнем абстракции звука для Windows?

и последнее, но не менее важное: это то, что Microsoft должна сказать http://msdn.microsoft.com/en-us/library/dd370784(VS.85).aspx

person Gregor Brandt    schedule 11.02.2009

Ни один? :)

Дело в том, что DirectSound является заменой waveOut, но DirectSound присоединился к DirectInput как устаревший API в Vista и заменен на ВАСАПИ. DirectSound и waveOut реализованы поверх WASAPI пользовательского пространства в Vista. В XP waveOut и DirectSound используют один и тот же Mixer API на уровне ядра.

Чтобы объединить все эти интерфейсы, взгляните на что-то вроде OpenAL, это хорошо поддерживаемый аудиостандарт, аналогичный OpenGL.

person joshperry    schedule 11.02.2009
comment
Хорошо, но если я использую этот WASAPI... Будет ли мое программное обеспечение работать и на XP? Или у меня должна быть другая устаревшая кодовая база для XP? (в этом случае я выберу устаревший API, если только WASAPI не даст мне очень хорошее улучшение по сравнению с ними) - person Daniel Magliola; 12.02.2009
comment
Да, WASAPI только для Vista. Вы определенно не хотите использовать функции WinMM. Большинство профессиональных аудиоприложений используют потоковую передачу ядра (WavePCI или WaveCyclic), потому что она работает в Windows 2000/XP/Vista (с поддержкой драйверов), хотя реализовать ее сложнее, чем что-то вроде DirectSound. - person joshperry; 12.02.2009
comment
Я бы посоветовал использовать DirectSound, если вы хотите что-то, что по-прежнему работает в Vista и XP, но без особых головных болей. И я бы сказал, что это Kernel Streaming, если у вас есть возможность его реализовать. - person joshperry; 12.02.2009
comment
Однако, как вы увидите на рынке, большинство приложений предоставляют абстрактный вывод с помощью нескольких выбираемых пользователем методов; если ваше приложение предназначено для профессионального использования, оно, вероятно, значительно выиграет от аналогичной функциональности. - person joshperry; 12.02.2009

Похоже, вы будете очень чувствительны к задержке. Возможно, стоит взглянуть на ASIO.

person geofftnz    schedule 11.02.2009

Я нашел Harmony Central — Audio Programming. Также прочитайте w:DirectSound.

Windows Vista имеет полностью переписанный звуковой стек, основанный на универсальной звуковой архитектуре. Из-за архитектурных изменений в переработанном аудиостеке прямого пути от DirectSound к аудиодрайверам не существует.

Из-за интеграции Xbox 360 и Microsoft Windows Microsoft активно подталкивает разработчиков к переносу новых приложений на эквивалентные аудио API Xbox, такие как XAudio и XACT.

OpenAL выглядит многообещающе.

person Eugene Yokota    schedule 11.02.2009