Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: LinC в Jul 25, 2013, 23:22



Титла: Изпълнение на аудио в програма на С
Публикувано от: LinC в Jul 25, 2013, 23:22
Здравейте,
Пиша на С под линукс и в един момент се яви необходимост да изпълня аудио файл  на едно място в програмата. Много търсих и четох, но така и не направих нещата. Под Windows видях как се прави, но под линукс не става точно така. Създавам ресурсен файл, в който описвам пътя до аудиофайла, но е нужно да го свържа с аудиоустройството, а това не знам как да направя. Аудиокартата ми е интегрирана: Intel Corporation N10/ICH 7 Family High Definition Audio Controller (rev 01). Предполагам, че трябва да я търся в /dev/snd/. Тук, обаче, има няколко файла и не знам кой е. Ползвам УСУ 8.3. Някой може ли да ми даде напътствия по проблема?
Благадаря предварително!


Титла: Re: Изпълнение на аудио в програма на С
Публикувано от: laskov в Jul 26, 2013, 00:00
Няма ли да е по-лесно да стартираш външна програма с параметър името на файла? Ако да, виж какво казва гугъл за "linux command line audio player" например.


Титла: Re: Изпълнение на аудио в програма на С
Публикувано от: gat3way в Jul 26, 2013, 00:27
Можеш да пишеш директно върху устройството, но това е само ако имаш някакви raw данни, дори тогава ще се налага да викаш разни ioctl-та за да си настроиш разни PCM параметри, там sampling rate, канали и тем подобни глупости. Съответно ioctl-тата можеш да ги разбереш единствено из kernel-ските хедъри и сигурно се променят чат-пат, което прави начинанието грозно и зависимо от версията на ядрото. Оттам нататък можеш да ползваш някакви библиотеки, които ти осигуряват някаква абстракция над тези неща, като почнеш от на alsa библиотеките и стигнеш до нещо на по-високо ниво, примерно там gstreamer. За съжаление не мога да помогна много, защото никога не ми се е налагало да се занимавам с това кой знае колко, но силно ти препоръчвам да ползваш някаква high-level библиотека и да не се занимаваш с глупости. Най-малкото защото надали ти се иска да се занимаваш с различни файлови формати, извратени компресии и т.н.


Титла: Re: Изпълнение на аудио в програма на С
Публикувано от: victim70 в Jul 26, 2013, 23:27
Като за начало използваш ffmpeg библиотеката за декодиране до удобен RAW вид http://ffmpeg.org/doxygen/trunk/api-example_8c-source.html ($2) . После през ALSA. Не е сложно но е дълго за обяснение. За функциите на ffmpeg се обърни към документацията (ужасна е). За Стрима към АЛСА можеш да стартираш от тука http://home.roadrunner.com/~jgglatt/tech/linuxapi.htm ($2) http://equalarea.com/paul/alsa-audio.html ($2)  - по сносно е обяснено от документацията и. Има и пример с който аз съм тръгнал и пробвал.
Само ffmpeg не съм пробвал но с повече пот ще тръгне. Апликацията трябва да е като стрим организирана т.е.
Инициализираш ALSA отваряш 2 треда в единят отваряш файла и го подаваш към декодера, изходните данни ги записваш в ALSA устройството, което е 2 рият тред. Декодирането трябва да е с 2-3 блока напред преди да задействаш трансвера на опашката към ALSA. Както и ако опашката се запълни треда на декодера трябва да изчака освобождаването на сегмент. Шернатият ресурс между тредовете, е опашката на декодираният файл. Заключващ е мутекс към декодера.
Друг вариянт е с 2 треда и IPC комуникация между тях. Единят е декодиращ другият е възпроизвеждащ. Така е по лесно на пръв поглед но е много бъгаво и дърводелско. Може на по-слаби компютри да насича или да оставя отворена IPC връзка.

Съжалявам че е толкова объркано обяснението. Реализацията обаче изглежда по-просто.


Титла: Re: Изпълнение на аудио в програма на С
Публикувано от: gat3way в Jul 27, 2013, 00:00
С gstreamer е значително по-лесно, 20-тина реда код и си готов: http://felipec.wordpress.com/2008/01/19/gstreamer-hello-world/ :)

Ама пък заниманието с декодиране с ffmpeg и засилване към ALSA е значително по-обогатяващо, ако ми беше по-интересно и имах време, бих си поиграл. Нещата най-добре се научават като си строшиш главата докато разбереш как работят и си ги направиш сам.


Титла: Re: Изпълнение на аудио в програма на С
Публикувано от: n00b в Jul 27, 2013, 03:13
http://www.mpg123.de/ палиш едно приложение на заден фон и му шибваш подходящите параметри

ИЛИ

ползваш libao - едно от най-читавите решения на около 5 реда:
ao_initialize()
ao_open_file()
ao_play()
ao_close()
ao_shutdown()

понеже съм на 4 бири и не ми се пише оставям сам да разбереш параметрите с които да ги извикаш.

ИЛИ
ползваш:
PortAudio
SDL

Такива каубойски изпълнения като отваряш /dev/snd и пишеш не ти ги препоръчвам!


Титла: Re: Изпълнение на аудио в програма на С
Публикувано от: LinC в Jul 29, 2013, 19:09
Момчета, благодаря за помощта!
Налага ми се да уча и правя много неща наведнъж и между другото реших да запусна и едно аудио, но тук не познах, че ще е лесно. Отделих един ден да чета, но накрая преминах към други задачи, защото явно имам още да натрупвам. Сега, обаче, с вашите насоки мисля да се върна при първа възможност и да доведа нещата докрай с аудиото.