STM32F4シリーズを使ってみる7 -Helix MP3 Decoderを実装してMP3ファイルの再生を行う-

マイコンを使った工作物としては入門となったMP3ファイルの再生ですが、今日日の
コアクロック100MHz越えのMPUならVS1053等の外付けのデコーダーICを使わずとも
ソフトウエアでデコードが可能です。
STM32F4にgiflibを載せて以来、次のステップとして(入院中もノートPCで)音楽再生に
挑戦していましたが私もようやく形にすることが出来ましたのでご紹介します。


すでにSTM32ではShuji009氏がHelixMP3Decorder挑戦されており、さらに野田篤司氏
libmadでMP3プレーヤーを製作されています
ねむいさんはこちらのBBSで公開されていたHelix+STM32F4Discoveryを利用したもの
大部分参考にさせていただきました。このプログラムはSPIポートを経由してSDカードから
データを取得しデコードを行う形になっていてハードウエア的には私のいつものとほぼ同じ
構成だったので非常に助かりました。
ソフトウエア的な点についてはChibiOS/RTを使用していたので私の非OS環境に移植する
ためにはさすがにそのまま転用は不可能で、一つ一つ動作を理解しつつ再構成していき
ました。

ChaN氏のファイラーはデータ転送用に容量固定値の汎用のSRAMを確保するようになって
いるのでそれを上手く使いSRAM容量を一切無駄にしないようにしています。また、I2Sへ
のデータ転送はリングバッファ構成でDMAするのでCPUにかなり余裕ができます。

あとSTM32F4を使い始めたころから何度も言及していますがCCM領域はDMA不可能
なのでCCM領域をスタックとして使い、自動変数にバッファを置くようなメモリの使い方を
していると特定困難な不具合になりますのでご注意ください。
…ってわざわざこういうこと書いてるのは自分で言ったにも係らず嵌ったということですorz。


ついでにいつものTFT-LCDにも各種情報を乗っけることにしました。
MP3のIDタグはv1とv2があり、v2でArtist/Titleが見つからなかった場合v1の方もくまな
く探すルーチンにしています。もちろん日本語表示もFontX2ドライバで対応してます♥


↑MP3ファイルを再生してるところ。48kHz/230kBpsでもSTM32F4はぱわふりゃーなので
 まったくの余裕です♥(※最適化オプションは必須です)


↑Riff-WAVEファイルももちろん再生可能です。WAVEのルーチンはChaN氏のWAVEPlayer
 FM3マイコン版を移植させていただきました。


MP3HelixのデコーダーはCBRとVBRをサポートしています。演奏中に全演奏時間や経過
時間をリアルタイムに表示するためにはCBRの場合はヘッダを除いたバイト数から容易
に算出可能です。しかしVBRの場合は少々厄介です。正確に算出したい場合は1フレー
ムあたりのビットレートからバイト数を計算しさらにそれを全フレームにわたって行う
必要がありますがもちろんこんなもんワンチップマイコンレベルではやってられない
のですが以下のプロセスで近似できます。

 ID2ヘッダ領域にあるXingと呼ばれるヘッダから全フレーム数を算出
◆.汽鵐廛襯譟璽箸ら1フレームあたりの時間を算出
   MPEG1Layer-3は1フレームあたり1152Sampleと定義付けられており、たとえば
   44.1KHzなら1フレームにかかる時間は((1152*10^3)/44100(Hz))=26mSecと近似できる。
 ,鉢△魍櫃韻襪帆躅藾媚間がミリ秒単位で得られる。

Xingヘッダーが無いと上記の技が使えませんので演奏時間/経過時間はめちゃくちゃに
なっちゃいます。殆どのMP3エンコーダーはXingヘッダーをちゃんと付与するのであまり
気にはなりませんが…。



今回のデモンストレーションで使用したaitendoさんのLCDはSPI接続オンリーなのですが、
STM32F4の性能のおかげでLCDへの転送をソフトSPIにしても音が一切途切れず余裕で
間に合うレベルです。STM32F4すごいってね、また一つ確信させていただきました!



てわけで先日より先行で紹介はしておりましたがソースコードを改めて紹介します
おまけでフリーで使用できるFontX2のフォントや隠れたメインコンテンツのTFT-LCD
ドライバも沢山(特にaitendoさんので初期化ルーチンが提示されてない品種)追加
しておりますのでこちらも併せて皆さんの参考としてください。

Go to top of page