arduino-audio-tools
All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends Modules Pages
CodecMP3Helix.h
1#pragma once
2
3#include "AudioTools/AudioCodecs/AudioCodecsBase.h"
4#ifndef HELIX_PRINT
5# define HELIX_PRINT
6#endif
7#include "MP3DecoderHelix.h"
8
9namespace audio_tools {
10
20 public:
21
23 TRACED();
24 mp3 = new libhelix::MP3DecoderHelix();
25 if (mp3!=nullptr){
26 mp3->setReference(this);
27 } else {
28 LOGE("Not enough memory for libhelix");
29 }
30 }
36 MP3DecoderHelix(Print &out_stream){
37 TRACED();
38 mp3 = new libhelix::MP3DecoderHelix();
39 if (mp3!=nullptr){
40 mp3->setReference(this);
41 } else {
42 LOGE("Not enough memory for libhelix");
43 }
44 setOutput(out_stream);
45 }
46
55 TRACED();
56 mp3 = new libhelix::MP3DecoderHelix();
57 if (mp3!=nullptr){
58 mp3->setReference(this);
59 } else {
60 LOGE("Not enough memory for libhelix");
61 }
62 setOutput(out_stream);
64 }
65
71 if (mp3!=nullptr) delete mp3;
72 }
73
75 void setOutput(Print &outStream) override {
76 AudioDecoder::setOutput(outStream);
77 if (mp3!=nullptr) mp3->setOutput(outStream);
78 }
79
81 bool begin() override {
82 TRACED();
83 if (mp3!=nullptr) {
84 //mp3->setDelay(CODEC_DELAY_MS);
85 mp3->begin();
86 }
87 return true;
88 }
89
91 void end() override {
92 TRACED();
93 if (mp3!=nullptr) mp3->end();
94 }
95
96 MP3FrameInfo audioInfoEx(){
97 return mp3->audioInfo();
98 }
99
100 AudioInfo audioInfo() override {
101 MP3FrameInfo i = audioInfoEx();
102 AudioInfo baseInfo;
103 baseInfo.channels = i.nChans;
104 baseInfo.sample_rate = i.samprate;
105 baseInfo.bits_per_sample = i.bitsPerSample;
106 return baseInfo;
107 }
108
110 size_t write(const uint8_t* data, size_t len) override {
111 LOGD("%s: %zu", LOG_METHOD, len);
112 if (mp3==nullptr) return 0;
113 return mp3->write((uint8_t*)data, len);
114 }
115
117 operator bool() override {
118 return mp3!=nullptr && (bool) *mp3;
119 }
120
121 libhelix::MP3DecoderHelix *driver() {
122 return mp3;
123 }
124
127 TRACED();
129 if (mp3!=nullptr) mp3->setInfoCallback(infoCallback, this);
130 }
131
133 static void infoCallback(MP3FrameInfo &i, void * ref){
134 MP3DecoderHelix* p_helix = (MP3DecoderHelix* )ref;
135 if (p_helix!=nullptr){
136 TRACED();
137 AudioInfo baseInfo;
138 baseInfo.channels = i.nChans;
139 baseInfo.sample_rate = i.samprate;
140 baseInfo.bits_per_sample = i.bitsPerSample;
141 baseInfo.logInfo("MP3DecoderHelix");
142 p_helix->notifyAudioChange(baseInfo);
143 } else {
144 LOGE("Wrong Libhelix Version");
145 }
146 }
147
149 size_t maxFrameSize() {
150 return mp3->maxFrameSize();
151 }
152
154 void setMaxFrameSize(size_t len){
155 mp3->setMaxFrameSize(len);
156 }
157
159 size_t maxPCMSize() {
160 return mp3->maxPCMSize();
161 }
162
164 void setMaxPCMSize(size_t len) {
165 mp3->setMaxPCMSize(len);
166 }
167 protected:
168 libhelix::MP3DecoderHelix *mp3=nullptr;
169
170};
171
172
173} // namespace
174
175
Decoding of encoded audio into PCM data.
Definition AudioCodecsBase.h:18
virtual void setOutput(AudioStream &out_stream)
Defines where the decoded result is written to.
Definition AudioCodecsBase.h:36
virtual void addNotifyAudioChange(AudioInfoSupport &bi)
Adds target to be notified about audio changes.
Definition AudioTypes.h:151
Supports changes to the sampling rate, bits and channels.
Definition AudioTypes.h:133
MP3 Decoder using libhelix: https://github.com/pschatzmann/arduino-libhelix This is basically just a ...
Definition CodecMP3Helix.h:19
void setMaxPCMSize(size_t len)
Define your optimized maximum pwm buffer size.
Definition CodecMP3Helix.h:164
void setMaxFrameSize(size_t len)
Define your optimized maximum frame size.
Definition CodecMP3Helix.h:154
void addNotifyAudioChange(AudioInfoSupport &bi) override
Defines the callback object to which the Audio information change is provided.
Definition CodecMP3Helix.h:126
~MP3DecoderHelix()
Destroy the MP3DecoderMini object.
Definition CodecMP3Helix.h:70
void setOutput(Print &outStream) override
Defines the output Stream.
Definition CodecMP3Helix.h:75
void end() override
Releases the reserved memory.
Definition CodecMP3Helix.h:91
size_t maxFrameSize()
Provides the maximum frame size - this is allocated on the heap and you can reduce the heap size my m...
Definition CodecMP3Helix.h:149
size_t maxPCMSize()
Provides the maximum pwm buffer size - this is allocated on the heap and you can reduce the heap size...
Definition CodecMP3Helix.h:159
size_t write(const uint8_t *data, size_t len) override
Write mp3 data to decoder.
Definition CodecMP3Helix.h:110
MP3DecoderHelix(Print &out_stream, AudioInfoSupport &bi)
Construct a new MP3DecoderMini object. The decoded output will go to the print object.
Definition CodecMP3Helix.h:54
MP3DecoderHelix(Print &out_stream)
Construct a new MP3DecoderMini object.
Definition CodecMP3Helix.h:36
static void infoCallback(MP3FrameInfo &i, void *ref)
notifies the subscriber about a change
Definition CodecMP3Helix.h:133
bool begin() override
Starts the processing.
Definition CodecMP3Helix.h:81
AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition CodecMP3Helix.h:100
Definition NoArduino.h:62
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