Программирование приложения Linux для одновременного воспроизведения нескольких звуков

Мне нужно написать приложение для Linux, которое делает следующее:

  • 1- Непрерывно воспроизводить WAV файл в фоновом режиме. Так что все время работы приложения играет эта фоновая музыка.
  • 2- Иметь возможность воспроизводить короткие звуки, когда происходят определенные события, в то время как фоновая музыка продолжает играть.

Что требуется для микширования дополнительных звуков событий, когда они происходят с фоновой музыкой, чтобы оба были слышны одновременно?

Я никогда не писал звуковой код для Linux, так что для меня это ВСЕ новое. Я предполагаю, что мне нужно будет писать в ALSA API? Или какая-то другая библиотека, которая облегчит это?

Если бы кто-нибудь мог предоставить пример кода, чтобы я начал, я был бы очень признателен. Через несколько дней я создам награду и предоставлю хорошую репутацию за образец кода, который делает то, что нужно.


person Chimera    schedule 10.08.2012    source источник


Ответы (2)


Обычно вы не хотите использовать ALSA API напрямую. Его сложно использовать, и он не совсем переносим (поскольку ALSA специфичен для Linux).

Если вы используете какие-то определенные библиотеки в своем приложении (например, Qt или что-то в этом роде), возможно, уже существует соответствующая звуковая библиотека для воспроизведения звуков.

Если вы ищете хорошую библиотеку звуков общего назначения, я предлагаю вам взглянуть на SDL. Он довольно приятный, маленький и портативный; очень популярен для игр. На их сайте есть неплохой пример кода, который поможет вам начать работу.

person Michał Górny    schedule 10.08.2012
comment
Спасибо за ответ. Я посмотрю на SDL. - person Chimera; 11.08.2012
comment
Не совсем верно, что ALSA не является переносимой: 4Front предоставляет интерфейс ALSA поверх OSS с именем SALSA (не путать с облегченным alsalib, известным как SALSA). - person ephemient; 11.08.2012
comment
Так что я могу использовать SDL_mixer. Можно ли использовать отдельно? Или мне нужно будет связать библиотеку SDL, а также библиотеку SDL_mixer? - person Chimera; 11.08.2012
comment
Если вы связываетесь с общей библиотекой, то SDL_mixer должно быть достаточно (если вы сами не используете некоторые вызовы libsdl). Однако при создании приложений для Linux вы всегда должны использовать pkg-config, чтобы знать, на что ссылаться, то есть pkg-config --cflags --libs SDL_mixer. - person Michał Górny; 11.08.2012

Что касается воспроизведения звуков, я использовал одну библиотеку, которая проста в освоении, использовании и имеет хороший пример в документации: мод. Документация, поставляемая с загрузкой, содержит очень простой для понимания пример, который вы можете изменить и очень быстро воспроизвести свои звуки.

person PALEN    schedule 10.08.2012
comment
Потоки обычно имеют плохой дизайн. Это делает программы очень сложными и более ресурсоемкими, чем они должны быть. Воспроизведение звука — это неинтерактивный процесс — вы просто предоставляете данные, а DMA обрабатывает их. Не говоря уже о том, что библиотека доступа к звуковой карте должна быть потокобезопасной, иначе один поток может заблокировать доступ звуковой карты к другому. - person Michał Górny; 11.08.2012
comment
Спасибо. Однако fork() не предоставляет потоков. Он создает точную копию запущенной программы, создает ее экземпляр и продолжает выполнение, возвращаясь дважды: один раз вызывающему и один раз дочернему процессу. Чтобы получить потоки, вам нужно будет использовать библиотеку Pthread в Linux или собственные потоки в другой ОС. - person Chimera; 11.08.2012
comment
Извините, моя ошибка (смущающая)... Мне все еще нужно больше читать о темах... отредактировано, спасибо! - person PALEN; 11.08.2012
comment
Спасибо, посмотрю fmod. - person Chimera; 11.08.2012