Skip to content

Commit a843652

Browse files
committed
ADPCM provide flush
1 parent ced5666 commit a843652

File tree

1 file changed

+54
-38
lines changed

1 file changed

+54
-38
lines changed

src/AudioTools/AudioCodecs/CodecADPCM.h

Lines changed: 54 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ namespace audio_tools {
1414
class ADPCMDecoder : public AudioDecoderExt {
1515
public:
1616
ADPCMDecoder(AVCodecID id, int blockSize = ADAPCM_DEFAULT_BLOCK_SIZE) {
17-
info.sample_rate = 44100;
18-
info.channels = 2;
19-
info.bits_per_sample = 16;
17+
if (id == AV_CODEC_ID_ADPCM_IMA_AMV) {
18+
info.sample_rate = 22050;
19+
info.channels = 1;
20+
info.bits_per_sample = 16;
21+
}
2022
p_decoder = adpcm_ffmpeg::ADPCMDecoderFactory::create(id);
21-
if (p_decoder!=nullptr){
23+
if (p_decoder != nullptr) {
2224
p_decoder->setCodecID(id);
2325
p_decoder->setBlockSize(blockSize);
2426
} else {
@@ -28,26 +30,27 @@ class ADPCMDecoder : public AudioDecoderExt {
2830

2931
// defines the block size
3032
void setBlockSize(int blockSize) override {
31-
if (p_decoder==nullptr) return;
33+
if (p_decoder == nullptr) return;
3234
p_decoder->setBlockSize(blockSize);
3335
}
3436

35-
/// Provides the block size (size of encoded frame) (only available after calling begin)
37+
/// Provides the block size (size of encoded frame) (only available after
38+
/// calling begin)
3639
int blockSize() {
37-
if (p_decoder==nullptr) return 0;
40+
if (p_decoder == nullptr) return 0;
3841
return p_decoder->blockSize();
3942
}
4043

41-
/// Provides the frame size (size of decoded frame) (only available after calling begin)
44+
/// Provides the frame size (size of decoded frame) (only available after
45+
/// calling begin)
4246
int frameSize() {
43-
if (p_decoder==nullptr) return 0;
44-
return p_decoder->frameSize()*2;
47+
if (p_decoder == nullptr) return 0;
48+
return p_decoder->frameSize() * 2;
4549
}
4650

47-
4851
bool begin() override {
4952
TRACEI();
50-
if (p_decoder==nullptr) return false;
53+
if (p_decoder == nullptr) return false;
5154
if (is_started) return true;
5255
current_byte = 0;
5356
LOGI("sample_rate: %d, channels: %d", info.sample_rate, info.channels);
@@ -66,8 +69,7 @@ class ADPCMDecoder : public AudioDecoderExt {
6669

6770
void end() override {
6871
TRACEI();
69-
if (p_decoder!=nullptr)
70-
p_decoder->end();
72+
if (p_decoder != nullptr) p_decoder->end();
7173
adpcm_block.resize(0);
7274
is_started = false;
7375
}
@@ -85,31 +87,38 @@ class ADPCMDecoder : public AudioDecoderExt {
8587
return len;
8688
}
8789

90+
void flush() {
91+
if (p_decoder != nullptr) p_decoder->flush();
92+
}
93+
8894
operator bool() override { return is_started; }
8995

9096
protected:
91-
adpcm_ffmpeg::ADPCMDecoder *p_decoder=nullptr;
97+
adpcm_ffmpeg::ADPCMDecoder *p_decoder = nullptr;
9298
Vector<uint8_t> adpcm_block;
9399
Print *p_print = nullptr;
94100
int current_byte = 0;
95101
int block_size = 0;
96102
bool is_started = false;
97103

98104
virtual bool decode(uint8_t byte) {
99-
if (p_decoder==nullptr) return false;
105+
if (p_decoder == nullptr) return false;
100106
adpcm_block[current_byte++] = byte;
101107

102108
if (current_byte >= block_size) {
103109
TRACED();
104-
adpcm_ffmpeg::AVFrame &frame = p_decoder->decode(&adpcm_block[0], block_size);
110+
adpcm_ffmpeg::AVFrame &frame =
111+
p_decoder->decode(&adpcm_block[0], block_size);
105112
// print the result
106113
int16_t *data = (int16_t *)frame.data[0];
107114
size_t byte_count = frame.nb_samples * sizeof(int16_t) * info.channels;
108115
size_t written = p_print->write((uint8_t *)data, byte_count);
109116
if (written != byte_count) {
110-
LOGE("decode %d -> %d -> %d",block_size, (int)byte_count, (int)written);
117+
LOGE("decode %d -> %d -> %d", block_size, (int)byte_count,
118+
(int)written);
111119
} else {
112-
LOGD("decode %d -> %d -> %d",block_size, (int)byte_count, (int)written);
120+
LOGD("decode %d -> %d -> %d", block_size, (int)byte_count,
121+
(int)written);
113122
}
114123

115124
// restart from array begin
@@ -129,41 +138,45 @@ class ADPCMDecoder : public AudioDecoderExt {
129138
class ADPCMEncoder : public AudioEncoderExt {
130139
public:
131140
ADPCMEncoder(AVCodecID id, int blockSize = ADAPCM_DEFAULT_BLOCK_SIZE) {
132-
info.sample_rate = 44100;
133-
info.channels = 2;
134-
info.bits_per_sample = 16;
141+
if (id == AV_CODEC_ID_ADPCM_IMA_AMV) {
142+
info.sample_rate = 22050;
143+
info.channels = 1;
144+
info.bits_per_sample = 16;
145+
}
135146
p_encoder = adpcm_ffmpeg::ADPCMEncoderFactory::create(id);
136-
if (p_encoder!=nullptr){
147+
if (p_encoder != nullptr) {
137148
p_encoder->setCodecID(id);
138149
p_encoder->setBlockSize(blockSize);
139150
} else {
140151
LOGE("Encoder not implemented");
141152
}
142153
}
143154

144-
/// Provides the block size (size of encoded frame) (only available after calling begin)
155+
/// Provides the block size (size of encoded frame) (only available after
156+
/// calling begin)
145157
int blockSize() override {
146-
if (p_encoder==nullptr) return 0;
158+
if (p_encoder == nullptr) return 0;
147159
return p_encoder->blockSize();
148160
}
149161

150-
/// Provides the frame size (size of decoded frame) (only available after calling begin)
151-
int frameSize() {
152-
if (p_encoder==nullptr) return 0;
153-
return p_encoder->frameSize()*2;
162+
/// Provides the frame size (size of decoded frame) (only available after
163+
/// calling begin)
164+
int frameSize() {
165+
if (p_encoder == nullptr) return 0;
166+
return p_encoder->frameSize() * 2;
154167
}
155168

156169
bool begin() override {
157170
TRACEI();
158-
if (p_encoder==nullptr) return false;
171+
if (p_encoder == nullptr) return false;
159172
if (is_started) return true;
160173
LOGI("sample_rate: %d, channels: %d", info.sample_rate, info.channels);
161174
p_encoder->begin(info.sample_rate, info.channels);
162175
LOGI("frameSize: %d", (int)frameSize());
163176
LOGI("blockSize: %d", (int)blockSize());
164177
assert(info.sample_rate != 0);
165178
assert(p_encoder->frameSize() != 0);
166-
total_samples = p_encoder->frameSize()*info.channels;
179+
total_samples = p_encoder->frameSize() * info.channels;
167180
pcm_block.resize(total_samples);
168181
current_sample = 0;
169182

@@ -174,7 +187,7 @@ class ADPCMEncoder : public AudioEncoderExt {
174187
void end() override {
175188
TRACEI();
176189
pcm_block.resize(0);
177-
if (p_encoder==nullptr) return;
190+
if (p_encoder == nullptr) return;
178191
p_encoder->end();
179192
is_started = false;
180193
}
@@ -195,25 +208,28 @@ class ADPCMEncoder : public AudioEncoderExt {
195208
}
196209

197210
protected:
198-
adpcm_ffmpeg::ADPCMEncoder* p_encoder = nullptr;
211+
adpcm_ffmpeg::ADPCMEncoder *p_encoder = nullptr;
199212
Vector<int16_t> pcm_block;
200213
Print *p_print = nullptr;
201214
bool is_started = false;
202215
int current_sample = 0;
203-
int total_samples=0;
216+
int total_samples = 0;
204217

205218
virtual bool encode(int16_t sample) {
206-
if (p_encoder==nullptr) return false;
219+
if (p_encoder == nullptr) return false;
207220
pcm_block[current_sample++] = sample;
208221
if (current_sample >= total_samples) {
209222
TRACED();
210-
adpcm_ffmpeg::AVPacket &packet = p_encoder->encode(&pcm_block[0], total_samples);
223+
adpcm_ffmpeg::AVPacket &packet =
224+
p_encoder->encode(&pcm_block[0], total_samples);
211225
if (packet.size > 0) {
212226
size_t written = p_print->write(packet.data, packet.size);
213227
if (written != packet.size) {
214-
LOGE("encode %d->%d->%d",2*total_samples, (int)packet.size, (int)written);
228+
LOGE("encode %d->%d->%d", 2 * total_samples, (int)packet.size,
229+
(int)written);
215230
} else {
216-
LOGD("encode %d->%d->%d",2*total_samples, (int)packet.size, (int)written);
231+
LOGD("encode %d->%d->%d", 2 * total_samples, (int)packet.size,
232+
(int)written);
217233
}
218234
}
219235
// restart from array begin

0 commit comments

Comments
 (0)