3 #define MINIMP3_NO_STDIO
9 #ifndef MINIMP3_MAX_SAMPLE_RATE
10 #define MINIMP3_MAX_SAMPLE_RATE 44100
13 #include "AudioCodecs/AudioEncoded.h"
39 void setBufferLength(
int len) { buffer_size = len; }
42 audioBaseInfoSupport = &bi;
50 buffer.resize(buffer_size);
51 pcm.resize(MINIMP3_MAX_SAMPLES_PER_FRAME);
70 size_t write(
const void *data,
size_t len) {
71 LOGD(
"write: %zu", len);
73 if (buffer_pos+len>=buffer.size()){
76 assert(buffer_pos+len<buffer.size());
77 memcpy(buffer.data()+buffer_pos, data, len);
91 virtual operator bool() {
return active; }
93 void setSampleRateLimit(
int limit){
94 sample_rate_limit = limit;
99 AudioInfoSupport *audioBaseInfoSupport =
nullptr;
100 Print *out =
nullptr;
102 mp3dec_frame_info_t mp3dec_info;
103 size_t buffer_size = 5 * 1024;
104 size_t buffer_pos = 0;
105 Vector<uint8_t> buffer;
106 Vector<mp3d_sample_t> pcm;
107 #ifdef MINIMP3_FLOAT_OUTPUT
108 Vector<int16_t> pcm16;
111 int sample_rate_limit = MINIMP3_MAX_SAMPLE_RATE;
115 LOGD(
"decode: %zd ", buffer_pos);
116 int open = buffer_pos;
121 samples = ::mp3dec_decode_frame(&mp3d, buffer.data()+processed, open,
122 pcm.data(), &mp3dec_info);
123 LOGD(
"frame_offset: %d - frame_bytes: %d -> samples %d", mp3dec_info.frame_offset, mp3dec_info.frame_bytes, samples);
124 open -= mp3dec_info.frame_bytes;
125 processed += mp3dec_info.frame_bytes;
131 }
while(processed < write_len);
135 memmove(buffer.data(),buffer.data()+processed, open);
140 LOGD(
"provideResult: %d samples", samples);
142 info.
sample_rate = mp3dec_info.hz>sample_rate_limit ? sample_rate_limit : mp3dec_info.hz;
143 info.
channels = mp3dec_info.channels;
147 if (audioBaseInfoSupport !=
nullptr && info != audio_info) {
149 audioBaseInfoSupport->setAudioInfo(info);
155 if (out !=
nullptr) {
156 #ifdef MINIMP3_FLOAT_OUTPUT
157 pcm16.resize(samples);
158 f32_to_s16(pcm.data(), pcm16.data(), samples);
159 out->write((uint8_t *)pcm16.data(), samples *
sizeof(int16_t));
161 out->write((uint8_t *)pcm.data(), samples *
sizeof(mp3d_sample_t));
166 void f32_to_s16(
float *in, int16_t *out,
int num_samples) {
168 for(; i < num_samples; i++){
169 float sample = in[i] * 32768.0f;
170 if (sample >= 32766.5f)
171 out[i] = (int16_t) 32767;
172 else if (sample <= -32767.5f)
173 out[i] = (int16_t)-32768;
175 int16_t s = (int16_t)(sample + .5f);