arduino-audio-tools
Loading...
Searching...
No Matches
CodecAMRNB.h
Go to the documentation of this file.
1#pragma once
2#include "AMRNB.h" // https://github.com/pschatzmann/codec-amr
4
5namespace audio_tools {
6
16class AMRNBDecoder : public AudioDecoder {
17 public:
21 AMRNBDecoder(AMRNB::Mode mode) {
23 info.channels = 1;
24 info.sample_rate = 8000;
25 }
26
27 ~AMRNBDecoder() override = default;
28
29 const char *mime() override { return "audio/amr"; }
30
31 void setMode(AMRNB::Mode mode) {
32 this->mode = mode;
33 amr.setMode(mode);
34 }
35
36 bool begin() {
38 buffer.resize(amr.getEncodedFrameSizeBytes());
39 return getOutput() != nullptr;
40 }
41
43 if (from.bits_per_sample != 16) {
44 LOGE("Invalid bits per sample: %d", from.bits_per_sample);
45 }
46 if (from.sample_rate != 8000) {
47 LOGE("Invalid sample rate: %d", from.sample_rate);
48 }
49 if (from.channels != 1) {
50 LOGE("Invalid channels: %d", from.channels);
51 }
52 }
53
54 size_t write(const uint8_t *data, size_t len) override {
55 for (size_t j = 0; j < len; j++) {
56 buffer.write(data[j]);
57 if (buffer.isFull()) {
58 int result_samples = amr.getFrameSizeSamples();
59 int16_t result[result_samples];
60 int size =
61 amr.decode(buffer.data(), buffer.size(), result, result_samples);
62 if (size > 0) {
63 if (getOutput() != nullptr) {
64 getOutput()->write((uint8_t *)result, size * sizeof(int16_t));
65 }
66 }
67 buffer.clear();
68 }
69 }
70 return len;
71 }
72
74 int blockSize() {
75 amr.setMode(mode);
76 return amr.getEncodedFrameSizeBytes();
77 }
78
80 int frameSize() { return amr.getFrameSizeSamples() * sizeof(int16_t); }
81
82 operator bool() override { return getOutput() != nullptr; }
83
84 protected:
85 AMRNB amr;
86 AMRNB::Mode mode;
88};
89
99class AMRNBEncoder : public AudioEncoder {
100 public:
104 AMRNBEncoder(AMRNB::Mode mode) {
105 setMode(mode);
106 info.channels = 1;
107 info.sample_rate = 8000;
108 }
109
110 ~AMRNBEncoder() override = default;
111
112 void setMode(AMRNB::Mode mode) {
113 this->mode = mode;
114 amr.setMode(mode);
115 }
116
117 bool begin() {
119 return getOutput() != nullptr;
120 }
121
123 if (from.bits_per_sample != 16) {
124 LOGE("Invalid bits per sample: %d", from.bits_per_sample);
125 }
126 if (from.sample_rate != 8000) {
127 LOGE("Invalid sample rate: %d", from.sample_rate);
128 }
129 if (from.channels != 1) {
130 LOGE("Invalid channels: %d", from.channels);
131 }
132 }
133
134 size_t write(const uint8_t *data, size_t len) override {
135 for (size_t j = 0; j < len; j++) {
136 buffer.write(data[j]);
137 if (buffer.isFull()) {
138 int result_bytes = blockSize();
139 uint8_t result[result_bytes];
140 int size =
141 amr.encode((int16_t *)buffer.data(),
142 buffer.size() / sizeof(int16_t), result, result_bytes);
143 if (size > 0) {
144 if (getOutput() != nullptr) {
145 getOutput()->write(result, size);
146 }
147 }
148 buffer.clear();
149 }
150 }
151 return len;
152 }
153
155 int blockSize() {
156 amr.setMode(mode);
157 return amr.getEncodedFrameSizeBytes();
158 }
159
161 int frameSize() { return amr.getFrameSizeSamples() * sizeof(int16_t); }
162
163 const char *mime() { return "audio/amr"; }
164
165 void setOutput(Print &out_stream) override { p_print = &out_stream; }
166
167 Print *getOutput() { return p_print; }
168
169 protected:
170 AMRNB amr;
171 AMRNB::Mode mode;
173 Print *p_print = nullptr;
174};
175
176} // namespace audio_tools
#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
AMR Narrowband Decoder See https://github.com/pschatzmann/codec-amr.
Definition CodecAMRNB.h:16
int frameSize()
Provides the frame size (size of decoded frame)
Definition CodecAMRNB.h:80
AMRNBDecoder(AMRNB::Mode mode)
Definition CodecAMRNB.h:21
int blockSize()
Provides the block size (size of encoded frame)
Definition CodecAMRNB.h:74
~AMRNBDecoder() override=default
AMRNB::Mode mode
Definition CodecAMRNB.h:86
bool begin()
Definition CodecAMRNB.h:36
size_t write(const uint8_t *data, size_t len) override
Definition CodecAMRNB.h:54
void setAudioInfo(AudioInfo from)
Defines the input AudioInfo.
Definition CodecAMRNB.h:42
AMRNB amr
Definition CodecAMRNB.h:85
void setMode(AMRNB::Mode mode)
Definition CodecAMRNB.h:31
SingleBuffer< uint8_t > buffer
Definition CodecAMRNB.h:87
const char * mime() override
Provides the mime type of the data that is expected by this decoder.
Definition CodecAMRNB.h:29
AMR NB Encoder See https://github.com/pschatzmann/codec-amr.
Definition CodecAMRNB.h:99
void setOutput(Print &out_stream) override
Default output assignment (encoders may override to store Print reference)
Definition CodecAMRNB.h:165
int frameSize()
Provides the frame size (size of decoded frame)
Definition CodecAMRNB.h:161
int blockSize()
Provides the block size (size of encoded frame)
Definition CodecAMRNB.h:155
AMRNB::Mode mode
Definition CodecAMRNB.h:171
Print * getOutput()
Definition CodecAMRNB.h:167
bool begin()
Definition CodecAMRNB.h:117
size_t write(const uint8_t *data, size_t len) override
Definition CodecAMRNB.h:134
const char * mime()
Provides the mime type of the encoded result.
Definition CodecAMRNB.h:163
void setAudioInfo(AudioInfo from)
Defines the input AudioInfo.
Definition CodecAMRNB.h:122
AMRNB amr
Definition CodecAMRNB.h:170
void setMode(AMRNB::Mode mode)
Definition CodecAMRNB.h:112
SingleBuffer< uint8_t > buffer
Definition CodecAMRNB.h:172
~AMRNBEncoder() override=default
Print * p_print
Definition CodecAMRNB.h:173
AMRNBEncoder(AMRNB::Mode mode)
Definition CodecAMRNB.h:104
Decoding of encoded audio into PCM data.
Definition AudioCodecsBase.h:19
AudioInfo info
Definition AudioCodecsBase.h:80
Print * getOutput()
Definition AudioCodecsBase.h:68
AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition AudioCodecsBase.h:29
Encoding of PCM data.
Definition AudioCodecsBase.h:101
AudioInfo info
Definition AudioCodecsBase.h:120
void notifyAudioChange(AudioInfo info)
Definition AudioTypes.h:175
void clear()
same as reset
Definition Buffers.h:96
A simple Buffer implementation which just uses a (dynamically sized) array.
Definition Buffers.h:189
size_t size() override
Definition Buffers.h:320
bool write(T sample) override
write add an entry to the buffer
Definition Buffers.h:223
bool isFull() override
checks if the buffer is full
Definition Buffers.h:257
T * data()
Provides address of actual data.
Definition Buffers.h:301
bool resize(size_t size)
Resizes the buffer if supported: returns false if not supported.
Definition Buffers.h:322
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition LMSEchoCancellationStream.h:6
Basic Audio information which drives e.g. I2S.
Definition AudioTypes.h:51
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