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のラッパースクリプトを作成し、実行する
上記問題は以下の流れで解決される。
- 先にTiMidity++を起動し、プロセスIDを控えておく
- Q4Wineを起動し、終了まで待機
- 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
関連記事: