WAVファイルの再生は出来た、しかしこれは当たり前すぎて、面白みが無い。
既に、RXマイコンでMP3ファイルの再生は実装した人がいたと思うのだが、
自分も確認の意味も含めて、実験してみた。
MP3のデコードには、libmad ライブラリを使う(これも先人と同じ)。
このライブラリ、かなり低負荷でMP3のデコードが出来るので、色々なプラ
ットホームで使われている。
※凄く昔に、i486DX100とかで、MP3をデコードするのがカツカツだ
ったように思う、それから考えると、ワンチップマイコンでデコードできるのは
かなり画期的な事だと思う。
DMACの制限により、1024ワード以上のバッファを転送するには別の工夫
が必要な事から、MP3デコーダーとD/Aのバッファの間にもう一つバッファ
を設ける事にした。
※そうしないと、MP3デコード処理の遅延により、バッファオーバーランが発
生して、再生が途切れてしまう。
それ以前に、120MHzのRXマイコンで、MP3をデコードした場合の処理
負荷を検証してみる。
MP3デコーダーにMP3ファイルを食わせて、回してみた、約4分くらいのフ
ァイルを1/2くらいの時間でデコードした、これなら、十分実用になる。
ただ、ビットレートやMP3をエンコードした条件により、処理負荷はかなり変
動するので、その変動時間を吸収できる量のバッファが必要と思われる。
簡単な実験では4096ワードでオーバーランが微妙に発生する感じなので、倍
の8192ワード設けるようにした。
※色々な曲を再生して聴いていたら、それでも怪しいファイルがあったので、さ
らに倍にした。
MP3の別の問題として、タグの問題がある。
MP3のタグは、ID3V1、ID3V2など複数のフォーマットがあり、ファ
イルの先頭にある場合(V2、可変長)、ファイルの終端にある場合(V1、固
定長)、バージョンの違い、文字コードの種類など、かなり面倒な仕様となって
いる、オープンソースのタグのパーサーはいくつかあるのだが、組み込みマイコ
ンのような少メモリの設計では無いのが痛い、結局は、「車輪の再発明」となる。
libmad はタグには感知しないので、もしID3V2タグが先頭にある場合、デコ
ーダーに食わせる前に、タグを見つけ出して、その部分を飛ばす必要がある。
以前にOpenGLのアプリで音楽プレイヤーを作った経験があり、その時に、
MP3のID3タグを色々とサポートした、その時は、libtag を利用したが、
やはり、組み込みマイコンにポートするには大掛かり過ぎる。
※とりあえず、ID3V2を見つけて、スキップするだけの実装を行った。
内部のフレームをパースするのは、暇なときにでも進める事とする・・
残念と思うのは、RAMの使用量が意外と大きい(現在81Kくらい)ので、
RX621、RX62NなどのRAMが少ない(確か64K)マイコンでは使え
ないと思う。(外部メモリーを実装すれば問題無いだろうか)
※プログラムサイズは、280K程度。
※gcc-6.4.0
自作のRX64Mボードは、プログラムの書き込みをシリアル経由で行う為、
360Kのプログラムを書くのがかなり遅い、E1を持っている(借り物だけど)
のだから、J-TAGインターフェースを配線した方が良さそうだ・・・
必要なソースコードは、GitHub にプッシュしてある。
※libmad は、gcc-6.4.0 でコンパイル、ライブラリとヘッダーを上げてある。