arduino-audio-tools
Loading...
Searching...
No Matches
src
AudioTools
AudioCodecs
CodecAMRWB.h
Go to the documentation of this file.
1
#pragma once
2
#include "AMRWB.h"
// https://github.com/pschatzmann/codec-amr
3
#include "
AudioTools/AudioCodecs/AudioCodecsBase.h
"
4
5
namespace
audio_tools
{
6
16
class
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
34
void
setAudioInfo
(
AudioInfo
from) {
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
93
class
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
115
void
setAudioInfo
(
AudioInfo
from) {
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
AudioCodecsBase.h
LOGE
#define LOGE(...)
Definition
AudioLoggerIDF.h:30
audio_tools::AMRWBDecoder
AMR Wideband Decoder See https://github.com/pschatzmann/codec-amr.
Definition
CodecAMRWB.h:16
audio_tools::AMRWBDecoder::frameSize
int frameSize()
Provides the frame size (size of decoded frame)
Definition
CodecAMRWB.h:69
audio_tools::AMRWBDecoder::AMRWBDecoder
AMRWBDecoder(AMRWB::Mode mode)
Definition
CodecAMRWB.h:20
audio_tools::AMRWBDecoder::begin
bool begin()
Definition
CodecAMRWB.h:28
audio_tools::AMRWBDecoder::setMode
void setMode(AMRWB::Mode mode)
Definition
CodecAMRWB.h:71
audio_tools::AMRWBDecoder::amr
AMRWB amr
Definition
CodecAMRWB.h:79
audio_tools::AMRWBDecoder::write
size_t write(const uint8_t *data, size_t len) override
Definition
CodecAMRWB.h:46
audio_tools::AMRWBDecoder::blickSize
int blickSize()
Provides the block size (size of encoded frame)
Definition
CodecAMRWB.h:66
audio_tools::AMRWBDecoder::setAudioInfo
void setAudioInfo(AudioInfo from)
Defines the input AudioInfo.
Definition
CodecAMRWB.h:34
audio_tools::AMRWBDecoder::mode
AMRWB::Mode mode
Definition
CodecAMRWB.h:80
audio_tools::AMRWBDecoder::buffer
SingleBuffer< uint8_t > buffer
Definition
CodecAMRWB.h:81
audio_tools::AMRWBDecoder::~AMRWBDecoder
~AMRWBDecoder() override=default
audio_tools::AMRWBEncoder
AMR Wideband Encoder See https://github.com/pschatzmann/codec-amr.
Definition
CodecAMRWB.h:93
audio_tools::AMRWBEncoder::setOutput
void setOutput(Print &out_stream) override
Default output assignment (encoders may override to store Print reference)
Definition
CodecAMRWB.h:158
audio_tools::AMRWBEncoder::frameSize
int frameSize()
Provides the frame size (size of decoded frame)
Definition
CodecAMRWB.h:154
audio_tools::AMRWBEncoder::blockSize
int blockSize()
Provides the block size (size of encoded frame)
Definition
CodecAMRWB.h:148
audio_tools::AMRWBEncoder::getOutput
Print * getOutput()
Definition
CodecAMRWB.h:160
audio_tools::AMRWBEncoder::begin
bool begin()
Definition
CodecAMRWB.h:110
audio_tools::AMRWBEncoder::setMode
void setMode(AMRWB::Mode mode)
Definition
CodecAMRWB.h:105
audio_tools::AMRWBEncoder::amr
AMRWB amr
Definition
CodecAMRWB.h:163
audio_tools::AMRWBEncoder::write
size_t write(const uint8_t *data, size_t len) override
Definition
CodecAMRWB.h:127
audio_tools::AMRWBEncoder::mime
const char * mime()
Provides the mime type of the encoded result.
Definition
CodecAMRWB.h:156
audio_tools::AMRWBEncoder::setAudioInfo
void setAudioInfo(AudioInfo from)
Defines the input AudioInfo.
Definition
CodecAMRWB.h:115
audio_tools::AMRWBEncoder::mode
AMRWB::Mode mode
Definition
CodecAMRWB.h:164
audio_tools::AMRWBEncoder::~AMRWBEncoder
~AMRWBEncoder() override=default
audio_tools::AMRWBEncoder::AMRWBEncoder
AMRWBEncoder(AMRWB::Mode mode)
Definition
CodecAMRWB.h:97
audio_tools::AMRWBEncoder::buffer
SingleBuffer< uint8_t > buffer
Definition
CodecAMRWB.h:165
audio_tools::AMRWBEncoder::p_print
Print * p_print
Definition
CodecAMRWB.h:166
audio_tools::AudioDecoder
Decoding of encoded audio into PCM data.
Definition
AudioCodecsBase.h:18
audio_tools::AudioDecoder::info
AudioInfo info
Definition
AudioCodecsBase.h:76
audio_tools::AudioDecoder::getOutput
Print * getOutput()
Definition
AudioCodecsBase.h:64
audio_tools::AudioDecoder::audioInfo
AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition
AudioCodecsBase.h:25
audio_tools::AudioEncoder
Encoding of PCM data.
Definition
AudioCodecsBase.h:97
audio_tools::AudioEncoder::info
AudioInfo info
Definition
AudioCodecsBase.h:116
audio_tools::AudioInfoSource::notifyAudioChange
void notifyAudioChange(AudioInfo info)
Definition
AudioTypes.h:178
audio_tools::BaseBuffer::clear
void clear()
same as reset
Definition
Buffers.h:95
audio_tools::Print
Definition
NoArduino.h:62
audio_tools::Print::write
virtual size_t write(const uint8_t *data, size_t len)
Definition
NoArduino.h:126
audio_tools::SingleBuffer
A simple Buffer implementation which just uses a (dynamically sized) array.
Definition
Buffers.h:172
audio_tools::SingleBuffer::size
size_t size() override
Definition
Buffers.h:303
audio_tools::SingleBuffer::write
bool write(T sample) override
write add an entry to the buffer
Definition
Buffers.h:206
audio_tools::SingleBuffer::isFull
bool isFull() override
checks if the buffer is full
Definition
Buffers.h:240
audio_tools::SingleBuffer::resize
bool resize(int size)
Resizes the buffer if supported: returns false if not supported.
Definition
Buffers.h:305
audio_tools::SingleBuffer::data
T * data()
Provides address of actual data.
Definition
Buffers.h:284
audio_tools
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition
AudioCodecsBase.h:10
audio_tools::writeData
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition
AudioTypes.h:512
audio_tools::AudioInfo
Basic Audio information which drives e.g. I2S.
Definition
AudioTypes.h:55
audio_tools::AudioInfo::sample_rate
sample_rate_t sample_rate
Sample Rate: e.g 44100.
Definition
AudioTypes.h:57
audio_tools::AudioInfo::channels
uint16_t channels
Number of channels: 2=stereo, 1=mono.
Definition
AudioTypes.h:59
audio_tools::AudioInfo::bits_per_sample
uint8_t bits_per_sample
Number of bits per sample (int16_t = 16 bits)
Definition
AudioTypes.h:61
Generated by
1.9.8