01 мая 2021

Как я в MPD звук через HDMI выводил.

 
Когда-то давно собрался сделать из компьютера музыкальную шкатулку с помощью MPD, но с выводом звука не заладилось. Никак не получалось вывести звук через HDMI-порт на ресивер. Тогда я бросил эту затею и просто подключил кабель к "Line Out" на материнской плате. Но вот буквально недавно я в очередной раз начал тыкать вывод звука на своём домашнем "недосервере".

На этот раз я пытался вывести звук с помощью MPV. У этого проигрывателя есть ключ "--audio-device=". Если ему присвоить значение "help", то он выведет список всех присутствующих в системе интерфейсов вывода звука (немного обрезал вывод):
$ mpv --audio-device=help
List of detected audio devices:
  'auto' (Autoselect device)
  'pulse/alsa_output.pci-0000_00_1b.0.hdmi-surround' (Встроенное аудио Digital Surround 5.1 (HDMI))
  'alsa' (Default (alsa))
  'alsa/jack' (JACK Audio Connection Kit)
  'alsa/dmixer' (dmixer)
...
  'alsa/sysdefault:CARD=PCH' (HDA Intel PCH, ALC887-VD Analog/Default Audio Device)
  'alsa/front:CARD=PCH,DEV=0' (HDA Intel PCH, ALC887-VD Analog/Front speakers)
  'alsa/surround21:CARD=PCH,DEV=0' (HDA Intel PCH, ALC887-VD Analog/2.1 Surround output to Front and Subwoofer speakers)
...
  'alsa/hdmi:CARD=PCH,DEV=0' (HDA Intel PCH, HDMI 0/HDMI Audio Output)
  'alsa/dmix:CARD=PCH,DEV=0' (HDA Intel PCH, ALC887-VD Analog/Direct sample mixing device)
  'alsa/dmix:CARD=PCH,DEV=3' (HDA Intel PCH, HDMI 0/Direct sample mixing device)
  'alsa/plughw:CARD=PCH,DEV=0' (HDA Intel PCH, ALC887-VD Analog/Hardware device with all software conversions)
  'alsa/plughw:CARD=PCH,DEV=3' (HDA Intel PCH, HDMI 0/Hardware device with all software conversions)
  'alsa/usbstream:CARD=PCH' (HDA Intel PCH/USB Stream Output)
  'jack' (Default (jack))
  'sdl' (Default (sdl))
Из всего богатства выбора меня заинтересовала строка "alsa/hdmi:CARD=PCH,DEV=0", подставив это значение в параметры и пощёлкав пультом ресивера, я услышал звук из подключённых колонок. Радости моей не было предела. Если MPV может, то и с MPD должно получиться.

Но сначала я решил проверить список устройств вывода, который распознала звуковая система ALSA, для этого я запустил "aplay -L". Среди прочего в выводе было несколько пунктов про HDMI:
hdmi:CARD=PCH,DEV=0
    HDA Intel PCH, HDMI 0
    HDMI Audio Output
dmix:CARD=PCH,DEV=3
    HDA Intel PCH, HDMI 0
    Direct sample mixing device
dsnoop:CARD=PCH,DEV=3
    HDA Intel PCH, HDMI 0
    Direct sample snooping device
hw:CARD=PCH,DEV=3
    HDA Intel PCH, HDMI 0
    Direct hardware device without any conversions
plughw:CARD=PCH,DEV=3
    HDA Intel PCH, HDMI 0
    Hardware device with all software conversions
Больше всего меня заинтересовал предпоследний пункт. Беспокоиться о совместном выводе звука несколькими приложениями одновременно мне не надо, потому что звук будет проигрываться только MPD или другим проигрывателем, когда первый не будет использоваться.

MPD может выводить звук через разные интерфейсы, в том числе и через ALSA. Для этого в файл конфигурации "/etc/mpd.conf" я прописал вывод звука так:
audio_output {
        type            "alsa"
        name            "ALSA HDMI"
        device          "hw:CARD=PCH,DEV=3"
#       device          "hdmi:CARD=PCH,DEV=0"
}
После перезапуска сервиса и обновления библиотеки музыки я добавил несколько треков в очередь и запустил воспроизведение. Звук есть!

Второй вариант я оставил на случай, если что-то случится с первым. Для удобства его можно вынести в отдельный пункт.

Подружить MPD и PulseAudio у меня так нормально и не получилось.

Пока я писал этот текст и собирал куски по конфигам, у меня MPD перестал воспроизводить звук через HDMI, жалуясь на медленный декодер ("alsa_output: Decoder is too slow; playing silence to avoid xrun"). Перезапуск не помогал. Получилось вразумить, запустив вывод звука через этот канал с помощью MPV, а потом заново включить MPD. Шаманство помогло.

-->