RXマイコンオーディオプレイヤー関係を更新

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 アナログ出力となるが・・

AUDIO_sample (Github)

「RXマイコンオーディオプレイヤー関係を更新」への2件のフィードバック

  1. すみません、AUDIO_Sampleをmakeすると以下のエラーが発生いたしますが、解決策をご教示いただけないでしょうか?libmad関連のファイルを拾ってくればいいと思うのですが、コンパイラは「GCC for Renesas RX 8.3.0.202004-GNURX-ELF」を使っておりまして、ライブラリフォルダにはlibmad関連は入っておりません。

    ../../sound/aac_in.hpp:11:10: fatal error: neaacdec.h: No such file or directory
    #include
    ^~~~~~~~~~~~

    1. 失礼しました。
      現在AACコーデックをサポート中で、まだ完成していないコードをマスターブランチにマージしてしまいました。

      修正しましたので、プルして下さい。


      libmad 関係は、rxlib に含まれています。

      以前、msys2 環境にインストールされた、mad ライブラリのヘッダーを認識してしまい、問題となったので、Makefile のヘッダーサーチパスを修正してあります。

      「INC_SYS = ../../rxlib/include $(LOCAL_PATH)/include」

      なので、MSYS にmadライブラリが無くても、問題は起こらないと思います。

      不具合のレポートはブログでも問題ありませんが、gihub の issue に書き込んで頂けたら、対応が速いと思います。

      ありがとうございました。

YuukiOkamiya へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください