arduino-audio-tools
All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends Modules Pages
CodecAMRWB.h
1#pragma once
2#include "AMRWB.h" // https://github.com/pschatzmann/codec-amr
3#include "AudioTools/AudioCodecs/AudioCodecsBase.h"
4
5namespace audio_tools {
6
16class AMRWBDecoder : public AudioDecoder {
17 public:
20 AMRWBDecoder(AMRWB::Mode mode) {
21 setMode(mode);
22 info.channels = 1;
23 info.sample_rate = 16000;
24 }
25
26 ~AMRWBDecoder() override = default;
27
28 bool begin() {
29 notifyAudioChange(audioInfo());
30 buffer.resize(amr.getEncodedFrameSizeBytes());
31 return getOutput() != nullptr;
32 }
33
35 if (from.bits_per_sample != 16) {
36 LOGE("Invalid bits per sample: %d", from.bits_per_sample);
37 }
38 if (from.sample_rate != 8000) {
39 LOGE("Invalid sample rate: %d", from.sample_rate);
40 }
41 if (from.channels != 1) {
42 LOGE("Invalid channels: %d", from.channels);
43 }
44 }
45
46 size_t write(const uint8_t *data, size_t len) override {
47 for (size_t j = 0; j < len; j++) {
48 buffer.write(data[j]);
49 if (buffer.isFull()) {
50 int result_samples = amr.getFrameSizeSamples();
51 int16_t result[result_samples];
52 int size =
53 amr.decode(buffer.data(), buffer.size(), result, result_samples);
54 if (size > 0) {
55 if (getOutput() != nullptr) {
56 getOutput()->write((uint8_t *)result, size * sizeof(int16_t));
57 }
58 }
59 buffer.clear();
60 }
61 }
62 return len;
63 }
64
66 int blickSize() { return amr.getEncodedFrameSizeBytes(); }
67
69 int frameSize() { return amr.getFrameSizeSamples() * sizeof(int16_t); }
70
71 void setMode(AMRWB::Mode mode) {
72 this->mode = mode;
73 amr.setMode(mode);
74 }
75
76 operator bool() override { return getOutput() != nullptr; }
77
78 protected:
79 AMRWB amr;
80 AMRWB::Mode mode;
81 SingleBuffer<uint8_t> buffer{0};
82};
83
93class AMRWBEncoder : public AudioEncoder {
94 public:
97 AMRWBEncoder(AMRWB::Mode mode) {
98 setMode(mode);
99 info.channels = 1;
100 info.sample_rate = 16000;
101 }
102
103 ~AMRWBEncoder() override = default;
104
105 void setMode(AMRWB::Mode mode) {
106 this->mode = mode;
107 amr.setMode(mode);
108 }
109
110 bool begin() {
111 buffer.resize(frameSize());
112 return getOutput() != nullptr;
113 }
114
116 if (from.bits_per_sample != 16) {
117 LOGE("Invalid bits per sample: %d", from.bits_per_sample);
118 }
119 if (from.sample_rate != 8000) {
120 LOGE("Invalid sample rate: %d", from.sample_rate);
121 }
122 if (from.channels != 1) {
123 LOGE("Invalid channels: %d", from.channels);
124 }
125 }
126
127 size_t write(const uint8_t *data, size_t len) override {
128 for (size_t j = 0; j < len; j++) {
129 buffer.write(data[j]);
130 if (buffer.isFull()) {
131 int result_bytes = blockSize();
132 uint8_t result[result_bytes];
133 int size =
134 amr.encode((int16_t *)buffer.data(),
135 buffer.size() / sizeof(int16_t), result, result_bytes);
136 if (size > 0) {
137 if (getOutput() != nullptr) {
138 getOutput()->write(result, size);
139 }
140 }
141 buffer.clear();
142 }
143 }
144 return len;
145 }
146
148 int blockSize() {
149 amr.setMode(mode);
150 return amr.getEncodedFrameSizeBytes();
151 }
152
154 int frameSize() { return amr.getFrameSizeSamples() * sizeof(int16_t); }
155
156 const char *mime() { return "audio/amr"; }
157
158 void setOutput(Print &out_stream) override { p_print = &out_stream; }
159
160 Print *getOutput() { return p_print; }
161
162 protected:
163 AMRWB amr;
164 AMRWB::Mode mode;
165 SingleBuffer<uint8_t> buffer{0};
166 Print *p_print = nullptr;
167};
168
169} // namespace audio_tools
AMR Wideband Decoder See https://github.com/pschatzmann/codec-amr.
Definition CodecAMRWB.h:16
int frameSize()
Provides the frame size (size of decoded frame)
Definition CodecAMRWB.h:69
AMRWBDecoder(AMRWB::Mode mode)
Definition CodecAMRWB.h:20
int blickSize()
Provides the block size (size of encoded frame)
Definition CodecAMRWB.h:66
void setAudioInfo(AudioInfo from)
Defines the input AudioInfo.
Definition CodecAMRWB.h:34
AMR Wideband Encoder See https://github.com/pschatzmann/codec-amr.
Definition CodecAMRWB.h:93
int frameSize()
Provides the frame size (size of decoded frame)
Definition CodecAMRWB.h:154
int blockSize()
Provides the block size (size of encoded frame)
Definition CodecAMRWB.h:148
const char * mime()
Provides the mime type of the encoded result.
Definition CodecAMRWB.h:156
void setAudioInfo(AudioInfo from)
Defines the input AudioInfo.
Definition CodecAMRWB.h:115
AMRWBEncoder(AMRWB::Mode mode)
Definition CodecAMRWB.h:97
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