@@ -19,19 +19,130 @@ namespace audio_tools {
19
19
20
20
class KARadioProtocol {
21
21
public:
22
- // / Default constructor
23
- KARadioProtocol (AudioPlayer& player) { setPlayer (player); }
24
-
25
22
// / Empty constructor: call setPlayer to define the player
26
- KARadioProtocol () = default ;
23
+ KARadioProtocol () {
24
+ addCommand (" play" , [](AudioPlayer& player, Str& cmd, Str& par, Print& out,
25
+ KARadioProtocol* self) {
26
+ if (!par.isEmpty ()) {
27
+ int idx = par.toInt ();
28
+ player.setIndex (idx);
29
+ }
30
+ return true ;
31
+ });
32
+ addCommand (" instant" , [](AudioPlayer& player, Str& cmd, Str& par,
33
+ Print& out, KARadioProtocol* self) {
34
+ player.setPath (par.c_str ());
35
+ return true ;
36
+ });
37
+ addCommand (" volume" , [](AudioPlayer& player, Str& cmd, Str& par, Print& out,
38
+ KARadioProtocol* self) {
39
+ if (!par.isEmpty ()) {
40
+ int volume = par.toInt ();
41
+ player.setVolume (static_cast <float >(volume) / 254 .0f );
42
+ }
43
+ return true ;
44
+ });
45
+ addCommand (" volume+" , [](AudioPlayer& player, Str& cmd, Str& par,
46
+ Print& out, KARadioProtocol* self) {
47
+ int volume = player.volume () * 254 .0f ;
48
+ volume += 5 ;
49
+ if (volume > 245 ) {
50
+ volume = 254 ;
51
+ }
52
+ player.setVolume (static_cast <float >(volume) / 254 .0f );
53
+ return true ;
54
+ });
55
+ addCommand (" volume-" , [](AudioPlayer& player, Str& cmd, Str& par,
56
+ Print& out, KARadioProtocol* self) {
57
+ int volume = player.volume () * 254 .0f ;
58
+ volume -= 5 ;
59
+ if (volume < 0 ) {
60
+ volume = 0 ;
61
+ }
62
+ player.setVolume (static_cast <float >(volume) / 254 .0f );
63
+ return true ;
64
+ });
65
+ addCommand (" pause" , [](AudioPlayer& player, Str& cmd, Str& par, Print& out,
66
+ KARadioProtocol* self) {
67
+ player.setActive (false );
68
+ return true ;
69
+ });
70
+ addCommand (" resume" , [](AudioPlayer& player, Str& cmd, Str& par, Print& out,
71
+ KARadioProtocol* self) {
72
+ player.setActive (true );
73
+ return true ;
74
+ });
75
+ addCommand (" stop" , [](AudioPlayer& player, Str& cmd, Str& par, Print& out,
76
+ KARadioProtocol* self) {
77
+ player.setActive (false );
78
+ return true ;
79
+ });
80
+ addCommand (" start" , [](AudioPlayer& player, Str& cmd, Str& par, Print& out,
81
+ KARadioProtocol* self) {
82
+ player.setActive (true );
83
+ return true ;
84
+ });
85
+ addCommand (" next" , [](AudioPlayer& player, Str& cmd, Str& par, Print& out,
86
+ KARadioProtocol* self) {
87
+ player.next ();
88
+ return true ;
89
+ });
90
+ addCommand (" prev" , [](AudioPlayer& player, Str& cmd, Str& par, Print& out,
91
+ KARadioProtocol* self) {
92
+ player.previous ();
93
+ return true ;
94
+ });
95
+ addCommand (" mute" , [](AudioPlayer& player, Str& cmd, Str& par, Print& out,
96
+ KARadioProtocol* self) {
97
+ if (!par.isEmpty ()) {
98
+ player.setActive (!(par.toInt () == 1 ));
99
+ }
100
+ return true ;
101
+ });
102
+ addCommand (" infos" , [](AudioPlayer& player, Str& cmd, Str& par,
103
+ Print& result, KARadioProtocol* self) {
104
+ result.print (" vol: " );
105
+ result.println (self->volume );
106
+ result.print (" num: " );
107
+ result.println (self->index ());
108
+ result.print (" stn: " ); // station
109
+ result.println (self->stationName ());
110
+ result.print (" tit: " ); // title
111
+ result.println (self->title ());
112
+ result.print (" sts: " ); // status
113
+ result.println (player.isActive ());
114
+ return true ;
115
+ });
116
+ addCommand (" version" , [](AudioPlayer& player, Str& cmd, Str& par,
117
+ Print& result, KARadioProtocol* self) {
118
+ result.print (" version: " );
119
+ result.println (KA_VERSION);
120
+ return true ;
121
+ });
122
+ addCommand (" list" ,
123
+ [](AudioPlayer& player, Str& cmd, Str& par, Print& result,
124
+ KARadioProtocol* self) { // arg: 0 to 254
125
+ if (!par.isEmpty ()) {
126
+ player.setIndex (par.toInt ());
127
+ }
128
+ result.println (self->stationName ());
129
+ return true ;
130
+ });
131
+ }
132
+
133
+ // / Default constructor
134
+ KARadioProtocol (AudioPlayer& player) : KARadioProtocol() {
135
+ setPlayer (player);
136
+ }
27
137
28
138
// / Defines the player
29
139
void setPlayer (AudioPlayer& player) {
30
140
p_player = &player;
31
141
volume = player.volume () * 254 .0f ;
32
142
}
33
143
34
- // / processes the commands and returns the result output via the Print object
144
+ // / processes the commands and returns the result output via the Print
145
+ // / object
35
146
bool processCommand (const char * input, Print& result) {
36
147
if (p_player == nullptr ) {
37
148
LOGE (" player not set" );
@@ -72,76 +183,16 @@ class KARadioProtocol {
72
183
// / Processes a single command
73
184
bool processCommand (Str& name, Str& arg, Print& result) {
74
185
LOGI (" command: %s (%s)" , name.c_str (), arg.c_str ());
75
- if (p_player == nullptr ) {
76
- LOGE (" No player set" );
77
- return false ;
78
- }
79
- if (name == " play" ) {
80
- if (!arg.isEmpty ()) {
81
- int idx = arg.toInt ();
82
- p_player->setIndex (idx);
83
- }
84
- } else if (name == " instant" ) {
85
- p_player->setPath (arg.c_str ());
86
- } else if (name == " volume" ) {
87
- if (!arg.isEmpty ()) {
88
- volume = arg.toInt ();
89
- p_player->setVolume (static_cast <float >(volume) / 254 .0f );
90
- }
91
- } else if (name == " volume+" ) {
92
- volume += 5 ;
93
- if (volume > 245 ) {
94
- volume = 254 ;
95
- }
96
- p_player->setVolume (static_cast <float >(volume) / 254 .0f );
97
- } else if (name == " volume-" ) {
98
- volume -= 5 ;
99
- if (volume < 0 ) {
100
- volume = 0 ;
101
- }
102
- p_player->setVolume (static_cast <float >(volume) / 254 .0f );
103
- } else if (name == " pause" ) {
104
- p_player->setActive (false );
105
- } else if (name == " resume" ) {
106
- p_player->setActive (true );
107
- } else if (name == " stop" ) {
108
- p_player->setActive (false );
109
- } else if (name == " start" ) {
110
- p_player->setActive (true );
111
- } else if (name == " next" ) {
112
- p_player->next ();
113
- } else if (name == " prev" ) {
114
- p_player->previous ();
115
- } else if (name == " version" ) {
116
- result.print (" version: " );
117
- result.println (KA_VERSION);
118
- } else if (name == " mute" ) {
119
- if (!arg.isEmpty ()) {
120
- p_player->setActive (!(arg.toInt () == 1 ));
121
- }
122
- } else if (name == " infos" ) {
123
- result.print (" vol: " );
124
- result.println (volume);
125
- result.print (" num: " );
126
- result.println (index ());
127
- result.print (" stn: " ); // station
128
- result.println (stationName ());
129
- result.print (" tit: " ); // title
130
- result.println (title ());
131
- result.print (" sts: " ); // status
132
- result.println (p_player->isActive ());
133
- } else if (name == " list" ) {
134
- // arg: 0 to 254
135
- if (!arg.isEmpty ()) {
136
- p_player->setIndex (arg.toInt ());
186
+ assert (p_player != nullptr );
187
+
188
+ for (Action& act : actions) {
189
+ if (name.equals (act.cmd )) {
190
+ return act.callback (*p_player, name, arg, result, this );
137
191
}
138
- result.println (stationName ());
139
- } else {
140
- LOGE (" Invalid command:" , name.c_str ());
141
- return false ;
142
192
}
143
- result.flush ();
144
- return true ;
193
+
194
+ LOGE (" Invalid command:" , name.c_str ());
195
+ return false ;
145
196
}
146
197
147
198
// / Provides the actual index
@@ -150,10 +201,25 @@ class KARadioProtocol {
150
201
// / Provides the actual title
151
202
const char * title () { return title_str.c_str (); }
152
203
204
+ // / Add a new command
205
+ void addCommand (const char * cmd,
206
+ bool (*cb)(AudioPlayer& player, Str& cmd, Str& par,
207
+ Print& out, KARadioProtocol* self)) {
208
+ Action act;
209
+ act.cmd = cmd;
210
+ act.callback = cb;
211
+ }
212
+
153
213
protected:
154
214
AudioPlayer* p_player = nullptr ;
155
215
int volume = 0 ;
156
216
Str title_str = " n/a" ;
217
+ struct Action {
218
+ const char * cmd;
219
+ bool (*callback)(AudioPlayer& player, Str& cmd, Str& par, Print& out,
220
+ KARadioProtocol* self) = nullptr ;
221
+ };
222
+ Vector<Action> actions;
157
223
158
224
int getEndPos (StrView& line, int start) {
159
225
int endPos = line.indexOf (' &' , start);
0 commit comments