ソフトウエアデコーダ式MP3プレーヤ

マイコンにソフトウエアデコーダを移植してMP3プレーヤを試作。
マイコンボードは 「mbed LPC1768」。DACはI2S接続のUDA1334Aボード(Adafruit)。ソフトウエアデコーダはlibmad
ソフトウエア開発環境として当初はLPCExpresso(CQ出版のこの本に付属のバージョン)で始めたが、その後mbedに変更した。

更新: 2018/05/12, 2018/05/20


LPCExpressoによる試作

LPCマイコンのI2Sの資料としてNXP社のアプリケーションノート「AN11178 MP3 player solution on NXP LPC1700 series」がある。
これの方針に沿って、ハードコードされたPCMデータで正弦波を発生させるプログラムを作成した。この時点のソース一式

その後、MP3デコーダlibmadの組み込みを試みたがうまくいかなかった。プログラムの実行が思いもよらない箇所でハングする...。

mbedサンプルプログラムの移植

mbedへのlibmadの移植例としてmadplayerがある。この例はLPC1768の内蔵DACを利用している。

この例を試してみたところ動作しました。この時点のソース一式(開発はすべてのmbedのオンライン環境で行った。このソースはエクスポート機能で落としたもの)。
内蔵DACを利用するところは同じですが、ファイルシステムはFatFs+SDカードに変更した。

I2S-DACの利用

mbedからI2Sを操作するためI2Sクラスを利用した。このクラスの利用例として flash_audio_playerI2Sがある。この例はハードコードされたPCMデータを再生する。

flash_audio_playerI2Sの例に沿ってI2Sクラスをmadplayerに組み込み動作を確認した。この時点のソース一式(これもmbedのオンライン環境からエクスポートしたもの)。
I2Sクラスにはunsigned shortの配列を引数にとるwrite関数を追加してある。

高ビットレート MP3への対応

手持ちのMP3データで試したところ、通常使っているビットレート128kbpsのものは問題なく再生できた。しかしダウンロード購入した高ビットレート(286kbpsとか)は再生できなかった(無音)。
原因の深いところまでは追い切れなかったが、input関数(main.cpp)のバッファメモリのサイズがある程度必要のようだ。メモリのやりくりの対策を施したソース一式

MP3プレーヤのページに戻る トップページに戻る