arduino-audio-tools
CodecMP3Helix.h
1 #pragma once
2 
3 #include "Stream.h"
4 #include "AudioCodecs/AudioEncoded.h"
5 #include "AudioMetaData/MetaDataFilter.h"
6 #include "MP3DecoderHelix.h"
7 
8 namespace audio_tools {
9 
18 class MP3DecoderHelix : public AudioDecoder {
19  public:
20 
21  MP3DecoderHelix() {
22  TRACED();
23  mp3 = new libhelix::MP3DecoderHelix();
24  if (mp3!=nullptr){
25  mp3->setReference(this);
26  filter.setDecoder(mp3);
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  filter.setDecoder(mp3);
42  } else {
43  LOGE("Not enough memory for libhelix");
44  }
45  setOutput(out_stream);
46  }
47 
56  TRACED();
57  mp3 = new libhelix::MP3DecoderHelix();
58  if (mp3!=nullptr){
59  mp3->setReference(this);
60  filter.setDecoder(mp3);
61  } else {
62  LOGE("Not enough memory for libhelix");
63  }
64  setOutput(out_stream);
66  }
67 
73  if (mp3!=nullptr) delete mp3;
74  }
75 
77  virtual void setOutput(Print &outStream){
78  if (mp3!=nullptr) mp3->setOutput(outStream);
79  }
80 
82  bool begin(){
83  TRACED();
84  if (mp3!=nullptr) {
85  mp3->setDelay(CODEC_DELAY_MS);
86  mp3->begin();
87  filter.begin();
88  }
89  return true;
90  }
91 
93  void end(){
94  TRACED();
95  if (mp3!=nullptr) mp3->end();
96  }
97 
98  MP3FrameInfo audioInfoEx(){
99  return mp3->audioInfo();
100  }
101 
102  AudioInfo audioInfo() override {
103  MP3FrameInfo i = audioInfoEx();
104  AudioInfo baseInfo;
105  baseInfo.channels = i.nChans;
106  baseInfo.sample_rate = i.samprate;
107  baseInfo.bits_per_sample = i.bitsPerSample;
108  return baseInfo;
109  }
110 
112  size_t write(const void* mp3Data, size_t len) {
113  LOGD("%s: %zu", LOG_METHOD, len);
114  if (mp3==nullptr) return 0;
115  return use_filter ? filter.write((uint8_t*)mp3Data, len): mp3->write((uint8_t*)mp3Data, len);
116  }
117 
119  operator bool(){
120  return mp3!=nullptr && (bool) *mp3;
121  }
122 
123  libhelix::MP3DecoderHelix *driver() {
124  return mp3;
125  }
126 
129  TRACED();
131  if (mp3!=nullptr) mp3->setInfoCallback(infoCallback, this);
132  }
133 
135  static void infoCallback(MP3FrameInfo &i, void * ref){
136  MP3DecoderHelix* p_helix = (MP3DecoderHelix* )ref;
137  if (p_helix!=nullptr){
138  TRACED();
139  AudioInfo baseInfo;
140  baseInfo.channels = i.nChans;
141  baseInfo.sample_rate = i.samprate;
142  baseInfo.bits_per_sample = i.bitsPerSample;
143  baseInfo.logInfo("MP3DecoderHelix");
144  p_helix->notifyAudioChange(baseInfo);
145  } else {
146  LOGE("Wrong Libhelix Version");
147  }
148  }
149 
151  void setFilterMetaData(bool filter){
152  use_filter = filter;
153  }
154 
157  return use_filter;
158  }
159 
161  size_t maxFrameSize() {
162  return mp3->maxFrameSize();
163  }
164 
166  void setMaxFrameSize(size_t len){
167  mp3->setMaxFrameSize(len);
168  }
169 
171  size_t maxPCMSize() {
172  return mp3->maxPCMSize();
173  }
174 
176  void setMaxPCMSize(size_t len) {
177  mp3->setMaxPCMSize(len);
178  }
179  protected:
180  libhelix::MP3DecoderHelix *mp3=nullptr;
182  bool use_filter = false;
183 
184 };
185 
186 
187 } // namespace
188 
189 
Docoding of encoded audio into PCM data.
Definition: AudioEncoded.h:18
virtual void addNotifyAudioChange(AudioInfoSupport &bi)
Adds target to be notified about audio changes.
Definition: AudioTypes.h:158
Supports changes to the sampling rate, bits and channels.
Definition: AudioTypes.h:136
MP3 Decoder using libhelix: https://github.com/pschatzmann/arduino-libhelix This is basically just a ...
Definition: CodecMP3Helix.h:18
void setMaxPCMSize(size_t len)
Define your optimized maximum pwm buffer size.
Definition: CodecMP3Helix.h:176
void setMaxFrameSize(size_t len)
Define your optimized maximum frame size.
Definition: CodecMP3Helix.h:166
bool isFilterMetaData()
Check if the metadata filter is active.
Definition: CodecMP3Helix.h:156
void addNotifyAudioChange(AudioInfoSupport &bi) override
Defines the callback object to which the Audio information change is provided.
Definition: CodecMP3Helix.h:128
~MP3DecoderHelix()
Destroy the MP3DecoderMini object.
Definition: CodecMP3Helix.h:72
virtual void setOutput(Print &outStream)
Defines the output Stream.
Definition: CodecMP3Helix.h:77
bool begin()
Starts the processing.
Definition: CodecMP3Helix.h:82
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:161
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:171
MP3DecoderHelix(Print &out_stream, AudioInfoSupport &bi)
Construct a new MP3DecoderMini object. The decoded output will go to the print object.
Definition: CodecMP3Helix.h:55
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:135
void end()
Releases the reserved memory.
Definition: CodecMP3Helix.h:93
size_t write(const void *mp3Data, size_t len)
Write mp3 data to decoder.
Definition: CodecMP3Helix.h:112
void setFilterMetaData(bool filter)
Activates a filter that makes sure that helix does not get any metadata segments.
Definition: CodecMP3Helix.h:151
AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition: CodecMP3Helix.h:102
size_t write(uint8_t *data, size_t len)
Writes the data to the decoder.
Definition: MetaDataFilter.h:35
void setDecoder(Decoder *decoder)
Defines the decoder to which we write the data.
Definition: MetaDataFilter.h:24
void begin()
(Re)starts the processing
Definition: MetaDataFilter.h:29
Definition: NoArduino.h:58
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition: AnalogAudio.h:10
Basic Audio information which drives e.g. I2S.
Definition: AudioTypes.h:50
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