arduino-audio-tools
Loading...
Searching...
No Matches
CodecILBC.h
Go to the documentation of this file.
1
11#pragma once
12
14#include "iLBC.h"
15
16// iLBC_define.h defines FS as a float constant, which clashes with the
17// ESP32 SD_MMC library's fs::FS class when both are included in a sketch.
18#ifdef FS
19# undef FS
20#endif
21
22namespace audio_tools {
23
32class ILBCDecoder : public AudioDecoder {
33 public:
34 ILBCDecoder(EnumLBCFrameSize frameSize = ms30, bool useEnhancer = true) {
35 info.sample_rate = 8000;
36 info.channels = 1;
38 frame_size = frameSize;
39 use_enhancer = useEnhancer;
40 }
41
43 end();
44 }
45
46 virtual const char *mime() override { return "audio/ilbc"; }
47
48 virtual bool begin() {
49 TRACEI();
50 if (p_print==nullptr){
51 LOGE("Output not defined");
52 return false;
53 }
54
55 if (p_ilbc==nullptr){
56 p_ilbc = new iLBCDecode(frame_size, use_enhancer);
57 }
58
59 // setup buffer
60 decoded_buffer.resize(p_ilbc->getSamples());
61 encoded_buffer.resize(p_ilbc->getEncodedBytes());
62
63 // update audio information
65 return true;
66 }
67
68 virtual void end() {
69 TRACEI();
70 delete p_ilbc;
71 p_ilbc = nullptr;
72 }
73
74 virtual void setOutput(Print &out_stream) { p_print = &out_stream; }
75
76 operator bool() { return p_ilbc != nullptr; }
77
78 virtual size_t write(const uint8_t *data, size_t len) {
79 if (p_ilbc==nullptr) return 0;
80 LOGI("write: %d", len);
81 int samples = len / sizeof(int16_t);
82 int16_t *p_samples = (int16_t *)data;
83 for (int j=0;j<samples;j++){
84 encoded_buffer[encoded_buffer_pos++]=p_samples[j];
86 memset(decoded_buffer.data(),0,decoded_buffer.size()*sizeof(int16_t));
88 if (p_print!=nullptr){
89 p_print->write((uint8_t*)decoded_buffer.data(), decoded_buffer.size()*sizeof(int16_t));
90 delay(2);
91 }
93 }
94 }
95 return len;
96 }
97
98 protected:
99 Print *p_print = nullptr;
100 iLBCDecode *p_ilbc = nullptr;
104 EnumLBCFrameSize frame_size;
106
107};
108
117class ILBCEncoder : public AudioEncoder {
118 public:
119 ILBCEncoder(EnumLBCFrameSize frameSize = ms30) {
120 info.sample_rate = 8000;
121 info.channels = 1;
124 }
125
127 end();
128 }
129
130 bool begin() {
131 TRACEI();
132 if (p_print==nullptr){
133 LOGE("Output not defined");
134 return false;
135 }
136 if (info.bits_per_sample!=16){
137 LOGE("bits_per_sample must be 16: %d",info.bits_per_sample);
138 return false;
139 }
140 if (info.sample_rate!=8000){
141 LOGW("The sample rate should be 8000: %d", info.sample_rate);
142 }
143 if (info.channels!=1){
144 LOGW("channels should be 1: %d", info.channels);
145 }
146 if (p_ilbc==nullptr){
147 p_ilbc = new iLBCEncode(frame_size);
148 }
149 decoded_buffer.resize(p_ilbc->getSamples());
150 encoded_buffer.resize(p_ilbc->getEncodedBytes());
152 return true;
153 }
154
155 virtual void end() {
156 TRACEI();
157 if (p_ilbc != nullptr) {
158 delete p_ilbc;
159 p_ilbc = nullptr;
160 }
161 }
162
163 virtual const char *mime() { return "audio/ilbc"; }
164
165 virtual void setOutput(Print &out_stream) { p_print = &out_stream; }
166
167 operator bool() { return p_ilbc != nullptr; }
168
169 virtual size_t write(const uint8_t *data, size_t len) {
170 if (p_ilbc==nullptr) return 0;
171 LOGI("write: %d", len);
172
173 int samples = len / sizeof(int16_t);
174 int16_t *p_samples = (int16_t *)data;
175
176 for (int j=0;j<samples;j++){
177 decoded_buffer[decoded_buffer_pos++]=p_samples[j];
181 if (p_print!=nullptr){
183 }
185 }
186 }
187 return len;
188 }
189
190 protected:
191 Print *p_print = nullptr;
192 iLBCEncode *p_ilbc = nullptr;
196 EnumLBCFrameSize frame_size;
197};
198
199} // namespace audio_tools
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define TRACEI()
Definition AudioLoggerIDF.h:32
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGE(...)
Definition AudioLoggerIDF.h:30
Definition Arduino.h:56
virtual size_t write(const uint8_t *data, size_t len)
Definition Arduino.h:120
Decoding of encoded audio into PCM data.
Definition AudioCodecsBase.h:19
AudioInfo info
Definition AudioCodecsBase.h:80
Encoding of PCM data.
Definition AudioCodecsBase.h:101
AudioInfo info
Definition AudioCodecsBase.h:129
virtual int frameSize()
Definition AudioCodecsBase.h:126
void notifyAudioChange(AudioInfo info)
Definition AudioTypes.h:180
Decoder for iLBC. Depends on https://github.com/pschatzmann/libilbc.
Definition CodecILBC.h:32
Vector< int16_t > decoded_buffer
Definition CodecILBC.h:101
virtual void setOutput(Print &out_stream)
Defines where the decoded result is written to.
Definition CodecILBC.h:74
virtual bool begin()
Definition CodecILBC.h:48
virtual const char * mime() override
Provides the mime type of the data that is expected by this decoder.
Definition CodecILBC.h:46
virtual size_t write(const uint8_t *data, size_t len)
Definition CodecILBC.h:78
ILBCDecoder(EnumLBCFrameSize frameSize=ms30, bool useEnhancer=true)
Definition CodecILBC.h:34
EnumLBCFrameSize frame_size
Definition CodecILBC.h:104
Vector< uint8_t > encoded_buffer
Definition CodecILBC.h:102
Print * p_print
Definition CodecILBC.h:99
iLBCDecode * p_ilbc
Definition CodecILBC.h:100
~ILBCDecoder()
Definition CodecILBC.h:42
virtual void end()
Definition CodecILBC.h:68
int16_t encoded_buffer_pos
Definition CodecILBC.h:103
bool use_enhancer
Definition CodecILBC.h:105
Encoder for iLBC - Depends on https://github.com/pschatzmann/libopenilbc.
Definition CodecILBC.h:117
Vector< float > decoded_buffer
Definition CodecILBC.h:193
virtual void setOutput(Print &out_stream)
Default output assignment (encoders may override to store Print reference)
Definition CodecILBC.h:165
iLBCEncode * p_ilbc
Definition CodecILBC.h:192
bool begin()
Definition CodecILBC.h:130
virtual const char * mime()
Provides the mime type of the encoded result.
Definition CodecILBC.h:163
virtual size_t write(const uint8_t *data, size_t len)
Definition CodecILBC.h:169
ILBCEncoder(EnumLBCFrameSize frameSize=ms30)
Definition CodecILBC.h:119
int16_t decoded_buffer_pos
Definition CodecILBC.h:195
~ILBCEncoder()
Definition CodecILBC.h:126
EnumLBCFrameSize frame_size
Definition CodecILBC.h:196
Vector< uint8_t > encoded_buffer
Definition CodecILBC.h:194
Print * p_print
Definition CodecILBC.h:191
virtual void end()
Definition CodecILBC.h:155
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
bool resize(size_t newSize, T value)
Definition Vector.h:266
T * data()
Definition Vector.h:316
int size()
Definition Vector.h:178
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition LMSEchoCancellationStream.h:6
void delay(uint32_t ms)
Definition Arduino.h:259
sample_rate_t sample_rate
Sample Rate: e.g 44100.
Definition AudioTypes.h:58
uint16_t channels
Number of channels: 2=stereo, 1=mono.
Definition AudioTypes.h:60
uint8_t bits_per_sample
Number of bits per sample (int16_t = 16 bits)
Definition AudioTypes.h:62