LINUX.ORG.RU

Пропадает звук после передачи ядру HDMI выхода в качестве параметра video

 , , , ,


1

1

Доброго времени суток!

Дано:
Собранный HTPC с XBMCbuntu 12.10 на борту.

uname -r
3.5.0-34-generic
LG-42LM760T подключен к HTPC по HDMI. HDMI выход является встроенным на материнке Gigabyte GA-Z77N-WIFI, графика - встроенная в Celeron G540 (SandyBridge).

Проблема:
Изначально и видео, и звук работают по HDMI корректно: нет проблем ни с разрешением, ни с передачей звука. Однако, имеется одна очень неприятная и известная проблема: падение иксов при загрузке с выключенным ТВ. Скормил ядру следующие параметры:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash apm=off i915.i915_enable_rc6=0 video=HDMI-A-3:e drm_kms_helper.edid_firmware=HDMI-A-3:LG-42LM760T.edid"
И о, чудо! Иксы поднимаются даже при загрузке с выключенным ТВ, разрешение выставляется корректное (1920х1080@60), но напрочь пропадает звук по HDMI, оставаясь при этом на аналоговых устройствах.

Системная информация:

cat /proc/asound/version
Advanced Linux Sound Architecture Driver Version 1.0.25.

cat /proc/asound/cards
 0 [PCH            ]: HDA-Intel - HDA Intel PCH
                      HDA Intel PCH at 0xf7d10000 irq 46

lspci -kv
# ...
00:1b.0 Audio device: Intel Corporation 7 Series/C210 Series Chipset Family High Definition Audio Controller (rev 04)
        Subsystem: Giga-byte Technology Device a002
        Flags: bus master, fast devsel, latency 0, IRQ 46
        Memory at f7d10000 (64-bit, non-prefetchable) [size=16K]
        Capabilities: <access denied>
        Kernel driver in use: snd_hda_intel
        Kernel modules: snd-hda-intel
# ...

# Вывод этой команды одинаков как со звуком, так и без:
aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC892 Analog [ALC892 Analog]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 1: ALC892 Digital [ALC892 Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 7: HDMI 1 [HDMI 1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

# Отрабатывает без каких-либо ошибок
aplay -D plughw:0,7 /usr/share/sounds/alsa/Front_Center.wav
Всякие xorg.conf, asound.conf, asoundrc отсутствуют, и без них всё работало, впрочем, их добавление не изменяет ситуацию.

Любопытные моменты:

  • Если загрузить HTPC с включённым ТВ, то звука нет ни в какую, все VT имеют разрешение 1920х1080.
  • Если загрузить HTPC с выключенным ТВ, то звук появляется после переключения на любой VT1-6, а потом обратно на VT7, причём VT1-6 имеют разрешение 1024х768.
  • Звук пропадает только на HDMI, на mini-JACK'ах он есть.
  • Звук пропадает именно после добавления параметра video.

Эти любопытные моменты наталкивают на следующую мысль: из-за явного указания видео-выхода ядру HDMI handshake происходит раньше, чем в HDMI-output'е появляется аудио-поток, и ТВ просто не включает декодирование аудио. А может это и бредни.

Как победить эту проблему?
Заранее благодарю за помощь.

и что? никаких предложений?

Xcentric
() автор топика
Ответ на: комментарий от minakov

Именно описанную в топике проблему не смог решить, пошёл другим путём (изначально требовалось сделать неважным порядок включения ТВ и HTPC).

1. убрал параметр video, но оставил edid_firmware;
2. создал xorg.conf, чтобы иксы хотя бы поднимались (в таком случае при выключенном ТВ иксы поднимаются так, что изображение замирает на заставке, но слышен звук интерфейса xbmc);
3. воспользовался этой ссылкой и создал правило в /etc/udev/rules.d/99-monitor-hotplug.rules

ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/usr/local/bin/monitor-hotplug.sh"
4. добавил скрипт /usr/local/bin/monitor-hotplug.sh

#!/bin/bash

#Adapt this script to your needs.

DEVICES=$(find /sys/class/drm/*/status)

#inspired by /etc/acpd/lid.sh and the function it sources

displaynum=`ls /tmp/.X11-unix/* | sed s#/tmp/.X11-unix/X##`
display=":$displaynum"
export DISPLAY=":$displaynum"

uid=$(ck-list-sessions | awk 'BEGIN { unix_user = ""; } /^Session/ { unix_user = ""; } /unix-user =/ { gsub(/'\''/,"",$3); unix_user = $3; } /x11-display = '\'$display\''/ { print unix_user; exit (0); }')
if [ -n "$uid" ]; then
	# from https://wiki.archlinux.org/index.php/Acpid#Laptop_Monitor_Power_Off
	export XAUTHORITY=$(ps -C Xorg -f --no-header | sed -n 's/.*-auth //; s/ -[^ ].*//; p')
else
  echo "unable to find an X session"
  exit 1
fi


#this while loop declare the $HDMI1 $VGA1 $LVDS1 and others if they are plugged in
while read l
do
  dir=$(dirname $l);
  status=$(cat $l);
  dev=$(echo $dir | cut -d\- -f 2-);

  if [ $(expr match  $dev "HDMI") != "0" ]
  then
#REMOVE THE -X- part from HDMI-X-n
    dev=HDMI${dev#HDMI-?-}
  else
    dev=$(echo $dev | tr -d '-')
  fi

  if [ "connected" == "$status" ]
  then
    echo $dev "connected"
    declare $dev="yes";

  fi
done <<< "$DEVICES"


lockfile_dir=/etc/X11/
lockfile_postfix=.monitor-hotplug-lock
HDMI3_lockfile=${lockfile_dir}HDMI3${lockfile_postfix}
if [ ! -z "$HDMI3" ] && [ ! -e "$HDMI3_lockfile" ]; then
  touch $HDMI3_lockfile
  sleep 2
  service lightdm restart
fi

5. на всякий сделал скрипт исполняемым (chmod +x)
6. добавил в конец /etc/init.d/rc.local

rm /etc/X11/*.monitor-hotplug-lock > /dev/null

Файл *.monitor-hotplug-lock нужен для того, чтобы рестартить иксы только при первом включении ТВ, поэтому после ребута эти файлы удаляются в rc.local.
Костыль корявый, но рабочий. Может потом доработаю.

Xcentric
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.