-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathplay.ino
143 lines (104 loc) · 4.27 KB
/
play.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
void play ( void *param ){
uint8_t playBuffer[32];
uint32_t bandcounter=GETBANDFREQ, VSlow=0;
int setvolume = getVolume();
Serial.printf("Playtask running on core %d\n", xPortGetCoreID());
vs1053player->startSong();
int qfillcount = 0;
int qminimumcount = (PLAYQUEUESIZE/2);
while ( uxQueueMessagesWaiting(playQueue) < qminimumcount ) {
qfillcount++;
if ( xSemaphoreGetMutexHolder( radioSemaphore ) != NULL ) qminimumcount = 0;
if ( qfillcount%10 == 0 ){
log_i ( "Waiting for Queue to fill up, %d messages in playQueue", uxQueueMessagesWaiting( playQueue ) );
if ( qfillcount > 40000 ){
log_d( "Queue still empty, trying a restart." );
ESP.restart();
}
}
if ( qfillcount > 800 ){
unavailablecount = MAXUNAVAILABLE + 1;
log_d( "Queue does not fill up, reconnect" );
}
delay(40);
}
if ( qminimumcount ){
log_i ( "Queueu filled up, %d messages in playQueue\n", uxQueueMessagesWaiting( playQueue ) );
}else{
log_i ( "Radio inactive, waiting for messages");
}
while(1){
xQueueReceive(playQueue, &playBuffer[0], portMAX_DELAY);
if ( strncmp( (char *) &playBuffer[0], "ChangeStationSoStartANewSongNow!",32) == 0 ){
log_i("start playing again");
vs1053player->setVolume(0);
if ( !ModeChange ){
log_d("play stops song");
if ( !vs1053player->stop_song() ){
log_d("play reboots as VS1053 was confused");
syslog((char *)"play reboots as VS1053 was confused");
ESP.restart();
}
}
skipstartsound = SKIPSTART;
setvolume = getVolume();
ModeChange = false;
delay(5);
vs1053player->startSong();
vs1053player->setVolume(0);
}
for ( int i = 0; i < 1 ; ++i ){
if ( digitalRead( VS_DREQ_PIN ) ){
if ( !MuteActive && !ModeChange ) {
vs1053player->playChunk(playBuffer, 32 );
}else{
delay(4);
}
#ifdef USESPECTRUM
--bandcounter;
if ( ! bandcounter ){
vs1053player->getBands();
delay(10); // please the task watchdog
if ( !skipstartsound && !screenUpdateInProgress)vs1053player->displaySpectrum();
bandcounter = GETBANDFREQ;
}
#endif
if ( skipstartsound ){
if ( skipstartsound < 200 ){
int newvolume = ( setvolume - (skipstartsound/2) + 1);
int divider = 16;
if ( (newvolume & divider) )vs1053player->setVolume( newvolume );
}
if ( skipstartsound == 1 ) {
log_d("** end fade in **");
vs1053player->setVolume( getVolume());
}
--skipstartsound;
}
VSlow = 0;
}else{
--i;
VSlow++;
if ( VSlow > 60 ){
if ( VSlow %10 == 0 ){
Serial.printf ( "Waiting for VS1053, VSlow %d , %d messages in playQueue\n", VSlow, uxQueueMessagesWaiting( playQueue ) );
syslog( (char *)"VSlow for a long time.");
}
}
delay(3);
}
}
}
}
/*--------------------------------------------------*/
int play_init(){
xTaskCreatePinnedToCore(
play, // Task to handle special functions.
"Player", // name of task.
4*1024, // Stack size of task
NULL, // parameter of the task
PLAYTASKPRIO, // priority of the task
&playTask, // Task handle to keep track of created task
PLAYCORE); // processor core
return(0);
}