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
17namespace audio_tools {
18
27class ILBCDecoder : public AudioDecoder {
28 public:
29 ILBCDecoder(EnumLBCFrameSize frameSize = ms30, bool useEnhancer = true) {
30 info.sample_rate = 8000;
31 info.channels = 1;
33 frame_size = frameSize;
34 use_enhancer = useEnhancer;
35 }
36
38 end();
39 }
40
41 virtual const char *mime() override { return "audio/ilbc"; }
42
43 virtual bool begin() {
44 TRACEI();
45 if (p_print==nullptr){
46 LOGE("Output not defined");
47 return false;
48 }
49
50 if (p_ilbc==nullptr){
51 p_ilbc = new iLBCDecode(frame_size, use_enhancer);
52 }
53
54 // setup buffer
55 decoded_buffer.resize(p_ilbc->getSamples());
56 encoded_buffer.resize(p_ilbc->getEncodedBytes());
57
58 // update audio information
60 return true;
61 }
62
63 virtual void end() {
64 TRACEI();
65 delete p_ilbc;
66 p_ilbc = nullptr;
67 }
68
69 virtual void setOutput(Print &out_stream) { p_print = &out_stream; }
70
71 operator bool() { return p_ilbc != nullptr; }
72
73 virtual size_t write(const uint8_t *data, size_t len) {
74 if (p_ilbc==nullptr) return 0;
75 LOGI("write: %d", len);
76 int samples = len / sizeof(int16_t);
77 int16_t *p_samples = (int16_t *)data;
78 for (int j=0;j<samples;j++){
79 encoded_buffer[encoded_buffer_pos++]=p_samples[j];
81 memset(decoded_buffer.data(),0,decoded_buffer.size()*sizeof(int16_t));
83 if (p_print!=nullptr){
84 p_print->write((uint8_t*)decoded_buffer.data(), decoded_buffer.size()*sizeof(int16_t));
85 delay(2);
86 }
88 }
89 }
90 return len;
91 }
92
93 protected:
94 Print *p_print = nullptr;
95 iLBCDecode *p_ilbc = nullptr;
98 int16_t encoded_buffer_pos = 0;
99 EnumLBCFrameSize frame_size;
101
102};
103
112class ILBCEncoder : public AudioEncoder {
113 public:
114 ILBCEncoder(EnumLBCFrameSize frameSize = ms30) {
115 info.sample_rate = 8000;
116 info.channels = 1;
118 frame_size = frameSize;
119 }
120
122 end();
123 }
124
125 bool begin() {
126 TRACEI();
127 if (p_print==nullptr){
128 LOGE("Output not defined");
129 return false;
130 }
131 if (info.bits_per_sample!=16){
132 LOGE("bits_per_sample must be 16: %d",info.bits_per_sample);
133 return false;
134 }
135 if (info.sample_rate!=8000){
136 LOGW("The sample rate should be 8000: %d", info.sample_rate);
137 }
138 if (info.channels!=1){
139 LOGW("channels should be 1: %d", info.channels);
140 }
141 if (p_ilbc==nullptr){
142 p_ilbc = new iLBCEncode(frame_size);
143 }
144 decoded_buffer.resize(p_ilbc->getSamples());
145 encoded_buffer.resize(p_ilbc->getEncodedBytes());
147 return true;
148 }
149
150 virtual void end() {
151 TRACEI();
152 if (p_ilbc != nullptr) {
153 delete p_ilbc;
154 p_ilbc = nullptr;
155 }
156 }
157
158 virtual const char *mime() { return "audio/ilbc"; }
159
160 virtual void setOutput(Print &out_stream) { p_print = &out_stream; }
161
162 operator bool() { return p_ilbc != nullptr; }
163
164 virtual size_t write(const uint8_t *data, size_t len) {
165 if (p_ilbc==nullptr) return 0;
166 LOGI("write: %d", len);
167
168 int samples = len / sizeof(int16_t);
169 int16_t *p_samples = (int16_t *)data;
170
171 for (int j=0;j<samples;j++){
172 decoded_buffer[decoded_buffer_pos++]=p_samples[j];
176 if (p_print!=nullptr){
178 }
180 }
181 }
182 return len;
183 }
184
185 protected:
186 Print *p_print = nullptr;
187 iLBCEncode *p_ilbc = nullptr;
191 EnumLBCFrameSize frame_size;
192};
193
194} // 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:120
void notifyAudioChange(AudioInfo info)
Definition AudioTypes.h:175
Decoder for iLBC. Depends on https://github.com/pschatzmann/libilbc.
Definition CodecILBC.h:27
Vector< int16_t > decoded_buffer
Definition CodecILBC.h:96
virtual void setOutput(Print &out_stream)
Defines where the decoded result is written to.
Definition CodecILBC.h:69
virtual bool begin()
Definition CodecILBC.h:43
virtual const char * mime() override
Provides the mime type of the data that is expected by this decoder.
Definition CodecILBC.h:41
virtual size_t write(const uint8_t *data, size_t len)
Definition CodecILBC.h:73
ILBCDecoder(EnumLBCFrameSize frameSize=ms30, bool useEnhancer=true)
Definition CodecILBC.h:29
EnumLBCFrameSize frame_size
Definition CodecILBC.h:99
Vector< uint8_t > encoded_buffer
Definition CodecILBC.h:97
Print * p_print
Definition CodecILBC.h:94
iLBCDecode * p_ilbc
Definition CodecILBC.h:95
~ILBCDecoder()
Definition CodecILBC.h:37
virtual void end()
Definition CodecILBC.h:63
int16_t encoded_buffer_pos
Definition CodecILBC.h:98
bool use_enhancer
Definition CodecILBC.h:100
Encoder for iLBC - Depends on https://github.com/pschatzmann/libopenilbc.
Definition CodecILBC.h:112
Vector< float > decoded_buffer
Definition CodecILBC.h:188
virtual void setOutput(Print &out_stream)
Default output assignment (encoders may override to store Print reference)
Definition CodecILBC.h:160
iLBCEncode * p_ilbc
Definition CodecILBC.h:187
bool begin()
Definition CodecILBC.h:125
virtual const char * mime()
Provides the mime type of the encoded result.
Definition CodecILBC.h:158
virtual size_t write(const uint8_t *data, size_t len)
Definition CodecILBC.h:164
ILBCEncoder(EnumLBCFrameSize frameSize=ms30)
Definition CodecILBC.h:114
int16_t decoded_buffer_pos
Definition CodecILBC.h:190
~ILBCEncoder()
Definition CodecILBC.h:121
EnumLBCFrameSize frame_size
Definition CodecILBC.h:191
Vector< uint8_t > encoded_buffer
Definition CodecILBC.h:189
Print * p_print
Definition CodecILBC.h:186
virtual void end()
Definition CodecILBC.h:150
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:53
uint16_t channels
Number of channels: 2=stereo, 1=mono.
Definition AudioTypes.h:55
uint8_t bits_per_sample
Number of bits per sample (int16_t = 16 bits)
Definition AudioTypes.h:57