MP3_with_ESP8266Audio.inoを参考に音声出力をしていたが音がとんだり画面にノイズ?が入ったりとしていた。ツイッターで呟いたらタカヲさん(@mongonta555)から参考情報を教えてもらった。
こちらで音が出るようになった。リンク先レポジトリのメモ書きを残す。なお、M5Unified_StackChanにはあるが試していないものもある。
対象音声フォーマット
readmeにはwavとなっているけどmp3用
バッファ処理
MP3_with_ESP8266Audioにはなかったbuffer処理が入っている。下のあたり
#include <AudioFileSourceBuffer.h>
static AudioFileSourceBuffer *buff = nullptr;
const int preallocateBufferSize = 50*1024;
wav.begin(buff, &out);
preallocateBuffer = (uint8_t *)malloc(preallocateBufferSize);
音声ファイルのサンプリングレート
readmeには”wavファイルのサンプリング周波数は16khzか24khzにしてください。”とある。ffmpegで16khzか24khzに変換したかったが、26khzが生成されて直し方がわからなかったので26khzを受け入れて試験。サンプリングレートじゃなくてビットレートが26kbpsだった。
スピーカーのコンフィグ指定
下のようにいくつか指定が入っている。
sample_rate は出来上がったファイルに合わせてみた。
task_priorityは同じコアでの処理優先順位。数時大きい数が優先順位高くたしか23が最大値。m5avaterの中で2が使われているはずなので使っているライブラリの範囲では3にしとけば最優先のはず。
dma_buf_count /dma_buf_len はよくわかっていない。
task_pinned_core は処理をさせるCPUコアの指定(PRO_APP_NUMデフォルトで、もう一個がPRO_APP_NUM)。M5Unified_StackChanではPRO_CPU_NUMを使っていたがデフォルトでも音質違いが分からなかったのでデフォルトに戻してある。
auto spk_cfg = M5.Speaker.config(); spk_cfg.sample_rate = 26000; spk_cfg.task_priority = 23; spk_cfg.dma_buf_count = 20; spk_cfg.dma_buf_len = 128; //spk_cfg.task_pinned_core = PRO_CPU_NUM; M5.Speaker.config(spk_cfg);
ファイルクローズ処理
mp3.stop()の中でもoutやfileのクローズが呼ばれているのでソフトウェア的にはfileやoutのクローズ処理はいらないはず。ただし、どこかのサイト(メモってなかったら出典探せなくなった)で下みたいな書き方の方がスピーカーの最初の音が小さくなるみたいなことが書かれていたのでそちらに合わせた。ちなみに、スピーカーの最初の音とはスピーカーに電源が入る時のボッみたいな音。その違いが分からなかったが、こだわるところでもないので合わせておく。
out.stop();
mp3.stop();
file->close();
delete file;
file = nullptr;
補足
比較をしていないけどもともと使っていたのが160kbpsの3分というファイルだったのでそいつの影響が大きい気がしなくもない。