Автор Тема: Изпълнение на аудио в програма на С  (Прочетена 2405 пъти)

LinC

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

laskov

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

Не си мислете, че понеже Вие мислите правилно, всички мислят като Вас! Затова, когато има избори, идете и гласувайте, за да не сте изненадани после от резултата, и за да не твърди всяка партия, че тя е спечелила, а Б.Б. (С.С., ...) е загубил, а трети да управлява.  Наздраве!  [_]3

gat3way

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

"Knowledge is power" - France is Bacon

victim70

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

Съжалявам че е толкова объркано обяснението. Реализацията обаче изглежда по-просто.
« Последна редакция: Jul 26, 2013, 23:30 от victim70 »
Активен

"Господи, дай ми сила да променя нещата които немога да приема,
дай ми търпение да приема нещата които не мога да променя,
и ми дай мъдрост, да правя разликата между двете"

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: Изпълнение на аудио в програма на С
« Отговор #4 -: Jul 27, 2013, 00:00 »
С gstreamer е значително по-лесно, 20-тина реда код и си готов: http://felipec.wordpress.com/2008/01/19/gstreamer-hello-world/ :)

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

"Knowledge is power" - France is Bacon

n00b

  • Напреднали
  • *****
  • Публикации: 1248
  • Distribution: OSX
  • Window Manager: 10.6, 10.8, 10.9
  • Live to hack, hack to live.
    • Профил
Re: Изпълнение на аудио в програма на С
« Отговор #5 -: 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 и пишеш не ти ги препоръчвам!
Активен

mobilio - професионални мобилни приложения

LinC

  • Участници
  • ***
  • Публикации: 5
    • Профил
Re: Изпълнение на аудио в програма на С
« Отговор #6 -: Jul 29, 2013, 19:09 »
Момчета, благодаря за помощта!
Налага ми се да уча и правя много неща наведнъж и между другото реших да запусна и едно аудио, но тук не познах, че ще е лесно. Отделих един ден да чета, но накрая преминах към други задачи, защото явно имам още да натрупвам. Сега, обаче, с вашите насоки мисля да се върна при първа възможност и да доведа нещата докрай с аудиото.
Активен