概要
musicForProgramming のmp3ファイルをemacsで再生できないかをあれこれと 試行錯誤したのでその備忘録として。
パッケージ
Music Players にあるようにいくつかのパッケージがあるが emms
を選択。
カスタム
customize-group
コマンドで emms-volume で emms-volume-change-function
に emms-volume-pulse-change を設定。
エラー
mp3 を追加してボリュームを上げようとすると以下のメッセージがミニバッ ファーに表示される。
Wrong type argument: stringp, nil
原因
emms-volume-pulse.el の pactl
の出力をパースするところが問題。コー ドではSink, Name, Volume を目印として情報を取得しているようで、コマ ンド出力が英語以外だと問題となる。
(string-match (mapconcat 'identity '(".*Sink[ \t]+\\#\\([0-9]+\\)" ".*Name:[ \t]\\([^\n]+\\)" ".*Volume:.*?\\([0-9]+\\)%.*\n?") "\n") output)
コード内の pactl
コマンドを再現すると日本語表示になっている。
pactl list sinks
シンク #0 状態: RUNNING 名前: alsa_output.pci-0000_00_01.1.hdmi-stereo-extra1 説明: 内部オーディオ Digital Stereo (HDMI 2) ドライバー: module-alsa-card.c サンプル仕様: s16le 2ch 44100Hz チャンネルマップ: front-left,front-right 所有者モジュール: 6 ミュート: いいえ ボリューム: front-left: 39321 / 60% / -13.31 dB, front-right: 39321 / 60% / -13.31 dB
ロケールを設定すると英語で表示される。
LC_ALL=C pactl list sinks
Sink #0 State: RUNNING Name: alsa_output.pci-0000_00_01.1.hdmi-stereo-extra1 Description: 内部オーディオ Digital Stereo (HDMI 2) Driver: module-alsa-card.c Sample Specification: s16le 2ch 44100Hz Channel Map: front-left,front-right Owner Module: 6 Mute: no Volume: front-left: 39321 / 60% / -13.31 dB, front-right: 39321 / 60% / -13.31 dB
対策
defadvice
を使用して問題の関数の環境変数を一時的に置換して問題を回 避。
(defadvice emms-volume--pulse-get-volume (around emms-volume--pulse-get-volume-around activate) (let ((process-environment (append process-environment '("LC_ALL=C")))) ad-do-it))