ESP32 Webradio
-
- Posts: 3
- Joined: Sun Nov 05, 2017 9:41 pm
Re: ESP32 Webradio
Hi Buddy,
I'm studying your project and I have a problem with playing music in APLL mode with PDM. First I compiled the sources without any change and start radio with APPL + PDM. And the problem is that output play very-very-very slow - actually even I can't understand what is playing. I've tried without APLL - it plays OK (but not a long time).
Below is the output for APLL and non-APLL modes. For APLL It looks good except XTAL 35MHz. Could you please advice what is the problem? Maybe for APLL I need another configuration of HW?
>>> Output for APLL
...
I (66) boot: Detected ESP32
W (68) rtc_clk: Potentially bogus XTAL frequency: 35 MHz, guessing 40 MHz
...
I (3756) renderer: init I2S mode 3, port 0, 16 bit, 44100 Hz
I (3756) renderer: chip revision 1, enabling APLL
I (3766) I2S: queue free spaces: 1
I (3766) I2S: DMA Malloc info, datalen=blocksize=256, dma_buf_count=32
I (3776) I2S: APLL: Req RATE: 44100, real rate: 44099.020, BITS: 16, CLKM: 1, BC K: 8, MCLK: 5.669, SCLK: 1411168.625000, diva: 1, divb: 0
I (3786) gpio: GPIO[0]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldo wn: 0| Intr:1
I (3796) main: RAM left 170588
....
I (4226) audio_player: Buffer fill 50%, 16012 bytes
I (4316) audio_player: RAM left 170968
I (4316) audio_player: created decoder task: mp3_decoder_task
I (4316) mad_decoder: decoder start
E (4316) mad_decoder: dec err 0x0235 (bad main_data_begin pointer)
E (4326) mad_decoder: dec err 0x0235 (bad main_data_begin pointer)
I (4326) audio_player: Buffer fill 91%, 29134 bytes
I (4516) wifi: pm start, type:0
I (8016) audio_player: Buffer fill 94%, 30123 bytes
I (12126) audio_player: Buffer fill 96%, 30985 bytes
...
I (51116) audio_player: Buffer fill 99%, 31832 bytes
I (53846) http_client: ... done reading from socket. Last read return=0 errno=12 8
I (53846) http_client: socket closed
I (53846) web_radio: http_client_get completed
I (63186) mad_decoder: decoder stopped
I (63186) mad_decoder: MAD decoder stack: 540
>>> Output for non-APLL
I (3276) renderer: init I2S mode 3, port 0, 16 bit, 44100 Hz
I (3276) renderer: chip revision 1, enabling APLL
I (3286) I2S: queue free spaces: 1
I (3286) I2S: DMA Malloc info, datalen=blocksize=256, dma_buf_count=32
I (3296) I2S: PLL_D2: Req RATE: 44100, real rate: 200000.000, BITS: 16, CLKM: 5, BCK: 5, MCLK: 5.669, SCLK: 6400000.000000, diva: 64, divb: 42
....
For me it is strange digits i I2S output here. Playing is OK, but not a long time as it plays lower rate than in browser and I suppose output buffer of server finished. Thank for help in advance.
I'm studying your project and I have a problem with playing music in APLL mode with PDM. First I compiled the sources without any change and start radio with APPL + PDM. And the problem is that output play very-very-very slow - actually even I can't understand what is playing. I've tried without APLL - it plays OK (but not a long time).
Below is the output for APLL and non-APLL modes. For APLL It looks good except XTAL 35MHz. Could you please advice what is the problem? Maybe for APLL I need another configuration of HW?
>>> Output for APLL
...
I (66) boot: Detected ESP32
W (68) rtc_clk: Potentially bogus XTAL frequency: 35 MHz, guessing 40 MHz
...
I (3756) renderer: init I2S mode 3, port 0, 16 bit, 44100 Hz
I (3756) renderer: chip revision 1, enabling APLL
I (3766) I2S: queue free spaces: 1
I (3766) I2S: DMA Malloc info, datalen=blocksize=256, dma_buf_count=32
I (3776) I2S: APLL: Req RATE: 44100, real rate: 44099.020, BITS: 16, CLKM: 1, BC K: 8, MCLK: 5.669, SCLK: 1411168.625000, diva: 1, divb: 0
I (3786) gpio: GPIO[0]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldo wn: 0| Intr:1
I (3796) main: RAM left 170588
....
I (4226) audio_player: Buffer fill 50%, 16012 bytes
I (4316) audio_player: RAM left 170968
I (4316) audio_player: created decoder task: mp3_decoder_task
I (4316) mad_decoder: decoder start
E (4316) mad_decoder: dec err 0x0235 (bad main_data_begin pointer)
E (4326) mad_decoder: dec err 0x0235 (bad main_data_begin pointer)
I (4326) audio_player: Buffer fill 91%, 29134 bytes
I (4516) wifi: pm start, type:0
I (8016) audio_player: Buffer fill 94%, 30123 bytes
I (12126) audio_player: Buffer fill 96%, 30985 bytes
...
I (51116) audio_player: Buffer fill 99%, 31832 bytes
I (53846) http_client: ... done reading from socket. Last read return=0 errno=12 8
I (53846) http_client: socket closed
I (53846) web_radio: http_client_get completed
I (63186) mad_decoder: decoder stopped
I (63186) mad_decoder: MAD decoder stack: 540
>>> Output for non-APLL
I (3276) renderer: init I2S mode 3, port 0, 16 bit, 44100 Hz
I (3276) renderer: chip revision 1, enabling APLL
I (3286) I2S: queue free spaces: 1
I (3286) I2S: DMA Malloc info, datalen=blocksize=256, dma_buf_count=32
I (3296) I2S: PLL_D2: Req RATE: 44100, real rate: 200000.000, BITS: 16, CLKM: 5, BCK: 5, MCLK: 5.669, SCLK: 6400000.000000, diva: 64, divb: 42
....
For me it is strange digits i I2S output here. Playing is OK, but not a long time as it plays lower rate than in browser and I suppose output buffer of server finished. Thank for help in advance.
-
- Posts: 263
- Joined: Sun Jun 19, 2016 12:00 am
Re: ESP32 Webradio
I simply didn't test APLL + PDM, assuming it would work the same as I2S. Can you open an issue on Github please?
-
- Posts: 3
- Joined: Sun Nov 05, 2017 9:41 pm
Re: ESP32 Webradio
Yes of course. Done. DAC APLL=1 also doesn't work also. I wrote it also. Thank you!
Re: ESP32 Webradio
Hi MrBuddyCasino,
I was asking You earlier about reading from broadcast (created issue on github).
Now I would like to run Your project in two modes (to test it for 80 devices)
1. reading stream from local server
2. reading stream from SD card
We have added SD card support and server to write mp3 files from external server to SD card, for each ESP32 player
Regarding second option I can see two possibilities
a) feed mp3 stream from mp3 File to audio_stream_consumer in audio_player.c
b) use http_client_get from http.c and first write "fake" headers into http_parser_execute and then mp3 stream
Could you tell us which one we should use? "B" option should read/set all header values before audio_player_start on the other hand we intend to play only mp3 with constant bitrate, so maybe we should skip the http header parsing and just write mp3 stream to spiramfifo ?
Best Regards
Marek
I was asking You earlier about reading from broadcast (created issue on github).
Now I would like to run Your project in two modes (to test it for 80 devices)
1. reading stream from local server
2. reading stream from SD card
We have added SD card support and server to write mp3 files from external server to SD card, for each ESP32 player
Regarding second option I can see two possibilities
a) feed mp3 stream from mp3 File to audio_stream_consumer in audio_player.c
b) use http_client_get from http.c and first write "fake" headers into http_parser_execute and then mp3 stream
Could you tell us which one we should use? "B" option should read/set all header values before audio_player_start on the other hand we intend to play only mp3 with constant bitrate, so maybe we should skip the http header parsing and just write mp3 stream to spiramfifo ?
Best Regards
Marek
-
- Posts: 263
- Joined: Sun Jun 19, 2016 12:00 am
Re: ESP32 Webradio
The right abstraction would be a separate URL handler for sd cards I guess. So depending on the URL scheme, the handler would choose http/https/scdard/filesystem or whatever. Not sure how well sdcard access can be abstracted, never done it.
Re: ESP32 Webradio
Hi
We have created new task for reading from SD card and it works well, below there is example code.
This is still work in progress, but if You accept pull requests we would like to add this functionality when it is complete.
Best Regards
Marek
We have created new task for reading from SD card and it works well, below there is example code.
This is still work in progress, but if You accept pull requests we would like to add this functionality when it is complete.
Best Regards
Marek
Code: Select all
static void sd_get_task(void *pvParameters)
{
web_radio_t *radio_conf = pvParameters;
/* configure callbacks */
http_parser_settings callbacks = { 0 };
callbacks.on_body = on_body_cb;
callbacks.on_header_field = on_header_field_cb;
callbacks.on_header_value = on_header_value_cb;
callbacks.on_headers_complete = on_headers_complete_cb;
callbacks.on_message_complete = on_message_complete_cb;
// blocks until end of stream
int result = st_file_get("/sdcard/test_file.mp3",&callbacks,radio_conf->player_config);
if (result != 0) {
ESP_LOGE(TAG, "sd_client_get error");
} else {
ESP_LOGI(TAG, "sd_client_get completed");
}
vTaskDelete(NULL);
}
void web_radio_start(web_radio_t *config)
{
// start reader task
//xTaskCreatePinnedToCore(&http_get_task, "http_get_task", 2560, config, 20,NULL, 0);
xTaskCreatePinnedToCore(&sd_get_task, "sd_get_task", 2560, config, 20,NULL, 0);
}
char header[]="HTTP/1.0 200 OK\nContent-Type: audio/mpeg\n\n";
FILE* st_read_file;
int st_file_get(const char *file_name, http_parser_settings *callbacks, void *user_data) {
/* Read HTTP response */
char recv_buf[64];
bzero(recv_buf, sizeof(recv_buf));
ssize_t recved;
/* parse response */
http_parser parser;
http_parser_init(&parser, HTTP_RESPONSE);
parser.data = user_data;
esp_err_t nparsed = 0;
ESP_LOGI(TAG,"%s size:%d",header,strlen(header));
nparsed = http_parser_execute(&parser, callbacks, header, strlen(header));
st_open_file("","test_file.mp3");
fseek(st_file,400000,SEEK_SET);
nparsed=0;
do {
recved = fread(recv_buf,sizeof(char),sizeof(recv_buf)-1,st_read_file);
// ESP_LOGI(TAG,"write mp3 bytes:%d",recved);
// using http parser causes stack overflow somtimes - disable for now
nparsed = http_parser_execute(&parser, callbacks, recv_buf, recved);
} while(recved > 0 && nparsed >= 0);
st_read_close_file();
return 0;
}
void st_read_open_file(const char *dir_name,const char *file_name) {
char path[100];
create_file_path(path,dir_name,file_name);
ESP_LOGI(TAG,"st_open_file path:%s",path);
st_read_file = fopen(path, "r");
if (st_read_file == NULL) {
ESP_LOGE(TAG, "Failed to open file %s",path);
return;
}
ESP_LOGI(TAG,"File open OK\n");
}
void st_read_close_file() {
fclose(st_read_file);
ESP_LOGI(TAG,"File closed\n");
}
-
- Posts: 263
- Joined: Sun Jun 19, 2016 12:00 am
Re: ESP32 Webradio
Nice, looks like you know what you're doing. Can you tell me what hardware are you using? So I can order the parts to test it on my side.
Re: ESP32 Webradio
Hi,
Very sorry for the late reply, I had to switch to other tasks.
I have some problem with writing to SD card in SPI mode, so I described my configuration in this thread
viewtopic.php?f=2&t=3657 unfortunately no response.
We will try access card in SDIO mode.
In about two weeks we will order some prototype boards with ESP32 and other modules like DAC so if you are interested I can write more.
Best Regards
Marek
Very sorry for the late reply, I had to switch to other tasks.
I have some problem with writing to SD card in SPI mode, so I described my configuration in this thread
viewtopic.php?f=2&t=3657 unfortunately no response.
We will try access card in SDIO mode.
In about two weeks we will order some prototype boards with ESP32 and other modules like DAC so if you are interested I can write more.
Best Regards
Marek
Re: ESP32 Webradio
Hello everyone,
I was looking into whether the ESP32 could be used as the "brain" in DIY guitar pedals/synthesizers. It seems relatively powerful.
With your knowledge (I'm no expert), do you think it would be powerful enough for this, with potential good audio quality?
If so, do you have a suggestion for a tiny budget-friendly I2S DAC board with input and output of good/fine quality?
Thank you for any help!
- Jonas
Student, Aalborg University Copenhagen
I was looking into whether the ESP32 could be used as the "brain" in DIY guitar pedals/synthesizers. It seems relatively powerful.
With your knowledge (I'm no expert), do you think it would be powerful enough for this, with potential good audio quality?
If so, do you have a suggestion for a tiny budget-friendly I2S DAC board with input and output of good/fine quality?
Thank you for any help!
- Jonas
Student, Aalborg University Copenhagen
-
- Posts: 263
- Joined: Sun Jun 19, 2016 12:00 am
Re: ESP32 Webradio
It should work very well for this task. You can find code on Github or via Hackaday projects, the ESP32 has two full-duplex I2S ports which you can use. If I were you I'd just go search Aliexpress for I2S boards that suit you, there are plenty on sale for little money.
Who is online
Users browsing this forum: No registered users and 15 guests