2

Перемещение предыдущего ответа на эту тему; сформулировано как вопрос, это будет:

Я использую ChucK, в частности chuck.alsa , для реализации многоканального аудио-петлителя командной строки для Linux.

К сожалению, это решение использует звуковую карту и не может смешивать свой аудиовыход с другими приложениями (VLC, Firefox/Flash (youtube), ...), которые в противном случае используют PulseAudio для этой цели.

Как можно сделать исполняемый файл ALSA, такой как chuck направить свой звук через PulseAudio, чтобы он мог смешивать свой аудиовыход с другими приложениями?

1 ответ1

2

(отошел от этого ответа):

Что ж, мне наконец-то удалось заставить 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.alsachuck-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:

В этом сокращенном объяснении звукового стека есть четыре слоя.

  1. Аппаратное обеспечение
  2. ALSA.
  3. Pulseaudio
  4. Приложения.

Другие релевантные страницы:Как связаны 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:

гном-объем-control.png

... а также в 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 сценария вы можете вызвать этот графический интерфейс, дважды щелкнув его значок:

tkGui

... и вы можете запустить и остановить скрипт, используя соответствующие кнопки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .