(отошел от этого ответа):
Что ж, мне наконец-то удалось заставить Linux chuck
и PulseAudio работать вместе - чтобы я мог запустить скрипт chuck
из принятого ответа этого поста вместе, скажем, с VLC или Youtube Flash, и автоматически смешивать их соответствующие аудиовыходы ... Итак, я собираюсь документировать это здесь ..
Чак версии
Обратите внимание, что принятый ответ был сделан на:
$ cat /etc/issue
Ubuntu 10.04.4 LTS \n \l
... для которой связана версия chuck
:
$ chuck.alsa --version
chuck version: 1.2.0.8 (dracula)
exe target: linux (alsa)
http://chuck.cs.princeton.edu/
Обратите внимание, что последняя версия исходного кода chuck
(на момент написания) была 1.3.1.3. chuck
нужно изменить в исходном коде и перестроить, чтобы он работал с PulseAudio.
Существуют некоторые различия между версиями chuck
1.2.0.8 и 1.3.1.3, одна из которых приводит к:
Смена скрипта цикла для патрона 1.3.1.3
Если мы посмотрим на файл chuck
VERSIONS , мы можем заметить следующее:
1.3.1.1
---
...
- (исправлено) Machine.add (...) в окнах теперь поддерживает как '\', так и '/' в путях aboslute (ранее только '\').
Исходный вызов loopsndbuf.ck
имеет формат:
chuck.alsa \
loopsndbuf.ck:/path/to/file1.wav:1.0 \
loopsndbuf.ck:/path/to/file2.wav:0.5 \ ...
... где двоеточие :
было проанализировано как разделитель аргументов сценария chuck
; и первым аргументом в этом списке был вызываемый скрипт chuck
имени файла (в данном случае, loopsndbuf.ck
).
С вышеуказанным изменением в 1.3.1.3 комбинация двоеточия и косой черты :/
теперь заставляет движок пропускать синтаксический анализ - таким образом, все loopsndbuf.ck:/path/to/file1.wav
интерпретируются как имя файла сценария chuck
- что конечно, вызовет сбой вызова.
Таким образом, в принципе, мы можем просто вставить любой символ между :
и /
в вызове сценария - и затем проанализировать его в сценарии chuck
. К сожалению, на данный момент в скриптовом движке chuck
, похоже, нет средств для общего анализа строк (см. [Chuck-dev] charAt, подстрока для строк); тем не менее, он имеет обрезку пробелов (см. init_class_string
в chuck_lang.cpp).
Итак, хотя мы не можем использовать какой-либо символ в качестве разделителя - мы, безусловно, можем использовать SPACE в качестве разделителя - что также вынуждает нас цитировать аргументы в вызове сценария. Таким образом, сам вызов (в loopchuck.sh
) необходимо изменить на:
chuck.alsa \
loopsndbuf.ck:" /path/to/file1.wav":1.0 \
loopsndbuf.ck:" /path/to/file2.wav":0.5 \ ...
... и сценарию loopsndbuf.ck
требуется изменить строку if( me.args()...
на:
if( me.args() ) me.arg(0).trim() => filename;
Хорошая вещь, однако, что такой вызов работает как для 1.2.0.8 и 1.3.1.3 версии chuck
Сборка chuck
из источника
Как уже упоминалось, последний выпуск исходного кода (на данный момент) chuck
chuck-1.3.1.3.tgz ; Я построил это снова на машине с Ubuntu 10.04.
Теперь, на этой Ubuntu 10.04, я включил PPA ; который предлагает последние версии, скажем, libogg-dev
изнутри apt-get
- но по какой-то причине не предлагает соответствующую версию libvorbis-dev
- которая в противном случае извлекается libsndfile-dev
(которая является требованием для сборки chuck
), Вот почему необходимо загрузить соответствующий libvorbis-dev
, а установка пакетов должна состоять из нескольких этапов, используя как dpkg -i
и apt-get install
(см. Команды ниже).
Помимо необходимых для build-essential
инструментов, пакеты, которые мне нужно было установить, можно увидеть ниже (может быть, я уже установил другие необходимые компоненты , поэтому проверьте руководство ChucK: ch004_installation: сборка Linux и зависимости: сборка ChucK и miniAudicle в Ubuntu 9.10), Ниже приведены команды для сборки chuck
для ALSA - так как это исполняемый файл, который имеет отношение к возможным изменениям PulseAudio:
# dependencies
wget http://ppa.launchpad.net/lucid-bleed/ppa/ubuntu/pool/main/libv/libvorbis/libvorbis-dev_1.3.1-1ubuntu1~ppa1~lucid1_i386.deb
sudo apt-get install bison flex libasound2-dev libogg-dev
sudo dpkg -i libvorbis-dev_1.3.1-1ubuntu1~ppa1~lucid1_i386.deb
sudo apt-get install libsndfile-dev
# source
wget http://chuck.cs.princeton.edu/release/files/chuck-1.3.1.3.tgz
tar xzvf chuck-1.3.1.3.tgz
cd chuck-1.3.1.3/src
make linux-alsa
# can copy executable at end manually (if not using `make install`):
sudo cp chuck /usr/bin/chuck.alsa-1.3.1.3
# cleanup dev libraries
sudo apt-get remove --purge bison flex libasound2-dev libsndfile-dev libogg-dev # also removes libvorbis-dev
#sudo dpkg -r libvorbis-dev # no need; dpkg: warning: ignoring request to remove libvorbis-dev which isn't installed
Отладочная сборка
Если вы хотите скомпилировать отладочную сборку chuck
(чтобы вы могли проверить ее с помощью gdb
); просто отредактируйте makefile.alsa
(в chuck-1.3.1.3/src
): закомментируйте первую строку и создайте новую, где переключатель оптимизации -O3
заменен переключателем отладки -g
:
# CFLAGS+= -D__LINUX_ALSA__ -O3 -fno-strict-aliasing -D__CK_SNDFILE_NATIVE__
CFLAGS+= -D__LINUX_ALSA__ -g -fno-strict-aliasing -D__CK_SNDFILE_NATIVE__
...
... затем запустите make clean
- и, наконец, снова make linux-alsa
.
Взломать chuck
с PulseAudio под ALSA
Прежде всего, приятно напомнить об отношениях между ALSA и PulseAudio - мне нравится заметка из Как вы используете и Pulse Audio, и Alsa? - Спросите Ubuntu:
В этом сокращенном объяснении звукового стека есть четыре слоя.
- Аппаратное обеспечение
- ALSA.
- Pulseaudio
- Приложения.
Другие релевантные страницы:Как связаны ALSA и PulseAudio? - Суперпользователь или Pulseaudio против ALSA - Форумы Ubuntu (см. Также Pulseaudio-диаграмму).
Во-вторых, есть два способа получить доступ к аппаратному устройству из ALSA - один через интерфейс hw:
а другой - через интерфейс plughw:
. Обратите внимание, что интерфейс plughw:
добавляет такие функции, как автоматическое преобразование частоты дискретизации для устройств, но сам по себе не обеспечивает микширование звука разных приложений! Дополнительную информацию смотрите в теме linux.alsa.devel - Re: devices/subdevices, hw:/plughw:. Также отмечу , что в источнике chuck
(ЦСИ / RTAudio / RtAudio.cpp) можно найти:
// Я не использую интерфейс "plug" ... слишком много противоречивого поведения.
В-третьих, помимо этого, существует два способа обращения к структурам ALSA, что проявляется в разнице выходных данных от aplay -l
и aplay -L
:
Примечательно, что pulse
в качестве имени выхода, которое определяет использование PulseAudio, появляется только в aplay -L
. Проблема в том, что chuck
существу работает с аппаратными устройствами (картами) ALSA, учитывая, что chuck.alsa --probe
существу возвращает тот же список, что и aplay -l
. Таким образом, у chuck
нет прямой возможности доступа к pulse
устройству - и единственный возможный способ - заменить доступ к устройству с именем hw:X,Y
в коде chuck
на устройство с именем pulse
.
В коде chuck
только один файл должен быть изменен, RtAudio.cpp
ниже разница:
--- ./RtAudio/RtAudio.cpp.orig 2013-01-14 16:18:18.113645910 +0100
+++ ./RtAudio/RtAudio.cpp 2013-01-14 18:46:15.289672175 +0100
@@ -5657,7 +5699,8 @@
if ( result < 0 ) break;
if ( subdevice < 0 ) break;
if ( nDevices == device ) {
- sprintf( name, "hw:%d,%d", card, subdevice );
+ //~ sprintf( name, "hw:%d,%d", card, subdevice );
+ sprintf( name, "pulse");
snd_ctl_close( chandle );
goto foundDevice;
}
@@ -5696,6 +5739,7 @@
snd_pcm_t *phandle;
int openMode = SND_PCM_ASYNC;
+ printf( "pcm name %s\n", name);
result = snd_pcm_open( &phandle, name, stream, openMode );
if ( result < 0 ) {
if ( mode == OUTPUT )
Обратите внимание, что при этом chuck.alsa
полностью маршрутизируется через PulseAudio, и настройки устройств через --dacN
не будут учитываться . Однако, это также заставит chuck
при запуске появиться в gnome-volume-control
:
... а также в pavucontrol
.
Обратите внимание , что в этом режиме, процесс chuck
может быть немного более чувствительны к GUI событий - как, имея небольшие капли в аудио после ГИП интенсивных событий , таких как прокрутка окна Firefox - но в целом, режим PulseAudio работает хорошо (и использует в качестве много процессора), как прямой режим ALSA. (На этом ПК я в порядке с chuck
просто играющим такие циклы - однако, если производительность важна для вас, вам, вероятно, лучше попробовать JACK-маршрут.)
Предыдущие попытки перенаправления PulseAudio
Прежде чем найти вышеупомянутый взлом, я попробовал несколько вещей, чтобы "перенаправить" звук ALSA на PulseAudio; Излишне говорить, что по указанным выше причинам было невозможно добиться микширования звука другого приложения. Однако есть один метод, который может это сделать - с помощью aoss
перенаправить аудио из alsa.oss
; к сожалению это страдает от серьезных падений звука.
Помимо использования /etc/asound.conf для перенаправления ALSA в PulseAudio, ниже я попробовал и другие вещи, которые (как правило) не смогли добиться правильного микширования со звуком приложения (только первая соответствующая строка скрипта loopchuck.sh
):
# via https://askubuntu.com/questions/8425/how-to-temporarily-disable-pulseaudio
# cannot mix, may need `pulseaudio --kill` to stop suspension
pasuspender -- chuck.alsa \
...
# stutters at first, but plays continuously
chuck.oss \
...
# via [How come aoss is better than padsp? - Ubuntu Forums](http://ubuntuforums.org/showthread.php?t=1259514)
# stutters a lot - but mixes audio!
padsp chuck.oss \
...
# stutters very little (upon gui updates though) - and mixes!
sudo apt-get install alsa-oss
aoss chuck.oss \
...
# via http://razor.occams.info/blog/2009/02/11/pulseaudio-sound-forwarding-across-a-network/
# plays OK, no mixing
ALSA_PCM_NAME=pulse chuck.alsa \
...
Простой Python/Tkinter GUI
На ПК, где я использую loopchuck.sh
у меня нет клавиатуры, поэтому я очень хотел простой графический интерфейс, чтобы просто запустить и остановить процесс (и, следовательно, аудио-петлю). Поэтому я собрал небольшой скрипт на Python, tkGui_ShellScriptRunner.py, который вы можете добавить в тот же каталог, что и loopchuck.sh
- просто включите правильную scriptcall = ...
- и после chmod +x
-ing сценария вы можете вызвать этот графический интерфейс, дважды щелкнув его значок:
... и вы можете запустить и остановить скрипт, используя соответствующие кнопки.