@@ -124,7 +124,7 @@ class ChannelFormatConverterStream : public ReformatBaseStream {
124
124
ChannelFormatConverterStream (Stream &stream) { setStream (stream); }
125
125
ChannelFormatConverterStream (Print &print) { setOutput (print); }
126
126
ChannelFormatConverterStream (ChannelFormatConverterStream const &) = delete ;
127
- virtual ~ChannelFormatConverterStream () { end (); }
127
+ virtual ~ChannelFormatConverterStream () { end (); }
128
128
ChannelFormatConverterStream &operator =(
129
129
ChannelFormatConverterStream const &) = delete ;
130
130
@@ -186,7 +186,7 @@ class ChannelFormatConverterStream : public ReformatBaseStream {
186
186
187
187
bool begin () { return begin (audioInfo (), to_channels); }
188
188
189
- void end () { cleanupConverter ();}
189
+ void end () { cleanupConverter (); }
190
190
191
191
void setToChannels (uint16_t channels) { to_channels = channels; }
192
192
@@ -270,9 +270,24 @@ class ChannelFormatConverterStream : public ReformatBaseStream {
270
270
}
271
271
272
272
void cleanupConverter () {
273
- if (p_stream != nullptr ) {
274
- delete p_stream;
275
- p_stream = nullptr ;
273
+ if (converter == nullptr ) return ;
274
+ switch (bits_per_sample) {
275
+ case 8 :
276
+ delete getConverter<int8_t >();
277
+ converter = nullptr ;
278
+ break ;
279
+ case 16 :
280
+ delete getConverter<int16_t >();
281
+ converter = nullptr ;
282
+ break ;
283
+ case 24 :
284
+ delete getConverter<int24_t >();
285
+ converter = nullptr ;
286
+ break ;
287
+ case 32 :
288
+ delete getConverter<int32_t >();
289
+ converter = nullptr ;
290
+ break ;
276
291
}
277
292
}
278
293
@@ -442,6 +457,7 @@ class NumberFormatConverterStream : public ReformatBaseStream {
442
457
NumberFormatConverterStream (AudioStream &stream) { setStream (stream); }
443
458
NumberFormatConverterStream (Print &print) { setOutput (print); }
444
459
NumberFormatConverterStream (AudioOutput &print) { setOutput (print); }
460
+ virtual ~NumberFormatConverterStream () { end (); }
445
461
446
462
void setAudioInfo (AudioInfo newInfo) override {
447
463
TRACED ();
@@ -473,35 +489,43 @@ class NumberFormatConverterStream : public ReformatBaseStream {
473
489
return begin (info.bits_per_sample , toBits, gain);
474
490
}
475
491
476
- bool begin () { return begin (from_bit_per_samples, to_bit_per_samples, gain); }
492
+ bool begin () override {
493
+ return begin (from_bit_per_samples, to_bit_per_samples, gain);
494
+ }
495
+
496
+ void end () override { cleanupConverter (); }
477
497
478
498
void setToBits (uint8_t bits) { to_bit_per_samples = bits; }
479
499
480
500
bool begin (int from_bit_per_samples, int to_bit_per_samples,
481
501
float gain = 1.0 ) {
482
- assert (to_bit_per_samples > 0 );
483
- // is_output_notify = false;
484
- this ->gain = gain;
485
502
LOGI (" begin %d -> %d bits" , from_bit_per_samples, to_bit_per_samples);
486
503
bool result = true ;
504
+ assert (to_bit_per_samples > 0 );
505
+
506
+ // / cleanup if we call begin() multiple times w/o end
507
+ if (p_converter != nullptr ) end ();
508
+
509
+ // store variables
510
+ this ->gain = gain;
487
511
this ->from_bit_per_samples = from_bit_per_samples;
488
512
this ->to_bit_per_samples = to_bit_per_samples;
489
513
490
514
if (from_bit_per_samples == to_bit_per_samples) {
491
515
LOGI (" no bit conversion: %d -> %d" , from_bit_per_samples,
492
516
to_bit_per_samples);
493
517
} else if (from_bit_per_samples == 8 && to_bit_per_samples == 16 ) {
494
- converter = new NumberFormatConverterStreamT<int8_t , int16_t >(gain);
518
+ p_converter = new NumberFormatConverterStreamT<int8_t , int16_t >(gain);
495
519
} else if (from_bit_per_samples == 16 && to_bit_per_samples == 8 ) {
496
- converter = new NumberFormatConverterStreamT<int16_t , int8_t >(gain);
520
+ p_converter = new NumberFormatConverterStreamT<int16_t , int8_t >(gain);
497
521
} else if (from_bit_per_samples == 24 && to_bit_per_samples == 16 ) {
498
- converter = new NumberFormatConverterStreamT<int24_t , int16_t >(gain);
522
+ p_converter = new NumberFormatConverterStreamT<int24_t , int16_t >(gain);
499
523
} else if (from_bit_per_samples == 16 && to_bit_per_samples == 24 ) {
500
- converter = new NumberFormatConverterStreamT<int16_t , int24_t >(gain);
524
+ p_converter = new NumberFormatConverterStreamT<int16_t , int24_t >(gain);
501
525
} else if (from_bit_per_samples == 32 && to_bit_per_samples == 16 ) {
502
- converter = new NumberFormatConverterStreamT<int32_t , int16_t >(gain);
526
+ p_converter = new NumberFormatConverterStreamT<int32_t , int16_t >(gain);
503
527
} else if (from_bit_per_samples == 16 && to_bit_per_samples == 32 ) {
504
- converter = new NumberFormatConverterStreamT<int16_t , int32_t >(gain);
528
+ p_converter = new NumberFormatConverterStreamT<int16_t , int32_t >(gain);
505
529
} else {
506
530
result = false ;
507
531
LOGE (" bit combination not supported %d -> %d" , from_bit_per_samples,
@@ -634,14 +658,41 @@ class NumberFormatConverterStream : public ReformatBaseStream {
634
658
}
635
659
636
660
protected:
637
- void *converter = nullptr ;
661
+ void *p_converter = nullptr ;
638
662
int from_bit_per_samples = 16 ;
639
663
int to_bit_per_samples = 0 ;
640
664
float gain = 1.0 ;
641
665
666
+ void cleanupConverter () {
667
+ if (p_converter == nullptr ) return ;
668
+
669
+ if (from_bit_per_samples == 8 && to_bit_per_samples == 16 ) {
670
+ delete static_cast <NumberFormatConverterStreamT<int8_t , int16_t > *>(
671
+ p_converter);
672
+ } else if (from_bit_per_samples == 16 && to_bit_per_samples == 8 ) {
673
+ delete static_cast <NumberFormatConverterStreamT<int16_t , int8_t > *>(
674
+ p_converter);
675
+ } else if (from_bit_per_samples == 24 && to_bit_per_samples == 16 ) {
676
+ delete static_cast <NumberFormatConverterStreamT<int24_t , int16_t > *>(
677
+ p_converter);
678
+ } else if (from_bit_per_samples == 16 && to_bit_per_samples == 24 ) {
679
+ delete static_cast <NumberFormatConverterStreamT<int16_t , int24_t > *>(
680
+ p_converter);
681
+ } else if (from_bit_per_samples == 32 && to_bit_per_samples == 16 ) {
682
+ delete static_cast <NumberFormatConverterStreamT<int32_t , int16_t > *>(
683
+ p_converter);
684
+ } else if (from_bit_per_samples == 16 && to_bit_per_samples == 32 ) {
685
+ delete static_cast <NumberFormatConverterStreamT<int16_t , int32_t > *>(
686
+ p_converter);
687
+ } else {
688
+ TRACEE ();
689
+ }
690
+ p_converter = nullptr ;
691
+ }
692
+
642
693
template <typename TFrom, typename TTo>
643
694
NumberFormatConverterStreamT<TFrom, TTo> *getConverter () {
644
- return (NumberFormatConverterStreamT<TFrom, TTo> *)converter ;
695
+ return (NumberFormatConverterStreamT<TFrom, TTo> *)p_converter ;
645
696
}
646
697
647
698
void setupStream () {
0 commit comments