В MPD есть замечательная возможность выводить проигрываемый PCM-поток в FIFO. Чтобы потом его, например, визуализировать. Казалось бы, UNIX-way, невероятная гибкость и прочие радости жизни. Только вот незадача: до сих пор не существует ни одного MPD-клиента, показывающего, например, пляшущий спектр. Что странно: эти клиенты обычно пишут студенты, и что, неужели им неинтересно приложить свежеизученное быстрое преобразование Фурье? Интересно, безусловно интересно, да только есть один issue 0002503: audio outputs are not kept in sync. Для тех, кому лень читать: через несколько минут содержимое FIFO-выхода начинает «обгонять» то, что реально подаётся на звуковую карту, а разработчики не понимают, почему это баг. Всё по Куперу: программисты не пойми зачем напрограммировали кучу функционала, никому кроме них не нужную. В самом деле: на что могут сгодиться рассинхронизированные выходы? Только на «повышение ЧСВ программиста», больше никуда. И они эту функцию задачу выполняют. Ну правда, что не так? Почему выходы должны быть синхронизированы?
Официальный Wiki словно издевается:
- Visualization of the output can be done by an independent audio program.
- An output plugin could help.
- MPD clients could decode and visualize the file themselves in sync with the server.
Отличный медиасервер! Клиент может декодировать файл самостоятельно. Спасибо большое. Как в журнале «Радио» за 1989 год:
FIFO-выход MPD пришлось выкинуть, в .asoundrc написать:
pcm.!default { type plug slave { pcm rate44100Hz } } pcm.rate44100Hz { type rate slave { pcm writeFile format S16_LE rate 44100 } } pcm.writeFile { type file slave { pcm card0 } file "/var/run/alsa.fifo" format "raw" } pcm.card0 { type hw card 0 } ctl.card0 { type hw card 0 }
И при запуске системы прежде чем кто-то успеет пикнуть (попытаться открыть аудиовыход), создавать в
/var/run/alsa.fifo пайп, откуда и читать нашим визуализатором.
При этом возникает ряд неудобств. Первое: визуализатор должен быть запущен постоянно. Потому что если его закрыть, все программы, выводящие звук, упадут с SIGPIPE. Второе: упрямому софту (тому же MPD) придётся вправлять мозги: явно указывать устройство вывода:
audio_output { type "alsa" name "My ALSA Device" device "rate44100Hz" }
Потому что если device не указать, он в обход нашей иерархии открое hw:0,0. А ещё у него по умолчанию огромный буфер (16384 байт для 44100/16 — визуализатор сможет рендерить аж 5 FPS), причём опция buffer_time не документирована и пришлось лезть в исходники. 125000 оказалось достаточно.
Если кому-то интересно, мой визуализатор — обычный светодиодный индикатор уровня на передней панели системника. Показывает интеграл сигнала за буфер, поэтому дрыгается будь здоров. Не в паблике, потому что уровни записи очень сильно разнятся: среднестатистическая нормально сделанная фонограмма будет прыгать по 90% индикатора, Burn The Priest - Bloodletting заставит его светиться полностью 95% времени (такого себе не позволяют даже авторы музыки в стиле «бум-бум»), а какой-нибудь сериал в самом громком месте едва ли дотянет до половины. Индикатор, очевидно, должен быть логарифмеским, но тогда он не так сильно прыгает, и получается некрасиво. Пацаны, посоветуйте 
И они эту функцию задачу выполняют.хм.
Доступные тэги: <b>, <i>, <s>, <u>, <a href="">, <img src="" /> (загрузить), <pre>, <quote>
- themylogin › Самое дорогое в жизни Вчера, 02:19
- ramwoolf › Am I not always be wanting this? (x8) 16 мая, 23:08
- anonymous › Написание «не» с различными частями речи 16 мая, 16:06
- anonymous › A Tragedy in the Air 15 мая, 18:24
- themylogin › Итоги 2011 15 мая, 12:10
- themylogin › На гелике езжу 13 мая, 16:24
- anonymous › Waking up at ten 13 мая, 13:16
- themylogin › Жук 12 мая, 11:55
- themylogin › Давайте шутки из твиттера продолжим развивать здесь 7 мая, 11:03
- anonymous › Шевченко лох 6 мая, 14:02



