mpd -> jackd -> usbaudio out

Я пытаюсь управлять стерео с моего телефона Android, используя mpd. У меня есть Ubuntu 16.04, подключенный к стереосистеме через маршрут USB -> Toslink -> DSP -> amps. Я пытаюсь управлять Джеком через демона mpd.,, и у меня проблемы.

До сих пор я был в состоянии:

1) Получите mpd для локального воспроизведения музыки на моем Ubuntu box. MPDroid (на моем телефоне) прекрасно работает с mpd на этом уровне, управляя музыкой на моем Ubuntu box.

2) Подключите мою стереосистему через разъем из коробки Ubuntu, используя разъемы и mplayer.

Я сильно подозреваю, что моя проблема в том, что я не понимаю, что нужно mpd.conf для привода джек.

Вот мой текущий раздел mp_.conf audio_output:

audio_output {
    type      "jack"
    name      "my JACK device"
    device    "hw:1,0"
    autostart "yes"
    destination_ports "playback_9, playback_10"
}

Я выбрал destination_ports 9 и 10, потому что это производит сигнал Toslink. Но я сильно подозреваю, что это то, что я отформатировал неправильно.

и версия, которая играет локально:

audio_output {
    type            "alsa"
    name            "My ALSA Device"
    device          "hw:0,0"        # optional
    mixer_type      "hardware"      # optional
    mixer_device    "default"       # optional
    mixer_control   "PCM"           # optional
    mixer_index     "0"             # optional
}

Вот несколько вещей, которые, вероятно, помогут. Джек-сантехника прекрасно работает для передачи вывода mplayer на мое USB-аудиоустройство. Работающий файл.jack:

(connect "MPlayer \[[0-9]+\]:out_0" "system:playback_9")
(connect "MPlayer \[[0-9]+\]:out_1" "system:playback_10")

выход aplay -l:

**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC269VC Analog [ALC269VC Analog]  
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: USBStreamer [USBStreamer], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: NVidia [HDA NVidia], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: NVidia [HDA NVidia], device 7: HDMI 1 [HDMI 1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: NVidia [HDA NVidia], device 8: HDMI 2 [HDMI 2]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

Я нашел документацию, доступную для mpd онлайн, немного трудной для чтения, и она имеет тенденцию становиться немного расплывчатой, когда дело доходит до использования ее с jackd. Любой совет? Я предполагаю, что делаю довольно простую ошибку. Спасибо за любую помощь.

изменить: с помощью "jack" версии mpd.conf в /etc/mpd.conf я получаю это в качестве вывода для команды "sudo systemctl status mpd":

● mpd.service - Music Player Daemon
   Loaded: loaded (/lib/systemd/system/mpd.service; disabled; vendor preset: enabled)
   Active: active (running) since Sun 2016-07-03 23:58:34 PDT; 52s ago
 Main PID: 3651 (mpd)
   CGroup: /system.slice/mpd.service
       └─3651 /usr/bin/mpd --no-daemon

Jul 03 23:58:34 rybu-ThinkPad-W530 systemd[1]: Started Music Player Daemon.
Jul 03 23:58:38 rybu-ThinkPad-W530 pulseaudio[3665]: [pulseaudio] module-jackdbus-detect.c: Unable to contact D-Bus session bus: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
Jul 03 23:58:38 rybu-ThinkPad-W530 pulseaudio[3665]: [pulseaudio] module.c: Failed to load module "module-jackdbus-detect" (argument: "channels=2"): initialization failed.
Jul 03 23:58:38 rybu-ThinkPad-W530 pulseaudio[3665]: [pulseaudio] main.c: Module load failed.
Jul 03 23:58:38 rybu-ThinkPad-W530 pulseaudio[3665]: [pulseaudio] server-lookup.c: Unable to contact D-Bus: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
Jul 03 23:58:38 rybu-ThinkPad-W530 pulseaudio[3665]: [pulseaudio] main.c: Unable to contact D-Bus: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
Jul 03 23:58:38 rybu-ThinkPad-W530 pulseaudio[3665]: [pulseaudio] bluez5-util.c: GetManagedObjects() failed: org.freedesktop.DBus.Error.AccessDenied: Rejected send message, 2 matched rules; type="method_call", sender=":1.177" (uid=122 pid=3665 comm="/usr/bin/pulseaudio --start --log-target=syslog ") interface="org.freedesktop.DBus.ObjectManager" member="GetManagedObjects" error name="(unset)" requested_reply="0" destination="org.bluez" (uid=0 pid=1018 comm="/usr/lib/bluetooth/bluetoothd ")

Я полагаю, я должен упомянуть еще одну вещь. После установки mpd время загрузки моей системы значительно сократилось. Иногда кажется, что компьютер ничего не делает, поэтому я перезагружаю систему снова. Иногда требуется 3 перезагрузки, прежде чем я могу получить приглашение к входу в систему.

редактировать 2: Возможно, я могу решить эту проблему, полностью избегая гнезда. Вот файл /var/lib/alsa/asound.state, относящийся к моему устройству usbaudio:

state.USBStreamer {
control.1 {
    iface PCM
    name 'Playback Channel Map'
    value.0 0
    value.1 0
    value.2 0
    value.3 0
    value.4 0
    value.5 0
    value.6 0
    value.7 0
    value.8 0
    value.9 0
    comment {
        access read
        type INTEGER
        count 10
        range '0 - 36'
    }
}
control.2 {
    iface PCM
    name 'Capture Channel Map'
    value.0 0
    value.1 0
    value.2 0
    value.3 0
    value.4 0
    value.5 0
    value.6 0
    value.7 0
    value.8 0
    value.9 0
    comment {
        access read
        type INTEGER
        count 10
        range '0 - 36'
    }
}
control.3 {
    iface MIXER
    name 'USBStreamer Output Playback Switch'
    value.0 true
    value.1 true
    value.2 true
    value.3 true
    value.4 true
    value.5 true
    value.6 true
    value.7 true
    value.8 true
    value.9 true
    comment {
        access 'read write'
        type BOOLEAN
        count 10
    }
}
control.4 {
    iface MIXER
    name 'USBStreamer Output Playback Switch'
    index 1
    value true
    comment {
        access 'read write'
        type BOOLEAN
        count 1
    }
}
control.5 {
    iface MIXER
    name 'USBStreamer Output Playback Volume'
    value.0 255
    value.1 255
    value.2 255
    value.3 255
    value.4 255
    value.5 255
    value.6 255
    value.7 255
    value.8 255
    value.9 255
    comment {
        access 'read write'
        type INTEGER
        count 10
        range '0 - 255'
        dbmin -12750
        dbmax 0
        dbvalue.0 0
        dbvalue.1 0
        dbvalue.2 0
        dbvalue.3 0
        dbvalue.4 0
        dbvalue.5 0
        dbvalue.6 0
        dbvalue.7 0
        dbvalue.8 0
        dbvalue.9 0
    }
}
control.6 {
    iface MIXER
    name 'USBStreamer Output Playback Volume'
    index 1
    value 152
    comment {
        access 'read write'
        type INTEGER
        count 1
        range '0 - 255'
        dbmin -12750
        dbmax 0
        dbvalue.0 -5150
    }
}
control.7 {
    iface MIXER
    name 'USBStreamer Clock Selector'
    value 'USBStreamer Internal Clock'
    comment {
        access 'read write'
        type ENUMERATED
        count 1
        item.0 'USBStreamer Internal Clock'
        item.1 'USBStreamer TOSLINK Clock'
    }
}
control.8 {
    iface MIXER
    name 'Mic Capture Switch'
    value.0 true
    value.1 true
    value.2 true
    value.3 true
    value.4 true
    value.5 true
    value.6 true
    value.7 true
    value.8 true
    value.9 true
    comment {
        access 'read write'
        type BOOLEAN
        count 10
    }
}
control.9 {
    iface MIXER
    name 'Mic Capture Switch'
    index 1
    value true
    comment {
        access 'read write'
        type BOOLEAN
        count 1
    }
}
control.10 {
    iface MIXER
    name 'Mic Capture Volume'
    value.0 255
    value.1 255
    value.2 255
    value.3 255
    value.4 255
    value.5 255
    value.6 255
    value.7 255
    value.8 255
    value.9 255
    comment {
        access 'read write'
        type INTEGER
        count 10
        range '0 - 255'
        dbmin -12750
        dbmax 0
        dbvalue.0 0
        dbvalue.1 0
        dbvalue.2 0
        dbvalue.3 0
        dbvalue.4 0
        dbvalue.5 0
        dbvalue.6 0
        dbvalue.7 0
        dbvalue.8 0
        dbvalue.9 0
    }
}
control.11 {
    iface MIXER
    name 'Mic Capture Volume'
    index 1
    value 255
    comment {
        access 'read write'
        type INTEGER
        count 1
        range '0 - 255'
        dbmin -12750
        dbmax 0
        dbvalue.0 0
    }
}

Если я правильно читаю, похоже, что соответствующие каналы вывода звука отключены? Каналы 8 и 9 предназначены для вывода звука по кабелю Toslink, поэтому я подозреваю, что мне нужно изменить эти значения и, возможно, я могу сделать прямой вывод ALSA из mpd.

Странно, если я удаляю asound.state, а затем воссоздаю его с помощью команды "sudo alsactl store", сопоставление каналов будет совершенно другим:

state.USBStreamer {
    control.1 {
            iface PCM
            name 'Playback Channel Map'
            value.0 3
            value.1 4
            value.2 7
            value.3 8
            value.4 5
            value.5 6
            value.6 12
            value.7 13
            value.8 11
            value.9 9
            comment {
                    access read
                    type INTEGER
                    count 10 
                    range '0 - 36'
            }
    }

Но он все еще не производит звука.

Еще одна вещь, которую я рассматриваю, заключается в том, что, поскольку JACK может воспроизводить мой usbstreamer, и он использует ALSA, поэтому, возможно, я могу просто выяснить, какие настройки используются с ALSA, и продублировать их. Каталог /proc/asound/card1 содержит текущие настройки для этой карты, поэтому я начинаю играть с jack и mplayer и зачитываю файлы.

stream0:

miniDSP USBStreamer at usb-0000:00:14.0-2, high speed : USB Audio

Playback:
  Status: Running
    Interface = 1
    Altset = 1
    Packet Size = 280
    Momentary freq = 44100 Hz (0x5.8330)
    Feedback Format = 16.16
  Interface 1
    Altset 1
    Format: S32_LE
    Channels: 10
    Endpoint: 1 OUT (ASYNC)
    Rates: 44100, 48000, 88200, 96000, 176400, 192000
    Data packet interval: 125 us

Capture:
  Status: Running
    Interface = 2
    Altset = 1
    Packet Size = 280
    Momentary freq = 44100 Hz (0x5.8333)
  Interface 2
    Altset 1
    Format: S32_LE
    Channels: 10
    Endpoint: 2 IN (ASYNC)
    Rates: 44100, 48000, 88200, 96000, 176400, 192000
    Data packet interval: 125 us

usbbus:

003/005

usbmixer:

USB Mixer: usb_id=0x27520016, ctrlif=0, ctlerr=0
 Card: miniDSP USBStreamer at usb-0000:00:14.0-2, high speed
  Unit: 10
Control: name="USBStreamer Output Playback Volume", index=1
Info: id=10, control=2, cmask=0x0, channels=1, type="S16"
Volume: min=-32640, max=0, dBmin=-12750, dBmax=0
Unit: 10
Control: name="USBStreamer Output Playback Volume", index=0
Info: id=10, control=2, cmask=0x3ff, channels=10, type="S16"
Volume: min=-32640, max=0, dBmin=-12750, dBmax=0
Unit: 10
Control: name="USBStreamer Output Playback Switch", index=1
Info: id=10, control=1, cmask=0x0, channels=1, type="INV_BOOLEAN"
Volume: min=0, max=1, dBmin=0, dBmax=0
Unit: 10
Control: name="USBStreamer Output Playback Switch", index=0
Info: id=10, control=1, cmask=0x3ff, channels=10, type="INV_BOOLEAN"
Volume: min=0, max=1, dBmin=0, dBmax=0
Unit: 11
Control: name="Mic Capture Volume", index=1
Info: id=11, control=2, cmask=0x0, channels=1, type="S16"
Volume: min=-32640, max=0, dBmin=-12750, dBmax=0
Unit: 11
Control: name="Mic Capture Volume", index=0
Info: id=11, control=2, cmask=0x3ff, channels=10, type="S16"
Volume: min=-32640, max=0, dBmin=-12750, dBmax=0
Unit: 11
Control: name="Mic Capture Switch", index=1
Info: id=11, control=1, cmask=0x0, channels=1, type="INV_BOOLEAN"
Volume: min=0, max=1, dBmin=0, dBmax=0
Unit: 11
Control: name="Mic Capture Switch", index=0
Info: id=11, control=1, cmask=0x3ff, channels=10, type="INV_BOOLEAN"
Volume: min=0, max=1, dBmin=0, dBmax=0
Unit: 40
Control: name="USBStreamer Clock Selector", index=0
Info: id=40, control=1, cmask=0x0, channels=1, type="U8"
Volume: min=1, max=2, dBmin=0, dBmax=0

pcm0p/ Информация:

card: 1
device: 0
subdevice: 0
stream: PLAYBACK
id: USB Audio
name: USB Audio
subname: subdevice #0
class: 0
subclass: 0
subdevices_count: 1
subdevices_avail: 0

pcm0p/ Sub0/ hw_params:

access: MMAP_INTERLEAVED
format: S32_LE
subformat: STD
channels: 10
rate: 44100 (44100/1)
period_size: 1024
buffer_size: 2048

pcm0p/ Sub0/ Информация

card: 1
device: 0
subdevice: 0
stream: PLAYBACK
id: USB Audio
name: USB Audio
subname: subdevice #0
class: 0
subclass: 0
subdevices_count: 1
subdevices_avail: 0

pcm0p/ Sub0/ статус

state: RUNNING
owner_pid   : 12545
trigger_time: 50245.966761737
tstamp      : 0.000000000
delay       : 2010
avail       : 72
avail_max   : 1029
----- 
hw_ptr      : 325870664
appl_ptr    : 325872640

pcm0p/ Sub0/sw_params:

tstamp_mode: NONE
period_step: 1
avail_min: 1024
start_threshold: 0
stop_threshold: 2048
silence_threshold: 0
silence_size: 0
boundary: 4611686018427387904

Хм, если там есть информация о каналах, она хитро спрятана!

Volker Schatz описывает настройку устройства ALSA для переключения каналов. Похоже, что это сделано иначе, чем просто поиграться с картой воспроизведения канала:

http://www.volkerschatz.com/noise/alsa.html

Кажется, что ttable - это устройство для микширования каналов, а если вы используете целочисленные записи (0 и 1), для переключения каналов. Наконец это начинает иметь смысл. Обозначения ij - это пары координат, описывающие элементы квадратной матрицы.

редактировать: некоторый прогресс. Команда "aplay -L" выдает список имен устройств. Для этого usbstreamer он дает:

sysdefault:CARD=USBStreamer
USBStreamer, USB Audio
Default Audio Device
front:CARD=USBStreamer,DEV=0
USBStreamer, USB Audio
Front speakers
surround21:CARD=USBStreamer,DEV=0
USBStreamer, USB Audio
2.1 Surround output to Front and Subwoofer speakers
surround40:CARD=USBStreamer,DEV=0
USBStreamer, USB Audio
4.0 Surround output to Front and Rear speakers
surround41:CARD=USBStreamer,DEV=0
USBStreamer, USB Audio
4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=USBStreamer,DEV=0
USBStreamer, USB Audio
5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=USBStreamer,DEV=0
USBStreamer, USB Audio
5.1 Surround output to Front, Center, Rear and Subwoofer speakers
surround71:CARD=USBStreamer,DEV=0
USBStreamer, USB Audio
7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
iec958:CARD=USBStreamer,DEV=0
USBStreamer, USB Audio
IEC958 (S/PDIF) Digital Audio Output
dmix:CARD=USBStreamer,DEV=0
USBStreamer, USB Audio
Direct sample mixing device
dsnoop:CARD=USBStreamer,DEV=0
USBStreamer, USB Audio
Direct sample snooping device
hw:CARD=USBStreamer,DEV=0
USBStreamer, USB Audio
Direct hardware device without any conversions
plughw:CARD=USBStreamer,DEV=0
USBStreamer, USB Audio
Hardware device with all software conversions

Эти имена устройств очень удобны, отсюда вы можете запустить команду:

speaker-test -c 10 -t sin -F S32_LE -D front:USBStreamer

который проходит через все динамики на этом устройстве. Каналы 8 и 9 (как и ожидалось) воспроизводят синусоидальный звук на левой и правой колонках соответственно.

Поэтому я думаю, что это означает, что я должен иметь возможность получать прямой вывод ALSA на мои колонки, используя конструкцию ttable в asound.state. Я мог бы предположить, что Карта Воспроизведения Канала может допустить это также, но после некоторого возни с этим, мне неясно, как заставить это работать.

Обновить:

Я изменил часть control.1 файла asound.state так:

control.1 {
            iface PCM
            name 'Playback Channel Map'
            value.0 0
            value.1 0
            value.2 0
            value.3 0
            value.4 0
            value.5 0
            value.6 0
            value.7 0
            value.8 3
            value.9 4
            comment {
                    access read
                    type INTEGER
                    count 10 
                    range '0 - 36'
            }
    }

и это почти работает. Mplayer не будет воспроизводиться на alsa:device=hw=1.0, но сообщение об ошибке заключается в том, что я отправляю на устройство неверный формат. ALSA считает, что устройство принимает только S32LE. Технически, я думаю, что это устройство S24LE. Я свяжусь с производителем, чтобы выяснить это.

Поэтому я добавляю -format s32le в командную строку mplayer, и все выходит из динамиков! Только это немного беспорядочно. Это играет слишком быстро и.,, что-то еще происходит. Там какое-то искажение частоты. Я подозреваю, что происходит то, что он отправляет данные s16le, как если бы это были данные s32le, поэтому происходит небольшая перестановка (во времени) данных и сдвиг высоты тона, и они воспроизводятся слишком быстро.

Так что теперь, чтобы это заработало, мне нужно знать, как преобразовать данные s16le в надлежащий s24le, а затем отформатировать его как s32le, чтобы USB-устройство было довольным.

Обновить:

speaker-test -c 10 -t sin -D plughw:USBStreamer

отлично работает, и преобразует S16_LE в S32_LE.

К несчастью,

aplay -Dplughw:USBStreamer ./blah.wav

не работает. Возможно, отображение каналов отключено для этого устройства?

Программное обеспечение Deadbeef проигрывает usbstreamer без особых усилий. Я даю ему устройство hw:USBStreamer и приказываю ему делать все 8->16->24-битные преобразования, и он работает как чудо.

1 ответ

Решение

Задача решена.

pcm.usbSTR { type hw card USBStreamer device 0 } pcm.usbREMAP { type plug slave.pcm usbSTR ttable.0.8 1 ttable.1.9 1 } pcm.!default { type plug slave.pcm usbREMAP } ctl.!default { type plug slave.pcm usbREMAP }

Сделайте вышеуказанное содержимое /etc/asound.conf

Этот файл (обычно) не существует в Ubuntu или LUbuntu, но если вы создадите его, usbstreamer станет устройством ALSA по умолчанию, и каналы будут сопоставлены соответствующим образом.

Это позволяет вам сделать раздел audio_output в /etc/mpd.conf просто полями "type" и "name", "alsa" и "что угодно" соответственно.

Другие вопросы по тегам