pschatzmann / arduino-audio-tools

Arduino Audio Tools (a powerful Audio library not only for Arduino)
GNU General Public License v3.0
1.26k stars 196 forks source link

URL Stream not working #1550

Closed duevil closed 1 week ago

duevil commented 1 week ago

Problem Description

Since the last update (v0.9.8 or v.0.8.3 for Mp3Helix) I cannot play certain URLs using the URLStream class which did work flawlessly in version 0.9.7. The log shows a successfull connection, however no data is received.

I have this problem when using the new Pipeline example sketch as well as using an older approach.

The log when trying to play the URL that's not working:

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 271414342, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1184
load:0x40078000,len:13260
load:0x40080400,len:3028
entry 0x400805e4
[    30][D][esp32-hal-cpu.c:244] setCpuFrequencyMhz(): PLL: 480 / 2 = 240 Mhz, APB: 80000000 Hz
[   255][I][esp32-hal-psram.c:96] psramInit(): PSRAM enabled
[I] URLStream.h : 82 - virtual bool audio_tools::URLStream::begin(const char*, const char*, MethodID, const char*, const char*): https://streams.radio21.de/aurich/mp3-128
[I] Url.h : 58 - Url::parse
[I] Url.h : 96 - url->https://streams.radio21.de/aurich/mp3-128
[I] Url.h : 97 - host->streams.radio21.de
[I] Url.h : 98 - protocol->https
[I] Url.h : 99 - path->/aurich/mp3-128
[I] Url.h : 100 - port->443
[I] URLStream.h : 400 - bool audio_tools::URLStream::login()
[   334][D][WiFiGeneric.cpp:1039] _eventCallback(): Arduino Event: 0 - WIFI_READY
[   405][D][WiFiGeneric.cpp:1039] _eventCallback(): Arduino Event: 2 - STA_START
.[   466][D][WiFiGeneric.cpp:1039] _eventCallback(): Arduino Event: 4 - STA_CONNECTED
[   485][D][WiFiGeneric.cpp:1039] _eventCallback(): Arduino Event: 7 - STA_GOT_IP
[   485][D][WiFiGeneric.cpp:1102] _eventCallback(): STA IP: 192.168.178.32, MASK: 255.255.255.0, GW: 192.168.178.1

