arduino-audio-tools
Loading...
Searching...
No Matches
CodecMP3LAME.h
Go to the documentation of this file.
1#pragma once
2
5#include "MP3EncoderLAME.h"
6
7namespace audio_tools {
8
14struct AudioInfoLAME : public liblame::AudioInfo {
16 sample_rate = 44100;
17 channels = 2;
18 bits_per_sample = 16;
19 };
20 AudioInfoLAME (const AudioInfoLAME &) = default;
21
22 int quality = 7; // 0..9. 0=best (very slow). 9=worst.
23};
24
39
40public:
42 MP3EncoderLAME(bool splitFrames = false){
43 TRACED();
44 split_frames = splitFrames;
45 }
46
48 MP3EncoderLAME(Print &out_stream, bool splitFrames = false){
49 TRACED();
50 p_print = &out_stream;
51 split_frames = splitFrames;
52 }
53
55 TRACED();
56 end();
57 }
58
60 void setOutput(Print &out_stream){
61 TRACED();
62 p_print = &out_stream;
63 if (split_frames) frames.setOutput(out_stream);
64 if (enc!=nullptr){
65 if (split_frames) {
66 enc->setOutput(frame_writer);
67 } else {
68 enc->setOutput(out_stream);
69 }
70 }
71 }
72
75 TRACED();
77 lame_info.channels = from.channels;
78 lame_info.sample_rate = from.sample_rate;
79 lame_info.bits_per_sample = from.bits_per_sample;
80 }
81
84 TRACED();
85 lame_info = from;
86 }
87
88 bool begin(AudioInfoLAME from) {
89 setAudioInfo(from);
90 return begin();
91 }
92
93 // starts the processing
94 bool begin() {
95 createEnc();
96 if (enc==nullptr) return false;
97 if (split_frames) {
98 frames.resize(kMaxFrameSize);
99 frames.reset();
100 }
101 enc->begin();
102 return true;
103 }
104
105
107 return lame_info;
108 }
109
111 AudioInfoLAME def;
112 return def;
113 }
114
115 // convert PCM data to convert into MP3
116 size_t write(const uint8_t *data, size_t len){
117 if (enc==nullptr) return 0;
118 LOGD("write %d bytes", (int) len);
119 return enc->write((uint8_t*)data, len);
120 }
121
122 // release resources
123 void end(){
124 TRACED();
125 if (enc!=nullptr){
126 enc->end();
127 if (split_frames) frames.flush();
128 delete enc;
129 enc = nullptr;
130 }
131 }
132
133 liblame::MP3EncoderLAME *driver() {
134 return enc;
135 }
136
137 const char *mime() {
138 return "audio/mpeg";
139 }
140
141 virtual operator bool() {
142 return enc!=nullptr && (bool)(*enc);
143 }
144
145protected:
147 class FrameWriter : public Print {
148 public:
150 size_t write(uint8_t c) override { return write(&c, 1); }
151 size_t write(const uint8_t *data, size_t len) override {
152 frames.write(data, len);
153 frames.flush(); // writes all complete frames
154 return len;
155 }
156 protected:
158 };
159
161 static constexpr int kMaxFrameSize = 2048;
162
163 liblame::MP3EncoderLAME *enc=nullptr;
165 Print *p_print=nullptr;
166 bool split_frames = false;
169
170 // Create enc only at begin so that we can use psram
171 void createEnc(){
172 TRACED();
173 if (enc==nullptr){
174 enc = new liblame::MP3EncoderLAME();
175 if (p_print!=nullptr){
177 } else {
178 LOGE("Output undefined");
179 }
180 LOGI("LibLAME channels: %d", lame_info.channels);
181 LOGI("LibLAME sample_rate: %d", lame_info.sample_rate);
182 LOGI("LibLAME bits_per_sample: %d", lame_info.bits_per_sample);
183 LOGI("LibLAME quality: %d", lame_info.quality);
184 enc->setAudioInfo(lame_info);
185 }
186 }
187
188};
189
190}
#define TRACED()
#define LOGI(...)
#define LOGD(...)
#define LOGE(...)
void setAudioInfo(AudioInfo from) override
Defines the sample rate, number of channels and bits per sample.
Definition AudioCodecsBase.h:110
MP3 header parser that processes MP3 data incrementally and extracts complete MP3 frames....
Definition HeaderParserMP3.h:25
Receives the output of LAME and passes it on in complete MP3 frames.
Definition CodecMP3LAME.h:147
FrameWriter(HeaderParserMP3 &frames)
Definition CodecMP3LAME.h:149
size_t write(uint8_t c) override
Definition CodecMP3LAME.h:150
size_t write(const uint8_t *data, size_t len) override
Definition CodecMP3LAME.h:151
HeaderParserMP3 & frames
Definition CodecMP3LAME.h:157
bool begin(AudioInfoLAME from)
Definition CodecMP3LAME.h:88
~MP3EncoderLAME()
Definition CodecMP3LAME.h:54
liblame::MP3EncoderLAME * driver()
Definition CodecMP3LAME.h:133
bool begin()
Definition CodecMP3LAME.h:94
HeaderParserMP3 frames
Definition CodecMP3LAME.h:167
AudioInfoLAME & audioInfoExt()
Definition CodecMP3LAME.h:106
const char * mime()
Provides the mime type of the encoded result.
Definition CodecMP3LAME.h:137
MP3EncoderLAME(bool splitFrames=false)
Definition CodecMP3LAME.h:42
void setAudioInfo(AudioInfoLAME from)
Defines the Audio Info.
Definition CodecMP3LAME.h:83
void createEnc()
Definition CodecMP3LAME.h:171
liblame::MP3EncoderLAME * enc
Definition CodecMP3LAME.h:163
void setAudioInfo(AudioInfo from)
Defines the Audio Info.
Definition CodecMP3LAME.h:74
AudioInfoLAME defaultConfig()
Definition CodecMP3LAME.h:110
void setOutput(Print &out_stream)
Defines the output stream.
Definition CodecMP3LAME.h:60
void end()
Definition CodecMP3LAME.h:123
AudioInfoLAME lame_info
Definition CodecMP3LAME.h:164
static constexpr int kMaxFrameSize
Buffer size for the frame splitting: bigger than the largest MP3 frame.
Definition CodecMP3LAME.h:161
Print * p_print
Definition CodecMP3LAME.h:165
bool split_frames
Definition CodecMP3LAME.h:166
FrameWriter frame_writer
Definition CodecMP3LAME.h:168
MP3EncoderLAME(Print &out_stream, bool splitFrames=false)
Definition CodecMP3LAME.h:48
size_t write(const uint8_t *data, size_t len)
Definition CodecMP3LAME.h:116
Definition CodecOpusOgg.h:57
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:56
sample_rate_t sample_rate
Sample Rate: e.g 44100.
Definition AudioTypes.h:58
uint16_t channels
Number of channels: 2=stereo, 1=mono.
Definition AudioTypes.h:60
uint8_t bits_per_sample
Number of bits per sample (int16_t = 16 bits).
Definition AudioTypes.h:62
LAME parameters.
Definition CodecMP3LAME.h:14
AudioInfoLAME(const AudioInfoLAME &)=default
AudioInfoLAME()
Definition CodecMP3LAME.h:15
int quality
Definition CodecMP3LAME.h:22