@@ -153,6 +153,7 @@ class OSCContainerEncoder : public AudioEncoder {
153
153
void *ref = nullptr ;
154
154
} osc_out;
155
155
156
+ // / OUtput AudioInfo via OSC
156
157
void writeAudioInfo (AudioInfo info, const char *mime) {
157
158
if (is_send_info_active) {
158
159
LOGD (" writeAudioInfo" );
@@ -180,8 +181,14 @@ class OSCContainerEncoder : public AudioEncoder {
180
181
class OSCContainerDecoder : public ContainerDecoder {
181
182
public:
182
183
OSCContainerDecoder () = default ;
183
- OSCContainerDecoder (AudioDecoder &decoder) { setDecoder (decoder); }
184
- OSCContainerDecoder (MultiDecoder &decoder) { setDecoder (decoder); }
184
+ OSCContainerDecoder (AudioDecoder &decoder, OSCData &osc) {
185
+ setDecoder (decoder);
186
+ setOSCData (osc);
187
+ }
188
+ OSCContainerDecoder (MultiDecoder &decoder, OSCData &osc) {
189
+ setDecoder (decoder);
190
+ setOSCData (osc);
191
+ }
185
192
186
193
void setDecoder (AudioDecoder &decoder) { p_codec = &decoder; }
187
194
@@ -190,26 +197,29 @@ class OSCContainerDecoder : public ContainerDecoder {
190
197
p_multi_decoder = &decoder;
191
198
}
192
199
200
+ void setOSCData (OSCData &osc) { p_osc = &osc; }
201
+
193
202
void setOutput (Print &outStream) {
194
203
LOGD (" OSCContainerDecoder::setOutput" )
195
204
p_out = &outStream;
196
205
}
197
206
198
207
bool begin () {
199
208
TRACED ();
200
- if (p_codec == nullptr ) return false ;
201
- osc. setReference (this );
202
- osc. addCallback (" /audio/info" , parseInfo, OSCCompare::StartsWith);
203
- osc. addCallback (" /audio/data" , parseData, OSCCompare::StartsWith);
209
+ if (p_codec == nullptr || p_osc == nullptr ) return false ;
210
+ p_osc-> setReference (this );
211
+ p_osc-> addCallback (" /audio/info" , parseInfo, OSCCompare::StartsWith);
212
+ p_osc-> addCallback (" /audio/data" , parseData, OSCCompare::StartsWith);
204
213
is_active = true ;
205
214
return true ;
206
215
}
207
216
208
217
void end () { is_active = false ; }
209
218
210
219
size_t write (const uint8_t *data, size_t len) {
220
+ if (!is_active) return 0 ;
211
221
LOGD (" write: %d" , (int )len);
212
- if (!osc. parse ((uint8_t *)data, len)) {
222
+ if (!p_osc-> parse ((uint8_t *)data, len)) {
213
223
return 0 ;
214
224
}
215
225
return len;
@@ -224,10 +234,12 @@ class OSCContainerDecoder : public ContainerDecoder {
224
234
uint64_t getSequenceNumber () { return seq_no; }
225
235
226
236
// / Adds an new parser callback for a specific address matching string
227
- void addParserCallback (const char *address,
237
+ bool addParserCallback (const char *address,
228
238
bool (*callback)(OSCData &data, void *ref),
229
239
OSCCompare compare = OSCCompare::Matches) {
230
- osc.addCallback (address, callback, compare);
240
+ if (p_osc == nullptr ) return false ;
241
+ p_osc->addCallback (address, callback, compare);
242
+ return true ;
231
243
}
232
244
233
245
// / Replace the write to the decoder with a callback:
@@ -253,7 +265,7 @@ class OSCContainerDecoder : public ContainerDecoder {
253
265
MultiDecoder *p_multi_decoder = nullptr ;
254
266
SingleBuffer<uint8_t > buffer{0 };
255
267
Print *p_out = nullptr ;
256
- OSCData osc ;
268
+ OSCData *p_osc = nullptr ;
257
269
Str mime_str;
258
270
uint64_t seq_no = 0 ;
259
271
// / Return false to complete the processing w/o writing to the decoder
0 commit comments