Skip to content

Commit b2d37c9

Browse files
committed
NumberFormatConverterStream: cleanup allocated objects
1 parent e275c40 commit b2d37c9

File tree

1 file changed

+68
-17
lines changed

1 file changed

+68
-17
lines changed

src/AudioTools/CoreAudio/AudioStreamsConverter.h

Lines changed: 68 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)