web-dev-qa-db-fra.com

mpd -> jackd -> sortie usbaudio

J'essaie de contrôler ma chaîne stéréo à partir de mon Android, en utilisant mpd. J'ai une boîte Ubuntu 16.04 connectée au système stéréo, via une route USB -> Toslink -> DSP -> ampères J'essaie de conduire jackd à travers le démon mpd ... et j'ai des problèmes.

Jusqu'à présent, j'ai pu:

1) Obtenez mpd pour jouer de la musique localement sur ma boîte Ubuntu. MPDroid (sur mon téléphone) fonctionne bien avec mpd à ce niveau, pilotant la musique sur ma boîte Ubuntu.

2) Conduisez mon système stéréo via la prise jack de la boîte Ubuntu, en utilisant la plomberie jack et mplayer.

Je soupçonne fortement que mon problème est que je ne comprends pas ce dont mpd.conf a besoin pour conduire la prise.

Voici ma section audio_output mpd.conf actuelle:

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

J'ai choisi destination_ports 9 et 10 car cela produit un signal Toslink. Mais je soupçonne fortement que c'est ce que j'ai mal formaté.

et la version qui joue localement:

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
}

Voici quelques éléments susceptibles de vous aider. la plomberie jack fonctionne très bien pour canaliser la sortie mplayer vers mon périphérique audio USB. Le fichier .jack-plumbing qui fonctionne est:

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

sortie 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

J'ai trouvé la documentation disponible pour mpd online un peu difficile à lire, et elle a tendance à devenir un peu vague quand il s'agit de l'utiliser avec jackd. Aucun conseil? J'imagine que je fais une erreur assez simple. Merci pour toute aide.

edit: avec la version "jack" de mpd.conf dans /etc/mpd.conf, j'obtiens ceci en sortie de la commande "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 ")

Je suppose que je devrais mentionner une autre chose. Après l'installation de mpd, les temps de démarrage de mon système sont devenus beaucoup plus lents. Parfois, il semble que l'ordinateur ne fasse rien, alors je redémarre le système. Parfois, il faut 3 redémarrages avant de pouvoir accéder à l'invite de connexion.

edit 2: Je peux peut-être résoudre ce problème en évitant complètement la prise. Voici le fichier /var/lib/alsa/asound.state, la partie pertinente pour mon périphérique 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
    }
}

Si je lis correctement, il semble que les canaux de sortie audio pertinents soient peut-être coupés? Les canaux 8 et 9 sont ceux pertinents pour la sortie audio sur un câble Toslink, donc je soupçonne que je dois modifier ces valeurs et peut-être puis-je faire une sortie ALSA directe à partir de mpd.

Étrangement, si je supprime asound.state puis le recrée avec une commande "Sudo alsactl store", le mappage des canaux est complètement différent:

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'
            }
    }

Mais il ne produit toujours aucun son.

Une autre chose que j'envisage est que puisque JACK peut jouer sur mon usbstreamer, et qu'il utilise ALSA, alors je peux peut-être juste comprendre quels paramètres son utiliser avec ALSA et les dupliquer. Le répertoire/proc/asound/card1 a les paramètres actuels de cette carte, donc je la démarre en jouant avec jack et mplayer, et je lis les fichiers.

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/info:

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/info

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/status

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

Hmm, si les informations sur les chaînes sont là, elles sont intelligemment cachées!

Volker Schatz décrit la configuration d'un périphérique ALSA pour changer de canal. Il semble que ce soit fait différemment que de simplement jouer avec la carte des canaux de lecture:

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

La table semble être un périphérique pour le mixage de canaux et, si vous utilisez des entrées entières (0 et 1), pour la commutation de canaux. Enfin, cela commence à avoir un sens. La notation i.j sont des coordonnées de paires, décrivant les entrées d'une matrice carrée.

edit: Quelques progrès. La commande "aplay -L" donne une liste de noms de périphériques. Pour cet usbstreamer, il donne:

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

Ces noms de périphériques sont très pratiques, à partir de là, vous pouvez exécuter la commande:

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

qui traverse toutes les enceintes de cet appareil. Les canaux 8 et 9 (comme prévu) produisent le son d'onde sinusoïdale sur les haut-parleurs gauche et droit respectivement.

Je pense donc que cela signifie que je devrais pouvoir obtenir une sortie ALSA directe vers mes haut-parleurs en utilisant une construction de table dans asound.state. J'imagine que la carte des canaux de lecture pourrait également permettre cela, mais après un bon bout de temps, je ne sais pas comment le faire fonctionner.

mise à jour:

J'ai modifié la partie control.1 du fichier asound.state pour qu'elle soit:

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'
            }
    }

et cela fonctionne presque . Mplayer ne jouera pas sur alsa: device = hw = 1.0 mais le message d'erreur est que j'envoie le mauvais format à l'appareil. ALSA pense que l'appareil accepte uniquement S32LE. Techniquement, je pense que c'est un appareil S24LE. Je vais contacter le fabricant pour clarifier cela.

J'ajoute donc -format s32le à la ligne de commande mplayer et des trucs sortent des haut-parleurs! Seulement, c'est un peu compliqué. Il joue trop vite et. . . il se passe autre chose. Il y a une sorte de distorsion de fréquence. Je soupçonne que ce qui se passe est d'envoyer des données s16le comme si ce sont des données s32le, donc il y a un peu de mélange (temporel) des données, et un pitch -shift, et ça joue trop vite.

Alors maintenant, pour que cela fonctionne, je dois savoir comment convertir les données s16le en s24le approprié, puis les formater en s32le pour que le périphérique USB soit satisfait.

mise à jour:

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

fonctionne correctement et convertit S16_LE en S32_LE.

Malheureusement,

aplay -Dplughw:USBStreamer ./blah.wav

ne fonctionne pas . Peut-être que le mappage des canaux est désactivé pour cet appareil?

Le logiciel Deadbeef joue avec l'usbstreamer avec peu d'effort. Je lui donne le périphérique hw: USBStreamer, et lui dis de faire toutes les conversions 8-> 16-> 24 bits et cela fonctionne comme un charme.

1
Ryan Budney

Problème résolu.

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 }

Faites ce qui précède le contenu de /etc/asound.conf

Ce fichier (généralement) n'existe pas dans Ubuntu ou LUbuntu, mais si vous le créez, l'usbstreamer devient le périphérique ALSA par défaut et les canaux sont mappés de manière appropriée.

Cela vous permet de faire de la section audio_output de /etc/mpd.conf uniquement les champs "type" et "nom", "alsa" et "ce que vous voulez" respectivement.

0
Ryan Budney