CelliesProjects / ESP32_VS1053_Stream

A streaming library for esp32 with a vs1053 mp3/aac/ogg/flac decoder. Plays http, https (insecure mode) and chunked streams and parses the metadata. Compiles in the Arduino IDE.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

ESP32_VS1053_Stream

Codacy Badge

A streaming library for esp32, esp32-wrover, esp32-s2 and esp32-s3 with a separate VS1053 codec chip.
This library plays mp3, ogg, aac, aac+ and flac files and streams and uses ESP_VS1053_Library to communicate with the decoder.

Supports http, https (insecure mode) and chunked audio streams.

Visit eStreamPlayer32_VS1053 for PIO to see a PlatformIO project using this library.

How to install and use

Install ESP_VS1053_Library and this library in your Arduino library folder.

Take care to install the master branch of the VS1053 library or at least a version from commit ba1803f or later because the getChipVersion() call that is needed is not included in the latest release.
See #23

Use the latest Arduino ESP32 core version.

Example code

#include <Arduino.h>
#include <VS1053.h>               /* https://github.com/baldram/ESP_VS1053_Library */
#include <ESP32_VS1053_Stream.h>

#define SPI_CLK_PIN 18
#define SPI_MISO_PIN 19
#define SPI_MOSI_PIN 23

#define VS1053_CS 5
#define VS1053_DCS 21
#define VS1053_DREQ 22

ESP32_VS1053_Stream stream;

const char* SSID = "xxx";
const char* PSK = "xxx";

void setup() {
#if defined(CONFIG_IDF_TARGET_ESP32S2) && ARDUHAL_LOG_LEVEL != ARDUHAL_LOG_LEVEL_NONE
    delay(3000);
    Serial.setDebugOutput(true);
#endif

    Serial.begin(115200);

    WiFi.begin(SSID, PSK);
    
    WiFi.setSleep(false); 
    /* important to set this right! See issue #15 */

    Serial.println("\n\nSimple vs1053 Streaming example.");

    while (!WiFi.isConnected())
        delay(10);
    Serial.println("wifi connected - starting decoder");

    SPI.setHwCs(true);
    SPI.begin(SPI_CLK_PIN, SPI_MISO_PIN, SPI_MOSI_PIN);  /* start SPI before starting decoder */

    if (!stream.startDecoder(VS1053_CS, VS1053_DCS, VS1053_DREQ) || !stream.isChipConnected())
    {
        Serial.println("Decoder not running");
        while (1) delay(100);
    };

    Serial.println("decoder running - starting stream");

    stream.connecttohost("http://icecast.omroep.nl/radio6-bb-mp3");

    Serial.print("codec: ");
    Serial.println(stream.currentCodec());

    Serial.print("bitrate: ");
    Serial.print(stream.bitrate());
    Serial.println("kbps");

}

void loop() {
    stream.loop();
    //Serial.printf("Buffer status: %s\n", stream.bufferStatus());
    delay(5);
}

void audio_showstation(const char* info) {
    Serial.printf("showstation: %s\n", info);
}

void audio_showstreamtitle(const char* info) {
    Serial.printf("streamtitle: %s\n", info);
}

void audio_eof_stream(const char* info) {
    Serial.printf("eof: %s\n", info);
}

Tips for troublefree streaming

WiFi setup

Do not forget to switch WiFi out of power save mode:

...
WiFi.begin(SSID, PSK);
WiFi.setSleep(false); 
...

Prevent reboots while playing

Early version of the esp32 have issues with the external psram cache, resulting in reboots.
Workarounds are possible depending on the hardware revision.

Revision V0.0

No workarounds are possible for this revision other than not using the psram.

Revision V1.0

On revision V1.0 psram can be used with the following build flags:

-D BOARD_HAS_PSRAM
-mfix-esp32-psram-cache-issue
-mfix-esp32-psram-cache-strategy=memw

Revision V3.0

On revision V3.0 psram can be used with the following build flag:

-D BOARD_HAS_PSRAM

Source: esp-idf api guide on external ram.

Find your hardware revision

In PIO you can find out what hardware revision you have by running esptool.py flash_id in a terminal.

In Arduino IDE go to File->Preferences and find the Show verbose output during option. Check the box marked upload.
You can now see the hardware revision when you upload a sketch.


Functions

Initialize the VS1053 codec

bool startDecoder(CS, DCS, DREQ)

Check if VS1053 is responding

bool isChipConnected()

Start or resume a stream

bool connecttohost(url)
bool connecttohost(url, offset)
bool connecttohost(url, user, pwd)
bool connecttohost(url, user, pwd, offset)

Stop a stream

void stopSong()

Feed the decoder

void loop()

This function has to called every couple of ms to feed the decoder with data.
For bitrates up to 320kbps somewhere between 5-25 ms is about right.


Check if stream is running

bool isRunning()

Get the current volume

uint8_t getVolume()

Set the volume

void setVolume(uint8_t volume)

Value should be between 0-100.


Set bass and treble

uint8_t rtone[4]  = {toneha, tonehf, tonela, tonelf};
void setTone(rtone)

Values for rtone:

toneha       = <0..15>        // Setting treble gain (0 off, 1.5dB steps)
tonehf       = <0..15>        // Setting treble frequency lower limit x 1000 Hz
tonela       = <0..15>        // Setting bass gain (0 = off, 1dB steps)
tonelf       = <0..15>        // Setting bass frequency lower limit x 10 Hz

Get the current used codec

const char* currentCodec()

Returns STOPPED if no stream is running.


Get the current stream url

const char* lastUrl()

The current stream url might differ from the request url if the request url points to a playlist.


Get the filesize

size_t size()

Returns 0 if the stream is a radio stream.


Get the current position in the file

size_t position()

Returns 0 if the stream is a radio stream.


Get the buffer fill status

const char *bufferStatus()

Returns 0/0 if there is no buffer.
Otherwise returns something like 4096/65536 which means 4kB waiting in a 64kB buffer.

void bufferStatus(size_t &used, size_t &capacity)

There is also a version that takes two size_t variables by reference.
Works the same as the const char * version.

A buffer will only be allocated if there is enough free psram.


Event callbacks

Station name callback.

void audio_showstation(const char* info)

Stream information callback.

void audio_showstreamtitle(const char* info)

End of file callback.

void audio_eof_stream(const char* info)

Returns the eof url.
Also called if a stream times out/errors.

Handy function for coding a playlist.
You can use connecttohost() inside this function to start the next item.


License

MIT License

Copyright (c) 2021 Cellie

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

About

A streaming library for esp32 with a vs1053 mp3/aac/ogg/flac decoder. Plays http, https (insecure mode) and chunked streams and parses the metadata. Compiles in the Arduino IDE.

License:MIT License


Languages

Language:C++ 100.0%