#! /usr/bin/python
# -*- coding: utf-8 -*-
import commands
import os
import glob
(s, o) = commands.getstatusoutput('pacmd dump')
if s != 0: exit()
ports = []
for card in glob.glob('/proc/asound/card*'):
if card[-5:] == 'cards':
continue
cardnum = int(float(card.rsplit('card')[1]))
pcmlist = glob.glob(card+'/pcm*p')
pcmlist.sort(cmp=lambda x,y: cmp(x, y))
for eld in glob.glob(card+'/eld*'):
buf = open(eld,'r').read()
param = {}
for kv in buf.split('¥n'):
param[kv.split('¥t', 1)[0].strip()] = kv.rsplit('¥t', 1)[-1].strip()
if param['monitor_present'] == '0' and param['eld_valid'] == '0':
continue
if param['connection_type'] != 'HDMI':
continue
portnum = pcmlist[int(float(eld.rsplit('eld#')[1]))]
portnum = int(portnum.rsplit('pcm')[1][:-1])
sink_name = 'alsa_module_sink_hw_%i_%i' % (cardnum, portnum)
# load-module
cmd = 'pacmd load-module module-alsa-sink device=hw:%i,%i sink_name=%s'
(s, o) = commands.getstatusoutput(cmd % (cardnum, portnum, sink_name))
# update description
description = '%s_%s_%s' % (param['monitor_name'], 'HDMI', param['speakers'].split(' ',1)[1])
cmd = 'pacmd update-sink-proplist %s device.description="%s"'
(s, o) = commands.getstatusoutput(cmd % (sink_name, description))
# change default sink
cmd = 'pacmd set-default-sink %s'
print (cmd % sink_name)
(s, o) = commands.getstatusoutput(cmd % sink_name)
print s,o
--ここまで--
実験環境:
openSUSE 12.1
GeForce GT430+SAMSUNG SMB2430H
あんまりテストをしていない。エラーチェックもしていない。users groupで実行可能。pacmdを必要とするのでopenSUSEの場合Pulseaudio-utilsパッケージがインストールされている必要がある。
実行すると適当に出力できそうな物をmodule-alsa-sinkで追加し説明文?を変える(pavucontrolなどに表示される)。最後に検出したものをdefault sinkとして変更する(手抜き)。
HDMI経由でディスプレイ名を取ってこれるならdescriptionはSMB2430H_HDMI_FL/FRなどとなる。
KDE4の自動スクリプト付近に入れておけば起動時に動く可能性があるが何もチェックしていない。$ pacmd exitやPulseaudio再起動した場合,常駐チェックも何ももっていないので再度実行して追加する必要がある。