arduino-audio-tools
Loading...
Searching...
No Matches
MetaDataFilter.h
Go to the documentation of this file.
1#pragma once
2#include "AudioLogger.h"
6
7namespace audio_tools {
8
17 public:
19 MetaDataFilter() = default;
20
25
27 void setOutput(Print &out) { p_out = &out; }
29 void setOutput(AudioWriter &out) { p_writer = &out; }
30
32 bool begin() override {
33 TRACED();
34 start = 0;
35 if (p_writer) p_writer->begin();
36 return true;
37 }
38
39 void end() override {
40 if (p_writer) p_writer->end();
41 }
42
44 size_t write(const uint8_t *data, size_t len) override {
45 LOGI("write: %u", (unsigned)len);
46 size_t result = len;
47 // prevent npe
48 if ((p_out == nullptr && p_writer == nullptr) || (data == nullptr) ||
49 (len == 0))
50 return 0;
51
52 // find tag
53 int meta_len = 0;
54 if (findTag(data, len, metadata_range.from, meta_len)) {
55 current_pos = 0;
57 LOGI("ignoring metadata at pos: %d len: %d", metadata_range.from,
58 meta_len);
59 }
60
61 // nothing to ignore
63 if (p_out) return p_out->write(data, len);
64 if (p_writer) return p_writer->write(data, len);
65 }
66
67 // ignore data in metadata range
69 for (int j = 0; j < len; j++) {
71 tmp.write(data[j]);
72 }
74 }
75
76 // write partial data
77 size_t to_write = tmp.available();
78 if (to_write > 0) {
79 LOGI("output: %u", (unsigned)to_write);
80 size_t written = 0;
81 if (p_out) written = p_out->write(tmp.data(), to_write);
82 if (p_writer) written = p_writer->write(tmp.data(), to_write);
83 assert(to_write == written);
85 } else {
86 LOGI("output ignored");
87 }
88
89 // reset for next run
91 current_pos = 0;
93 }
94
95 return result;
96 }
97
98 protected:
99 Print *p_out = nullptr;
101 int current_pos = 0;
103 int start = 0;
105 struct Range {
106 int from = -1;
107 int to = -1;
108
109 bool inRange(int pos) { return pos >= from && pos < to; }
110 void setLen(int len) { to = from + len; }
111
112 void clear() {
113 from = -1;
114 to = -1;
115 }
116 bool isDefined() { return from != -1; }
118
126
128 bool findTag(const uint8_t *data, size_t len, int &pos_tag, int &meta_len) {
130 if (find((const char *)data, len, pos_tag, tag_type)) {
131 switch (tag_type) {
132 case TAG:
133 LOGD("TAG");
134 meta_len = 128;
135 break;
136 case TAG_PLUS:
137 LOGD("TAG+");
138 meta_len = 227;
139 break;
140 case ID3:
141 LOGD("ID3");
142 memcpy(&tagv2, data + pos_tag, sizeof(ID3v2));
144 break;
145 }
146 return true;
147 }
148 return false;
149 }
150
151 // calculate the synch save size for ID3v2
153 uint32_t byte0 = chars[0];
154 uint32_t byte1 = chars[1];
155 uint32_t byte2 = chars[2];
156 uint32_t byte3 = chars[3];
157 return byte0 << 21 | byte1 << 14 | byte2 << 7 | byte3;
158 }
159
161 bool find(const char *str, size_t len, int &pos, MetaType &type) {
162 if (str == nullptr || len <= 0) return false;
163 for (size_t j = 0; j <= len - 3; j++) {
164 if (str[j] == 'T' && str[j + 1] == 'A' && str[j + 2] == 'G') {
165 type = str[j + 3] == '+' ? TAG_PLUS : TAG;
166 pos = j;
167 return true;
168 } else if (str[j] == 'I' && str[j + 1] == 'D' && str[j + 2] == '3') {
169 type = ID3;
170 pos = j;
171 return true;
172 }
173 }
174 return false;
175 }
176};
177
187 public:
189 p_decoder = &decoder;
190 filter.setOutput(decoder);
191 }
192
193 bool begin() override {
194 is_active = true;
195 filter.begin();
196 p_decoder->begin();
197 return AudioDecoder::begin();
198 }
199
200 void end() override {
201 is_active = false;
202 filter.end();
204 }
205
206 size_t write(const uint8_t *data, size_t len) override {
207 return filter.write(data, len);
208 }
209
214
219
221 virtual void setOutput(Print &out_stream) override {
223 }
224
225 operator bool() override { return p_print != nullptr && is_active; }
226
227 protected:
230 bool is_active = false;
231};
232
241 public:
243 p_encoder = &encoder;
244 filter.setOutput(encoder);
245 }
246
247 bool begin(AudioInfo info) override {
249 return begin();
250 }
251
252 bool begin() override { return p_encoder->begin() && filter.begin(); }
253
254 void end() override {
255 p_encoder->end();
256 filter.end();
257 }
258
260
261 void setOutput(Print &out_stream) override {
263 }
264
265 size_t write(const uint8_t *data, size_t len) override {
266 return filter.write(data, len);
267 }
268
269 operator bool() override { return (bool)(*p_encoder); }
270
271 const char *mime() override { return p_encoder->mime(); }
272
274
276
277 protected:
280 bool is_initialized = false;
281};
282
283} // namespace audio_tools
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGD(...)
Definition AudioLoggerIDF.h:27
#define assert(T)
Definition avr.h:10
Decoding of encoded audio into PCM data.
Definition AudioCodecsBase.h:18
virtual bool begin(AudioInfo info) override
Definition AudioCodecsBase.h:54
void end() override
Definition AudioCodecsBase.h:59
virtual void setOutput(AudioStream &out_stream)
Defines where the decoded result is written to.
Definition AudioCodecsBase.h:36
bool begin() override
Definition AudioCodecsBase.h:58
Print * p_print
Definition AudioCodecsBase.h:75
Encoding of PCM data.
Definition AudioCodecsBase.h:97
AudioInfo info
Definition AudioCodecsBase.h:116
void setAudioInfo(AudioInfo from) override
Defines the sample rate, number of channels and bits per sample.
Definition AudioCodecsBase.h:106
virtual uint16_t samplesPerFrame()
Optional rtsp function: provide samples per the frame.
Definition AudioCodecsBase.h:113
virtual void setOutput(Print &out_stream) override
Default output assignment (encoders may override to store Print reference)
Definition AudioCodecsBase.h:109
virtual uint32_t frameDurationUs()
Optional rtsp function: provide the frame duration in microseconds.
Definition AudioCodecsBase.h:111
virtual const char * mime()=0
Provides the mime type of the encoded result.
virtual void addNotifyAudioChange(AudioInfoSupport &bi)
Adds target to be notified about audio changes.
Definition AudioTypes.h:153
Abstract Audio Ouptut class.
Definition AudioOutput.h:25
SingleBuffer< uint8_t > tmp
Definition AudioOutput.h:89
Base class for all Audio Streams. It support the boolean operator to test if the object is ready with...
Definition BaseStream.h:122
E.g. used by Encoders and Decoders.
Definition AudioTypes.h:209
virtual size_t write(const uint8_t *data, size_t len)=0
virtual void end()=0
virtual bool begin()=0
MetaDataFiler applied to the indicated decoder: Class which filters out ID3v1 and ID3v2 Metadata and ...
Definition MetaDataFilter.h:186
virtual void setOutput(AudioOutput &out_stream) override
Defines where the decoded result is written to.
Definition MetaDataFilter.h:215
bool is_active
Definition MetaDataFilter.h:230
MetaDataFilter filter
Definition MetaDataFilter.h:229
void end() override
Definition MetaDataFilter.h:200
size_t write(const uint8_t *data, size_t len) override
Definition MetaDataFilter.h:206
AudioDecoder * p_decoder
Definition MetaDataFilter.h:228
MetaDataFilterDecoder(AudioDecoder &decoder)
Definition MetaDataFilter.h:188
void setOutput(AudioStream &out_stream) override
Defines where the decoded result is written to.
Definition MetaDataFilter.h:210
bool begin() override
Definition MetaDataFilter.h:193
virtual void setOutput(Print &out_stream) override
Defines where the decoded result is written to.
Definition MetaDataFilter.h:221
MetaDataFilter applied to an encoder: filters out ID3v1 / ID3v2 metadata from the mp3 input stream be...
Definition MetaDataFilter.h:240
void setOutput(Print &out_stream) override
Default output assignment (encoders may override to store Print reference)
Definition MetaDataFilter.h:261
bool is_initialized
Definition MetaDataFilter.h:280
MetaDataFilter filter
Definition MetaDataFilter.h:279
void end() override
Definition MetaDataFilter.h:254
uint16_t samplesPerFrame() override
Optional rtsp function: provide samples per the frame.
Definition MetaDataFilter.h:275
size_t write(const uint8_t *data, size_t len) override
Definition MetaDataFilter.h:265
const char * mime() override
Provides the mime type of the encoded result.
Definition MetaDataFilter.h:271
MetaDataFilterEncoder(AudioEncoder &encoder)
Definition MetaDataFilter.h:242
uint32_t frameDurationUs() override
Optional rtsp function: provide the frame duration in microseconds.
Definition MetaDataFilter.h:273
bool begin(AudioInfo info) override
Definition MetaDataFilter.h:247
bool begin() override
Definition MetaDataFilter.h:252
void setAudioInfo(AudioInfo info) override
Defines the sample rate, number of channels and bits per sample.
Definition MetaDataFilter.h:259
AudioEncoder * p_encoder
Definition MetaDataFilter.h:278
Class which filters out ID3v1 and ID3v2 Metadata and provides only the audio data to the decoder.
Definition MetaDataFilter.h:16
MetaDataFilter(Print &out)
Constructor which assigns the decoder.
Definition MetaDataFilter.h:22
int start
Definition MetaDataFilter.h:103
uint32_t calcSizeID3v2(uint8_t chars[4])
Definition MetaDataFilter.h:152
void end() override
Definition MetaDataFilter.h:39
void setOutput(AudioWriter &out)
Defines the decoder to which we write the data.
Definition MetaDataFilter.h:29
bool find(const char *str, size_t len, int &pos, MetaType &type)
find the tag position in the string;
Definition MetaDataFilter.h:161
AudioWriter * p_writer
Definition MetaDataFilter.h:100
size_t write(const uint8_t *data, size_t len) override
Writes the data to the decoder.
Definition MetaDataFilter.h:44
struct audio_tools::MetaDataFilter::ID3v2 tagv2
Print * p_out
Definition MetaDataFilter.h:99
int current_pos
Definition MetaDataFilter.h:101
MetaDataFilter(AudioWriter &out)
Constructor which assigns the decoder.
Definition MetaDataFilter.h:24
MetaDataFilter()=default
Default Constructor.
bool begin() override
(Re)starts the processing
Definition MetaDataFilter.h:32
MetaType
Definition MetaDataFilter.h:102
@ ID3
Definition MetaDataFilter.h:102
@ TAG
Definition MetaDataFilter.h:102
@ TAG_PLUS
Definition MetaDataFilter.h:102
bool findTag(const uint8_t *data, size_t len, int &pos_tag, int &meta_len)
determines if the data conatins a ID3v1 or ID3v2 tag
Definition MetaDataFilter.h:128
void setOutput(Print &out)
Defines the decoder to which we write the data.
Definition MetaDataFilter.h:27
struct audio_tools::MetaDataFilter::Range metadata_range
Definition NoArduino.h:62
virtual size_t write(const uint8_t *data, size_t len)
Definition NoArduino.h:126
A simple Buffer implementation which just uses a (dynamically sized) array.
Definition Buffers.h:172
bool write(T sample) override
write add an entry to the buffer
Definition Buffers.h:206
int available() override
provides the number of entries that are available to read
Definition Buffers.h:233
T * data()
Provides address of actual data.
Definition Buffers.h:284
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition AudioTypes.h:512
Basic Audio information which drives e.g. I2S.
Definition AudioTypes.h:55
ID3 verion 2 TAG Header (10 bytes)
Definition MetaDataFilter.h:120
uint8_t header[3]
Definition MetaDataFilter.h:121
uint8_t flags
Definition MetaDataFilter.h:123
uint8_t size[4]
Definition MetaDataFilter.h:124
uint8_t version[2]
Definition MetaDataFilter.h:122
Metadata range.
Definition MetaDataFilter.h:105
bool inRange(int pos)
Definition MetaDataFilter.h:109
int from
Definition MetaDataFilter.h:106
void setLen(int len)
Definition MetaDataFilter.h:110
int to
Definition MetaDataFilter.h:107
void clear()
Definition MetaDataFilter.h:112
bool isDefined()
Definition MetaDataFilter.h:116