試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Q4Wine動作時にのみTiMidity++(alsaseqインターフェース)を動かす

以前「TiMidity++をWineのMIDIデバイスとして使用する」で扱っている通り、WineではALSAサウンドシステム上のMIDIバイスが利用でき、ALSAのハードウェアMIDIバイスがない場合でもTiMidity++のalsaseqインターフェース(-iAオプション)を用いることで、ALSA MIDIアプリケーションと同様にWine上のMIDIバイスとして用いることができる。
そこで、Q4Wineの使用時だけ自動で一時的にTiMidity++を動かすようにしてみることにした。

Q4Wineの自動起動フォルダを使用した方法:不完全

Q4Wineについて(初期設定・2009/10/16現在)」で書いているように、Q4WineにはWine環境*1の設定ごとに利用できる「autostart」という自動実行用フォルダがあり、ここに作成したランチャアイコンがQ4Wineの起動時に自動的に起動される。
起動の対象はWindowsアプリケーション(wineコマンドの引数として指定される)なので、GNU/Linux版のTiMidity++を起動するために下のようなプログラムを作成した。

#define _XOPEN_SOURCE 1
#include <stdlib.h>

/*
 * WineからGNU/Linux版TiMidity++をALSA MIDIデバイスとして起動する
 *
 * .exe.soファイルの場所を指定したランチャをautostartフォルダに作成すると
 * Q4Wine起動時にGNU/Linux版TiMidity++が起動する
 *
 * 終了ができないのが問題
 *
 * winegcc -m32 -Wall -Wextra -O2 -pipe [このファイル] -o [実行ファイル名]
 */

int
main ()
{
  int status = system ("timidity -iA");  /* 必要に応じてオプションを付ける */
  if (status == -1)
    return -1;                    /* エラー */
  else
    return WEXITSTATUS (status);  /* 終了ステータス(戻り値) 実行失敗は127 */
}

これをwinegccコマンドでコンパイルし、生成された.exe.soファイルの場所を指定したランチャアイコンをQ4Wineのautostartフォルダ(Wine環境はどれでもOK)に作成し、Q4Wineを終了,再起動すると、正常にTiMidity++が起動することが確認できた。
しかしながら、上のプログラム内のコメントにも書いている通り、自動起動はできてもQ4Wineの終了時に止まってくれないのが大きな問題となり、この方法を用いるのは難しい。*2

Q4Wineのラッパースクリプトを作成し、実行する

上記問題は以下の流れで解決される。

  1. 先にTiMidity++を起動し、プロセスIDを控えておく
  2. Q4Wineを起動し、終了まで待機
  3. Q4Wineが終了したら控えていたプロセスIDのTiMidity++を終了

これはQ4Wineの起動の前後に処理を行うラッパースクリプトを作成することで実現する。
下のような内容のシェルスクリプトを作成し、保存する。
[任意]ファイル名: q4wine-timidity

#! /bin/sh

#PATH=/usr/bin  # q4wineコマンドが/usr/bin/にある場合
PATH=/usr/bin:[q4wineコマンドのあるディレクトリ]

timidity ${TIMIDITY_OPTS} -iA &
PID=${!}
q4wine
kill ${PID}

そして、変数TIMIDITY_OPTSにTiMidity++への追加オプションを付けて起動してみる。

$ TIMIDITY_OPTS="--sequencer-ports=2 --realtime-priority=99" [q4wine-timidityの場所]

すると、上に書いた流れの通りに期待した動作をすることが確認できた。
後は下のような.desktopファイルを作成後設定を反映することで、デスクトップ環境のメニューなどからもこのラッパースクリプトが実行できるようになる。
[任意]ファイル名: ~/.local/share/applications/q4wine-timidity.desktop

[Desktop Entry]
Categories=Qt;System;Emulator;
Comment[uk]=Граф〓чна оболонка для налаштування Wine
Comment=GUI configuration tool for Wine
Comment[en]=GUI configuration tool for Wine
Comment[ru]=Графическая оболочка для настройки Wine
Comment[ja]=WineのGUI設定ツール
Encoding=UTF-8
Exec=env TIMIDITY_OPTS="[TiMidity++の追加オプション指定...]" [q4wine-timidityの絶対パス]
GenericName[uk]=Граф〓чна оболонка для налаштування Wine
GenericName=GUI configuration tool for Wine
GenericName[en]=GUI configuration tool for Wine
GenericName[ru]=Графическая оболочка для настройки Wine
GenericName[ja]=WineのGUI設定ツール
Icon=q4wine
Name[uk]=Q4Wine (with TiMidity++)
Name[ja]=Q4Wine (TiMidity++の同時実行)
Name=Q4Wine (with TiMidity++)
Path=
StartupNotify=true
Terminal=false
TerminalOptions=
Type=Application

「Exec」の行は環境や好みに合わせて書き換える必要がある。
これを以下のコマンドで適用する(端末か「アプリケーションの実行」へコピペして実行)。

update-desktop-database ~/.local/share/applications

使用したバージョン:

  • Q4Wine 0.113
  • TiMidity++ 2.13.2

関連記事:

*1:Fake driveのウィザードを実行したものに限る

*2:Q4Wineに「Q4Wineの終了時にコマンド実行」もしくは「終了時にプロセス終了」などの機能が追加されたりした場合は別