arduino-audio-tools
Loading...
Searching...
No Matches
ContainerM4A.h
Go to the documentation of this file.
1#pragma once
2
6
7namespace audio_tools {
8
40 public:
49
56
58 const char *mime() override { return "audio/mp4"; }
59
64 void setOutput(Print& out_stream) override {
65 if (p_decoder != nullptr && p_decoder->getOutput()!=&out_stream) {
66 p_decoder->setOutput(out_stream);
67 }
69 }
70
75 bool isResultPCM() override { return p_decoder != nullptr ? true : false; }
76
81 bool begin() override {
82 demux.begin();
84 is_active = true;
85 return true;
86 }
87
91 void end() override {
92 TRACED();
93 is_active = false;
95 if (p_decoder) p_decoder->end();
96 }
97
104 size_t write(const uint8_t* data, size_t len) override {
105 if (is_active == false) return len;
106 demux.write(data, len);
107 return len;
108 }
109
114 operator bool() override { return is_active; }
132 }
133
139 bool setDecoder(MultiDecoder& decoder) {
140 p_decoder = &decoder;
142 return true;
143 }
144
146 return demux;
147 }
148
149 protected:
150 bool is_active = false;
152 false;
155
162 static void decodeAudio(const M4AAudioDemuxer::Frame& frame, void* ref) {
163 ContainerM4A* self = static_cast<ContainerM4A*>(ref);
164 if (self->p_decoder == nullptr) {
165 self->p_print->write(frame.data, frame.size);
166 return;
167 }
168 MultiDecoder& dec = *(self->p_decoder);
169 const char* old_mime = dec.selectedMime();
170
171 // select decoder based on mime type
172 if (!dec.selectDecoder(frame.mime)) {
173 const char* mime = frame.mime ? frame.mime : "(nullptr)";
174 LOGE("No decoder found for mime type: %s", mime);
175 return;
176 }
177
178 // for ALAC only: process magic cookie if not done yet
179 if (StrView(frame.mime) == "audio/alac" &&
181 auto& magic_cookie = self->demux.getALACMagicCookie();
182 if (magic_cookie.size() > 0) {
183 if (!dec.setCodecConfig(magic_cookie.data(), magic_cookie.size())) {
184 LOGE("Failed to set ALAC magic cookie for decoder: %s",
185 dec.selectedMime());
186 }
187 }
188 self->is_magic_cookie_processed = true;
189 }
190 // write encoded data to decoder
191 dec.write(frame.data, frame.size);
192
193 // restore previous decoder
194 dec.selectDecoder(old_mime);
195
196 }
197};
198
199} // namespace audio_tools
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGE(...)
Definition AudioLoggerIDF.h:30
Definition Arduino.h:56
virtual size_t write(const uint8_t *data, size_t len)
Definition Arduino.h:120
Print * getOutput()
Definition AudioCodecsBase.h:68
virtual void setOutput(AudioStream &out_stream)
Defines where the decoded result is written to.
Definition AudioCodecsBase.h:40
Print * p_print
Definition AudioCodecsBase.h:79
virtual void addNotifyAudioChange(AudioInfoSupport &bi)
Adds target to be notified about audio changes.
Definition AudioTypes.h:150
Shared functionality of all buffers.
Definition Buffers.h:23
Parent class for all container formats.
Definition AudioCodecsBase.h:90
M4A Demuxer that extracts audio from M4A/MP4 containers. The audio is decoded into pcm with the help ...
Definition ContainerM4A.h:39
void setOutput(Print &out_stream) override
Set the output stream for decoded or raw audio.
Definition ContainerM4A.h:64
static void decodeAudio(const M4AAudioDemuxer::Frame &frame, void *ref)
Static callback for demuxed audio frames. Handles decoder selection and magic cookie for ALAC.
Definition ContainerM4A.h:162
ContainerM4A()
Default constructor: If no decoder is provided, the raw audio data is provided to the defined output.
Definition ContainerM4A.h:45
bool is_active
True if demuxer is active.
Definition ContainerM4A.h:150
void end() override
End the demuxer and decoder, releasing resources.
Definition ContainerM4A.h:91
virtual void setChunkOffsetsBuffer(BaseBuffer< uint32_t > &buffer)
Sets the buffer to use for sample sizes. This is currently not used!
Definition ContainerM4A.h:130
size_t write(const uint8_t *data, size_t len) override
Feed data to the demuxer for parsing.
Definition ContainerM4A.h:104
bool setDecoder(MultiDecoder &decoder)
Sets the decoder to use for audio frames.
Definition ContainerM4A.h:139
MultiDecoder * p_decoder
Pointer to the MultiDecoder.
Definition ContainerM4A.h:153
const char * mime() override
Provides "audio/mp4".
Definition ContainerM4A.h:58
M4AAudioDemuxer & getDemuxer()
Definition ContainerM4A.h:145
bool is_magic_cookie_processed
True if ALAC magic cookie has been processed.
Definition ContainerM4A.h:151
bool isResultPCM() override
Returns true if the result is PCM (decoder is present).
Definition ContainerM4A.h:75
ContainerM4A(MultiDecoder &decoder)
Constructor with decoder. Sets up the demuxer and decoder notification.
Definition ContainerM4A.h:55
bool begin() override
Initialize the demuxer and decoder.
Definition ContainerM4A.h:81
virtual void setSampleSizesBuffer(BaseBuffer< stsz_sample_size_t > &buffer)
Sets the buffer to use for sample sizes. You can use this to provide a custom buffer that does not re...
Definition ContainerM4A.h:122
M4AAudioDemuxer demux
Internal demuxer instance.
Definition ContainerM4A.h:154
A simple M4A audio data demuxer which is providing AAC, MP3 and ALAC frames.
Definition M4AAudioDemuxer.h:11
Vector< uint8_t > & getALACMagicCookie()
Returns the ALAC magic cookie (codec config).
Definition M4AAudioDemuxer.h:61
bool begin()
Initializes the demuxer and resets state.
Definition M4AAudioDemuxer.h:30
void setReference(void *ref)
Sets a reference pointer for callbacks.
Definition M4AAudioDemuxer.h:67
void write(const uint8_t *data, size_t len)
Writes data to the demuxer for parsing.
Definition M4AAudioDemuxer.h:49
void setCallback(FrameCallback cb) override
Defines the callback that returns the audio frames.
Definition M4AAudioDemuxer.h:22
void setSampleSizesBuffer(BaseBuffer< stsz_sample_size_t > &buffer)
Sets the buffer to use for sample sizes.
Definition M4ACommonDemuxer.h:386
void setChunkOffsetsBuffer(BaseBuffer< uint32_t > &buffer)
Sets the buffer to use for sample sizes.
Definition M4ACommonDemuxer.h:393
Manage multiple AudioDecoders with automatic format detection.
Definition MultiDecoder.h:51
void setOutput(Print &out_stream) override
Sets the output stream for decoded audio data.
Definition MultiDecoder.h:151
bool setCodecConfig(const uint8_t *data, size_t len) override
Sets codec-specific configuration data.
Definition MultiDecoder.h:332
const char * selectedMime()
Returns the MIME type that was detected and selected.
Definition MultiDecoder.h:265
bool selectDecoder(const char *mime)
Definition MultiDecoder.h:196
void end() override
Releases resources and closes the active decoder.
Definition MultiDecoder.h:116
size_t write(const uint8_t *data, size_t len) override
Writes encoded audio data to be decoded.
Definition MultiDecoder.h:281
bool begin() override
Starts the processing and enables automatic MIME type determination.
Definition MultiDecoder.h:99
A simple wrapper to provide string functions on existing allocated char*. If the underlying char* is ...
Definition StrView.h:29
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition LMSEchoCancellationStream.h:6
Definition M4ACommonDemuxer.h:29
const uint8_t * data
Definition M4ACommonDemuxer.h:32
size_t size
Definition M4ACommonDemuxer.h:33
const char * mime
Definition M4ACommonDemuxer.h:31