前回の投稿「M5Core2とM5Atom EchoでMP3再生」で、M5Core2とM5Atom EchoからMP3再生しました。この時は、I2Sの機能を使っていましたが、DAC接続のM5Stack FireやM5StickCでも同様に再生できるので実際にやってみます。
ESP32におけるオーディオ再生
前回同様以下のライブラリを使わせていただいています。
earlephilhower/ESP8266Audio
〇宣言
以前の投稿の時と同じです。
#include <driver/i2s.h>
#include "AudioFileSourceHTTPStream.h"
#include "AudioFileSourceBuffer.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2S.h"
#include "AudioFileSourceSD.h"
static AudioOutputI2S *out = NULL;
static AudioGeneratorMP3 *mp3 = NULL;
static AudioFileSourceSD *file_sd = NULL;
static AudioFileSourceHTTPStream *file_http = NULL;
static AudioFileSourceBuffer *buff = NULL;
〇準備
このAudioOutputI2Sのコンストラクタでのパラメータの指定方法が違います。
I2Sを利用する場合(M5Core2やM5Atom Echoの場合)
out = new AudioOutputI2S(I2S_NUM_0);
out->SetOutputModeMono(true);
out->SetGain(audio_gain / 100.0);
DACを利用する場合(M5Stack FireやM5StickCの場合)
out = new AudioOutputI2S(I2S_NUM_0, AudioOutputI2S::INTERNAL_DAC);
out->SetOutputModeMono(true);
out->SetGain(audio_gain / 100.0);
DACを利用する場合、音声信号は、PIN番号26に出力されます。
M5Stack Fireの場合には本体内蔵のスピーカに接続されています。M5StickCでは、本体上側の端子から出力され、以下の周辺デバイスのスピーカを接続することで再生できます。
M5StickC Speaker Hat(PAM8303搭載)
〇PIN設定
以前の投稿の時と変わりませんが、このPIN設定は、I2Sを利用する場合にのみ必要です。
out->SetPinout(bclk, lrck, dout);
3つのPIN番号を指定します。BCLK、LRCK、DataOutです。
M5Core2では、以下の通りです。
BCLK:12
LRCK:0
DataOut:2
M5Atom Echoでは、以下の通りです。
BCLK:19
LRCK:33
DataOut:22
後は同じです。
〇URLから再生
file_http = new AudioFileSourceHTTPStream(url);
buff = new AudioFileSourceBuffer(file_http, bufsize);
mp3 = new AudioGeneratorMP3();
mp3->begin(buff, out);
〇SDからの再生
file_sd = new AudioFileSourceSD(path);
if( !file_sd->isOpen() ){
delete file_sd;
file_sd = NULL;
return JS_EXCEPTION;
}
mp3 = new AudioGeneratorMP3();
mp3->begin(file_sd, out);
そして以下を継続呼び出し
if( mp3 != NULL ){
if (mp3->isRunning()) {
if (!mp3->loop())
mp3->stop();
}
}
Javascriptでの呼び出し
以下の技術書で紹介している、ESP32内部で動作するJavascript環境で動作させる場合のJavascriptコード例を示します。
M5StackとJavascriptではじめるIoTデバイス制御
I2Sで再生するM5Stackモジュールの場合
import * as audio from "Audio";
audio.begin();
//audio.setPinout(12, 0, 2); // for M5Core2
audio.setPinout(19, 33, 22); // for M5Atom Echo
audio.playSd("/g_07.mp3");
//audio.playUrl('http://192.168.1.16:20080/g_07.mp3');
setInterval(() =>{
audio.update();
}, 1);
DACで再生するM5Stackモジュールの場合
import * as audio from "Audio";
audio.begin(audio.INTERNAL_DAC);
audio.playSd("/g_07.mp3");
//audio.playUrl('http://192.168.1.16:20080/g_07.mp3');
setInterval(() =>{
audio.update();
}, 1);
細かな処理はC言語で実装済みのため、Javascriptからは簡単に呼び出せるようにしています。
以上