MP3, WAV の全体時間を表示
色々さぼっていた部分を更新した。
ただ、イマイチとなってしまった事もある・・
WAV ファイルで RAW の場合、圧縮は無いので、全体の時間を取得する事は、割と簡単に出来る。
これが、MP3 の場合は、結構面倒な処理を通す必要がある。
可変ビットレートの場合は、特に面倒だ・・
今まで全体時間は表示していなかったので、サウンド関係クラスを全体的に、細かく色々修正をした。
ただ、問題もある、3分程度の MP3 ファイルの全体時間を取得するのに2秒くらいかかる・・・
余分な処理は通していないハズだが、240MHz の RX72N でもそのくらいかかる・・・
何がネックになっているのか解析していないが・・
詳しく読んだ訳では無いが、MP3 のフレームのヘッダー情報をパースするだけなのだが・・・
mad ライブラリは、あまり詳しく理解している訳では無いので、API の使い方が悪いのかもしれない・・・
とりあえず、これは、今後の課題とする・・
ID3 タグ関係を更新
MP3 のタグ関係も細かく更新した。
ここでの問題は、APIC 情報で、プログレッシブ方式で格納された画像をデコード出来ない問題だ。
picojpeg では、プログレッシブ方式はサポートしていない。
※サポートしようとすると、メモリを消費するので仕方無いと思うが、余分なメモリを使わないで強引にパースする事は出来そうに思う。
ただ、メモリ使用量の制約では、ソフトは、もの凄く面倒になるのは間違いない・・・
なので、これは保留とする。
※それでなくとも、デコードしながら、リアルタイムに画像をスケールして、直でフレームバッファに書き込むようにして、メモリを節約している。
プログレスバー表示
全体時間が取得できるようになったので、プログレスバー表示を追加した。
その過程で、widget 関係の管理を少しだけ見直した。
以前の電卓アプリでも、色々拡張したが、まだまだ足りない機能がある。
色々やりたい事はあるが
既にバイナリーは860キロを超えており、フラッシュの書き換えに時間がかかる・・・
このアプリでは、シュミレータで実験するには、色々とサポートしなければならない機能があるので、それも面倒。
※やろうとすると、実装に時間がかかりそう・・
それに、速度のシュミレーションは現状では出来ないし・・
ID3 タグのパースも色々問題があるかもしれない・・
ID3 タグのパースは、自前のコードを使っている。
一応、ちゃんと説明を理解して実装してはいるが、MP3 タグの場合、それだけでは、パース出来ない場合がある。
これはつまり、厳密には間違った仕様で作られたMP3ファイルでも、それを出来るだけ回避してパースする工夫を盛り込む必要がある。
厳密に間違った仕様を弾いていると、よの中に流通しているMP3のタグをパース出来ない場合がかなり出現する。
かなり知名度があったアプリでも、間違った TAG を吐くアプリも存在する為、既成事実的にそれで作成した物をパースする必要がある。
また、文字コードに起因する解釈の違いもある、これはかなり厄介だ、UTF-8 や UTF-16 ならほぼ問題無いが、OEM コードの場合、国別で意味が異なるので、日本語圏以外で作られた物を日本語圏でデコードすると化ける。
また OEM コードなのに UTF-8 であったり、UTF-8 のハズなのに OEM コードだったり・・
APIC のプログレッシブの件は別としても、色々問題は多く、全てに対応する事は不可能なので、最悪「死ぬ」事を防いで、スルーするしかない。
picojpeg の問題
JPEG のデコーダーは、フルセット版を利用出来ない。
これは、殆どの場合、メモリ不足になる為で、picojpeg を利用している。
ベースラインでエンコードされた画像であっても、picojpeg ではサポートしていない機能があるようだ。
その場合、タグの画像を張り替えるしかない・・・
現在判明している、サポート出来ないマーカー:
ID3v2: Ver: 0400, Flag: 80 (153579)
V2.3: 'image/jpeg'
Album: 'sasakure.UK - プロトタイプ ナナクジャク'
Title: 'トゥイー・ボックスの人形劇場'
Artist: 'sasakure.UK'
Artist2: 'sasakure.UK'
Year:
Disc: 1/1
Track: 3/11
Audio file: '03 トゥイー・ボックスの人形劇場.mp3'
JPEG status: 20
picojpeg.c
case M_SOF1: /* extended sequential DCT */
default:
{
return PJPG_UNSUPPORTED_MARKER;
}
文字列が長い場合に対応
アルバム名、曲名、アーティスト名などが、長い場合がある。
以前は、気にせず描画していたので、ジャケット画像に重ねて表示されていた。
これを、正確にクリッピングして、表示しきれない場合は、スクロールをして全体を表示させるようにした。
この機能は、widget text クラスで行っているので、オーディオプレイヤーの機能ではなく一般化した GUI の機能となる。
描画は、オフラインで行っていない為、多少ちらつくが、まぁ「良し」としている。
かなり細かい描画を組み合わせているので、色々と問題が起こるかもしれないが・・
どんな感じに表示されるのかは、動画じゃないとわかりづらい。
レベルメーター表示
オーディオ出力時のレベルをサンプリングして、レベルメーター的な物を追加した。
ピークホールド表示も追加。
CD をリッピングして MP3 を作成するには?
ところで、CD をリッピングして MP3 を作成する場合、どんなアプリを使うべきか?
自分の知見では、SONY の「Music Center for PC」が一番良いのではと思っている。
※SONY の Music プレイヤーを持っていなくても利用できる。
全ソースコードなど
このプロジェクトは、RX72N Envision Kit 専用では無い、RX65N Envision Kit でも動作する。
※オーディオ出力は、12 ビットの D/A アナログ出力となるが・・