フォトアルバム

最近のトラックバック

Powered by Six Apart

« 【日常】保育所卒園式 | メイン | 【AVR】非マルチインターバルタイマリモコンを作る(1) »

2012年3月18日 (日)

【STM32F4】MP3の移植中(2) ~とりあえず終了まで

【STM32F4】MP3の移植中(1)から日にちがあきすぎましたが、MP3の移植~実験レベルですが、済みました。

大まかな仕様は、下記の通り。

(1) ハンダ付けはしない

(2) 追加部品
  Micro-USB(Aメス-MicroA)アダプタ 延長ケーブル(http://www.amazon.co.jp/dp/B003UIRIH2/ 等)
  USBメモリー・・・・STのサンプルプログラムが動作するもの。またできれば、実験専用のものが望ましいです。
  ステレオ用イヤフォン等、STM32F4 discaoveryのステレオミニジャックにつなげて音がきけるもの。
  できれば、ボリューム付のものが望ましい(音量調整ができないため)です。

 電源は、パソコンと接続しているUSBからのもの。

(3) 当たり前ですが、MP3ファイルが再生できること(できないものもあるとは思いますが、未確認です)。

(4) ソフトウェアもハードウェア同様に、手間を掛けたくなかったので、簡単に移植できるものであること。

という、軟弱方針でスタートしました。

まず、Audio_playback_and_recordのUSBを使っているプログラムをざっとみておきました。
このプログラムの音出し部分は、
Audio.wavを二つのバッファ(buffer1,buffer2)に読込みます。後は、buffer1を再生し、空になったらbuffer1に読込み、次にbuffer2を再生。
buffer2が空になったらbuffer1を再生し・・・・を繰り返すだけです。
DMAのノーマルモードを使用していました。

当初、MP3でも、ノーマルモードを使って移植をしようとしていたのですが、電源オン直後音が一瞬鳴るだけで、後は、ノイズ・・・・とか、最初から最後まで無音・・・・とかでしたので、結構悩みました。

waveplay.cの関数void WavePlayBack(uint32_t AudioFreq)を見ていますと、
  /*
  Normal mode description:
  Start playing the audio file (using DMA stream) .
  Using this mode, the application can run other tasks in parallel since
  the DMA is handling the Audio Transfer instead of the CPU.
  The only task remaining for the CPU will be the management of the DMA
  Transfer Complete interrupt or the Half Transfer Complete interrupt in
  order to load again the buffer and to calculate the remaining data. 
  Circular mode description:
  Start playing the file from a circular buffer, once the DMA is enabled it
  always run. User has to fill periodically the buffer with the audio data
  using Transfer complete and/or half transfer complete interrupts callbacks
  (EVAL_AUDIO_TransferComplete_CallBack() or EVAL_AUDIO_HalfTransfer_CallBack()...
  In this case the audio data file is smaller than the DMA max buffer
  size 65535 so there is no need to load buffer continuously or manage the
  transfer complete or Half transfer interrupts callbacks. */ 

と書かれた,注釈があります。英語だったので見ていなかったのですが、よくよくみると、DMAの  Circular mode descriptionが、書かれていました。
元々の中華MP3プレーヤでは、  DMAのCircularモードを使っていました。STBeeでは、インターバルタイマでの割り込みなので、DMAは使用していなかったのですが、結局元に戻すようなプログラムでよさそうです(ハードウェアは違うし、中華サンプルは、元々対応したマイコンボードでも動作しなかったのですが・・・汗;)。
ということで、ノーマルモードは捨てて、  Circularモードにしました。これですと、一度DMAの設定をし、DMAの終了判定の他に、半分フラグ判定すれば、1つのバッファを前半、後半と2に分けての処理になるので、簡単です(と、ここで実ははまったのですが)。
また、waveplay.cを見ると、それらの割り込み処理に関しての関数もありました。

void EVAL_AUDIO_TransferComplete_CallBack(uint32_t pBuffer, uint32_t Size)と
void EVAL_AUDIO_HalfTransfer_CallBack(uint32_t pBuffer, uint32_t Size)
です。

stm32f4_discovery_audio_codec.hの属性を書込可として、#define AUDIO_MAL_MODE_CIRCULARを有効化し、更に、
#define AUDIO_MAL_DMA_IT_HT_ENも有効化。
#define AUDIO_MAL_MODE_NORMALは、コメント化する必要があります。

後、確か、このままだと、コンパイルエラーが出るので、stm32f4_discovery_audio_codec.cの一部を修正する必要がありました。
うろ覚えですが、517行を    EVAL_AUDIO_TransferComplete_CallBack((uint32_t)pAddr, Size); とする必要がありました。
元々は、キャスト変換の(uint32_t)が無かった記憶あり(未確認でごめんなさい)。

あっというまに、修正は終わったので、鳴らしてみたら・・・・・
おおお・・・一発で、連続的にが出ました!奇跡だった。でもでもでもでも・・・

問題点(使った音源は、ステレオ、16ビット、340320kbps、44.1kHz)

[1] かろうじて、音楽と判るレベル。ノイズ多すぎ。
[2] 演奏がやや遅い(実測値約5%遅い)・・・・これについては、先の記事でpcm1723さんから教えて貰いました。
[3] 1曲で演奏が終わってしまう。

という、問題がありました。
[3]については、「1」と「2」とは、性格の異なるバグで、単に終了条件をまともに実装していなかったので、直ぐに治りました。
当初は、[1]と[2]の原因が判らずで、例えば、USBメモリーからの読込みが遅くて、バッファアンダーフローを起こしているのでは?
とか考えていたりしたのですが・・・。

判ってみたら、あほみたいな話しで、我ながら情けない話しでした。
DMAの終了条件の関数 void EVAL_AUDIO_TransferComplete_CallBack(uint32_t pBuffer, uint32_t Size) 内で、
#ifdef AUDIO_MAL_MODE_NORMAL内に必要なプログラムを書いてしまい、本来必要な、
#else /* #ifdef AUDIO_MAL_MODE_CIRCULAR */
の下にプログラムが書かれていなかった・・・・orz orz orz。
でした。
これを治したら、ぴたっと[1]のノイズ問題は解決しました・・・というのは、嘘で、実は、audio.c側で、
Audio_MAL_Play((uint32_t)AudioBuffer, mp3FrameInfo.outputSamps*2);
としていたのですが、実は、これだと、バッファサイズが半分であり倍速演奏になってしまいました(汗;)。
Audio_MAL_Play((uint32_t)AudioBuffer, mp3FrameInfo.outputSamps*4);
として、ようやくまともに近くなりました([2]の速度除く)

その後、[2]がさっぱりわからなくて、すんさん掲示板でそれを書いたところ、pcm1723さんから丁寧な解答(!)があった訳です。

現状試験しているメモリーカードのツリー構造は、こんな感じです。
-------------------------------------------------------------------------------------
フォルダ パスの一覧
ボリューム シリアル番号は 43EE-26C5 です
I:.
│  02 - LoveGame.mp3
│ 
├─mp3
│  │  12 灰色のカラス「a gray crow」.mp3
│  │ 
│  ├─Laibach-Volk
│  │      00_laibach-volk-2006-fwyh.m3u <--未対応
│  │      11_laibach-nippon-fwyh.mp3
│  │      
│  ├─Ador Dorath - Adon Nin Edeleth Ador Dorath (2002)
│  │      06 Adon nin edeleth ador dorath.mp3
│  │      
│  └─Queen - Greatest Hits I (1981)
│          05 - Bicycle Race.mp3
│         
├─music
│      01 - Soul Wandering.mp3
│      02 - Lugburz.mp3
│      
├─qvga
│      DSCF8058.jpg

│      IMG_0944.jpg
│      
├─WAV
│      001 - Finale.wav

│      In The Nursery - Workcorps (Fist Style).wav
│      
├─WAV2
│      06 Larks' Tongues in Aspic, Pt. 2.wav

│      ys2.WAV
│      
├─B2M-QVGA

│      ch68.b2m

│      
├─jpeg
│      HI3G0232.JPG

│      HI3G0304.JPG
│      
├─JPG

│      long.jpg
│      
└─test dept - 1984 - Ecstasy Under Duress
        01 - Hunger.mp3

-------------------------------------------------------------------------------------
 artist名
   アルバム1
   アルバム2

という構造でも再生できることは確認していますが、色々と入ったメモリに、いれているものは、再生できないものもあります。
当初は、mp3フォルダとmusicフォルダ内だけの演奏でしたので、これはうまくいったのですが・・・。

-------------------------------------------------------------------------------------
プロジェクトファイルは、ここから
mp3sample20120318.zipをダウンロード(約11.8M)

hexファイル同梱。探してください(をい)。

Mp3sample_exp

という構造を再現しないと駄目です。また、必要に応じて、lib関係等を書き換えてください(記事に書いていますので・・)。
そうそう、日本語ファイル名の関係で、一応、ff_conf.hのコードページを932にしています(さわらなくても音は出るようです)。

それと、後で、簡単な動画も入れる予定です。

操作ですが、ユーザーボタンで曲をスキップします・・・それだけです(汗;)。

あ、リセットで最初から・・・・当たり前だって・・・orz

できる人!GCCに移植してください。

-----------------------------------------------------------------------------------
動画の追加

(2012/08/28追記)

ロシアの方が、youtubeで紹介されています。


YouTube: stm32f4 software MP3 (Helix) player

トラックバック

このページのトラックバックURL:
http://app.blog.eonet.jp/t/trackback/517109/28123549

【STM32F4】MP3の移植中(2) ~とりあえず終了までを参照しているブログ:

コメント

折角追いついたと思ったら、また離されてしまった。
STM32F4のMP3音だし成功おめでとうございます。
しかし、ソフトMP3が簡単に(でもなかったか)動くんですね。感心しました。

Keilでコンパイルしているのですよね。御苦労さまです。
MP3はやったこと一度もないですが
Shuji009さんはなんとか工作されているのでさすがです。

Digikeyから物を買うときは何年も目的をMP3プレイヤーの製作と書いているので、
そのうちやってみたジャンルだったりします。

がた老さん、どうもです。
元々、ねむいさんが、昨年秋頃、

http://nemuisan.blog.bai.ne.jp/?eid=190873
で、
「誰か早くSTM32F4Discoverymp3プレーヤー作ってくだち!!」
と書かれていたのが,発端です。この頃は、STBee触っていたので、
結局、今になってしまいましたが(しかもkeilだし)。

実際プログラム自体が46kなので残念ながら、無料版uVision4ですと、
コンパイルはできるのですが、リンクできません。また、SRAMも50kバイト
異常使用していますので、それなりのマイコンが要りそうです(もっとも
今は無駄なバッファの取り方をしているというのもありますが)。

因みにSTBee + GCCで最初始めたのですが駄目でした。
パワーがあれば、ねむいさん環境を作って再チャレンジしたいのですが
どうなりますやら。

すんさん、どうもです。

MP3は、STBeeでやりましたが、これもソフトですが、鳴らすハードウェアが、
STBeeでは、マイコン内蔵DAC(12bit x 2ch)、今回のは、CS43L22
(I2Sインターフェース)でした。ただ今回のは、USBのフレームワーク
みたいでしたので、よく分らないままの移植になっています(汗;)。
waveプレーヤの実験はいくつかしてきましたが、mp3は、まだ3回目。
しかも、どれも実用レベルではないので、実用レベルのものも作りたいです。

コメントを投稿