LINUX.ORG.RU

[C/C++][OSS] DSP, воспроизведение с нескольких источников одновременно через единый звуковой вывод

 


0

0

Здрасте!

Задача: нужно огранизовать запись аудио-информации в устройство звука ( /dev/dsp ) сразу с нескольких источников.
Звуковая система: OSS

Звуковая система ( OSS ) предоставляет мне 10 звуковых устройств ( это для моей карты ).
Это значит что я могу слушать сразу с 10-ти источников ( audacious, gajim, mplayer ... )
Но мне требуется написать кусок кода ( для мультиплатформенной игры ) в которой я смогу воспроизвести несколько источников звука
( фон, шаги, стрельбы, голоса и т.д ) через ОДИН источник ( engine ) + через единый файловый дескриптор.

Аналог - SDL.
Я посмотрел что все игры замученые на нем, без проблем справляются с этой задачей, хотя сам по себе OSS это как бы не поддерживает на прямую.
Просмотр исходного текста не принес результатов. Я ничего там особенного не нашел...

Кто нить подскажет куда рыть?

Для ясности приведу несколько примеров:

// Этой коммандой мы воспроизводим wav-файл.
// Конечно звук будет не тот ( ибо нужно выставить правильно канали, дисретизацию и т.д ), но для теста годится отлично
cat step.wav > /dev/dsp

А теперь поспробуем запустить несколько копий с консоли:
cat wind.wav > /dev/dsp & cat voice.wav > /dev/dsp & cat shortgun.wav > /dev/dsp

Все прекрасно работает, НО: у нас задействовао уже 3 звуковых вывода ( можно проверить напр. ossxmix )
Осталось всего-то 7....
Еще несколько бомбочек и выстрелов - и у нас закончится звук... )

Вот собственно и проблема. мне нужно как SDL все звуки вывести через одинин звуковой вывод ( и единый файловый дескриптор. )

mkfifo test
cat test > /dev/dsp
cat wind.wav > test
cat voice.wav > test
cat shortgun.wav > test

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

Это все с консоли для примера.
Пишу конечно на C++.

И так. Что есть. Есть OpenAL - но это мне не подходит.
Есть SDL - это мне не нужно, так как я сам пишу свой код ( библиотеку ).
осталось - куда мне рыть?

Я приблезительно догадываюсь что наверное надо все источники загрузить в буфер,
потом смешать ( как-то.. ) и скормить /dev/dsp.
Не уверен...

Возможно кто-то знает как это сделать в ALSA ( ведь они похожи ) че-ли..

// елементраный пример воспроизведения звука ( одного файла )
dspDev = open ( "/dev/dsp", O_WRONLY );
input_fd = open ( "voice.wav", O_RDONLY );

int actlen = 0;
const int buf_size = 4096;
char buf [ buf_size ];

while ( ( actlen = read ( input_fd, buf, buf_size ) ) ) {
write ( dspDev, buf, actlen );
// fwrite(buf,1,actlen,stdout); // для перенаправления по >
}

anonymous

Микшер пиши.

mv ★★★★★
()

Да, под SDL программный микшер надо делать. Есть рабочий пример микшера на 10 слотов, работающий. Число слотов (сколько одновременно звуков играет) можно увеличить в дефиниции MAX_PLAYING_SOUNDS, 16 нормально будет. Я этот пример и использую, немного адаптировав под себя.

Вот ссылка.

http://mirror.sweon.net/madchat/tech/Game/listings/sdl/audio-sdl.c

Момент такой там есть - все загруженные звуки должны быть с одинаковой размерностью амплитуды и одинаковой частотой семплирования. То есть, в игре звуки должны быть в единообразном формате.

xintrea
()
Ответ на: комментарий от xintrea

> Момент такой там есть - все загруженные звуки должны быть с одинаковой > размерностью амплитуды и одинаковой частотой семплирования. То есть, в > игре звуки должны быть в единообразном формате.

Ну да, я тоже над этим думал. Ведь параметры OSS то мы выставляем один раз...

Спасибо зп ответ. Посмотрю, позже отвечу.

anonymous
()
Ответ на: комментарий от INFOMAN

> Just use ALSA.

ALSA = ONLY LINUX
OSS = Linux, *BSD, Solaris, SCO, UnixWare, LynxOS, AIX, HP-UX, True64

Ну че убедительно?

anonymous
()

Почему не хотите использовать SDL_mixer? Он кросс-платформенный. Играет разнообразные источники. Для меня его единственный минус это качество звука.

Есть OpenAL - качество хорошее, кросс-платформенный. В своем движке думаю использовать именно его вместо SDL_mixer. Для игрушки, дистрибутив которой больше 30-50 мб он вполне оправдан, имхо.

anonymous
()
Ответ на: комментарий от anonymous

>Почему не хотите использовать SDL_mixer? Он кросс-платформенный. Играет >разнообразные источники. Для меня его единственный минус это качество >звука.

Я бы с радостю! Но дело в том, что я пишу как раз тоже библиотеку для работы со звуком ))
Выйдет прикольно когда библиотека для работы со звуком требует еще одну такую же а то и более тяжелую библиотеку )

> Для меня его единственный минус это качество звука.
Если честно то я не обращал внимание на качество. Я что оно как-то там портиться что-ли? Вообще такое возможно? Если OpenAL - то ИМХО сполне возможно, так как он там фазы крутит туда-сюда...

>Есть OpenAL - качество хорошее, кросс-платформенный. В своем движке >думаю использовать именно его вместо SDL_mixer. Для игрушки, >дистрибутив которой больше 30-50 мб он вполне оправдан, имхо.

OpenAL я хотел как раз задействовать, но именно качество этому помешало.
Я взял пример где три файла воспроизводяться ( правда в 3D )
Подсунул свои wav-ы. Качество моих wav-файлов было превосходное, но когда оно это все смесило в кучу - вышло так сухо и убого, аж аж не поверил.
Ибо на сколько известно, то DOOM3 напр. использует OpenAL, но звук там превосходный...
Вот это меня сильно смутило..

Но после просмотра исходного кода SDL_mixer была мысль все таки попробовать использовать OpenAL для микширования :) но в 2D.
не знаю что из этого выйдет...

И еще вопрос: а как дела обстоят в ALSA? Она умеет воспроизводить несколько источников через единственный звуковой вывод? ( то что у меня не выходит с OSS )



anonymous
()
Ответ на: комментарий от anonymous

Вижу ALSA вообще не умеет миксовать. Первое проигрование нормально, второе:

play soxio: Can't open output file `/dev/dsp': Device or resource busy

или

ALSA lib pcm_dmix.c:996:(snd_pcm_dmix_open) unable to open slave
aplay: main:564: audio open error: Устройство или ресурс занято

Скверно.
Помню что где-то читал, мол ALSA это облегченный вариант OSS.

anonymous
()
Ответ на: комментарий от anonymous

Ошибочка. Если все воспроизводить через aplay то мне удалось 50 кампозиций за раз воспроизвести.
Далее пошли тормоза....

Короче в ALSA эта фича пашет.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.