Skip to content

Commit af7ecf2

Browse files
committed
Correct CodecLC3 quality problem
1 parent d6240e9 commit af7ecf2

File tree

3 files changed

+33
-19
lines changed

3 files changed

+33
-19
lines changed

src/AudioCodecs/AudioEncoded.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -332,10 +332,8 @@ class EncodedAudioPrint : public AudioStream {
332332
const CodecNOP *nop = CodecNOP::instance();
333333
if (decoder_ptr != nop || encoder_ptr != nop) {
334334
// some decoders need this - e.g. opus
335-
decoder_ptr->setAudioInfo(info);
336-
decoder_ptr->begin();
337-
encoder_ptr->setAudioInfo(info);
338-
encoder_ptr->begin();
335+
decoder_ptr->begin(info);
336+
encoder_ptr->begin(info);
339337
active = true;
340338
} else {
341339
LOGW("no decoder or encoder defined");

src/AudioCodecs/CodecLC3.h

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,11 @@
1313
#include "AudioCodecs/AudioEncoded.h"
1414
#include "lc3.h"
1515

16-
/**
16+
/**
1717
* @defgroup c lc3
1818
* @ingroup codecs
19-
* @brief LC3 Codec
20-
**/
21-
19+
* @brief LC3 Codec
20+
**/
2221

2322
namespace audio_tools {
2423

@@ -43,12 +42,13 @@ class LC3Decoder : public AudioDecoder {
4342
this->input_byte_count = inputByteCount;
4443
}
4544

46-
LC3Decoder(int dt_us = LC3_DEFAULT_DT_US, uint16_t inputByteCount = DEFAULT_BYTE_COUNT) {
45+
LC3Decoder(int dt_us = LC3_DEFAULT_DT_US,
46+
uint16_t inputByteCount = DEFAULT_BYTE_COUNT) {
4747
this->dt_us = dt_us;
4848
this->input_byte_count = inputByteCount;
4949
info.sample_rate = 32000;
5050
info.bits_per_sample = 16;
51-
info.channels = 2;
51+
info.channels = 1;
5252
}
5353

5454
virtual AudioInfo audioInfo() { return info; }
@@ -60,6 +60,8 @@ class LC3Decoder : public AudioDecoder {
6060

6161
virtual void begin() {
6262
TRACEI();
63+
64+
// Return the number of PCM samples in a frame
6365
num_frames = lc3_frame_samples(dt_us, info.sample_rate);
6466
dec_size = lc3_decoder_size(dt_us, info.sample_rate);
6567

@@ -71,12 +73,13 @@ class LC3Decoder : public AudioDecoder {
7173
LOGI("dec_size: %d", dec_size);
7274

7375
if (!checkValues()) {
76+
LOGE("Invalid Parameters");
7477
return;
7578
}
7679

7780
// setup memory
7881
input_buffer.resize(input_byte_count);
79-
output_buffer.resize(num_frames*2);
82+
output_buffer.resize(num_frames * 2);
8083
lc3_decoder_memory.resize(dec_size);
8184

8285
// setup decoder
@@ -133,8 +136,6 @@ class LC3Decoder : public AudioDecoder {
133136

134137
protected:
135138
Print *p_print = nullptr;
136-
AudioInfo info;
137-
AudioInfoDependent *p_notify = nullptr;
138139
lc3_decoder_t lc3_decoder = nullptr;
139140
lc3_pcm_format pcm_format;
140141
Vector<uint8_t> lc3_decoder_memory;
@@ -163,6 +164,10 @@ class LC3Decoder : public AudioDecoder {
163164
return false;
164165
}
165166

167+
if (info.channels!=1){
168+
LOGE("channels: %d", info.channels);
169+
}
170+
166171
if (num_frames == -1) {
167172
LOGE("num_frames could not be determined - using m");
168173
return false;
@@ -197,11 +202,12 @@ class LC3Decoder : public AudioDecoder {
197202
*/
198203
class LC3Encoder : public AudioEncoder {
199204
public:
200-
LC3Encoder(int dt_us = LC3_DEFAULT_DT_US, uint16_t outputByteCount = DEFAULT_BYTE_COUNT) {
205+
LC3Encoder(int dt_us = LC3_DEFAULT_DT_US,
206+
uint16_t outputByteCount = DEFAULT_BYTE_COUNT) {
201207
this->dt_us = dt_us;
202208
info.sample_rate = 32000;
203209
info.bits_per_sample = 16;
204-
info.channels = 2;
210+
info.channels = 1;
205211
output_byte_count = outputByteCount;
206212
}
207213

@@ -212,6 +218,7 @@ class LC3Encoder : public AudioEncoder {
212218

213219
void begin() {
214220
TRACEI();
221+
215222
unsigned enc_size = lc3_encoder_size(dt_us, info.sample_rate);
216223
num_frames = lc3_frame_samples(dt_us, info.sample_rate);
217224

@@ -232,8 +239,8 @@ class LC3Encoder : public AudioEncoder {
232239
output_buffer.resize(output_byte_count);
233240

234241
// setup encoder
235-
lc3_encoder =
236-
lc3_setup_encoder(dt_us, info.sample_rate, 0, lc3_encoder_memory.data());
242+
lc3_encoder = lc3_setup_encoder(dt_us, info.sample_rate, 0,
243+
lc3_encoder_memory.data());
237244

238245
input_pos = 0;
239246
active = true;
@@ -260,8 +267,9 @@ class LC3Encoder : public AudioEncoder {
260267
for (int j = 0; j < in_size; j++) {
261268
input_buffer[input_pos++] = p_ptr8[j];
262269
if (input_pos >= num_frames * 2) {
263-
if (lc3_encode(lc3_encoder, pcm_format, (const int16_t *)input_buffer.data(),
264-
1, output_buffer.size(), output_buffer.data()) != 0) {
270+
if (lc3_encode(lc3_encoder, pcm_format,
271+
(const int16_t *)input_buffer.data(), 1,
272+
output_buffer.size(), output_buffer.data()) != 0) {
265273
LOGE("lc3_encode");
266274
}
267275

@@ -307,6 +315,10 @@ class LC3Encoder : public AudioEncoder {
307315
return false;
308316
}
309317

318+
if (info.channels!=1){
319+
LOGE("channels: %d", info.channels);
320+
}
321+
310322
if (num_frames == -1) {
311323
LOGE("Invalid num_frames");
312324
return false;

src/AudioTools/AudioTypes.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,10 @@ class AudioWriter {
126126
virtual void setOutputStream(Print &out_stream) = 0;
127127
virtual operator bool() = 0;
128128
virtual void begin() = 0;
129+
virtual void begin(AudioInfo info) {
130+
setAudioInfo(info);
131+
begin();
132+
}
129133
virtual void end() = 0;
130134
protected:
131135
void writeBlocking(Print *out, uint8_t* data, size_t len){

0 commit comments

Comments
 (0)