SDストリーミングによるムービーおよび音声の再生

AVR-SDカードインタフェースは調子よく動いているので、ストリーミングを試してみました。

まず転送速度ですが、SDカードからの読み込み速度は現状でおよそ30kB/s出ています。 1秒でPC-6001のフリーエリアがいっぱいになってしまいますね(苦笑)。

ムービー

これまで、256x192ドットでの動画はオンメモリで8fpsでも厳しかったのですが、アルゴリズムを見直したとこ ろ、8fpsなら特に問題なく動作するようになりました。 in命令のみでデータが読み込め、メモリアクセスが不要なのが効いています。 ちなみに、inirを連続させて生データを読み込む方法だと、理論値でもかなり厳しいのと、現在はinirのスピードにAVRが追いつきません(AVRの クロックを上げればいいだけですが)。 したがって、圧縮アルゴリズムは以前のものをそのまま使っています。

動きの激しい部分などは少々スキャンラインが見えてしまいますが、何とかがんばっている、という感じです。

音声

実はムービーより音声のほうが厄介です。 タイミングを厳密に取る必要があるためです。

  • サンプリング周波数は8000Hzおよび11025Hz
  • DMA OFF
  • 割り込み禁止
  • 1チャネルのみ使用(4ビット、実のところは2ビット程度)

上記の条件だと、そこそこクリアに聞こえますが、1セクタごとにリードコマンドを発行する関係上、ポツポツとノイズが乗ります。 リードする際の待ち時間がSDカード依存で、平準化できないためです。

ここで以前の3チャネル高品質再生ではなくて1チャネルにしているのは、ムービーとの同時再生を目論んでいるためです。

当然、同時再生をするためにはDMAをONにしなければなりません。 再生時は多少時間的余裕があるので、待ち時間を減らしてDMAをONにしてみました。

すると...かなりnoisyです。 スピードの問題というよりは、BUSACKの最中に処理ができず、再生速度にムラができてしまうためかと思います。

余談

ところで、PSGの音量は以前解説したように設定値に対して対数の関係にあるのですが、それを勘案して音量レジスタの値をエンコードしてやると、何も考えずにリニアに設定するときよりも音質が悪化します。 不思議ですが、もともと4ビットと、解像度が悪いためかもしれません。