WebRadio w/I2S -05 . 音量調整

今回はボリュームを調整を中心に実装して行きます。今回の実装内容は

  • スライドバーを用いてボリュームの大きさを調整する。
  • Muteボタンを追加して消音機能を追加する。
  • 再生中、Play ボタンの色を変える。

前回のスケッチを元に変更して行きます。


#include <Arduino.h>
#include <WiFi.h>
#include "AudioFileSourceICYStream.h"
#include "AudioFileSourceBuffer.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2S.h"

#include <WebServer.h>
#include <ESPmDNS.h>

// Enter your WiFi setup here:
const char *SSID = "XXXXXX";
const char *PASSWORD = "YYYYYY";

// Randomly picked URL
const char *URL="http://199.180.75.118:80/stream";

AudioGeneratorMP3 *mp3;
AudioFileSourceICYStream *file;
AudioFileSourceBuffer *buff;
AudioOutputI2S *out;

int flg=0;
int vol=50;

WebServer server(80);

String index_Dt =
                  "<!DOCTYPE html>\n<html>\n<head>\n"
                  "<title>ESP32 WebRadio</title>\n</head>\n"
                  "<body>\n<center>\n<h2>ESP32 WebRadio</h2>\n"
                  
                  "<form id='cmd_vol' method='get'>\n"
                  "<input type='range' min='0' max='100' step='1' name='3' onchange='showValue()' id='s_value' value='50'>\n"
                  "<span id='p_value'>50</span><br><br>\n"
                  "</form>\n"

                  "<form method='get'>\n"
                  "<button type='submit' name='1' id='b_play' style='background:#90ee90'>PLAY</button>\n"
                  "<button type='submit' name='2' style='background:#90ee90'>STOP</button>\n"
                  "<button type='submit' name='4' id='b_mute' style='background:#90ee90'>MUTE</button>\n"
                  "</form>\n"
                  
                  "<script>\n"
                  "function showValue () {\n"
                  "target = document.getElementById('cmd_vol');\n"
                  "target.submit();\n}\n";


void setup()
{
  Serial.begin(115200);
  delay(1000);
  Serial.println("Connecting to WiFi");

  WiFi.disconnect();
  WiFi.softAPdisconnect(true);
  WiFi.mode(WIFI_STA);
  
  WiFi.begin(SSID, PASSWORD);

  // Try forever
  while (WiFi.status() != WL_CONNECTED) {
    Serial.println("...Connecting to WiFi");
    delay(1000);
  }
  Serial.println("Connected");
  Serial.println(SSID);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (MDNS.begin("esp32")) {
    Serial.println("MDNS responder started");
  }
  
  server.on("/", handleRoot);
  
  server.begin();
  Serial.println("HTTP server started");

  out = new AudioOutputI2S();
}

void loop()
{
  if(flg)
  {
    if (mp3->isRunning()) {
      if (!mp3->loop()) mp3->stop();
    } 
    else {
      Serial.printf("MP3 done\n");
      delay(1000);
    }
  }

  server.handleClient();
}

void handleRoot()
{
  String cmd;
  int a;
   
    cmd=server.argName(0);
    switch(cmd.toInt())
    {
      case 1:   // Play 
                if(flg == 0)
                {
                  file = new AudioFileSourceICYStream(URL);
                  buff = new AudioFileSourceBuffer(file, 2048*16);
                  mp3 = new AudioGeneratorMP3();
                  mp3->begin(buff, out);
                  flg=1;
                }
                break;
                
      case 2:   // Stop 
                if (mp3) { mp3->stop(); delete mp3; mp3 = NULL; }
                if (buff) { buff->close(); delete buff; buff = NULL; }
                if (file) { file->close(); delete file; file = NULL; }
                flg=0;
                break;
                
      case 3:   // Volume 
                cmd=server.arg("3");
                vol=cmd.toInt();
                out->SetGain((float)vol/100.0);
                break;
                
      case 4:   // Mute
                vol *= -1;
                a=vol;
                if(vol < 0) a=0;
                out->SetGain(((float)a)/100.0);
                break;
    }

  cmd=index_Dt;
  cmd += ("document.getElementById('s_value').value='" + String(abs(vol)) + "'\n");
  cmd += ("document.getElementById('p_value').innerHTML='" + String(abs(vol)) + "'\n");
  if(flg)
    cmd += ("document.getElementById('b_play').style.backgroundColor='#ff6347'\n");
  if(vol < 0)
    cmd += ("document.getElementById('b_mute').style.backgroundColor='#2020ff'\n");
  cmd += "</script>\n</center>\n</body>\n</html>";
   
  server.send(200, "text/html",cmd);
}
  • 24行:int vol=50;   ボリューム用変数
  • 33から41行:0から100までのスライドバーを設定。
  • PLAY STOP MUTE ボタンの設定。
  • 44から47行:スライドバーが変更になった時にサーバーに値を送る Script
  • 126から130行:ボリュームを設定するルーチン。スライドバーが変更されサーバに値が送られとこのルーチンに来る。
    • 127行:cmd=server.arg(“3”); クライアントから3=XXXとデータが送られてくるので、XXXをcmdに代入。
    • 128行:vol=cmd.toInt(); 文字、”XXX” を数字に変換してvolに代入。
    • 129行:out->SetGain((float)vol/100.0); これが音量を設定する関数。volの値0から100で音量を調整する。
  • 132から137行: MUTE(消音)処理
    • 133行:vol *= -1; Muteボタンが押されたらMuteの符号を反転させる。値が負ならMUTE中と判断。
    • 136行:out->SetGain(((float)a)/100.0); Mute中ならa=0となり音が出ない。
  • 141から147行: スライダーの位置、値。PLAY、MUTEボタンの色設定
    • 141行:スライダの位置を設定
    • 142行:スライダの値を表示
    • 143,144行:PLAYボタンの色設定。再生中ー>オレンジ。停止ー>水色
    • 145,146行:MUTEボタンの色設定。OFFー>水色。 ONー>青

コンパイル、実行、ブラウザに、”esp32.local”と入力して下さい。この画面が出ると思います。

このページのソースは

ちなみにスライドバーを移動すると、

23,24行のコードが変わります。

サーバ側でスケッチの141,142行でバーの値に合わせてHTMLののコード書き換えています。

PLAYボタンやMUTEボタンの色も同じ要領で変えています。ボタンの色に合わせてHTMLが増えたり減ったりしています。PLAYボタンを押した場合

PLAYボタンがオレンジに変わり、ソースは

25行目にボタンの色を変更するHTMLが足されています。

これで音量調整の実装は終わり。次回は選局の実装を行いたいと思います。