arduino-audio-tools
All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends Modules Pages
CodecAMRNB.h
1#pragma once
2#include "AMRNB.h" // https://github.com/pschatzmann/codec-amr
3#include "AudioTools/AudioCodecs/AudioCodecsBase.h"
4
5namespace audio_tools {
6
16class AMRNBDecoder : public AudioDecoder {
17 public:
21 AMRNBDecoder(AMRNB::Mode mode) {
22 setMode(mode);
23 info.channels = 1;
24 info.sample_rate = 8000;
25 }
26
27 ~AMRNBDecoder() override = default;
28
29 void setMode(AMRNB::Mode mode) {
30 this->mode = mode;
31 amr.setMode(mode);
32 }
33
34 bool begin() {
35 notifyAudioChange(audioInfo());
36 buffer.resize(amr.getEncodedFrameSizeBytes());
37 return getOutput() != nullptr;
38 }
39
41 if (from.bits_per_sample != 16) {
42 LOGE("Invalid bits per sample: %d", from.bits_per_sample);
43 }
44 if (from.sample_rate != 8000) {
45 LOGE("Invalid sample rate: %d", from.sample_rate);
46 }
47 if (from.channels != 1) {
48 LOGE("Invalid channels: %d", from.channels);
49 }
50 }
51
52 size_t write(const uint8_t *data, size_t len) override {
53 for (size_t j = 0; j < len; j++) {
54 buffer.write(data[j]);
55 if (buffer.isFull()) {
56 int result_samples = amr.getFrameSizeSamples();
57 int16_t result[result_samples];
58 int size =
59 amr.decode(buffer.data(), buffer.size(), result, result_samples);
60 if (size > 0) {
61 if (getOutput() != nullptr) {
62 getOutput()->write((uint8_t *)result, size * sizeof(int16_t));
63 }
64 }
65 buffer.clear();
66 }
67 }
68 return len;
69 }
70
72 int blockSize() {
73 amr.setMode(mode);
74 return amr.getEncodedFrameSizeBytes();
75 }
76
78 int frameSize() { return amr.getFrameSizeSamples() * sizeof(int16_t); }
79
80 operator bool() override { return getOutput() != nullptr; }
81
82 protected:
83 AMRNB amr;
84 AMRNB::Mode mode;
85 SingleBuffer<uint8_t> buffer{0};
86};
87
97class AMRNBEncoder : public AudioEncoder {
98 public:
102 AMRNBEncoder(AMRNB::Mode mode) {
103 setMode(mode);
104 info.channels = 1;
105 info.sample_rate = 8000;
106 }
107
108 ~AMRNBEncoder() override = default;
109
110 void setMode(AMRNB::Mode mode) {
111 this->mode = mode;
112 amr.setMode(mode);
113 }
114
115 bool begin() {
116 buffer.resize(frameSize());
117 return getOutput() != nullptr;
118 }
119
121 if (from.bits_per_sample != 16) {
122 LOGE("Invalid bits per sample: %d", from.bits_per_sample);
123 }
124 if (from.sample_rate != 8000) {
125 LOGE("Invalid sample rate: %d", from.sample_rate);
126 }
127 if (from.channels != 1) {
128 LOGE("Invalid channels: %d", from.channels);
129 }
130 }
131
132 size_t write(const uint8_t *data, size_t len) override {
133 for (size_t j = 0; j < len; j++) {
134 buffer.write(data[j]);
135 if (buffer.isFull()) {
136 int result_bytes = blockSize();
137 uint8_t result[result_bytes];
138 int size =
139 amr.encode((int16_t *)buffer.data(),
140 buffer.size() / sizeof(int16_t), result, result_bytes);
141 if (size > 0) {
142 if (getOutput() != nullptr) {
143 getOutput()->write(result, size);
144 }
145 }
146 buffer.clear();
147 }
148 }
149 return len;
150 }
151
153 int blockSize() {
154 amr.setMode(mode);
155 return amr.getEncodedFrameSizeBytes();
156 }
157
159 int frameSize() { return amr.getFrameSizeSamples() * sizeof(int16_t); }
160
161 const char *mime() { return "audio/amr"; }
162
163 void setOutput(Print &out_stream) override { p_print = &out_stream; }
164
165 Print *getOutput() { return p_print; }
166
167 protected:
168 AMRNB amr;
169 AMRNB::Mode mode;
170 SingleBuffer<uint8_t> buffer{0};
171 Print *p_print = nullptr;
172};
173
174} // namespace audio_tools
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:78
AMRNBDecoder(AMRNB::Mode mode)
Definition CodecAMRNB.h:21
int blockSize()
Provides the block size (size of encoded frame)
Definition CodecAMRNB.h:72
void setAudioInfo(AudioInfo from)
Defines the input AudioInfo.
Definition CodecAMRNB.h:40
AMR NB Encoder See https://github.com/pschatzmann/codec-amr.
Definition CodecAMRNB.h:97
int frameSize()
Provides the frame size (size of decoded frame)
Definition CodecAMRNB.h:159
int blockSize()
Provides the block size (size of encoded frame)
Definition CodecAMRNB.h:153
const char * mime()
Provides the mime type of the encoded result.
Definition CodecAMRNB.h:161
void setAudioInfo(AudioInfo from)
Defines the input AudioInfo.
Definition CodecAMRNB.h:120
AMRNBEncoder(AMRNB::Mode mode)
Definition CodecAMRNB.h:102
Decoding of encoded audio into PCM data.
Definition AudioCodecsBase.h:18
AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition AudioCodecsBase.h:25
Encoding of PCM data.
Definition AudioCodecsBase.h:96
void clear()
same as reset
Definition Buffers.h:95
Definition NoArduino.h:62
bool write(T sample) override
write add an entry to the buffer
Definition Buffers.h:202
bool isFull() override
checks if the buffer is full
Definition Buffers.h:236
bool resize(int size)
Resizes the buffer if supported: returns false if not supported.
Definition Buffers.h:292
T * data()
Provides address of actual data.
Definition Buffers.h:271
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
Basic Audio information which drives e.g. I2S.
Definition AudioTypes.h:53
sample_rate_t sample_rate
Sample Rate: e.g 44100.
Definition AudioTypes.h:55
uint16_t channels
Number of channels: 2=stereo, 1=mono.
Definition AudioTypes.h:57
uint8_t bits_per_sample
Number of bits per sample (int16_t = 16 bits)
Definition AudioTypes.h:59