[I] URLStream.h : 367 - WiFiClientSecure
[I] HttpRequest.h : 222 - process connecting to host streams.radio21.de port 443
[  2009][D][ssl_client.cpp:176] start_ssl_client(): WARNING: Skipping SSL Verification. INSECURE!
[I] HttpRequest.h : 337 - connected 1 timeout 60000
[I] HttpRequest.h : 233 - Free heap: 180476
[I] HttpHeader.h : 276 - HttpHeader::write
[I] HttpHeader.h : 421 - -> GET /aurich/mp3-128 HTTP/1.1
[I] HttpHeader.h : 210 -  -> Host: streams.radio21.de 
[I] HttpHeader.h : 210 -  -> Connection: keep-alive 
[I] HttpHeader.h : 210 -  -> Accept-Encoding: identity 
[I] HttpHeader.h : 210 -  -> Accept: audio/mp3 
[I] HttpHeader.h : 342 -  -> <CR LF> 
[I] HttpRequest.h : 288 - Request written ... waiting for reply
[I] HttpHeader.h : 253 - Data available: 479
[W] URLStream.h : 342 - Redirected to: https://radio21.streamabc.net/radio21-aurich-mp3-128-9097805?sABC=6637s98p%230%23sqs1p198n899651q81933462qq3652q8%23&aw_0_1st.playerid=&amsparams=playerid:;skey:1714944396
[I] Url.h : 58 - Url::parse
[I] Url.h : 96 - url->https://radio21.streamabc.net/radio21-aurich-mp3-128-9097805?sABC=6637s98p%230%23sqs1p198n899651q81933462qq3652q8%23&aw_0_1st.playerid=&amsparams=playerid:;skey:1714944396
[I] Url.h : 97 - host->radio21.streamabc.net
[I] Url.h : 98 - protocol->https
[I] Url.h : 99 - path->/radio21-aurich-mp3-128-9097805?sABC=6637s98p%230%23sqs1p198n899651q81933462qq3652q8%23&aw_0_1st.playerid=&amsparams=playerid:;skey:1714944396
[I] Url.h : 100 - port->443
[I] URLStream.h : 367 - WiFiClientSecure
[I] HttpRequest.h : 222 - process connecting to host radio21.streamabc.net port 443
[  2870][D][ssl_client.cpp:176] start_ssl_client(): WARNING: Skipping SSL Verification. INSECURE!
[I] HttpRequest.h : 337 - connected 1 timeout 60000
[I] HttpRequest.h : 233 - Free heap: 182776
[I] HttpHeader.h : 276 - HttpHeader::write
[I] HttpHeader.h : 421 - -> GET /radio21-aurich-mp3-128-9097805?sABC=6637s98p%230%23sqs1p198n899651q81933462qq3652q8%23&aw_0_1st.playerid=&amsparams=playerid:;skey:1714944396 HTTP/1.1
[I] HttpHeader.h : 210 -  -> Host: radio21.streamabc.net 
[I] HttpHeader.h : 210 -  -> Connection: keep-alive 
[I] HttpHeader.h : 210 -  -> Accept-Encoding: identity 
[I] HttpHeader.h : 210 -  -> Accept: audio/mp3 
[I] HttpHeader.h : 342 -  -> <CR LF> 
[I] HttpRequest.h : 288 - Request written ... waiting for reply
[I] HttpHeader.h : 244 - Waiting for data...
[I] HttpHeader.h : 253 - Data available: 666
[I] HttpRequest.h : 164 - no CONTENT_LENGTH found in reply
[I] URLStream.h : 90 - size: 0
[I] URLStream.h : 234 - Request written ... waiting for reply
[I] URLStream.h : 97 - ==> http status: 200
[I] VolumeStream.h : 199 - setVolume: 0.500000 at 0
[I] VolumeStream.h : 199 - setVolume: 0.500000 at 1
[I] AudioTypes.h : 127 - out: sample_rate: 44100 / channels: 2 / bits_per_sample: 16
[I] AudioTypes.h : 127 -  sample_rate: 44100 / channels: 2 / bits_per_sample: 16
[I] I2SConfigESP32.h : 80 - rx/tx mode: TX_MODE
[I] I2SConfigESP32.h : 81 - port_no: 0
[I] I2SConfigESP32.h : 82 - is_master: Master
[I] I2SConfigESP32.h : 83 - sample rate: 44100
[I] I2SConfigESP32.h : 84 - bits per sample: 16
[I] I2SConfigESP32.h : 85 - number of channels: 2
[I] I2SConfigESP32.h : 86 - signal_type: Digital
[I] I2SConfigESP32.h : 88 - i2s_format: I2S_STD_FORMAT
[I] I2SConfigESP32.h : 90 - auto_clear: true
[I] I2SConfigESP32.h : 92 - use_apll: true
[I] I2SConfigESP32.h : 97 - buffer_count:6
[I] I2SConfigESP32.h : 98 - buffer_size:512
[I] I2SConfigESP32.h : 103 - pin_bck: 27
[I] I2SConfigESP32.h : 105 - pin_ws: 33
[I] I2SConfigESP32.h : 107 - pin_data: 12
[I] AudioEncoded.h : 321 - virtual void audio_tools::EncodedAudioOutput::addNotifyAudioChange(audio_tools::AudioInfoSupport&)
[I] AudioStreamsConverter.h : 459 - begin 16 -> 32 bits
[I] AudioTypes.h : 127 -  sample_rate: 44100 / channels: 2 / bits_per_sample: 16
[I] I2SConfigESP32.h : 80 - rx/tx mode: RXTX_MODE
[I] I2SConfigESP32.h : 81 - port_no: 0
[I] I2SConfigESP32.h : 82 - is_master: Master
[I] I2SConfigESP32.h : 83 - sample rate: 44100
[I] I2SConfigESP32.h : 84 - bits per sample: 16
[I] I2SConfigESP32.h : 85 - number of channels: 2
[I] I2SConfigESP32.h : 86 - signal_type: Digital
[I] I2SConfigESP32.h : 88 - i2s_format: I2S_STD_FORMAT
[I] I2SConfigESP32.h : 90 - auto_clear: true
[I] I2SConfigESP32.h : 92 - use_apll: true
[I] I2SConfigESP32.h : 97 - buffer_count:6
[I] I2SConfigESP32.h : 98 - buffer_size:512
[I] I2SConfigESP32.h : 103 - pin_bck: 27
[I] I2SConfigESP32.h : 105 - pin_ws: 33
[I] I2SConfigESP32.h : 107 - pin_data: 12
[I] StreamCopy.h : 147 - StreamCopy::copy  416 -> 416 -> 416 bytes - in 1 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  0 -> 0 -> 0 bytes - in 0 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  0 -> 0 -> 0 bytes - in 0 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  0 -> 0 -> 0 bytes - in 0 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  0 -> 0 -> 0 bytes - in 0 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  0 -> 0 -> 0 bytes - in 0 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  0 -> 0 -> 0 bytes - in 0 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  0 -> 0 -> 0 bytes - in 0 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  0 -> 0 -> 0 bytes - in 0 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  0 -> 0 -> 0 bytes - in 0 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  0 -> 0 -> 0 bytes - in 0 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  0 -> 0 -> 0 bytes - in 0 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  0 -> 0 -> 0 bytes - in 0 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  0 -> 0 -> 0 bytes - in 0 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  0 -> 0 -> 0 bytes - in 0 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  0 -> 0 -> 0 bytes - in 0 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  0 -> 0 -> 0 bytes - in 0 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  0 -> 0 -> 0 bytes - in 0 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  0 -> 0 -> 0 bytes - in 0 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  0 -> 0 -> 0 bytes - in 0 hops
...

Device Description

Adafruit ESP32 Feather V2

Sketch

#include "AudioTools.h"
#include "AudioCodecs/CodecMP3Helix.h"

URLStream url(SSID, PASS);
Pipeline pipeline;
MP3DecoderHelix helix;
EncodedAudioStream dec(&helix);
VolumeStream volume;
NumberFormatConverterStream bits;
I2SStream i2s;
StreamCopy copier(pipeline, url);

void setup(){
    Serial.begin(115200);
    AudioLogger::instance().begin(Serial, AudioLogger::Info);
    // mp3 radio
    url.begin("http://stream.srg-ssr.ch/m/rsj/mp3_128","audio/mp3"); // works
    //url.begin("https://streams.radio21.de/aurich/mp3-128","audio/mp3"); // does not work

    // predefine define some values
    volume.setVolume(0.5);
    bits.setToBits(32);

    auto cfg = i2s.defaultConfig();
    cfg.pin_ws = GPIO_NUM_33;
    cfg.pin_bck = GPIO_NUM_27;
    cfg.pin_data = GPIO_NUM_12;
    i2s.begin(cfg);

    // setup pipeline
    pipeline.add(dec);
    pipeline.add(volume);
    pipeline.add(bits);
    pipeline.setOutput(i2s);
    // start all components with their default values
    pipeline.begin();
}

void loop(){
    copier.copy();
}

Other Steps to Reproduce

No response

What is your development environment

PlatformIO

my lib_deps:

    https://github.com/pschatzmann/arduino-audio-tools#v0.9.8
    https://github.com/pschatzmann/arduino-libhelix#v.0.8.3

I have checked existing issues, discussions and online documentation

pschatzmann commented 1 week ago

Please don't report any problems that have already been corrected! I can't reproduce your issue with the latest code from the master branch...

Is there any reason why you convert to 32 bits ?

duevil commented 1 week ago

Please don't report any problems that have already been corrected! I can't reproduce your issue with the latest code from the master branch...

Is there any reason why you convert to 32 bits ?

How was the problem corrected? I am using the newest version of the library and the problem still occurs. It seems to be caused by using a https connection. When changing the url to use a plain http connection I can get the stream to work. Is this intended? In the previous version I also did use https and had no problems.

And no, there is no reason for why I use 32 bits, I simply copied the Pipeline example for testing

pschatzmann commented 1 week ago

As far as I can see the issue is caused by the 32 bit conversion which is not notifying the i2s. It is corrected in the main branch, so please use this!

duevil commented 1 week ago

As far as I can see the issue is caused by the 32 bit conversion which is not notifying the i2s. It is corrected in the main branch, so please use this!

As far as I know I am using the main branch. And the problem persists without using the 23 bit conversion, so that is not the cause. I have testet this with a new project with the same pipeline implemented in my main project. The log shows the problem: When connecting using http, everything is fine, however when trying to connect using https the error occurs. In the test I have called the stream begin inside a Ticker callback which causes the ESP to crash, however when called in the setup the problem remains, though no crash occurs but the stream won't provide any data.

Sketch

#include <AudioTools.h>
#include <AudioLibs/MemoryManager.h>
#include <AudioCodecs/CodecMP3Helix.h>
#include <Ticker.h>

#define SSID ""
#define PASS ""

constexpr auto PIN_DATA = GPIO_NUM_12;
constexpr auto PIN_BCK = GPIO_NUM_27;
constexpr auto PIN_LRC = GPIO_NUM_33;

MemoryManager mem{};
I2SStream i2s{};
AdapterAudioStreamToAudioOutput i2sOut{i2s};
VolumeOutput volumeOut{};
MultiOutput i2sAndVolumeOut{i2sOut, volumeOut};
FadeStream fadeStream{};
VolumeStream volumeStream{};
EncodedAudioOutput decodedOut{new MP3DecoderHelix()};
Pipeline pipeline{};
StreamCopy copier;
ICYStream icy{};

Ticker ticker;

static void metaData(MetaDataType type, const char *data, int) { log_v("Metadata: [%s] %s", toStr(type), data); }

struct : ModifyingOutput {
    Print *out = nullptr;

    void setOutput(Print &output) override { out = &output; }

    size_t write(const uint8_t *buffer, size_t size) override {
        if (out) {
            return out->write(buffer, size);
        }
        return size;
    }

    void setAudioInfo(AudioInfo newInfo) override {
        ModifyingOutput::setAudioInfo(newInfo);
        log_i("Audio info: sample rate: %d, bits per sample: %d, channels: %d",
              newInfo.sample_rate, newInfo.bits_per_sample, newInfo.channels);
    }
} info;

void play(const char *url) {
    log_i("Playing URL: %s", url);
    icy.begin(url);
    copier.begin(pipeline, icy);
    copier.setActive(true);
    fadeStream.setFadeInActive(true);
}

void setup() {
    Serial.begin(SERIAL_BAUD_RATE);

    WiFi.begin(SSID, PASS);
    while (WiFi.status() != WL_CONNECTED) {
        delay(100);
        log_d("Connecting to WiFi...");
    }

    AudioLogger::instance().begin(Serial, AudioLogger::Info);
    log_i("Audio setup");

    mem.begin((int) ESP.getPsramSize() / 2);

    auto cfg = i2s.defaultConfig();
    cfg.pin_ws = PIN_LRC;
    cfg.pin_bck = PIN_BCK;
    cfg.pin_data = PIN_DATA;
    cfg.buffer_count = 8;
    cfg.buffer_size = 1024;
    i2s.begin(cfg);

    volumeStream.setVolume(0.66f);

    pipeline.add(decodedOut);
    pipeline.add(volumeStream);
    pipeline.add(fadeStream);
    pipeline.add(info);
    pipeline.setOutput(i2sAndVolumeOut);
    pipeline.begin();
    i2sOut.begin();

    icy.setMetadataCallback(metaData);

    copier.setActive(false);

    log_i("Audio setup complete");
    AudioLogger::instance().begin(Serial, AudioLogger::Warning);

    ticker.attach(10, []() {
        static uint8_t state = 0;
        switch (state) {
            case 0:
                play("http://streams.radio21.de/aurich/mp3-128/web");
                state = 1;
                break;
            case 1:
                play("https://streams.radio21.de/aurich/mp3-128/web");
                state = 0;
                break;
        }
    });

    play("http://stream.srg-ssr.ch/m/rsj/mp3_128");
}

void loop() {
    static auto last = millis();
    auto written = copier.copy();
    if (written > 0) {
        last = millis();
        auto max = (float) pow(2, volumeOut.audioInfo().bits_per_sample - 1) - 1;
        auto v = (uint8_t) mapFloat(volumeOut.volume(), 0.0f, max, 0, 255);
        // the volume signal would be user here to control a LED or something
        (void) v;
    } else if (copier.isActive() && millis() - last > 1000) {
        log_i("No audio data copied for more than a second, stopping playback");
        if (copier.available()) {
            fadeStream.setFadeOutActive(true);
            copier.copyN(copier.minCopySize());
        }
        icy.end();
        copier.setActive(false);
    }
}

platformio.ini

[env:adafruit_feather_esp32_v2]
platform = espressif32@6.5.0
board = adafruit_feather_esp32_v2
framework = arduino
upload_speed = 921600
monitor_speed = 115200
monitor_filters = esp32_exception_decoder
build_flags =
    -w
    -D SERIAL_BAUD_RATE=${env:adafruit_feather_esp32_v2.monitor_speed}
    -D CORE_DEBUG_LEVEL=4
board_build.partitions = huge_app.csv
lib_deps =
    https://github.com/pschatzmann/arduino-audio-tools#v0.9.8
    https://github.com/pschatzmann/arduino-libhelix#v.0.8.3

Log

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 271414342, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1184
load:0x40078000,len:13260
load:0x40080400,len:3028
entry 0x400805e4
[    31][D][esp32-hal-cpu.c:244] setCpuFrequencyMhz(): PLL: 480 / 2 = 240 Mhz, APB: 80000000 Hz
[   256][I][esp32-hal-psram.c:96] psramInit(): PSRAM enabled
[   302][D][WiFiGeneric.cpp:1039] _eventCallback(): Arduino Event: 0 - WIFI_READY
[   373][D][WiFiGeneric.cpp:1039] _eventCallback(): Arduino Event: 2 - STA_START
[   437][D][WiFiGeneric.cpp:1039] _eventCallback(): Arduino Event: 4 - STA_CONNECTED
[   461][D][WiFiGeneric.cpp:1039] _eventCallback(): Arduino Event: 7 - STA_GOT_IP
[   461][D][WiFiGeneric.cpp:1102] _eventCallback(): STA IP: 192.168.178.32, MASK: 255.255.255.0, GW: 192.168.178.1
[   486][D][main.cpp:67] setup(): Connecting to WiFi...
[   486][I][main.cpp:72] setup(): Audio setup
[I] MemoryManager.h : 29 - Activate PSRAM from 1047551 bytes
[I] AudioTypes.h : 127 - out: sample_rate: 44100 / channels: 2 / bits_per_sample: 16
[I] AudioTypes.h : 127 -  sample_rate: 44100 / channels: 2 / bits_per_sample: 16
[I] I2SConfigESP32.h : 80 - rx/tx mode: TX_MODE
[I] I2SConfigESP32.h : 81 - port_no: 0
[I] I2SConfigESP32.h : 82 - is_master: Master
[I] I2SConfigESP32.h : 83 - sample rate: 44100
[I] I2SConfigESP32.h : 84 - bits per sample: 16
[I] I2SConfigESP32.h : 85 - number of channels: 2
[I] I2SConfigESP32.h : 86 - signal_type: Digital
[I] I2SConfigESP32.h : 88 - i2s_format: I2S_STD_FORMAT
[I] I2SConfigESP32.h : 90 - auto_clear: true
[I] I2SConfigESP32.h : 92 - use_apll: true
[I] I2SConfigESP32.h : 97 - buffer_count:8
[I] I2SConfigESP32.h : 98 - buffer_size:1024
[I] I2SConfigESP32.h : 103 - pin_bck: 27
[I] I2SConfigESP32.h : 105 - pin_ws: 33
[I] I2SConfigESP32.h : 107 - pin_data: 12
[I] VolumeStream.h : 199 - setVolume: 0.660000 at 0
[I] VolumeStream.h : 199 - setVolume: 0.660000 at 1
[I] AudioEncoded.h : 321 - virtual void audio_tools::EncodedAudioOutput::addNotifyAudioChange(audio_tools::AudioInfoSupport&)
[I] AudioTypes.h : 127 -  sample_rate: 44100 / channels: 2 / bits_per_sample: 16
[I] I2SConfigESP32.h : 80 - rx/tx mode: RXTX_MODE
[I] I2SConfigESP32.h : 81 - port_no: 0
[I] I2SConfigESP32.h : 82 - is_master: Master
[I] I2SConfigESP32.h : 83 - sample rate: 44100
[I] I2SConfigESP32.h : 84 - bits per sample: 16
[I] I2SConfigESP32.h : 85 - number of channels: 2
[I] I2SConfigESP32.h : 86 - signal_type: Digital
[I] I2SConfigESP32.h : 88 - i2s_format: I2S_STD_FORMAT
[I] I2SConfigESP32.h : 90 - auto_clear: true
[I] I2SConfigESP32.h : 92 - use_apll: true
[I] I2SConfigESP32.h : 97 - buffer_count:8
[I] I2SConfigESP32.h : 98 - buffer_size:1024
[I] I2SConfigESP32.h : 103 - pin_bck: 27
[I] I2SConfigESP32.h : 105 - pin_ws: 33
[I] I2SConfigESP32.h : 107 - pin_data: 12
[   654][I][main.cpp:98] setup(): Audio setup complete
[   657][I][main.cpp:53] play(): Playing URL: http://stream.srg-ssr.ch/m/rsj/mp3_128
[  1984][I][main.cpp:47] setAudioInfo(): Audio info: sample rate: 48000, bits per sample: 16, channels: 2
[ 10657][I][main.cpp:53] play(): Playing URL: http://streams.radio21.de/aurich/mp3-128/web
[ 10658][I][WiFiClient.cpp:539] connected(): Unexpected: RES: 0, ERR: 0
[W] URLStream.h : 342 - Redirected to: http://radio21.streamabc.net/radio21-aurich-mp3-128-9097805?sABC=6638q50r%230%23por329q72nn690p0p3q71q5pqn9425p2%23jro&aw_0_1st.playerid=web&amsparams=playerid:web;skey:1715000590
[E] MetaDataICY.h : 269 - icy-metaint not defined
[W] ICYStream.h : 73 - url does not provide metadata
[ 11719][I][main.cpp:47] setAudioInfo(): Audio info: sample rate: 44100, bits per sample: 16, channels: 2
[ 20657][I][main.cpp:53] play(): Playing URL: https://streams.radio21.de/aurich/mp3-128/web
[ 20708][D][ssl_client.cpp:176] start_ssl_client(): WARNING: Skipping SSL Verification. INSECURE!
[W] URLStream.h : 342 - Redirected to: https://radio21.streamabc.net/radio21-aurich-mp3-128-9097805?sABC=6638q519%230%23por329q72nn690p0p3q71q5pqn9425p2%23jro&aw_0_1st.playerid=web&amsparams=playerid:web;skey:1715000601
[ 21651][D][ssl_client.cpp:176] start_ssl_client(): WARNING: Skipping SSL Verification. INSECURE!
[ 21674][I][main.cpp:129] loop(): No audio data copied for more than a second, stopping playback
Guru Meditation Error: Core  0 panic'ed (Unhandled debug exception). 
Debug exception reason: Stack canary watchpoint triggered (esp_timer) 
Core  0 register dump:
PC      : 0x40136db4  PS      : 0x00060636  A0      : 0x80137c1d  A1      : 0x3ffba270  
A2      : 0x3ffba360  A3      : 0xe6831272  A4      : 0x00000000  A5      : 0x75f82a8f  
A6      : 0x6ba97e63  A7      : 0x01ebda0f  A8      : 0xc5e8b4fd  A9      : 0x00000040  
A10     : 0x00000001  A11     : 0x00000000  A12     : 0xd4000000  A13     : 0x34f4975f  
A14     : 0xbe000000  A15     : 0x00000008  SAR     : 0x0000001e  EXCCAUSE: 0x00000001  
EXCVADDR: 0x00000000  LBEG    : 0x40136d00  LEND    : 0x40136dbc  LCOUNT  : 0x00000039  

Backtrace: 0x40136db1:0x3ffba270 0x40137c1a:0x3ffba5d0 0x40137c8f:0x3ffba5f0 0x40137cc9:0x3ffba610 0x40133e84:0x3ffba630 0x4012e3c2:0x3ffba730 0x4012e4ba:0x3ffba7a0 0x4012e506:0x3ffba850 0x4012e689:0x3ffba8d0 0x4012a029:0x3ffba8f0 0x4012a10a:0x3ffbaaa0 0x4012a1e9:0x3ffbaac0 0x4012a2bd:0x3ffbab30 0x4012798e:0x3ffbab50 0x40128953:0x3ffbab80 0x4012b3f2:0x3ffbabd0 0x4012c12d:0x3ffbac10 0x4012c937:0x3ffbae00 0x4012a82d:0x3ffbaf60 0x4012aa34:0x3ffbaf90 0x40125484:0x3ffbafb0 0x40122eb5:0x3ffbb050 0x40122eef:0x3ffbb070 0x400e65ed:0x3ffbb090 0x400e5607:0x3ffbb320 0x400e56ce:0x3ffbb370 0x400e57aa:0x3ffbb3b0 0x400d50e0:0x3ffbb3d0 0x400db565:0x3ffbb3f0 0x400d43e3:0x3ffbb430 0x400dac4f:0x3ffbb460 0x400dad04:0x3ffbb4a0 0x400dae0b:0x3ffbb4c0 0x400daeba:0x3ffbb500 0x400daf4b:0x3ffbb520 0x401158f7:0x3ffbb540

  #0  0x40136db1:0x3ffba270 in mbedtls_sha512_software_process at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/port/sha/parallel_engine/esp_sha512.c:298 (discriminator 2)
  #1  0x40137c1a:0x3ffba5d0 in mbedtls_internal_sha512_process at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/port/sha/parallel_engine/esp_sha512.c:252
  #2  0x40137c8f:0x3ffba5f0 in mbedtls_sha512_update_ret at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/port/sha/parallel_engine/esp_sha512.c:367
  #3  0x40137cc9:0x3ffba610 in mbedtls_sha512_update_ret at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/port/sha/parallel_engine/esp_sha512.c:342
  #4  0x40133e84:0x3ffba630 in mbedtls_sha512_ret at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/sha512.c:461
  #5  0x4012e3c2:0x3ffba730 in entropy_update at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/entropy.c:186
  #6  0x4012e4ba:0x3ffba7a0 in entropy_gather_internal at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/entropy.c:291
  #7  0x4012e506:0x3ffba850 in entropy_gather_internal at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/entropy.c:269
      (inlined by) mbedtls_entropy_func at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/entropy.c:371
  #8  0x4012e689:0x3ffba8d0 in mbedtls_entropy_func at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/entropy.c:340
  #9  0x4012a029:0x3ffba8f0 in mbedtls_ctr_drbg_reseed_internal at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/ctr_drbg.c:381
  #10 0x4012a10a:0x3ffbaaa0 in mbedtls_ctr_drbg_reseed at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/ctr_drbg.c:419
  #11 0x4012a1e9:0x3ffbaac0 in mbedtls_ctr_drbg_random_with_add at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/ctr_drbg.c:537
  #12 0x4012a2bd:0x3ffbab30 in mbedtls_ctr_drbg_random at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/ctr_drbg.c:604
  #13 0x4012798e:0x3ffbab50 in mpi_fill_random_internal at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/bignum.c:2501
  #14 0x40128953:0x3ffbab80 in mbedtls_mpi_random at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/bignum.c:2594 (discriminator 2)
  #15 0x4012b3f2:0x3ffbabd0 in ecp_randomize_jac at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/ecp.c:1721
  #16 0x4012c12d:0x3ffbac10 in ecp_mul_comb_core at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/ecp.c:2086
      (inlined by) ecp_mul_comb_after_precomp at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/ecp.c:2198
      (inlined by) ecp_mul_comb at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/ecp.c:2401
  #17 0x4012c937:0x3ffbae00 in mbedtls_ecp_mul_restartable at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/ecp.c:2763
      (inlined by) mbedtls_ecp_mul_restartable at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/ecp.c:2711
  #18 0x4012a82d:0x3ffbaf60 in ecdh_gen_public_restartable at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/ecdh.c:89
      (inlined by) mbedtls_ecdh_gen_public at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/ecdh.c:107
  #19 0x4012aa34:0x3ffbaf90 in ecdh_make_public_internal at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/ecdh.c:558
      (inlined by) mbedtls_ecdh_make_public at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/ecdh.c:587
  #20 0x40125484:0x3ffbafb0 in ssl_write_client_key_exchange at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/ssl_cli.c:3725
      (inlined by) mbedtls_ssl_handshake_client_step at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/ssl_cli.c:4347
  #21 0x40122eb5:0x3ffbb050 in mbedtls_ssl_handshake_step at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/ssl_tls.c:5770
  #22 0x40122eef:0x3ffbb070 in mbedtls_ssl_handshake at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/mbedtls/mbedtls/library/ssl_tls.c:5808
  #23 0x400e65ed:0x3ffbb090 in start_ssl_client(sslclient_context*, IPAddress const&, unsigned int, char const*, int, char const*, bool, char const*, char const*, char const*, char const*, bool, char const**) at C:/Users/Malte/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src/ssl_client.cpp:271
  #24 0x400e5607:0x3ffbb320 in WiFiClientSecure::connect(IPAddress, unsigned short, char const*, char const*, char const*, char const*) at C:/Users/Malte/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src/WiFiClientSecure.cpp:141
  #25 0x400e56ce:0x3ffbb370 in WiFiClientSecure::connect(char const*, unsigned short, char const*, char const*, char const*) at C:/Users/Malte/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src/WiFiClientSecure.cpp:136
  #26 0x400e57aa:0x3ffbb3b0 in WiFiClientSecure::connect(char const*, unsigned short) at C:/Users/Malte/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src/WiFiClientSecure.cpp:117
      (inlined by) WiFiClientSecure::connect(char const*, unsigned short) at C:/Users/Malte/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src/WiFiClientSecure.cpp:113
  #27 0x400d50e0:0x3ffbb3d0 in audio_tools::HttpRequest::connect(char const*, unsigned short, int) at .pio/libdeps/adafruit_feather_esp32_v2/audio-tools/src/AudioHttp/HttpRequest.h:336
  #28 0x400db565:0x3ffbb3f0 in audio_tools::HttpRequest::processBegin(MethodID, audio_tools::Url&, char const*, int) at .pio/libdeps/adafruit_feather_esp32_v2/audio-tools/src/AudioHttp/HttpRequest.h:223 (discriminator 3)
  #29 0x400d43e3:0x3ffbb430 in audio_tools::HttpRequest::process(MethodID, audio_tools::Url&, char const*, char const*, int) at .pio/libdeps/adafruit_feather_esp32_v2/audio-tools/src/AudioHttp/HttpRequest.h:187
  #30 0x400dac4f:0x3ffbb460 in int audio_tools::URLStream::process<char const*>(MethodID, audio_tools::Url&, char const*, char const*, int) at .pio/libdeps/adafruit_feather_esp32_v2/audio-tools/src/AudioHttp/URLStream.h:350
  #31 0x400dad04:0x3ffbb4a0 in audio_tools::URLStream::begin(char const*, char const*, MethodID, char const*, char const*) at .pio/libdeps/adafruit_feather_esp32_v2/audio-tools/src/AudioHttp/URLStream.h:87
  #32 0x400dae0b:0x3ffbb4c0 in audio_tools::ICYStream::begin(char const*, char const*, MethodID, char const*, char const*) at .pio/libdeps/adafruit_feather_esp32_v2/audio-tools/src/AudioHttp/ICYStream.h:61 (discriminator 3)
  #33 0x400daeba:0x3ffbb500 in play(char const*) at src/main.cpp:54
  #34 0x400daf4b:0x3ffbb520 in setup()::{lambda()#1}::_FUN() at src/main.cpp:110
      (inlined by) _FUN at src/main.cpp:114
  #35 0x401158f7:0x3ffbb540 in timer_process_alarm at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/esp_timer/src/esp_timer.c:396
      (inlined by) timer_task at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/esp_timer/src/esp_timer.c:422
pschatzmann commented 1 week ago

To use the main branch you will need to change the https://github.com/pschatzmann/arduino-audio-tools#v0.9.8 https://github.com/pschatzmann/arduino-libhelix#v.0.8.3 to https://github.com/pschatzmann/arduino-audio-tools https://github.com/pschatzmann/arduino-libhelix

What ESP32 core version are you using ? The actual one is 2.0.16

duevil commented 1 week ago

To use the main branch you will need to change the https://github.com/pschatzmann/arduino-audio-tools#v0.9.8 https://github.com/pschatzmann/arduino-libhelix#v.0.8.3 to https://github.com/pschatzmann/arduino-audio-tools https://github.com/pschatzmann/arduino-libhelix

What ESP32 core version are you using ? The actual one is 2.0.16

The problem still persist when omitting the version number.

As for the core version: The latest platfom version is 6.6.0, which supports the core version 2.0.14. As far as I know there is no other way to change the core version but for changing the platform version.

Edit: Forgot to mention; tested using platform version 6.6.0, problem persists.

pschatzmann commented 1 week ago

Did you try to delete the .pio folder to trigger a reload of the libraries ? I am not sure if just updating the link is good enough. Also go back to the initial version of your sketch. I don't want to work on an issue where you constantly change the sketch and potentially introduce other bugs.

