ホームページmini2440>その7・内蔵オーディオを使ってみる

その7・内蔵オーディオを使ってみる

目次
 はじめに

 mini2440はオーディオ・ライン出力を標準で持っているので、その利用について試行しました。

 なお、検証マシンはMac mini mid 2010、OSは10.11.3、Qtは4.8.6、Qt Creatorは3.2.1です。
 また、各バージョンは試行時のもので、最新版とは異なる場合があります。


 背景と方針

 mini2440は、オーディオシステムを内蔵しています。
 ハードウェアとしては、オーディオコーデックチップUDA1341TS(データシートによる)を搭載し、内蔵マイクとマイク端子、ライン出力を持っています。
 オーディオドライバとしては、OSSとALSAに対応しています。(カーネルオプション(menuconfig)で設定可能。)

 今回は、音楽ファイルの再生に絞って調べていきます。
 Qtからの利用方法(API)はいくつかあって、順に試していきます。


 QtのオーディオAPIを試す

 <QSound>
 QSoundクラスは、.wav(リニアPCM)形式のサウンドファイルを再生します。

 参考サイト(1):QSound Class | Qt 4.8

 サウンドデータの送り先はデバイスドライバ(/dev/dsp)で、(前回作成した)ハイブリッドカーネルでは、以下のモジュールを起動してやると生成されました。
insmod /lib/modules/2.6.32-rc8/kernel/sound/core/oss/snd-mixer-oss.ko
insmod /lib/modules/2.6.32-rc8/kernel/sound/core/oss/snd-pcm-oss.ko
 アプリを作成して、入力に.wavファイルを指定したところ、正常に再生されました。
 ともかくも音を出したい、ということであれば、この方法が使えることを確認できました。

 <phonon>
 リニアPCMは(圧縮されていないために)ファイルサイズが大きく、mini2440のような環境ではファイル形式としてあまり実用的ではありません。
 そこで次に、phononを試してみました。
 phononはマルチメディア向けのラッパーで、アプリケーションとフレームワークとの橋渡しをするもののようです。

 参考サイト(2):Phonon multimedia framework | Qt 4.8

 phononがLinuxでサポートするフレームワークはGStreamerで、これは別途Debian側にインストールする必要があります。
 また、GStreamer自身は個々のメディアに直接対応している訳ではなく、例えば「圧縮形式の音楽を再生」しようと思ったら、それ用のプラグインも同時にインストールする必要があります。
プラグインは、base/good/bad/uglyに区分けされている。
MP3はライセンス的に問題があるとされるuglyに含まれているため、以降の実験ではOgg Vorbisを用いた。
 インストールは、以下の通りとしました。(mini2440で実行)
apt-get install gstreamer-tools
apt-get install gstreamer0.10-plugins-base
apt-get install gstreamer0.10-plugins-good
apt-get install libgstreamer0.10-dev
apt-get install libgstreamer-plugins-base0.10-dev
apt-get install phonon-backend-gstreamer
 最後のは、phononのバックエンドとしてGStreamerを使うことを指示するもので、インストール後、以下のシンボリックリンクを張っておくことで、Qtはプラグインとして認識するようです。
ln -s /usr/lib/arm-linux-gnueabi/qt4/plugins/phonon_backend /usr/local/Qt4.8.6-arm/plugins/

 GStreamerは単独でも動作するので、確認のため、コマンドを実行してみました。
root@mini2440:~# gst-launch playbin uri="file:///root/sample.ogg"
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstAudioSinkClock
Got EOS from element "playbin0".
Execution ended after 4898258000 ns.
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
 エラーは出たものの、音楽は正常に再生されたので、ひとまずOKとみてよさそうでした。

 phononによるアプリケーションの記述は、QSoundクラス同様シンプルです。(サンプルが参考サイト(2)にあります。)
 実行してみたところ、phonon-backend-gstreamerプラグイン呼び出しのところで警告が出て、再生できませんでした。
In /usr/lib/arm-linux-gnueabi/qt4/plugins/phonon_backend/phonon_gstreamer.so:
  Plugin uses incompatible Qt library
  expected build key "arm linux gnueabi-g++ no-pkg-config", got "arm linux g++-4 full-config"
WARNING: bool Phonon::FactoryPrivate::createBackend() phonon backend plugin could not be loaded 
 ビルドキーが違う、とのことですが、これはMacでクロスコンパイルしたQtとDebianのphonon_gstreamer.soをミックスして使ったことが原因かと思われます。

 参考サイト(3):Deploying Plugins | Qt 4.8

 もしそうだとすると、自前でビルドすれば解消する気もしますが、phonon-backend-gstreamerはgstreamerやphononにも依存するようで、事前の仕込みが大事になりそうな気配がします。(gstreamerはAdvanced Sysrootに含まれていましたが、現状、エラーでビルドできていません。)
 ということで、ここで足踏みとなりました。

 <QProcess>
 phononを使わず、GStreamerを直接起動できないか試してみました。
 Qtでコマンド操作を行うQProcessを使って試したところ、音が鳴るには鳴ったのですが、鳴り出すまで5秒程度かかりました。
 jack絡みのオーバーヘッドが解消されれば改善される余地はあるものの、コマンドラインレベルでは細かい操作は難しいという話もあり、更なる調査が必要のようです。

 <GStreamerライブラリ>
 GStreamerは、アプリ内部からC++のクラスライブラリとして利用することもできるので、これですと、よりきめ細かい操作が期待できます。
 ただし、そのためにはgstreamerのビルドが必要な訳ですが、上述の通り、現状、エラーでビルドできていません。
 なので、何もしていません。

 <QtGStreamer>
 QtGStreamerは、Qtに特化したクラスライブラリで、これも、きめ細かい操作が期待できます。
 ただし、こちらもビルドが必要な訳で、phonon-backend-gstreamerやGStreamerライブラリと似たような問題が生じることになります。
 なので、何もしていません。

 <QMediaPlayer>
 ドキュメントをナナメ読みした限り、このクラスはQt5から実装されたようです。
 なので、何もしていません。


 おわりに

 ひとまず、Qtで音楽を再生できることは確認できました。
 また、Qtを介さず、GStreamerを直接駆動することで、圧縮音楽ファイルを再生できることも確認できました。

 ビルドの必要なライブラリ/プラグインの利用は、現状では難しそうです。
 他の手立てを探るか、Qt5に移行するか、考えた方が良さそうです。


 お世話になったサイト

 有用なソフトウェアおよび貴重な情報をご提供頂いている皆様に、お礼申し上げます。(以下、順不同)

 参考サイト(1):QSound Class | Qt 4.8
 参考サイト(2):Phonon multimedia framework | Qt 4.8
 参考サイト(3):Deploying Plugins | Qt 4.8


 更新履歴

 2016.02.10 新規作成


[Home]  [MacSoft]  [Donation]  [History]