77#include "esp_psram.h"
88
99// Flag if the stream is currently underrun and rebuffering
10- bool is_underrun = true;
10+ bool is_underrun = true;
1111// Number of received packets since last underflow
12- uint64_t received_packets = 0 ;
12+ unsigned int received_packets = 0 ;
1313// Number of packets in ring buffer
1414unsigned int packet_buffer_size = 0 ;
1515// Position of ring buffer read head
16- uint64_t packet_buffer_pos = 0 ;
16+ unsigned int packet_buffer_pos = 0 ;
1717// Number of bytes to buffer
18- uint64_t target_buffer_size = INITIAL_BUFFER_SIZE ;
18+ unsigned int target_buffer_size = INITIAL_BUFFER_SIZE ;
1919// Buffer of packets to send
2020uint8_t * packet_buffer [MAX_BUFFER_SIZE ] = { 0 };
2121portMUX_TYPE buffer_mutex = portMUX_INITIALIZER_UNLOCKED ;
@@ -24,20 +24,20 @@ void set_underrun() {
2424 if (!is_underrun ) {
2525 received_packets = 0 ;
2626 target_buffer_size += BUFFER_GROW_STEP_SIZE ;
27- if (target_buffer_size >= MAX_BUFFER_SIZE )
28- target_buffer_size = MAX_BUFFER_SIZE ;
29- ESP_LOGI (TAG , "Buffer Underflow" );
27+ if (target_buffer_size >= MAX_GROW_SIZE )
28+ target_buffer_size = MAX_GROW_SIZE ;
29+ ESP_LOGI (TAG , "Buffer Underflow, New Size: %i" , target_buffer_size );
3030 }
3131 is_underrun = true;
3232}
3333
3434bool push_chunk (uint8_t * chunk ) {
3535 int write_position = (packet_buffer_pos + packet_buffer_size ) % MAX_BUFFER_SIZE ;
3636// ESP_LOGI(TAG, "memcpy(%p, %p, %i)", packet_buffer[write_position], chunk, PCM_CHUNK_SIZE);
37- // taskENTER_CRITICAL(&buffer_mutex);
37+ taskENTER_CRITICAL (& buffer_mutex );
3838 if (packet_buffer_size == MAX_BUFFER_SIZE ) {
3939 packet_buffer_size = target_buffer_size ;
40- // taskEXIT_CRITICAL(&buffer_mutex);
40+ taskEXIT_CRITICAL (& buffer_mutex );
4141 ESP_LOGI (TAG , "Buffer Overflow" );
4242 return false;
4343 }
@@ -48,32 +48,38 @@ bool push_chunk(uint8_t *chunk) {
4848 received_packets ++ ;
4949 if (received_packets >= target_buffer_size )
5050 is_underrun = false;
51- // taskEXIT_CRITICAL(&buffer_mutex);
51+ taskEXIT_CRITICAL (& buffer_mutex );
5252 return true;
5353}
5454
5555uint8_t * pop_chunk () {
56- // taskENTER_CRITICAL(&buffer_mutex);
56+ taskENTER_CRITICAL (& buffer_mutex );
5757 if (packet_buffer_size == 0 ) {
58- // taskEXIT_CRITICAL(&buffer_mutex);
58+ taskEXIT_CRITICAL (& buffer_mutex );
5959 set_underrun ();
6060 return NULL ;
6161 }
6262 if (is_underrun ) {
63- // taskEXIT_CRITICAL(&buffer_mutex);
63+ taskEXIT_CRITICAL (& buffer_mutex );
6464 return NULL ;
6565 }
6666 uint8_t * return_chunk = packet_buffer [packet_buffer_pos ];
6767 packet_buffer_size -- ;
6868 packet_buffer_pos = (packet_buffer_pos + 1 ) % MAX_BUFFER_SIZE ;
69- // taskEXIT_CRITICAL(&buffer_mutex);
69+ taskEXIT_CRITICAL (& buffer_mutex );
7070 return return_chunk ;
7171}
7272
73+ void empty_buffer () {
74+ taskENTER_CRITICAL (& buffer_mutex );
75+ packet_buffer_size = 0 ;
76+ received_packets = 0 ;
77+ taskEXIT_CRITICAL (& buffer_mutex );
78+ }
79+
7380void setup_buffer () {
7481 ESP_LOGI (TAG , "Allocating buffer" );
7582 uint8_t * buffer = 0 ;
76-
7783 buffer = (uint8_t * )malloc (PCM_CHUNK_SIZE * MAX_BUFFER_SIZE );
7884 memset (buffer , 0 , PCM_CHUNK_SIZE * MAX_BUFFER_SIZE );
7985 for (int i = 0 ; i < MAX_BUFFER_SIZE ; i ++ )
0 commit comments