@@ -124,7 +124,7 @@ class ChannelFormatConverterStream : public ReformatBaseStream {
124124 ChannelFormatConverterStream (Stream &stream) { setStream (stream); }
125125 ChannelFormatConverterStream (Print &print) { setOutput (print); }
126126 ChannelFormatConverterStream (ChannelFormatConverterStream const &) = delete ;
127- virtual ~ChannelFormatConverterStream () { end (); }
127+ virtual ~ChannelFormatConverterStream () { end (); }
128128 ChannelFormatConverterStream &operator =(
129129 ChannelFormatConverterStream const &) = delete ;
130130
@@ -186,7 +186,7 @@ class ChannelFormatConverterStream : public ReformatBaseStream {
186186
187187 bool begin () { return begin (audioInfo (), to_channels); }
188188
189- void end () { cleanupConverter ();}
189+ void end () { cleanupConverter (); }
190190
191191 void setToChannels (uint16_t channels) { to_channels = channels; }
192192
@@ -270,9 +270,24 @@ class ChannelFormatConverterStream : public ReformatBaseStream {
270270 }
271271
272272 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 ;
276291 }
277292 }
278293
@@ -442,6 +457,7 @@ class NumberFormatConverterStream : public ReformatBaseStream {
442457 NumberFormatConverterStream (AudioStream &stream) { setStream (stream); }
443458 NumberFormatConverterStream (Print &print) { setOutput (print); }
444459 NumberFormatConverterStream (AudioOutput &print) { setOutput (print); }
460+ virtual ~NumberFormatConverterStream () { end (); }
445461
446462 void setAudioInfo (AudioInfo newInfo) override {
447463 TRACED ();
@@ -473,35 +489,43 @@ class NumberFormatConverterStream : public ReformatBaseStream {
473489 return begin (info.bits_per_sample , toBits, gain);
474490 }
475491
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 (); }
477497
478498 void setToBits (uint8_t bits) { to_bit_per_samples = bits; }
479499
480500 bool begin (int from_bit_per_samples, int to_bit_per_samples,
481501 float gain = 1.0 ) {
482- assert (to_bit_per_samples > 0 );
483- // is_output_notify = false;
484- this ->gain = gain;
485502 LOGI (" begin %d -> %d bits" , from_bit_per_samples, to_bit_per_samples);
486503 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;
487511 this ->from_bit_per_samples = from_bit_per_samples;
488512 this ->to_bit_per_samples = to_bit_per_samples;
489513
490514 if (from_bit_per_samples == to_bit_per_samples) {
491515 LOGI (" no bit conversion: %d -> %d" , from_bit_per_samples,
492516 to_bit_per_samples);
493517 } 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);
495519 } 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);
497521 } 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);
499523 } 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);
501525 } 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);
503527 } 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);
505529 } else {
506530 result = false ;
507531 LOGE (" bit combination not supported %d -> %d" , from_bit_per_samples,
@@ -634,14 +658,41 @@ class NumberFormatConverterStream : public ReformatBaseStream {
634658 }
635659
636660 protected:
637- void *converter = nullptr ;
661+ void *p_converter = nullptr ;
638662 int from_bit_per_samples = 16 ;
639663 int to_bit_per_samples = 0 ;
640664 float gain = 1.0 ;
641665
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+
642693 template <typename TFrom, typename TTo>
643694 NumberFormatConverterStreamT<TFrom, TTo> *getConverter () {
644- return (NumberFormatConverterStreamT<TFrom, TTo> *)converter ;
695+ return (NumberFormatConverterStreamT<TFrom, TTo> *)p_converter ;
645696 }
646697
647698 void setupStream () {
0 commit comments