With your original sketch compiled in PlatformIO I am getting

rst:0x1 (POWERON_RESET),boot:0x1f (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:1184
load:0x40078000,len:13232
load:0x40080400,len:3028
entry 0x400805e4
[I] URLStream.h : 82 - virtual bool audio_tools::URLStream::begin(const char*, const char*, MethodID, const char*, const char*): https://streams.radio21.de/aurich/mp3-128
[I] Url.h : 58 - Url::parse
[I] Url.h : 96 - url->https://streams.radio21.de/aurich/mp3-128
[I] Url.h : 97 - host->streams.radio21.de
[I] Url.h : 98 - protocol->https
[I] Url.h : 99 - path->/aurich/mp3-128
[I] Url.h : 100 - port->443
[I] URLStream.h : 400 - bool audio_tools::URLStream::login()
.
[I] URLStream.h : 367 - WiFiClientSecure
[I] HttpRequest.h : 222 - process connecting to host streams.radio21.de port 443
[I] HttpRequest.h : 337 - connected 1 timeout 60000
[I] HttpRequest.h : 233 - Free heap: 193264
[I] HttpHeader.h : 276 - HttpHeader::write
[I] HttpHeader.h : 421 - -> GET /aurich/mp3-128 HTTP/1.1
[I] HttpHeader.h : 210 -  -> Host: streams.radio21.de 
[I] HttpHeader.h : 210 -  -> Connection: keep-alive 
[I] HttpHeader.h : 210 -  -> Accept-Encoding: identity 
[I] HttpHeader.h : 210 -  -> Accept: audio/mp3 
[I] HttpHeader.h : 342 -  -> <CR LF> 
[I] HttpRequest.h : 288 - Request written ... waiting for reply
[I] HttpHeader.h : 253 - Data available: 479
[W] URLStream.h : 342 - Redirected to: https://radio21.streamabc.net/radio21-aurich-mp3-128-9097805?sABC=6638r467%230%23r5rq9p4r023575s942379o63394qq52o%23&aw_0_1st.playerid=&amsparams=playerid:;skey:1715004519
[I] Url.h : 58 - Url::parse
[I] Url.h : 96 - url->https://radio21.streamabc.net/radio21-aurich-mp3-128-9097805?sABC=6638r467%230%23r5rq9p4r023575s942379o63394qq52o%23&aw_0_1st.playerid=&amsparams=playerid:;skey:1715004519
[I] Url.h : 97 - host->radio21.streamabc.net
[I] Url.h : 98 - protocol->https
[I] Url.h : 99 - path->/radio21-aurich-mp3-128-9097805?sABC=6638r467%230%23r5rq9p4r023575s942379o63394qq52o%23&aw_0_1st.playerid=&amsparams=playerid:;skey:1715004519
[I] Url.h : 100 - port->443
[I] URLStream.h : 367 - WiFiClientSecure
[I] HttpRequest.h : 222 - process connecting to host radio21.streamabc.net port 443
[I] HttpRequest.h : 337 - connected 1 timeout 60000
[I] HttpRequest.h : 233 - Free heap: 192784
[I] HttpHeader.h : 276 - HttpHeader::write
[I] HttpHeader.h : 421 - -> GET /radio21-aurich-mp3-128-9097805?sABC=6638r467%230%23r5rq9p4r023575s942379o63394qq52o%23&aw_0_1st.playerid=&amsparams=playerid:;skey:1715004519 HTTP/1.1
[I] HttpHeader.h : 210 -  -> Host: radio21.streamabc.net 
[I] HttpHeader.h : 210 -  -> Connection: keep-alive 
[I] HttpHeader.h : 210 -  -> Accept-Encoding: identity 
[I] HttpHeader.h : 210 -  -> Accept: audio/mp3 
[I] HttpHeader.h : 342 -  -> <CR LF> 
[I] HttpRequest.h : 288 - Request written ... waiting for reply
[I] HttpHeader.h : 244 - Waiting for data...
[I] HttpHeader.h : 253 - Data available: 666
[I] HttpRequest.h : 164 - no CONTENT_LENGTH found in reply
[I] URLStream.h : 90 - size: 0
[I] URLStream.h : 234 - Request written ... waiting for reply
[I] URLStream.h : 97 - ==> http status: 200
[I] VolumeStream.h : 199 - setVolume: 0.500000 at 0
[I] VolumeStream.h : 199 - setVolume: 0.500000 at 1
[I] AudioTypes.h : 127 - out: sample_rate: 44100 / channels: 2 / bits_per_sample: 16
[I] AudioTypes.h : 127 -  sample_rate: 44100 / channels: 2 / bits_per_sample: 16
[I] I2SConfigESP32.h : 80 - rx/tx mode: TX_MODE
[I] I2SConfigESP32.h : 81 - port_no: 0
[I] I2SConfigESP32.h : 82 - is_master: Master
[I] I2SConfigESP32.h : 83 - sample rate: 44100
[I] I2SConfigESP32.h : 84 - bits per sample: 16
[I] I2SConfigESP32.h : 85 - number of channels: 2
[I] I2SConfigESP32.h : 86 - signal_type: Digital
[I] I2SConfigESP32.h : 88 - i2s_format: I2S_STD_FORMAT
[I] I2SConfigESP32.h : 90 - auto_clear: true
[I] I2SConfigESP32.h : 92 - use_apll: true
[I] I2SConfigESP32.h : 97 - buffer_count:6
[I] I2SConfigESP32.h : 98 - buffer_size:512
[I] I2SConfigESP32.h : 103 - pin_bck: 27
[I] I2SConfigESP32.h : 105 - pin_ws: 33
[I] I2SConfigESP32.h : 107 - pin_data: 12
[I] AudioEncoded.h : 321 - virtual void audio_tools::EncodedAudioOutput::addNotifyAudioChange(audio_tools::AudioInfoSupport&)
[I] AudioStreamsConverter.h : 490 - begin 16 -> 32 bits
[I] AudioTypes.h : 127 -  sample_rate: 44100 / channels: 2 / bits_per_sample: 16
[I] I2SConfigESP32.h : 80 - rx/tx mode: TX_MODE
[I] I2SConfigESP32.h : 81 - port_no: 0
[I] I2SConfigESP32.h : 82 - is_master: Master
[I] I2SConfigESP32.h : 83 - sample rate: 44100
[I] I2SConfigESP32.h : 84 - bits per sample: 16
[I] I2SConfigESP32.h : 85 - number of channels: 2
[I] I2SConfigESP32.h : 86 - signal_type: Digital
[I] I2SConfigESP32.h : 88 - i2s_format: I2S_STD_FORMAT
[I] I2SConfigESP32.h : 90 - auto_clear: true
[I] I2SConfigESP32.h : 92 - use_apll: true
[I] I2SConfigESP32.h : 97 - buffer_count:6
[I] I2SConfigESP32.h : 98 - buffer_size:512
[I] I2SConfigESP32.h : 103 - pin_bck: 27
[I] I2SConfigESP32.h : 105 - pin_ws: 33
[I] I2SConfigESP32.h : 107 - pin_data: 12
[I] StreamCopy.h : 147 - StreamCopy::copy  418 -> 418 -> 418 bytes - in 1 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  418 -> 418 -> 418 bytes - in 1 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  417 -> 417 -> 417 bytes - in 1 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  418 -> 418 -> 418 bytes - in 1 hops
[I] AudioTypes.h : 127 - MP3DecoderHelix sample_rate: 44100 / channels: 2 / bits_per_sample: 16
[I] AudioStreamsConverter.h : 454 - -> NumberFormatConverterStream:
[I] AudioTypes.h : 127 - out: sample_rate: 44100 / channels: 2 / bits_per_sample: 32
[I] I2SStream.h : 83 - virtual void audio_tools::I2SStream::setAudioInfo(audio_tools::AudioInfo)
[I] AudioTypes.h : 127 - in: sample_rate: 44100 / channels: 2 / bits_per_sample: 32
[I] AudioTypes.h : 127 - out: sample_rate: 44100 / channels: 2 / bits_per_sample: 32
[I] I2SStream.h : 92 - restarting i2s
[I] AudioTypes.h : 127 - I2SStream sample_rate: 44100 / channels: 2 / bits_per_sample: 32
[I] AudioTypes.h : 127 -  sample_rate: 44100 / channels: 2 / bits_per_sample: 32
[I] I2SConfigESP32.h : 80 - rx/tx mode: TX_MODE
[I] I2SConfigESP32.h : 81 - port_no: 0
[I] I2SConfigESP32.h : 82 - is_master: Master
[I] I2SConfigESP32.h : 83 - sample rate: 44100
[I] I2SConfigESP32.h : 84 - bits per sample: 32
[I] I2SConfigESP32.h : 85 - number of channels: 2
[I] I2SConfigESP32.h : 86 - signal_type: Digital
[I] I2SConfigESP32.h : 88 - i2s_format: I2S_STD_FORMAT
[I] I2SConfigESP32.h : 90 - auto_clear: true
[I] I2SConfigESP32.h : 92 - use_apll: true
[I] I2SConfigESP32.h : 97 - buffer_count:6
[I] I2SConfigESP32.h : 98 - buffer_size:512
[I] I2SConfigESP32.h : 103 - pin_bck: 27
[I] I2SConfigESP32.h : 105 - pin_ws: 33
[I] I2SConfigESP32.h : 107 - pin_data: 12
[I] StreamCopy.h : 147 - StreamCopy::copy  418 -> 418 -> 418 bytes - in 1 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  418 -> 418 -> 418 bytes - in 1 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  418 -> 418 -> 418 bytes - in 1 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  418 -> 418 -> 418 bytes - in 1 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  418 -> 418 -> 418 bytes - in 1 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  418 -> 418 -> 418 bytes - in 1 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  418 -> 418 -> 418 bytes - in 1 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  418 -> 418 -> 418 bytes - in 1 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  418 -> 418 -> 418 bytes - in 1 hops
[I] StreamCopy.h : 147 - StreamCopy::copy  418 -> 418 -> 418 bytes - in 1 hops