id3lib 3.8.3
field.cpp
Go to the documentation of this file.
1// $Id: field.cpp,v 1.47 2002/11/03 00:41:27 t1mpy Exp $
2
3// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
4// Copyright 1999, 2000 Scott Thomas Haug
5// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
6
7// This library is free software; you can redistribute it and/or modify it
8// under the terms of the GNU Library General Public License as published by
9// the Free Software Foundation; either version 2 of the License, or (at your
10// option) any later version.
11//
12// This library is distributed in the hope that it will be useful, but WITHOUT
13// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
15// License for more details.
16//
17// You should have received a copy of the GNU Library General Public License
18// along with this library; if not, write to the Free Software Foundation,
19// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20
21// The id3lib authors encourage improvements and optimisations to be sent to
22// the id3lib coordinator. Please see the README file for details on where to
23// send such submissions. See the AUTHORS file for a list of people who have
24// contributed to id3lib. See the ChangeLog file for a list of changes to
25// id3lib. These files are distributed with id3lib at
26// http://download.sourceforge.net/id3lib/
27
28
29#include "field_impl.h"
30#include "id3/utils.h" // has <config.h> "id3/id3lib_streams.h" "id3/globals.h" "id3/id3lib_strings.h"
31#include "field_def.h"
32#include "frame_def.h"
33#include "readers.h"
34#include <assert.h>
35
36using namespace dami;
37
38// This is used for unimplemented frames so that their data is preserved when
39// parsing and rendering
40static ID3_FieldDef ID3FD_Unimplemented[] =
41{
42 {
43 ID3FN_DATA, // FIELD NAME
44 ID3FTY_BINARY, // FIELD TYPE
45 0, // FIXED LEN
46 ID3V2_EARLIEST, // INITIAL SPEC
47 ID3V2_LATEST, // ENDING SPEC
48 ID3FF_NONE, // FLAGS
49 ID3FN_NOFIELD // LINKED FIELD
50 },
52};
53
54const ID3_FieldDef* ID3_FieldDef::DEFAULT = ID3FD_Unimplemented;
55
56static ID3_FieldDef ID3FD_URL[] =
57{
58 {
59 ID3FN_URL, // FIELD NAME
60 ID3FTY_TEXTSTRING, // FIELD TYPE
61 0, // FIXED LEN
62 ID3V2_EARLIEST, // INITIAL SPEC
63 ID3V2_LATEST, // ENDING SPEC
64 ID3FF_NONE, // FLAGS
65 ID3FN_NOFIELD // LINKED FIELD
66 },
68};
69
70static ID3_FieldDef ID3FD_UserURL[] =
71{
72 {
73 ID3FN_TEXTENC, // FIELD NAME
74 ID3FTY_INTEGER, // FIELD TYPE
75 1, // FIXED LEN
76 ID3V2_EARLIEST, // INITIAL SPEC
77 ID3V2_LATEST, // ENDING SPEC
78 ID3FF_NONE, // FLAGS
79 ID3FN_NOFIELD // LINKED FIELD
80 },
81 {
82 ID3FN_DESCRIPTION, // FIELD NAME
83 ID3FTY_TEXTSTRING, // FIELD TYPE
84 0, // FIXED LEN
85 ID3V2_EARLIEST, // INITIAL SPEC
86 ID3V2_LATEST, // ENDING SPEC
87 ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
88 ID3FN_NOFIELD // LINKED FIELD
89 },
90 {
91 ID3FN_URL, // FIELD NAME
92 ID3FTY_TEXTSTRING, // FIELD TYPE
93 0, // FIXED LEN
94 ID3V2_EARLIEST, // INITIAL SPEC
95 ID3V2_LATEST, // ENDING SPEC
96 ID3FF_NONE, // FLAGS
97 ID3FN_NOFIELD // LINKED FIELD
98 },
100};
101
102static ID3_FieldDef ID3FD_Text[] =
103{
104 {
105 ID3FN_TEXTENC, // FIELD NAME
106 ID3FTY_INTEGER, // FIELD TYPE
107 1, // FIXED LEN
108 ID3V2_EARLIEST, // INITIAL SPEC
109 ID3V2_LATEST, // ENDING SPEC
110 ID3FF_NONE, // FLAGS
111 ID3FN_NOFIELD // LINKED FIELD
112 },
113 {
114 ID3FN_TEXT, // FIELD NAME
115 ID3FTY_TEXTSTRING, // FIELD TYPE
116 0, // FIXED LEN
117 ID3V2_EARLIEST, // INITIAL SPEC
118 ID3V2_LATEST, // ENDING SPEC
119 ID3FF_ENCODABLE, // FLAGS
120 ID3FN_NOFIELD // LINKED FIELD
121 },
122 { ID3FN_NOFIELD }
123};
124
125
126static ID3_FieldDef ID3FD_UserText[] =
127{
128 {
129 ID3FN_TEXTENC, // FIELD NAME
130 ID3FTY_INTEGER, // FIELD TYPE
131 1, // FIXED LEN
132 ID3V2_EARLIEST, // INITIAL SPEC
133 ID3V2_LATEST, // ENDING SPEC
134 ID3FF_NONE, // FLAGS
135 ID3FN_NOFIELD // LINKED FIELD
136 },
137 {
138 ID3FN_DESCRIPTION, // FIELD NAME
139 ID3FTY_TEXTSTRING, // FIELD TYPE
140 0, // FIXED LEN
141 ID3V2_EARLIEST, // INITIAL SPEC
142 ID3V2_LATEST, // ENDING SPEC
143 ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
144 ID3FN_NOFIELD // LINKED FIELD
145 },
146 {
147 ID3FN_TEXT, // FIELD NAME
148 ID3FTY_TEXTSTRING, // FIELD TYPE
149 0, // FIXED LEN
150 ID3V2_EARLIEST, // INITIAL SPEC
151 ID3V2_LATEST, // ENDING SPEC
152 ID3FF_ENCODABLE, // FLAGS
153 ID3FN_NOFIELD // LINKED FIELD
154 },
155 { ID3FN_NOFIELD }
156};
157
158
159static ID3_FieldDef ID3FD_GeneralText[] =
160{
161 {
162 ID3FN_TEXTENC, // FIELD NAME
163 ID3FTY_INTEGER, // FIELD TYPE
164 1, // FIXED LEN
165 ID3V2_EARLIEST, // INITIAL SPEC
166 ID3V2_LATEST, // ENDING SPEC
167 ID3FF_NONE, // FLAGS
168 ID3FN_NOFIELD // LINKED FIELD
169 },
170 {
171 ID3FN_LANGUAGE, // FIELD NAME
172 ID3FTY_TEXTSTRING, // FIELD TYPE
173 3, // FIXED LEN
174 ID3V2_EARLIEST, // INITIAL SPEC
175 ID3V2_LATEST, // ENDING SPEC
176 ID3FF_NONE, // FLAGS
177 ID3FN_NOFIELD // LINKED FIELD
178 },
179 {
180 ID3FN_DESCRIPTION, // FIELD NAME
181 ID3FTY_TEXTSTRING, // FIELD TYPE
182 0, // FIXED LEN
183 ID3V2_EARLIEST, // INITIAL SPEC
184 ID3V2_LATEST, // ENDING SPEC
185 ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
186 ID3FN_NOFIELD // LINKED FIELD
187 },
188 {
189 ID3FN_TEXT, // FIELD NAME
190 ID3FTY_TEXTSTRING, // FIELD TYPE
191 0, // FIXED LEN
192 ID3V2_EARLIEST, // INITIAL SPEC
193 ID3V2_LATEST, // ENDING SPEC
194 ID3FF_ENCODABLE, // FLAGS
195 ID3FN_NOFIELD // LINKED FIELD
196 },
197 { ID3FN_NOFIELD }
198};
199
200static ID3_FieldDef ID3FD_TermsOfUse[] =
201{
202 {
203 ID3FN_TEXTENC, // FIELD NAME
204 ID3FTY_INTEGER, // FIELD TYPE
205 1, // FIXED LEN
206 ID3V2_3_0, // INITIAL SPEC
207 ID3V2_LATEST, // ENDING SPEC
208 ID3FF_NONE, // FLAGS
209 ID3FN_NOFIELD // LINKED FIELD
210 },
211 {
212 ID3FN_LANGUAGE, // FIELD NAME
213 ID3FTY_TEXTSTRING, // FIELD TYPE
214 3, // FIXED LEN
215 ID3V2_3_0, // INITIAL SPEC
216 ID3V2_LATEST, // ENDING SPEC
217 ID3FF_NONE, // FLAGS
218 ID3FN_NOFIELD // LINKED FIELD
219 },
220 {
221 ID3FN_TEXT, // FIELD NAME
222 ID3FTY_TEXTSTRING, // FIELD TYPE
223 0, // FIXED LEN
224 ID3V2_3_0, // INITIAL SPEC
225 ID3V2_LATEST, // ENDING SPEC
226 ID3FF_ENCODABLE, // FLAGS
227 ID3FN_NOFIELD // LINKED FIELD
228 },
229 { ID3FN_NOFIELD }
230};
231
232static ID3_FieldDef ID3FD_LinkedInfo[] =
233{
234 {
235 ID3FN_ID, // FIELD NAME
236 ID3FTY_TEXTSTRING, // FIELD TYPE
237 3, // FIXED LEN
238 ID3V2_EARLIEST, // INITIAL SPEC
239 ID3V2_2_1, // ENDING SPEC
240 ID3FF_NONE, // FLAGS
241 ID3FN_NOFIELD // LINKED FIELD
242 },
243 {
244 ID3FN_ID, // FIELD NAME
245 ID3FTY_TEXTSTRING, // FIELD TYPE
246 4, // FIXED LEN
247 ID3V2_3_0, // INITIAL SPEC
248 ID3V2_LATEST, // ENDING SPEC
249 ID3FF_NONE, // FLAGS
250 ID3FN_NOFIELD // LINKED FIELD
251 },
252 {
253 ID3FN_URL, // FIELD NAME
254 ID3FTY_TEXTSTRING, // FIELD TYPE
255 0, // FIXED LEN
256 ID3V2_EARLIEST, // INITIAL SPEC
257 ID3V2_LATEST, // ENDING SPEC
258 ID3FF_CSTR, // FLAGS
259 ID3FN_NOFIELD // LINKED FIELD
260 },
261 {
262 ID3FN_TEXT, // FIELD NAME
263 ID3FTY_TEXTSTRING, // FIELD TYPE
264 0, // FIXED LEN
265 ID3V2_EARLIEST, // INITIAL SPEC
266 ID3V2_LATEST, // ENDING SPEC
267 ID3FF_NONE, // FLAGS
268 ID3FN_NOFIELD // LINKED FIELD
269 },
270 { ID3FN_NOFIELD }
271};
272
273static ID3_FieldDef ID3FD_Picture[] =
274{
275 {
276 ID3FN_TEXTENC, // FIELD NAME
277 ID3FTY_INTEGER, // FIELD TYPE
278 1, // FIXED LEN
279 ID3V2_EARLIEST, // INITIAL SPEC
280 ID3V2_LATEST, // ENDING SPEC
281 ID3FF_NONE, // FLAGS
282 ID3FN_NOFIELD // LINKED FIELD
283 },
284 {
285 ID3FN_IMAGEFORMAT, // FIELD NAME
286 ID3FTY_TEXTSTRING, // FIELD TYPE
287 3, // FIXED LEN
288 ID3V2_EARLIEST, // INITIAL SPEC
289 ID3V2_2_1, // ENDING SPEC
290 ID3FF_NONE, // FLAGS
291 ID3FN_NOFIELD // LINKED FIELD
292 },
293 {
294 ID3FN_MIMETYPE, // FIELD NAME
295 ID3FTY_TEXTSTRING, // FIELD TYPE
296 0, // FIXED LEN
297 ID3V2_3_0, // INITIAL SPEC
298 ID3V2_LATEST, // ENDING SPEC
299 ID3FF_CSTR, // FLAGS
300 ID3FN_NOFIELD // LINKED FIELD
301 },
302 {
303 ID3FN_PICTURETYPE, // FIELD NAME
304 ID3FTY_INTEGER, // FIELD TYPE
305 1, // FIXED LEN
306 ID3V2_EARLIEST, // INITIAL SPEC
307 ID3V2_LATEST, // ENDING SPEC
308 ID3FF_NONE, // FLAGS
309 ID3FN_NOFIELD // LINKED FIELD
310 },
311 {
312 ID3FN_DESCRIPTION, // FIELD NAME
313 ID3FTY_TEXTSTRING, // FIELD TYPE
314 0, // FIXED LEN
315 ID3V2_EARLIEST, // INITIAL SPEC
316 ID3V2_LATEST, // ENDING SPEC
317 ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
318 ID3FN_NOFIELD // LINKED FIELD
319 },
320 {
321 ID3FN_DATA, // FIELD NAME
322 ID3FTY_BINARY, // FIELD TYPE
323 0, // FIXED LEN
324 ID3V2_EARLIEST, // INITIAL SPEC
325 ID3V2_LATEST, // ENDING SPEC
326 ID3FF_NONE, // FLAGS
327 ID3FN_NOFIELD // LINKED FIELD
328 },
329 { ID3FN_NOFIELD }
330};
331
332static ID3_FieldDef ID3FD_GEO[] =
333{
334 {
335 ID3FN_TEXTENC, // FIELD NAME
336 ID3FTY_INTEGER, // FIELD TYPE
337 1, // FIXED LEN
338 ID3V2_EARLIEST, // INITIAL SPEC
339 ID3V2_LATEST, // ENDING SPEC
340 ID3FF_NONE, // FLAGS
341 ID3FN_NOFIELD // LINKED FIELD
342 },
343 {
344 ID3FN_MIMETYPE, // FIELD NAME
345 ID3FTY_TEXTSTRING, // FIELD TYPE
346 0, // FIXED LEN
347 ID3V2_EARLIEST, // INITIAL SPEC
348 ID3V2_LATEST, // ENDING SPEC
349 ID3FF_CSTR, // FLAGS
350 ID3FN_NOFIELD // LINKED FIELD
351 },
352 {
353 ID3FN_FILENAME, // FIELD NAME
354 ID3FTY_TEXTSTRING, // FIELD TYPE
355 0, // FIXED LEN
356 ID3V2_EARLIEST, // INITIAL SPEC
357 ID3V2_LATEST, // ENDING SPEC
358 ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
359 ID3FN_NOFIELD // LINKED FIELD
360 },
361 {
362 ID3FN_DESCRIPTION, // FIELD NAME
363 ID3FTY_TEXTSTRING, // FIELD TYPE
364 0, // FIXED LEN
365 ID3V2_EARLIEST, // INITIAL SPEC
366 ID3V2_LATEST, // ENDING SPEC
367 ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
368 ID3FN_NOFIELD // LINKED FIELD
369 },
370 {
371 ID3FN_DATA, // FIELD NAME
372 ID3FTY_BINARY, // FIELD TYPE
373 0, // FIXED LEN
374 ID3V2_EARLIEST, // INITIAL SPEC
375 ID3V2_LATEST, // ENDING SPEC
376 ID3FF_NONE, // FLAGS
377 ID3FN_NOFIELD // LINKED FIELD
378 },
379 { ID3FN_NOFIELD }
380};
381
382static ID3_FieldDef ID3FD_UFI[] =
383{
384 {
385 ID3FN_OWNER, // FIELD NAME
386 ID3FTY_TEXTSTRING, // FIELD TYPE
387 0, // FIXED LEN
388 ID3V2_EARLIEST, // INITIAL SPEC
389 ID3V2_LATEST, // ENDING SPEC
390 ID3FF_CSTR, // FLAGS
391 ID3FN_NOFIELD // LINKED FIELD
392 },
393 {
394 ID3FN_DATA, // FIELD NAME
395 ID3FTY_BINARY, // FIELD TYPE
396 0, // FIXED LEN
397 ID3V2_EARLIEST, // INITIAL SPEC
398 ID3V2_LATEST, // ENDING SPEC
399 ID3FF_NONE, // FLAGS
400 ID3FN_NOFIELD // LINKED FIELD
401 },
402 { ID3FN_NOFIELD }
403};
404
405static ID3_FieldDef ID3FD_PlayCounter[] =
406{
407 {
408 ID3FN_COUNTER, // FIELD NAME
409 ID3FTY_INTEGER, // FIELD TYPE
410 4, // FIXED LEN
411 ID3V2_EARLIEST, // INITIAL SPEC
412 ID3V2_LATEST, // ENDING SPEC
413 ID3FF_NONE, // FLAGS
414 ID3FN_NOFIELD // LINKED FIELD
415 },
416 { ID3FN_NOFIELD }
417};
418
419static ID3_FieldDef ID3FD_Popularimeter[] =
420{
421 {
422 ID3FN_EMAIL, // FIELD NAME
423 ID3FTY_TEXTSTRING, // FIELD TYPE
424 0, // FIXED LEN
425 ID3V2_EARLIEST, // INITIAL SPEC
426 ID3V2_LATEST, // ENDING SPEC
427 ID3FF_CSTR, // FLAGS
428 ID3FN_NOFIELD // LINKED FIELD
429 },
430 {
431 ID3FN_RATING, // FIELD NAME
432 ID3FTY_INTEGER, // FIELD TYPE
433 1, // FIXED LEN
434 ID3V2_EARLIEST, // INITIAL SPEC
435 ID3V2_LATEST, // ENDING SPEC
436 ID3FF_NONE, // FLAGS
437 ID3FN_NOFIELD // LINKED FIELD
438 },
439 {
440 ID3FN_COUNTER, // FIELD NAME
441 ID3FTY_INTEGER, // FIELD TYPE
442 4, // FIXED LEN
443 ID3V2_EARLIEST, // INITIAL SPEC
444 ID3V2_LATEST, // ENDING SPEC
445 ID3FF_NONE, // FLAGS
446 ID3FN_NOFIELD // LINKED FIELD
447 },
448 { ID3FN_NOFIELD }
449};
450
451static ID3_FieldDef ID3FD_Private[] =
452{
453 {
454 ID3FN_OWNER, // FIELD NAME
455 ID3FTY_TEXTSTRING, // FIELD TYPE
456 0, // FIXED LEN
457 ID3V2_3_0, // INITIAL SPEC
458 ID3V2_LATEST, // ENDING SPEC
459 ID3FF_CSTR, // FLAGS
460 ID3FN_NOFIELD // LINKED FIELD
461 },
462 {
463 ID3FN_DATA, // FIELD NAME
464 ID3FTY_BINARY, // FIELD TYPE
465 0, // FIXED LEN
466 ID3V2_3_0, // INITIAL SPEC
467 ID3V2_LATEST, // ENDING SPEC
468 ID3FF_NONE, // FLAGS
469 ID3FN_NOFIELD // LINKED FIELD
470 },
471 { ID3FN_NOFIELD }
472};
473
474
475static ID3_FieldDef ID3FD_Registration[] =
476{
477 {
478 ID3FN_OWNER, // FIELD NAME
479 ID3FTY_TEXTSTRING, // FIELD TYPE
480 0, // FIXED LEN
481 ID3V2_3_0, // INITIAL SPEC
482 ID3V2_LATEST, // ENDING SPEC
483 ID3FF_CSTR, // FLAGS
484 ID3FN_NOFIELD // LINKED FIELD
485 },
486 {
487 ID3FN_ID, // FIELD NAME
488 ID3FTY_INTEGER, // FIELD TYPE
489 1, // FIXED LEN
490 ID3V2_3_0, // INITIAL SPEC
491 ID3V2_LATEST, // ENDING SPEC
492 ID3FF_NONE, // FLAGS
493 ID3FN_NOFIELD // LINKED FIELD
494 },
495 {
496 ID3FN_DATA, // FIELD NAME
497 ID3FTY_BINARY, // FIELD TYPE
498 0, // FIXED LEN
499 ID3V2_3_0, // INITIAL SPEC
500 ID3V2_LATEST, // ENDING SPEC
501 ID3FF_NONE, // FLAGS
502 ID3FN_NOFIELD // LINKED FIELD
503 },
504 { ID3FN_NOFIELD }
505};
506
507static ID3_FieldDef ID3FD_InvolvedPeople[] =
508{
509 {
510 ID3FN_TEXTENC, // FIELD NAME
511 ID3FTY_INTEGER, // FIELD TYPE
512 1, // FIXED LEN
513 ID3V2_EARLIEST, // INITIAL SPEC
514 ID3V2_LATEST, // ENDING SPEC
515 ID3FF_NONE, // FLAGS
516 ID3FN_NOFIELD // LINKED FIELD
517 },
518 {
519 ID3FN_TEXT, // FIELD NAME
520 ID3FTY_TEXTSTRING, // FIELD TYPE
521 0, // FIXED LEN
522 ID3V2_EARLIEST, // INITIAL SPEC
523 ID3V2_LATEST, // ENDING SPEC
524 ID3FF_TEXTLIST, // FLAGS
525 ID3FN_NOFIELD // LINKED FIELD
526 },
527 { ID3FN_NOFIELD }
528};
529
530static ID3_FieldDef ID3FD_CDM[] =
531{
532 {
533 ID3FN_DATA, // FIELD NAME
534 ID3FTY_BINARY, // FIELD TYPE
535 0, // FIXED LEN
536 ID3V2_2_1, // INITIAL SPEC
537 ID3V2_2_1, // ENDING SPEC
538 ID3FF_NONE, // FLAGS
539 ID3FN_NOFIELD // LINKED FIELD
540 }
541};
542
543static ID3_FieldDef ID3FD_SyncLyrics[] =
544{
545 {
546 ID3FN_TEXTENC, // FIELD NAME
547 ID3FTY_INTEGER, // FIELD TYPE
548 1, // FIXED LEN
549 ID3V2_EARLIEST, // INITIAL SPEC
550 ID3V2_LATEST, // ENDING SPEC
551 ID3FF_NONE, // FLAGS
552 ID3FN_NOFIELD // LINKED FIELD
553 },
554 {
555 ID3FN_LANGUAGE, // FIELD NAME
556 ID3FTY_TEXTSTRING, // FIELD TYPE
557 3, // FIXED LEN
558 ID3V2_EARLIEST, // INITIAL SPEC
559 ID3V2_LATEST, // ENDING SPEC
560 ID3FF_NONE, // FLAGS
561 ID3FN_NOFIELD // LINKED FIELD
562 },
563 {
564 ID3FN_TIMESTAMPFORMAT, // FIELD NAME
565 ID3FTY_INTEGER, // FIELD TYPE
566 1, // FIXED LEN
567 ID3V2_EARLIEST, // INITIAL SPEC
568 ID3V2_LATEST, // ENDING SPEC
569 ID3FF_NONE, // FLAGS
570 ID3FN_NOFIELD // LINKED FIELD
571 },
572 {
573 ID3FN_CONTENTTYPE, // FIELD NAME
574 ID3FTY_INTEGER, // FIELD TYPE
575 1, // FIXED LEN
576 ID3V2_EARLIEST, // INITIAL SPEC
577 ID3V2_LATEST, // ENDING SPEC
578 ID3FF_NONE, // FLAGS
579 ID3FN_NOFIELD // LINKED FIELD
580 },
581 {
582 ID3FN_DESCRIPTION, // FIELD NAME
583 ID3FTY_TEXTSTRING, // FIELD TYPE
584 0, // FIXED LEN
585 ID3V2_EARLIEST, // INITIAL SPEC
586 ID3V2_LATEST, // ENDING SPEC
587 ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
588 ID3FN_NOFIELD // LINKED FIELD
589 },
590 {
591 ID3FN_DATA, // FIELD NAME
592 ID3FTY_BINARY, // FIELD TYPE
593 0, // FIXED LEN
594 ID3V2_EARLIEST, // INITIAL SPEC
595 ID3V2_LATEST, // ENDING SPEC
596 ID3FF_NONE, // FLAGS
597 ID3FN_NOFIELD // LINKED FIELD
598 },
599 { ID3FN_NOFIELD }
600};
601
602
603/*
604 * Currently unused
605 */
606#if defined _UNDEFINED_
607static ID3_FieldDef ID3FD_Volume[] =
608{
609 {
610 ID3FN_VOLUMEADJ, // FIELD NAME
611 ID3FTY_INTEGER, // FIELD TYPE
612 1, // FIXED LEN
613 ID3V2_EARLIEST, // INITIAL SPEC
614 ID3V2_LATEST, // ENDING SPEC
615 ID3FF_NONE, // FLAGS
616 ID3FN_NOFIELD // LINKED FIELD
617 },
618 {
619 ID3FN_NUMBITS, // FIELD NAME
620 ID3FTY_INTEGER, // FIELD TYPE
621 1, // FIXED LEN
622 ID3V2_EARLIEST, // INITIAL SPEC
623 ID3V2_LATEST, // ENDING SPEC
624 ID3FF_NONE, // FLAGS
625 ID3FN_NOFIELD // LINKED FIELD
626 },
627 {
628 ID3FN_VOLCHGRIGHT, // FIELD NAME
629 ID3FTY_BITFIELD, // FIELD TYPE
630 0, // FIXED LEN
631 ID3V2_EARLIEST, // INITIAL SPEC
632 ID3V2_LATEST, // ENDING SPEC
633 ID3FF_ADJUSTEDBY, // FLAGS
634 ID3FN_NUMBITS // LINKED FIELD
635 },
636 {
637 ID3FN_VOLCHGLEFT, // FIELD NAME
638 ID3FTY_BITFIELD, // FIELD TYPE
639 0, // FIXED LEN
640 ID3V2_EARLIEST, // INITIAL SPEC
641 ID3V2_LATEST, // ENDING SPEC
642 ID3FF_ADJUSTEDBY, // FLAGS
643 ID3FN_NUMBITS // LINKED FIELD
644 },
645 {
646 ID3FN_PEAKVOLRIGHT, // FIELD NAME
647 ID3FTY_BITFIELD, // FIELD TYPE
648 0, // FIXED LEN
649 ID3V2_EARLIEST, // INITIAL SPEC
650 ID3V2_LATEST, // ENDING SPEC
651 ID3FF_ADJUSTEDBY, // FLAGS
652 ID3FN_NUMBITS // LINKED FIELD
653 },
654 {
655 ID3FN_PEAKVOLLEFT, // FIELD NAME
656 ID3FTY_BITFIELD, // FIELD TYPE
657 0, // FIXED LEN
658 ID3V2_EARLIEST, // INITIAL SPEC
659 ID3V2_LATEST, // ENDING SPEC
660 ID3FF_ADJUSTEDBY, // FLAGS
661 ID3FN_NUMBITS // LINKED FIELD
662 },
663 { ID3FN_NOFIELD }
664};
665#endif /* _UNDEFINED_ */
666
667// **** Currently Implemented Frames
668// APIC PIC ID3FID_PICTURE Attached picture
669// COMM COM ID3FID_COMMENT Comments
670// ENCR ID3FID_CRYPTOREG Encryption method registration
671// GEOB GEO ID3FID_GENERALOBJECT General encapsulated object
672// GRID ID3FID_GROUPINGREG Group identification registration
673// IPLS IPL ID3FID_INVOLVEDPEOPLE Involved people list
674// LINK LNK ID3FID_LINKEDINFO Linked information
675// PCNT CNT ID3FID_PLAYCOUNTER Play counter
676// POPM POP ID3FID_POPULARIMETER Popularimeter
677// PRIV ID3FID_PRIVATE Private frame
678// SYLT SLT ID3FID_SYNCEDLYRICS Synchronized lyric/text
679// TALB TAL ID3FID_ALBUM Album/Movie/Show title
680// TBPM TBP ID3FID_BPM BPM (beats per minute)
681// TCOM TCM ID3FID_COMPOSER Composer
682// TCON TCO ID3FID_CONTENTTYPE Content type
683// TCOP TCR ID3FID_COPYRIGHT Copyright message
684// TDAT TDA ID3FID_DATE Date
685// TDLY TDY ID3FID_PLAYLISTDELAY Playlist delay
686// TENC TEN ID3FID_ENCODEDBY Encoded by
687// TEXT TXT ID3FID_LYRICIST Lyricist/Text writer
688// TFLT TFT ID3FID_FILETYPE File type
689// TIME TKE ID3FID_TIME Time
690// TIT1 TIM ID3FID_CONTENTGROUP Content group description
691// TIT2 TT1 ID3FID_TITLE Title/songname/content description
692// TIT3 TT2 ID3FID_SUBTITLE Subtitle/Description refinement
693// TKEY TT3 ID3FID_INITIALKEY Initial key
694// TLAN TLA ID3FID_LANGUAGE Language(s)
695// TLEN TLE ID3FID_SONGLEN Length
696// TMED TMT ID3FID_MEDIATYPE Media type
697// TOAL TOT ID3FID_ORIGALBUM Original album/movie/show title
698// TOFN TOF ID3FID_ORIGFILENAME Original filename
699// TOLY TOL ID3FID_ORIGLYRICIST Original lyricist(s)/text writer(s)
700// TOPE TOA ID3FID_ORIGARTIST Original artist(s)/performer(s)
701// TORY TOR ID3FID_ORIGYEAR Original release year
702// TOWN ID3FID_FILEOWNER File owner/licensee
703// TPE1 TP1 ID3FID_LEADARTIST Lead performer(s)/Soloist(s)
704// TPE2 TP2 ID3FID_BAND Band/orchestra/accompaniment
705// TPE3 TP3 ID3FID_CONDUCTOR Conductor/performer refinement
706// TPE4 TP4 ID3FID_MIXARTIST Interpreted, remixed, or otherwise modified
707// TPOS TPA ID3FID_PARTINSET Part of a set
708// TPUB TPB ID3FID_PUBLISHER Publisher
709// TRCK TRK ID3FID_TRACKNUM Track number/Position in set
710// TRDA TRD ID3FID_RECORDINGDATES Recording dates
711// TRSN TRN ID3FID_NETRADIOSTATION Internet radio station name
712// TRSO TRO ID3FID_NETRADIOOWNER Internet radio station owner
713// TSIZ TSI ID3FID_SIZE Size
714// TSRC TRC ID3FID_ISRC ISRC (international standard recording code)
715// TSSE TSS ID3FID_ENCODERSETTINGS Software/Hardware and encoding settings
716// TXXX TXX ID3FID_USERTEXT User defined text information
717// TYER TYE ID3FID_YEAR Year
718// UFID UFI ID3FID_UNIQUEFILEID Unique file identifier
719// USER ID3FID_TERMSOFUSE Terms of use
720// USLT ULT ID3FID_UNSYNCEDLYRICS Unsynchronized lyric/text transcription
721// WCOM WCM ID3FID_WWWCOMMERCIALINFO Commercial information
722// WCOP WCM ID3FID_WWWCOPYRIGHT Copyright/Legal infromation
723// WOAF WCP ID3FID_WWWAUDIOFILE Official audio file webpage
724// WOAR WAF ID3FID_WWWARTIST Official artist/performer webpage
725// WOAS WAR ID3FID_WWWAUDIOSOURCE Official audio source webpage
726// WORS WAS ID3FID_WWWRADIOPAGE Official internet radio station homepage
727// WPAY WRA ID3FID_WWWPAYMENT Payment
728// WPUB WPY ID3FID_WWWPUBLISHER Official publisher webpage
729// WXXX WXX ID3FID_WWWUSER User defined URL link
730// CDM ID3FID_METACOMPRESSION Compressed data meta frame
731
732// **** Currently unimplemented frames
733// AENC CRA ID3FID_AUDIOCRYPTO Audio encryption
734// COMR ID3FID_COMMERCIAL Commercial frame
735// EQUA EQU ID3FID_EQUALIZATION Equalization
736// ETCO ETC ID3FID_EVENTTIMING Event timing codes
737// MCDI MCI ID3FID_CDID Music CD identifier
738// MLLT MLL ID3FID_MPEGLOOKUP MPEG location lookup table
739// OWNE ID3FID_OWNERSHIP Ownership frame
740// POSS ID3FID_POSITIONSYNC Position synchronisation frame
741// RBUF BUF ID3FID_BUFFERSIZE Recommended buffer size
742// RVAD RVA ID3FID_VOLUMEADJ Relative volume adjustment
743// RVRB REV ID3FID_REVERB Reverb
744// SYTC STC ID3FID_SYNCEDTEMPO Synchronized tempo codes
745// CRM ID3FID_METACRYPTO Encrypted meta frame
746static ID3_FrameDef ID3_FrameDefs[] =
747{
748 // short long tag file
749 // frame id id id discrd discrd field defs description
750 {ID3FID_AUDIOCRYPTO, "CRA", "AENC", false, false, ID3FD_Unimplemented, "Audio encryption"},
751 {ID3FID_PICTURE, "PIC", "APIC", false, false, ID3FD_Picture, "Attached picture"},
752 {ID3FID_COMMENT, "COM", "COMM", false, false, ID3FD_GeneralText, "Comments"},
753 {ID3FID_COMMERCIAL, "" , "COMR", false, false, ID3FD_Unimplemented, "Commercial"},
754 {ID3FID_CRYPTOREG, "" , "ENCR", false, false, ID3FD_Registration, "Encryption method registration"},
755 {ID3FID_EQUALIZATION, "EQU", "EQUA", false, true, ID3FD_Unimplemented, "Equalization"},
756 {ID3FID_EVENTTIMING, "ETC", "ETCO", false, true, ID3FD_Unimplemented, "Event timing codes"},
757 {ID3FID_GENERALOBJECT, "GEO", "GEOB", false, false, ID3FD_GEO, "General encapsulated object"},
758 {ID3FID_GROUPINGREG, "" , "GRID", false, false, ID3FD_Registration, "Group identification registration"},
759 {ID3FID_INVOLVEDPEOPLE, "IPL", "IPLS", false, false, ID3FD_InvolvedPeople,"Involved people list"},
760 {ID3FID_LINKEDINFO, "LNK", "LINK", false, false, ID3FD_LinkedInfo, "Linked information"},
761 {ID3FID_CDID, "MCI", "MCDI", false, false, ID3FD_Unimplemented, "Music CD identifier"},
762 {ID3FID_MPEGLOOKUP, "MLL", "MLLT", false, true, ID3FD_Unimplemented, "MPEG location lookup table"},
763 {ID3FID_OWNERSHIP, "" , "OWNE", false, false, ID3FD_Unimplemented, "Ownership frame"},
764 {ID3FID_PRIVATE, "" , "PRIV", false, false, ID3FD_Private, "Private frame"},
765 {ID3FID_PLAYCOUNTER, "CNT", "PCNT", false, false, ID3FD_PlayCounter, "Play counter"},
766 {ID3FID_POPULARIMETER, "POP", "POPM", false, false, ID3FD_Popularimeter, "Popularimeter"},
767 {ID3FID_POSITIONSYNC, "" , "POSS", false, true, ID3FD_Unimplemented, "Position synchronisation frame"},
768 {ID3FID_BUFFERSIZE, "BUF", "RBUF", false, false, ID3FD_Unimplemented, "Recommended buffer size"},
769 {ID3FID_VOLUMEADJ, "RVA", "RVAD", false, true, ID3FD_Unimplemented, "Relative volume adjustment"},
770 {ID3FID_REVERB, "REV", "RVRB", false, false, ID3FD_Unimplemented, "Reverb"},
771 {ID3FID_SYNCEDLYRICS, "SLT", "SYLT", false, false, ID3FD_SyncLyrics, "Synchronized lyric/text"},
772 {ID3FID_SYNCEDTEMPO, "STC", "SYTC", false, true, ID3FD_Unimplemented, "Synchronized tempo codes"},
773 {ID3FID_ALBUM, "TAL", "TALB", false, false, ID3FD_Text, "Album/Movie/Show title"},
774 {ID3FID_BPM, "TBP", "TBPM", false, false, ID3FD_Text, "BPM (beats per minute)"},
775 {ID3FID_COMPOSER, "TCM", "TCOM", false, false, ID3FD_Text, "Composer"},
776 {ID3FID_CONTENTTYPE, "TCO", "TCON", false, false, ID3FD_Text, "Content type"},
777 {ID3FID_COPYRIGHT, "TCR", "TCOP", false, false, ID3FD_Text, "Copyright message"},
778 {ID3FID_DATE, "TDA", "TDAT", false, false, ID3FD_Text, "Date"},
779 {ID3FID_PLAYLISTDELAY, "TDY", "TDLY", false, false, ID3FD_Text, "Playlist delay"},
780 {ID3FID_ENCODEDBY, "TEN", "TENC", false, true, ID3FD_Text, "Encoded by"},
781 {ID3FID_LYRICIST, "TXT", "TEXT", false, false, ID3FD_Text, "Lyricist/Text writer"},
782 {ID3FID_FILETYPE, "TFT", "TFLT", false, false, ID3FD_Text, "File type"},
783 {ID3FID_TIME, "TIM", "TIME", false, false, ID3FD_Text, "Time"},
784 {ID3FID_CONTENTGROUP, "TT1", "TIT1", false, false, ID3FD_Text, "Content group description"},
785 {ID3FID_TITLE, "TT2", "TIT2", false, false, ID3FD_Text, "Title/songname/content description"},
786 {ID3FID_SUBTITLE, "TT3", "TIT3", false, false, ID3FD_Text, "Subtitle/Description refinement"},
787 {ID3FID_INITIALKEY, "TKE", "TKEY", false, false, ID3FD_Text, "Initial key"},
788 {ID3FID_LANGUAGE, "TLA", "TLAN", false, false, ID3FD_Text, "Language(s)"},
789 {ID3FID_SONGLEN, "TLE", "TLEN", false, true, ID3FD_Text, "Length"},
790 {ID3FID_MEDIATYPE, "TMT", "TMED", false, false, ID3FD_Text, "Media type"},
791 {ID3FID_ORIGALBUM, "TOT", "TOAL", false, false, ID3FD_Text, "Original album/movie/show title"},
792 {ID3FID_ORIGFILENAME, "TOF", "TOFN", false, false, ID3FD_Text, "Original filename"},
793 {ID3FID_ORIGLYRICIST, "TOL", "TOLY", false, false, ID3FD_Text, "Original lyricist(s)/text writer(s)"},
794 {ID3FID_ORIGARTIST, "TOA", "TOPE", false, false, ID3FD_Text, "Original artist(s)/performer(s)"},
795 {ID3FID_ORIGYEAR, "TOR", "TORY", false, false, ID3FD_Text, "Original release year"},
796 {ID3FID_FILEOWNER, "" , "TOWN", false, false, ID3FD_Text, "File owner/licensee"},
797 {ID3FID_LEADARTIST, "TP1", "TPE1", false, false, ID3FD_Text, "Lead performer(s)/Soloist(s)"},
798 {ID3FID_BAND, "TP2", "TPE2", false, false, ID3FD_Text, "Band/orchestra/accompaniment"},
799 {ID3FID_CONDUCTOR, "TP3", "TPE3", false, false, ID3FD_Text, "Conductor/performer refinement"},
800 {ID3FID_MIXARTIST, "TP4", "TPE4", false, false, ID3FD_Text, "Interpreted, remixed, or otherwise modified by"},
801 {ID3FID_PARTINSET, "TPA", "TPOS", false, false, ID3FD_Text, "Part of a set"},
802 {ID3FID_PUBLISHER, "TPB", "TPUB", false, false, ID3FD_Text, "Publisher"},
803 {ID3FID_TRACKNUM, "TRK", "TRCK", false, false, ID3FD_Text, "Track number/Position in set"},
804 {ID3FID_RECORDINGDATES, "TRD", "TRDA", false, false, ID3FD_Text, "Recording dates"},
805 {ID3FID_NETRADIOSTATION, "TRN", "TRSN", false, false, ID3FD_Text, "Internet radio station name"},
806 {ID3FID_NETRADIOOWNER, "TRO", "TRSO", false, false, ID3FD_Text, "Internet radio station owner"},
807 {ID3FID_SIZE, "TSI", "TSIZ", false, true, ID3FD_Text, "Size"},
808 {ID3FID_ISRC, "TRC", "TSRC", false, false, ID3FD_Text, "ISRC (international standard recording code)"},
809 {ID3FID_ENCODERSETTINGS, "TSS", "TSSE", false, false, ID3FD_Text, "Software/Hardware and settings used for encoding"},
810 {ID3FID_USERTEXT, "TXX", "TXXX", false, false, ID3FD_UserText, "User defined text information"},
811 {ID3FID_YEAR, "TYE", "TYER", false, false, ID3FD_Text, "Year"},
812 {ID3FID_UNIQUEFILEID, "UFI", "UFID", false, false, ID3FD_UFI, "Unique file identifier"},
813 {ID3FID_TERMSOFUSE, "" , "USER", false, false, ID3FD_TermsOfUse, "Terms of use"},
814 {ID3FID_UNSYNCEDLYRICS, "ULT", "USLT", false, false, ID3FD_GeneralText, "Unsynchronized lyric/text transcription"},
815 {ID3FID_WWWCOMMERCIALINFO, "WCM", "WCOM", false, false, ID3FD_URL, "Commercial information"},
816 {ID3FID_WWWCOPYRIGHT, "WCP", "WCOP", false, false, ID3FD_URL, "Copyright/Legal infromation"},
817 {ID3FID_WWWAUDIOFILE, "WAF", "WOAF", false, false, ID3FD_URL, "Official audio file webpage"},
818 {ID3FID_WWWARTIST, "WAR", "WOAR", false, false, ID3FD_URL, "Official artist/performer webpage"},
819 {ID3FID_WWWAUDIOSOURCE, "WAS", "WOAS", false, false, ID3FD_URL, "Official audio source webpage"},
820 {ID3FID_WWWRADIOPAGE, "WRA", "WORS", false, false, ID3FD_URL, "Official internet radio station homepage"},
821 {ID3FID_WWWPAYMENT, "WPY", "WPAY", false, false, ID3FD_URL, "Payment"},
822 {ID3FID_WWWPUBLISHER, "WPB", "WPUB", false, false, ID3FD_URL, "Official publisher webpage"},
823 {ID3FID_WWWUSER, "WXX", "WXXX", false, false, ID3FD_UserURL, "User defined URL link"},
824 {ID3FID_METACRYPTO, "CRM", "" , false, false, ID3FD_Unimplemented, "Encrypted meta frame"},
825 {ID3FID_METACOMPRESSION, "CDM", "" , false, false, ID3FD_CDM, "Compressed data meta frame"},
827};
828
885
886ID3_FieldImpl::ID3_FieldImpl()
887 : _id(ID3FN_NOFIELD),
888 _type(ID3FTY_INTEGER),
889 _spec_begin(ID3V2_EARLIEST),
890 _spec_end(ID3V2_LATEST),
891 _flags(0),
892 _changed(false),
893 _fixed_size(0),
894 _num_items(0),
895 _enc(ID3TE_NONE)
896{
897 this->Clear();
898}
899
900ID3_FieldImpl::ID3_FieldImpl(const ID3_FieldDef& def)
901 : _id(def._id),
902 _type(def._type),
903 _spec_begin(def._spec_begin),
904 _spec_end(def._spec_end),
905 _flags(def._flags),
906 _changed(false),
907 _fixed_size(def._fixed_size),
908 _num_items(0),
909 _enc((_type == ID3FTY_TEXTSTRING) ? ID3TE_ASCII : ID3TE_NONE)
910{
911 this->Clear();
912}
913
917
924{
925 switch (_type)
926 {
927 case ID3FTY_INTEGER:
928 {
929 _integer = 0;
930 break;
931 }
932 case ID3FTY_BINARY:
933 {
934 _binary.erase();
935 if (_fixed_size > 0)
936 {
937 _binary.assign(_fixed_size, '\0');
938 }
939 break;
940 }
942 {
943 _text.erase();
944 if (_fixed_size > 0)
945 {
946 if (this->GetEncoding() == ID3TE_UNICODE)
947 {
948 _text.assign(_fixed_size * 2, '\0');
949 }
950 else if (this->GetEncoding() == ID3TE_ASCII)
951 {
952 _text.assign(_fixed_size, '\0');
953 }
954 }
955 break;
956 }
957 default:
958 {
959 break;
960 }
961 }
962 _changed = true;
963
964 return ;
965}
966
967bool
969{
970 return _changed;
971}
972
991
993{
994 if (_fixed_size > 0)
995 {
996 return _fixed_size;
997 }
998 size_t size = this->Size();
999 if (_type == ID3FTY_TEXTSTRING)
1000 {
1001 ID3_TextEnc enc = this->GetEncoding();
1002 if (enc == ID3TE_UNICODE && size > 0)
1003 {
1004 size++;
1005 }
1006 if (_flags & ID3FF_CSTR)
1007 {
1008 size++;
1009 }
1010 if (enc == ID3TE_UNICODE)
1011 {
1012 size *= 2;
1013 }
1014 }
1015 return size;
1016}
1017
1019{
1020 size_t size = 0;
1021 // check to see if we are within the legal limit for this field 0 means
1022 // arbitrary length field
1023 if (_fixed_size > 0)
1024 {
1025 size = _fixed_size;
1026 }
1027 else if (_type == ID3FTY_INTEGER)
1028 {
1029 size = sizeof(uint32);
1030 }
1031 else if (_type == ID3FTY_TEXTSTRING)
1032 {
1033 size = _text.size();
1034 }
1035 else
1036 {
1037 size = _binary.size();
1038 }
1039
1040 return size;
1041}
1042
1044{
1045 bool success = false;
1046 switch (this->GetType())
1047 {
1048 case ID3FTY_INTEGER:
1049 {
1050 success = this->ParseInteger(reader);
1051 break;
1052 }
1053
1054 case ID3FTY_BINARY:
1055 {
1056 success = this->ParseBinary(reader);
1057 break;
1058 }
1059
1060 case ID3FTY_TEXTSTRING:
1061 {
1062 success = this->ParseText(reader);
1063 break;
1064 }
1065
1066 default:
1067 {
1068 ID3D_WARNING( "ID3_FieldImpl::Parse(): unknown field type" );
1069 break;
1070 }
1071 }
1072 return success;
1073}
1074
1076{
1077 ID3_FrameDef *info = NULL;
1078
1079 for (size_t cur = 0; ID3_FrameDefs[cur].eID != ID3FID_NOFRAME; ++cur)
1080 {
1081 if (ID3_FrameDefs[cur].eID == id)
1082 {
1083 info = &ID3_FrameDefs[cur];
1084 break;
1085 }
1086 }
1087
1088 return info;
1089}
1090
1092ID3_FindFrameID(const char *id)
1093{
1095 const int slen = strlen(id);
1096
1097 for (size_t cur = 0; ID3_FrameDefs[cur].eID != ID3FID_NOFRAME; ++cur)
1098 {
1099 if (((strcmp(ID3_FrameDefs[cur].sShortTextID, id) == 0) &&
1100 slen == 3) ||
1101 ((strcmp(ID3_FrameDefs[cur].sLongTextID, id) == 0) &&
1102 slen == 4))
1103 {
1104 fid = ID3_FrameDefs[cur].eID;
1105 break;
1106 }
1107 }
1108
1109 return fid;
1110}
1111
1113{
1114 switch (this->GetType())
1115 {
1116 case ID3FTY_INTEGER:
1117 {
1118 RenderInteger(writer);
1119 break;
1120 }
1121
1122 case ID3FTY_BINARY:
1123 {
1124 RenderBinary(writer);
1125 break;
1126 }
1127
1128 case ID3FTY_TEXTSTRING:
1129 {
1130 RenderText(writer);
1131 break;
1132 }
1133
1134 default:
1135 {
1136 ID3D_WARNING ( "ID3D_FieldImpl::Render(): unknown field type" );
1137 break;
1138 }
1139 }
1140}
1141
1142ID3_Field &
1144{
1145 const ID3_FieldImpl* fld = (const ID3_FieldImpl*) &rhs;
1146 if (this != &rhs && this->GetType() == fld->GetType())
1147 {
1148 switch (fld->GetType())
1149 {
1150 case ID3FTY_INTEGER:
1151 {
1152 this->SetInteger(fld->GetInteger());
1153 break;
1154 }
1155 case ID3FTY_TEXTSTRING:
1156 {
1157 this->SetEncoding(fld->GetEncoding());
1158 this->SetText(fld->GetText());
1159 break;
1160 }
1161 case ID3FTY_BINARY:
1162 {
1163 this->SetBinary(fld->GetBinary());
1164 break;
1165 }
1166 default:
1167 {
1168 break;
1169 }
1170 }
1171 }
1172 return *this;
1173}
1174
1176{
1177 bool changed = this->IsEncodable() && (enc != this->GetEncoding()) &&
1178 (ID3TE_NONE < enc && enc < ID3TE_NUMENCODINGS);
1179 if (changed)
1180 {
1181 _text = convert(_text, _enc, enc);
1182 _enc = enc;
1183 _changed = true;
1184 }
1185 return changed;
1186}
1187
1240
1241
1243{
1244 ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
1245 if (pFD!=NULL)
1246 return pFD->sShortTextID;
1247 else
1248 return NULL;
1249}
1250
1252{
1253 ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
1254 if (pFD!=NULL)
1255 return pFD->sLongTextID;
1256 else
1257 return NULL;
1258}
1259
1261{
1262 ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
1263 if (pFD!=NULL)
1264 return pFD->sDescription;
1265 else
1266 return NULL;
1267}
1268
1270{
1271 return ID3FID_LASTFRAMEID-1;
1272}
1273
1275{
1276 int fieldnum=0;
1277 ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
1278 if (pFD!=NULL)
1279 {
1280 while (pFD->aeFieldDefs[fieldnum]._id != ID3FN_NOFIELD)
1281 {
1282 ++fieldnum;
1283 }
1284 }
1285 return fieldnum;
1286}
1287
1289{
1290 ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
1291 if (pFD!=NULL)
1292 return (pFD->aeFieldDefs[fieldnum]._type);
1293 else
1294 return ID3FTY_NONE;
1295}
1296
1297size_t ID3_FrameInfo::FieldSize(ID3_FrameID frameID, int fieldnum)
1298{
1299 ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
1300 if (pFD!=NULL)
1301 return (pFD->aeFieldDefs[fieldnum]._fixed_size);
1302 else
1303 return 0;
1304}
1305
1307{
1308 ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
1309 if (pFD!=NULL)
1310 return (pFD->aeFieldDefs[fieldnum]._flags);
1311 else
1312 return 0;
1313}
1314
The representative class of an ID3v2 field.
Definition field.h:37
ID3_Field()
Definition field.h:93
dami::String GetText() const
bool HasChanged() const
Definition field.cpp:968
bool ParseInteger(ID3_Reader &)
bool IsEncodable() const
Definition field_impl.h:106
size_t SetText(dami::String)
void RenderInteger(ID3_Writer &) const
void RenderText(ID3_Writer &) const
uint32 GetInteger() const
void SetInteger(uint32)
ID3_FieldType GetType() const
Definition field_impl.h:103
bool ParseBinary(ID3_Reader &)
void Clear()
Clears any data and frees any memory associated with the field.
Definition field.cpp:923
ID3_TextEnc GetEncoding() const
Definition field_impl.h:105
ID3_Field & operator=(uint32 val)
A shortcut for the Set method.
Definition field_impl.h:53
void Render(ID3_Writer &) const
Definition field.cpp:1112
bool ParseText(ID3_Reader &)
bool Parse(ID3_Reader &)
Definition field.cpp:1043
size_t Size() const
Returns the size of a field.
Definition field.cpp:1018
void RenderBinary(ID3_Writer &) const
bool SetEncoding(ID3_TextEnc enc)
Definition field.cpp:1175
size_t SetBinary(dami::BString)
Copies the supplied unicode string to the field.
dami::BString GetBinary() const
size_t BinSize() const
Definition field.cpp:992
size_t FieldSize(ID3_FrameID frameid, int fieldnum)
Definition field.cpp:1297
int NumFields(ID3_FrameID frameid)
Definition field.cpp:1274
char * LongName(ID3_FrameID frameid)
Definition field.cpp:1251
const char * Description(ID3_FrameID frameid)
Definition field.cpp:1260
char * ShortName(ID3_FrameID frameid)
Definition field.cpp:1242
ID3_FieldType FieldType(ID3_FrameID frameid, int fieldnum)
Definition field.cpp:1288
int MaxFrameID()
Definition field.cpp:1269
flags_t FieldFlags(ID3_FrameID frameid, int fieldnum)
Definition field.cpp:1306
ID3_FrameDef * ID3_FindFrameDef(ID3_FrameID id)
Definition field.cpp:1075
ID3_FrameID ID3_FindFrameID(const char *id)
Definition field.cpp:1092
#define NULL
Definition globals.h:743
@ ID3FN_MIMETYPE
Mimetype field.
Definition globals.h:212
@ ID3FN_NOFIELD
No field.
Definition globals.h:199
@ ID3FN_VOLCHGRIGHT
Volume chage on the right channel.
Definition globals.h:217
@ ID3FN_PEAKVOLRIGHT
Peak volume on the right channel.
Definition globals.h:219
@ ID3FN_EMAIL
Email field.
Definition globals.h:206
@ ID3FN_VOLCHGLEFT
Volume chage on the left channel.
Definition globals.h:218
@ ID3FN_DESCRIPTION
Description field.
Definition globals.h:204
@ ID3FN_IMAGEFORMAT
Image format field.
Definition globals.h:211
@ ID3FN_TIMESTAMPFORMAT
SYLT Timestamp Format.
Definition globals.h:221
@ ID3FN_PEAKVOLLEFT
Peak volume on the left channel.
Definition globals.h:220
@ ID3FN_RATING
Rating field.
Definition globals.h:207
@ ID3FN_NUMBITS
Number of bits field.
Definition globals.h:216
@ ID3FN_FILENAME
Filename field.
Definition globals.h:208
@ ID3FN_OWNER
Owner field.
Definition globals.h:205
@ ID3FN_LANGUAGE
Language field.
Definition globals.h:209
@ ID3FN_TEXT
Text field.
Definition globals.h:201
@ ID3FN_VOLUMEADJ
Volume adjustment field.
Definition globals.h:215
@ ID3FN_URL
A URL.
Definition globals.h:202
@ ID3FN_DATA
Data field.
Definition globals.h:203
@ ID3FN_ID
Identifier/Symbol field.
Definition globals.h:214
@ ID3FN_COUNTER
Counter field.
Definition globals.h:213
@ ID3FN_PICTURETYPE
Picture type field.
Definition globals.h:210
@ ID3FN_CONTENTTYPE
SYLT content type.
Definition globals.h:222
@ ID3FN_TEXTENC
Text encoding (unicode or ASCII)
Definition globals.h:200
ID3_TextEnc
Enumeration of the types of text encodings: ascii or unicode.
Definition globals.h:138
@ ID3TE_NONE
Definition globals.h:139
@ ID3TE_NUMENCODINGS
Definition globals.h:144
@ ID3TE_ASCII
Definition globals.h:145
@ ID3TE_UNICODE
Definition globals.h:146
@ ID3V2_LATEST
Definition globals.h:169
@ ID3V2_2_1
Definition globals.h:165
@ ID3V2_EARLIEST
Definition globals.h:168
@ ID3V2_3_0
Definition globals.h:166
ID3_FrameID
Enumeration of the different types of frames recognized by id3lib.
Definition globals.h:230
@ ID3FID_SYNCEDTEMPO
Synchronized tempo codes.
Definition globals.h:259
@ ID3FID_LEADARTIST
Lead performer(s)/Soloist(s)
Definition globals.h:292
@ ID3FID_CONTENTTYPE
Content type.
Definition globals.h:263
@ ID3FID_BUFFERSIZE
Recommended buffer size.
Definition globals.h:252
@ ID3FID_MIXARTIST
Interpreted, remixed, or otherwise modified by.
Definition globals.h:295
@ ID3FID_BPM
BPM (beats per minute)
Definition globals.h:261
@ ID3FID_GROUPINGREG
Group identification registration.
Definition globals.h:242
@ ID3FID_ENCODERSETTINGS
Software/Hardware and settings used for encoding.
Definition globals.h:308
@ ID3FID_SUBTITLE
Subtitle/Description refinement.
Definition globals.h:279
@ ID3FID_ORIGARTIST
Original artist(s)/performer(s)
Definition globals.h:289
@ ID3FID_ISRC
ISRC (international standard recording code)
Definition globals.h:307
@ ID3FID_COMPOSER
Composer.
Definition globals.h:262
@ ID3FID_MPEGLOOKUP
MPEG location lookup table.
Definition globals.h:246
@ ID3FID_PUBLISHER
Publisher.
Definition globals.h:298
@ ID3FID_AUDIOCRYPTO
Audio encryption.
Definition globals.h:232
@ ID3FID_INVOLVEDPEOPLE
Involved people list.
Definition globals.h:243
@ ID3FID_ORIGALBUM
Original album/movie/show title.
Definition globals.h:286
@ ID3FID_PLAYLISTDELAY
Playlist delay.
Definition globals.h:267
@ ID3FID_LANGUAGE
Language(s)
Definition globals.h:281
@ ID3FID_WWWPUBLISHER
Official publisher webpage.
Definition globals.h:322
@ ID3FID_WWWARTIST
Official artist/performer webpage.
Definition globals.h:318
@ ID3FID_WWWPAYMENT
Payment.
Definition globals.h:321
@ ID3FID_LYRICIST
Lyricist/Text writer.
Definition globals.h:274
@ ID3FID_FILETYPE
File type.
Definition globals.h:275
@ ID3FID_WWWAUDIOSOURCE
Official audio source webpage.
Definition globals.h:319
@ ID3FID_METACRYPTO
Encrypted meta frame (id3v2.2.x)
Definition globals.h:324
@ ID3FID_WWWAUDIOFILE
Official audio file webpage.
Definition globals.h:317
@ ID3FID_TIME
Time.
Definition globals.h:276
@ ID3FID_METACOMPRESSION
Compressed meta frame (id3v2.2.1)
Definition globals.h:325
@ ID3FID_LASTFRAMEID
Last field placeholder.
Definition globals.h:326
@ ID3FID_ENCODEDBY
Encoded by.
Definition globals.h:273
@ ID3FID_WWWUSER
User defined URL link.
Definition globals.h:323
@ ID3FID_POPULARIMETER
Popularimeter.
Definition globals.h:250
@ ID3FID_PARTINSET
Part of a set.
Definition globals.h:296
@ ID3FID_UNIQUEFILEID
Unique file identifier.
Definition globals.h:312
@ ID3FID_GENERALOBJECT
General encapsulated object.
Definition globals.h:241
@ ID3FID_REVERB
Reverb.
Definition globals.h:255
@ ID3FID_USERTEXT
User defined text information.
Definition globals.h:310
@ ID3FID_BAND
Band/orchestra/accompaniment.
Definition globals.h:293
@ ID3FID_FILEOWNER
File owner/licensee.
Definition globals.h:291
@ ID3FID_COMMERCIAL
Commercial frame.
Definition globals.h:236
@ ID3FID_INITIALKEY
Initial key.
Definition globals.h:280
@ ID3FID_ALBUM
Album/Movie/Show title.
Definition globals.h:260
@ ID3FID_COMMENT
Comments.
Definition globals.h:235
@ ID3FID_NETRADIOOWNER
Internet radio station owner.
Definition globals.h:302
@ ID3FID_ORIGFILENAME
Original filename.
Definition globals.h:287
@ ID3FID_EQUALIZATION
Equalization.
Definition globals.h:239
@ ID3FID_COPYRIGHT
Copyright message.
Definition globals.h:264
@ ID3FID_CRYPTOREG
Encryption method registration.
Definition globals.h:237
@ ID3FID_RECORDINGDATES
Recording dates.
Definition globals.h:300
@ ID3FID_SONGLEN
Length.
Definition globals.h:282
@ ID3FID_POSITIONSYNC
Position synchronisation frame.
Definition globals.h:251
@ ID3FID_WWWCOPYRIGHT
Copyright/Legal infromation.
Definition globals.h:316
@ ID3FID_LINKEDINFO
Linked information.
Definition globals.h:244
@ ID3FID_SIZE
Size.
Definition globals.h:303
@ ID3FID_CONDUCTOR
Conductor/performer refinement.
Definition globals.h:294
@ ID3FID_DATE
Date.
Definition globals.h:265
@ ID3FID_YEAR
Year.
Definition globals.h:311
@ ID3FID_NETRADIOSTATION
Internet radio station name.
Definition globals.h:301
@ ID3FID_WWWCOMMERCIALINFO
Commercial information.
Definition globals.h:315
@ ID3FID_MEDIATYPE
Media type.
Definition globals.h:284
@ ID3FID_TERMSOFUSE
Terms of use.
Definition globals.h:313
@ ID3FID_EVENTTIMING
Event timing codes.
Definition globals.h:240
@ ID3FID_CONTENTGROUP
Content group description.
Definition globals.h:277
@ ID3FID_NOFRAME
No known frame.
Definition globals.h:231
@ ID3FID_OWNERSHIP
Ownership frame.
Definition globals.h:247
@ ID3FID_PICTURE
Attached picture.
Definition globals.h:233
@ ID3FID_TRACKNUM
Track number/Position in set.
Definition globals.h:299
@ ID3FID_ORIGLYRICIST
Original lyricist(s)/text writer(s)
Definition globals.h:288
@ ID3FID_UNSYNCEDLYRICS
Unsynchronized lyric/text transcription.
Definition globals.h:314
@ ID3FID_VOLUMEADJ
Relative volume adjustment.
Definition globals.h:254
@ ID3FID_ORIGYEAR
Original release year.
Definition globals.h:290
@ ID3FID_CDID
Music CD identifier.
Definition globals.h:245
@ ID3FID_TITLE
Title/songname/content description.
Definition globals.h:278
@ ID3FID_SYNCEDLYRICS
Synchronized lyric/text.
Definition globals.h:258
@ ID3FID_PRIVATE
Private frame.
Definition globals.h:248
@ ID3FID_WWWRADIOPAGE
Official internet radio station homepage.
Definition globals.h:320
@ ID3FID_PLAYCOUNTER
Play counter.
Definition globals.h:249
@ ID3FF_ENCODABLE
Definition globals.h:346
@ ID3FF_NONE
Definition globals.h:343
@ ID3FF_CSTR
Definition globals.h:344
@ ID3FF_TEXTLIST
Definition globals.h:347
uint16 flags_t
Definition globals.h:118
ID3_FieldType
Enumeration of the types of field types.
Definition globals.h:352
@ ID3FTY_INTEGER
Definition globals.h:354
@ ID3FTY_TEXTSTRING
Definition globals.h:356
@ ID3FTY_NONE
Definition globals.h:353
@ ID3FTY_BINARY
Definition globals.h:355
String ID3_C_EXPORT convert(String data, ID3_TextEnc, ID3_TextEnc)
Definition utils.cpp:185
ID3_FieldType _type
Definition field_def.h:36
size_t _fixed_size
Definition field_def.h:37
ID3_FieldID _id
Definition field_def.h:35
static const ID3_FieldDef * DEFAULT
Definition field_def.h:42
flags_t _flags
Definition field_def.h:40
const ID3_FieldDef * aeFieldDefs
Definition frame_def.h:43
char sShortTextID[3+1]
Definition frame_def.h:39
const char * sDescription
Definition frame_def.h:44
char sLongTextID[4+1]
Definition frame_def.h:40