4
4
MiniWebRadio -- Webradio receiver for ESP32
5
5
6
6
first release on 03/2017 */ String Version =" \
7
- Version 3.1d Jun 10 /2024 " ;
7
+ Version 3.1e Jun 11 /2024 " ;
8
8
9
9
/* 2.8" color display (320x240px) with controller ILI9341 or HX8347D (SPI) or
10
10
3.5" color display (480x320px) wiht controller ILI9486 or ILI9488 (SPI)
@@ -165,6 +165,8 @@ bool _f_shuffle = false;
165
165
bool _f_dlnaBrowseServer = false ;
166
166
bool _f_dlnaWaitForResponse = false ;
167
167
bool _f_dlnaSeekServer = false ;
168
+ bool _f_dlnaMakePlaylistOTF = false ; // notify callback that this browsing was to build a On-The_fly playlist
169
+ bool _f_dlna_browseReady = false ;
168
170
bool _f_BtEmitterFound = false ;
169
171
bool _f_BTEmitterConnected = false ;
170
172
bool _f_brightnessIsChangeable = false ;
@@ -1116,6 +1118,29 @@ bool preparePlaylistFromFolder(const char* path) { // all files whithin a folder
1116
1118
return true ;
1117
1119
}
1118
1120
// ____________________________________________________________________________________________________________________________________________________
1121
+ bool preparePlaylistFromDLNAFolder (){
1122
+ vector_clear_and_shrink (_PLS_content); // clear _PLS_content first
1123
+ DLNA_Client::srvContent_t foldercontent = dlna.getBrowseResult ();
1124
+ for ( int i=0 ; i<foldercontent.size ; i++) {
1125
+ // log_i( "%d : (%d) %s %s -- %s",i, foldercontent.isAudio[i], foldercontent.itemURL[i], foldercontent.title[i], foldercontent.duration[i]);
1126
+ if (!foldercontent.isAudio [i]) continue ;
1127
+ uint16_t len = strlen ((const char *)foldercontent.itemURL [i]) + strlen ((const char *)foldercontent.title [i]) + strlen ((const char *)foldercontent.duration [i]) + 3 ;
1128
+ // log_i("malloc with size %d %d %d %d",len, strlen((const char*)foldercontent.itemURL[i]), strlen((const char*)foldercontent.title[i]), strlen((const char*)foldercontent.duration[i]));
1129
+ char * itstr = x_ps_malloc ( len );
1130
+ strcpy ( itstr, (const char *)foldercontent.itemURL [i]);
1131
+ strcat ( itstr, " \n " );
1132
+ strcat ( itstr, (const char *)foldercontent.duration [i]);
1133
+ strcat ( itstr, " ," );
1134
+ strcat ( itstr, (const char *)foldercontent.title [i]);
1135
+ log_i (" pushing to playlist : %s" ,itstr);
1136
+ _PLS_content.push_back (itstr);
1137
+ // _PLS_content.push_back(x_ps_strdup((const char*)foldercontent.itemURL[i]));
1138
+ }
1139
+ if (!_PLS_content.size ()) return false ;
1140
+ log_i (" pls length %i" , _PLS_content.size ());
1141
+ return true ;
1142
+ }
1143
+ // ____________________________________________________________________________________________________________________________________________________
1119
1144
1120
1145
void sortPlayListAlphabetical () {
1121
1146
for (int i = 0 ; i < _PLS_content.size (); i++) { // easy bubble sort
@@ -2621,6 +2646,16 @@ void loop() {
2621
2646
_f_dlnaSeekServer = false ;
2622
2647
dlna.seekServer ();
2623
2648
}
2649
+ // ------------------------------------------CREATE DLNA PLAYLIST------------------------------------------------------------------------------
2650
+ if (_f_dlnaMakePlaylistOTF && _f_dlna_browseReady){
2651
+ _f_dlnaMakePlaylistOTF = false ;
2652
+ _f_dlna_browseReady = false ;
2653
+ if (preparePlaylistFromDLNAFolder ()) processPlaylist (true );
2654
+ }
2655
+ // ------------------------------------------DLNA ITEMS RECEIVED-------------------------------------------------------------------------------
2656
+ if (_f_dlna_browseReady){ // unused
2657
+ _f_dlna_browseReady = false ;
2658
+ }
2624
2659
// ------------------------------------------GET AUDIO FILE ITEMS------------------------------------------------------------------------------
2625
2660
if (_f_isFSConnected) {
2626
2661
// uint32_t t = 0;
@@ -2704,7 +2739,6 @@ void audio_info(const char* info) {
2704
2739
log_w (" disconnected, wait 35s" );
2705
2740
vTaskDelay (35000 / portTICK_PERIOD_MS);
2706
2741
log_w (" try reconnection" );
2707
- _reconnectCnt = 0 ;
2708
2742
_f_reconnect = true ;
2709
2743
}return ;}
2710
2744
if (startsWith (info, " FLAC" )) {SerialPrintflnCut (" AUDIO_info: " , ANSI_ESC_GREEN, info); return ;}
@@ -3087,6 +3121,7 @@ void tp_released(uint16_t x, uint16_t y){
3087
3121
3088
3122
void tp_long_released (){
3089
3123
// log_w("long released)");
3124
+ if (_state == DLNAITEMSLIST) {lst_DLNA.longReleased ();}
3090
3125
}
3091
3126
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
3092
3127
void tp_positionXY (uint16_t x, uint16_t y){
@@ -3411,8 +3446,8 @@ void dlna_browseResult(const char* objectId, const char* parentId, uint16_t chil
3411
3446
void dlna_browseReady (uint16_t numberReturned, uint16_t totalMatches) {
3412
3447
SerialPrintfln (" DLNA_server: returned %i from %i" , numberReturned + _totalNumberReturned, totalMatches);
3413
3448
_dlnaMaxItems = totalMatches;
3414
- if (numberReturned == 50 ) { // next round
3415
- _totalNumberReturned += numberReturned;
3449
+ _totalNumberReturned += numberReturned;
3450
+ if (numberReturned == 50 && !_f_dlnaMakePlaylistOTF) { // next round
3416
3451
if (_totalNumberReturned < totalMatches && _totalNumberReturned < 500 ) { _f_dlnaBrowseServer = true ; }
3417
3452
}
3418
3453
if (_f_dlnaWaitForResponse) {
@@ -3421,6 +3456,10 @@ void dlna_browseReady(uint16_t numberReturned, uint16_t totalMatches) {
3421
3456
setTimeCounter (4 );
3422
3457
}
3423
3458
else { webSrv.send (" dlnaContent=" , dlna.stringifyContent ()); }
3459
+ if (_totalNumberReturned == totalMatches || _totalNumberReturned == 500 || _f_dlnaMakePlaylistOTF){
3460
+ _totalNumberReturned = 0 ;
3461
+ _f_dlna_browseReady = true ; // last item received
3462
+ }
3424
3463
}
3425
3464
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
3426
3465
void kcx_bt_info (const char * info, const char * val) {
@@ -3538,7 +3577,7 @@ void graphicObjects_OnClick(const char* name, uint8_t val) { // val = 0 --> is d
3538
3577
if ( val && strcmp (name, " btn_DL_cancel" ) == 0 ) {clearStationName (); btn_DL_pause.setInactive (); return ;}
3539
3578
}
3540
3579
if (_state == DLNAITEMSLIST) {
3541
- if ( val && strcmp (name, " lst_DLNA" ) == 0 ) {setTimeCounter (6 ); _f_dlnaWaitForResponse = true ; return ;}
3580
+ if ( val && strcmp (name, " lst_DLNA" ) == 0 ) {setTimeCounter (15 ); _f_dlnaWaitForResponse = true ; return ;}
3542
3581
}
3543
3582
if (_state == CLOCK) {
3544
3583
if ( val && strcmp (name, " btn_CL_Mute" ) == 0 ) {setTimeCounter (2 ); if (!_f_mute){ _f_muteIsPressed = true ;} return ;}
@@ -3640,7 +3679,9 @@ void graphicObjects_OnRelease(const char* name, releasedArg ra) {
3640
3679
if (strcmp (name, " btn_DL_cancel" ) == 0 ) {stopSong (); txt_DL_fName.setText (" " ); return ;}
3641
3680
}
3642
3681
if (_state == DLNAITEMSLIST) {
3643
- if (strcmp (name, " lst_DLNA" ) == 0 ) {if (ra.val1 ){txt_DL_fName.setTextColor (TFT_CYAN); txt_DL_fName.setText (ra.arg2 , TFT_ALIGN_LEFT, TFT_ALIGN_CENTER); changeState (DLNA); connecttohost (ra.arg1 );} return ;}
3682
+ if (strcmp (name, " lst_DLNA" ) == 0 ) {if (ra.val1 == 1 ){txt_DL_fName.setTextColor (TFT_CYAN); txt_DL_fName.setText (ra.arg2 , TFT_ALIGN_LEFT, TFT_ALIGN_CENTER); changeState (DLNA); connecttohost (ra.arg1 );} // play a file
3683
+ if (ra.val1 == 2 ){dlna.browseServer (ra.val2 , ra.arg1 , 0 , 50 ); _f_dlnaMakePlaylistOTF = true ; } // browse dlna object, waiting for content and create a playlist
3684
+ return ;}
3644
3685
}
3645
3686
if (_state == CLOCK) {
3646
3687
if (strcmp (name, " btn_CL_Mute" ) == 0 ) {muteChanged (btn_CL_Mute.getValue ()); return ;}
0 commit comments