ソフトウエアデコーダ式MP3プレーヤ(試作)

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

更新: 2018/05/12, 2018/05/20, 2018/05/29, 2018/07/22


[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カードに変更してある。

[mbed]I2S-DACの利用

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

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

[mbed]高ビットレート MP3への対応

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

[LPCExpresso]試作再開

mbed版madplayerを参照しつつLPCExpresso版の開発を再開した。その結果、再生できるところまでたどり着いた。この時点のソースはこれ。Releaseコンパイルでないと速度が間に合いません。

[LPCExpresso]スイッチ追加

再生中止、音量変更などのテスト。

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