PulseAudioのWAVE保存ツールをパッケージ化した際のメモ
「PulseAudio上のオーディオをWAVE保存するツールをGTK+のGUIアプリケーションに」でGTK+アプリケーションとして作成したものをautoconf/automakeなどによるビルドシステムでC言語アプリケーションとしてビルド/インストールできるようにパッケージ化した。
(2014/10/23)2014年時点では特にこのようなツールを使用しなくてもPulseAudio使用アプリケーションで出ている音は録音アプリケーションで保存できるようになっており、公開は終了している。
メモ
ビルドシステム関係
Vala言語で書かれたソースファイル群をそれぞれ対応するC言語のコードに変換してビルドシステム上でうまく処理するための要領はValaの本体のパッケージに含まれる幾つかのMakefile.amが特に参考になった。- Vala言語のコードにgettextによるメッセージの国際化*1を使用する場合「#error You must define GETTEXT_PACKAGE before including gi18n-lib.h. Did you forget to include config.h?」というメッセージによりC言語のコードがコンパイルできないが、GCCのオプションに--include=config.hを付けて下のようにすることで回避した*2・また、PACKAGE_LOCALE_DIRは別途src/Makefile.amなどで定義されるようにする必要がある
[引用]ファイル名: parecwave-0.1.0/vapi/config.vapi
[CCode (cprefix = "", lower_case_cprefix = "", cheader_filename = "config.h")] namespace Config { public const string GETTEXT_PACKAGE; public const string PACKAGE_LOCALE_DIR; public const string PACKAGE_NAME; public const string VERSION; public const string PACKAGE_URL; public const string PACKAGE_DATA_DIR; public const string PACKAGE; }
[引用]ファイル名: parecwave-0.1.0/src/main.vala より
using Config; using GLib.Intl; (中略) namespace PaRecWave { class MainClass { public static int main (string[] args) { bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); (中略) } } }
- 「.vala.stamp」という拡張子のファイルをビルドのルールに用いて下のような要領でsrc/Makefile.amを記述することにより、Vala言語のコードに変更があったとき、次のmake時にvalacを実行して対応するC言語のコードに変更を反映するようにできる*3
[引用]ファイル名: parecwave-0.1.0/src/Makefile.am より
NULL = AM_CPPFLAGS = \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ $(NULL) AM_CFLAGS = \ (中略) --include=config.h \ $(GTK_CFLAGS) $(GSTREAMER_CFLAGS) \ $(NULL) BUILT_SOURCES = parecwave.vala.stamp bin_PROGRAMS = parecwave parecwave_VALASOURCES = \ main.vala \ mainwindow.vala \ pipeline.vala \ header.vala \ appinfo.vala \ $(NULL) parecwave_SOURCES = \ parecwave.vala.stamp \ $(parecwave_VALASOURCES:.vala=.c) \ $(NULL) parecwave_LDFLAGS = \ -Wl,--export-dynamic \ $(NULL) parecwave_LDADD = $(GTK_LIBS) $(GSTREAMER_LIBS) parecwave.vala.stamp: $(parecwave_VALASOURCES) $(VALAC) $(VALAFLAGS) -C --vapidir $(srcdir)/../vapi --pkg gstreamer-0.10 --pkg gtk+-2.0 --pkg config $^ touch $@ EXTRA_DIST = $(parecwave_VALASOURCES) parecwave.vala.stamp MAINTAINERCLEANFILES = \ $(parecwave_VALASOURCES:.vala=.c) \ $(NULL)
上の変数VALACはconfigure.acで
AC_PATH_PROG(VALAC, valac, valac) AC_SUBST(VALAC)
のようにして設定しておくことになるが、configureスクリプトの実行時にvalacコマンドがなくてもエラーが出るわけではない。
なお、外部のパッケージから利用してもよいクラス(「public」を付けたクラス)がある場合、valacを実行するところで
$(VALAC) $(VALAFLAGS) -C --vapidir $(srcdir)/../vapi --pkg gstreamer-0.10 --pkg gtk+-2.0 --pkg config -H parecwave.h --library parecwave $^
のようにすることでCヘッダファイルと.vapiファイルを作成できる。publicなクラスがなければ-Hや--libraryのオプションを付けてもほとんど空の内容で生成される。今回のPaRecWaveでは公開クラスはないため、これらのオプションはvalacには渡していないが、これらのヘッダと.vapiファイルを生成する場合はMakefile.amの変数MAINTAINERCLEANFILESに記述するようだ。
[引用]ファイル名: vala-0.7.3/vala/Makefile.am より
(中略) vala.vapi vala.vala.stamp: $(libvalacore_la_VALASOURCES) $(VALAC) -C --vapidir $(srcdir)/../vapi --pkg gobject-2.0 --vapidir ../gee --pkg gee --vapidir ../ccode --pkg ccode --pkg config -H vala.h --library vala $^ touch $@ (中略) MAINTAINERCLEANFILES = \ vala.vapi \ vala.h \ $(libvalacore_la_VALASOURCES:.vala=.c) \ $(NULL)
アイコン
アイコンの作成において、「波」の部分で使用するためにInkscapeで正弦曲線(サインカーブ)を描く必要があった。これにはhttp://web.archive.org/web/20120430041044/http://www.catch.jp/wiki/index.php?Inkscape%20Function-Plot
の情報が役に立った。
関連URL: