arduino-audio-tools
Loading...
Searching...
No Matches
CodecAMRWB.h
Go to the documentation of this file.
1#pragma once
2#include "AMRWB.h" // https://github.com/pschatzmann/codec-amr
4
5namespace audio_tools {
6
16class AMRWBDecoder : public AudioDecoder {
17 public:
20 AMRWBDecoder(AMRWB::Mode mode) {
22 info.channels = 1;
23 info.sample_rate = 16000;
24 }
25
26 ~AMRWBDecoder() override = default;
27
28 const char *mime() override { return "audio/amr"; }
29
30 bool begin() {
32 buffer.resize(amr.getEncodedFrameSizeBytes());
33 return getOutput() != nullptr;
34 }
35
37 if (from.bits_per_sample != 16) {
38 LOGE("Invalid bits per sample: %d", from.bits_per_sample);
39 }
40 if (from.sample_rate != 8000) {
41 LOGE("Invalid sample rate: %d", from.sample_rate);
42 }
43 if (from.channels != 1) {
44 LOGE("Invalid channels: %d", from.channels);
45 }
46 }
47
48 size_t write(const uint8_t *data, size_t len) override {
49 for (size_t j = 0; j < len; j++) {
50 buffer.write(data[j]);
51 if (buffer.isFull()) {
52 int result_samples = amr.getFrameSizeSamples();
53 int16_t result[result_samples];
54 int size =
55 amr.decode(buffer.data(), buffer.size(), result, result_samples);
56 if (size > 0) {
57 if (getOutput() != nullptr) {
58 getOutput()->write((uint8_t *)result, size * sizeof(int16_t));
59 }
60 }
61 buffer.clear();
62 }
63 }
64 return len;
65 }
66
68 int blickSize() { return amr.getEncodedFrameSizeBytes(); }
69
71 int frameSize() { return amr.getFrameSizeSamples() * sizeof(int16_t); }
72
73 void setMode(AMRWB::Mode mode) {
74 this->mode = mode;
75 amr.setMode(mode);
76 }
77
78 operator bool() override { return getOutput() != nullptr; }
79
80 protected:
81 AMRWB amr;
82 AMRWB::Mode mode;
84};
85
95class AMRWBEncoder : public AudioEncoder {
96 public:
99 AMRWBEncoder(AMRWB::Mode mode) {
100 setMode(mode);
101 info.channels = 1;
102 info.sample_rate = 16000;
103 }
104
105 ~AMRWBEncoder() override = default;
106
107 void setMode(AMRWB::Mode mode) {
108 this->mode = mode;
109 amr.setMode(mode);
110 }
111
112 bool begin() {
114 return getOutput() != nullptr;
115 }
116
118 if (from.bits_per_sample != 16) {
119 LOGE("Invalid bits per sample: %d", from.bits_per_sample);
120 }
121 if (from.sample_rate != 8000) {
122 LOGE("Invalid sample rate: %d", from.sample_rate);
123 }
124 if (from.channels != 1) {
125 LOGE("Invalid channels: %d", from.channels);
126 }
127 }
128
129 size_t write(const uint8_t *data, size_t len) override {
130 for (size_t j = 0; j < len; j++) {
131 buffer.write(data[j]);
132 if (buffer.isFull()) {
133 int result_bytes = blockSize();
134 uint8_t result[result_bytes];
135 int size =
136 amr.encode((int16_t *)buffer.data(),
137 buffer.size() / sizeof(int16_t), result, result_bytes);
138 if (size > 0) {
139 if (getOutput() != nullptr) {
140 getOutput()->write(result, size);
141 }
142 }
143 buffer.clear();
144 }
145 }
146 return len;
147 }
148
150 int blockSize() {
151 amr.setMode(mode);
152 return amr.getEncodedFrameSizeBytes();
153 }
154
156 int frameSize() { return amr.getFrameSizeSamples() * sizeof(int16_t); }
157
158 const char *mime() { return "audio/amr"; }
159
160 void setOutput(Print &out_stream) override { p_print = &out_stream; }
161
162 Print *getOutput() { return p_print; }
163
164 protected:
165 AMRWB amr;
166 AMRWB::Mode mode;
168 Print *p_print = nullptr;
169};
170
171} // 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 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:71
AMRWBDecoder(AMRWB::Mode mode)
Definition CodecAMRWB.h:20
bool begin()
Definition CodecAMRWB.h:30
void setMode(AMRWB::Mode mode)
Definition CodecAMRWB.h:73
AMRWB amr
Definition CodecAMRWB.h:81
size_t write(const uint8_t *data, size_t len) override
Definition CodecAMRWB.h:48
int blickSize()
Provides the block size (size of encoded frame)
Definition CodecAMRWB.h:68
void setAudioInfo(AudioInfo from)
Defines the input AudioInfo.
Definition CodecAMRWB.h:36
AMRWB::Mode mode
Definition CodecAMRWB.h:82
SingleBuffer< uint8_t > buffer
Definition CodecAMRWB.h:83
const char * mime() override
Provides the mime type of the data that is expected by this decoder.
Definition CodecAMRWB.h:28
~AMRWBDecoder() override=default
AMR Wideband Encoder See https://github.com/pschatzmann/codec-amr.
Definition CodecAMRWB.h:95
void setOutput(Print &out_stream) override
Default output assignment (encoders may override to store Print reference)
Definition CodecAMRWB.h:160
int frameSize()
Provides the frame size (size of decoded frame)
Definition CodecAMRWB.h:156
int blockSize()
Provides the block size (size of encoded frame)
Definition CodecAMRWB.h:150
Print * getOutput()
Definition CodecAMRWB.h:162
bool begin()
Definition CodecAMRWB.h:112
void setMode(AMRWB::Mode mode)
Definition CodecAMRWB.h:107
AMRWB amr
Definition CodecAMRWB.h:165
size_t write(const uint8_t *data, size_t len) override
Definition CodecAMRWB.h:129
const char * mime()
Provides the mime type of the encoded result.
Definition CodecAMRWB.h:158
void setAudioInfo(AudioInfo from)
Defines the input AudioInfo.
Definition CodecAMRWB.h:117
AMRWB::Mode mode
Definition CodecAMRWB.h:166
~AMRWBEncoder() override=default
AMRWBEncoder(AMRWB::Mode mode)
Definition CodecAMRWB.h:99
SingleBuffer< uint8_t > buffer
Definition CodecAMRWB.h:167
Print * p_print
Definition CodecAMRWB.h:168
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:194
size_t size() override
Definition Buffers.h:325
bool write(T sample) override
write add an entry to the buffer
Definition Buffers.h:228
bool isFull() override
checks if the buffer is full
Definition Buffers.h:262
T * data()
Provides address of actual data.
Definition Buffers.h:306
bool resize(size_t size)
Resizes the buffer if supported: returns false if not supported.
Definition Buffers.h:327
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