xref: /MusicPlayer2/MusicPlayer2/taglib/eventtimingcodesframe.h (revision 2661106a96494c0a7dfab38bf1ae7b9565882443)
1*2661106aSZhong Yang /***************************************************************************
2*2661106aSZhong Yang     copyright            : (C) 2014 by Urs Fleisch
3*2661106aSZhong Yang     email                : [email protected]
4*2661106aSZhong Yang  ***************************************************************************/
5*2661106aSZhong Yang 
6*2661106aSZhong Yang /***************************************************************************
7*2661106aSZhong Yang  *   This library is free software; you can redistribute it and/or modify  *
8*2661106aSZhong Yang  *   it  under the terms of the GNU Lesser General Public License version  *
9*2661106aSZhong Yang  *   2.1 as published by the Free Software Foundation.                     *
10*2661106aSZhong Yang  *                                                                         *
11*2661106aSZhong Yang  *   This library is distributed in the hope that it will be useful, but   *
12*2661106aSZhong Yang  *   WITHOUT ANY WARRANTY; without even the implied warranty of            *
13*2661106aSZhong Yang  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
14*2661106aSZhong Yang  *   Lesser General Public License for more details.                       *
15*2661106aSZhong Yang  *                                                                         *
16*2661106aSZhong Yang  *   You should have received a copy of the GNU Lesser General Public      *
17*2661106aSZhong Yang  *   License along with this library; if not, write to the Free Software   *
18*2661106aSZhong Yang  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA         *
19*2661106aSZhong Yang  *   02110-1301  USA                                                       *
20*2661106aSZhong Yang  *                                                                         *
21*2661106aSZhong Yang  *   Alternatively, this file is available under the Mozilla Public        *
22*2661106aSZhong Yang  *   License Version 1.1.  You may obtain a copy of the License at         *
23*2661106aSZhong Yang  *   http://www.mozilla.org/MPL/                                           *
24*2661106aSZhong Yang  ***************************************************************************/
25*2661106aSZhong Yang 
26*2661106aSZhong Yang #ifndef TAGLIB_EVENTTIMINGCODESFRAME_H
27*2661106aSZhong Yang #define TAGLIB_EVENTTIMINGCODESFRAME_H
28*2661106aSZhong Yang 
29*2661106aSZhong Yang #include "id3v2frame.h"
30*2661106aSZhong Yang #include "tlist.h"
31*2661106aSZhong Yang 
32*2661106aSZhong Yang namespace TagLib {
33*2661106aSZhong Yang 
34*2661106aSZhong Yang   namespace ID3v2 {
35*2661106aSZhong Yang 
36*2661106aSZhong Yang     //! ID3v2 event timing codes frame
37*2661106aSZhong Yang     /*!
38*2661106aSZhong Yang      * An implementation of ID3v2 event timing codes.
39*2661106aSZhong Yang      */
40*2661106aSZhong Yang     class TAGLIB_EXPORT EventTimingCodesFrame : public Frame
41*2661106aSZhong Yang     {
42*2661106aSZhong Yang       friend class FrameFactory;
43*2661106aSZhong Yang 
44*2661106aSZhong Yang     public:
45*2661106aSZhong Yang 
46*2661106aSZhong Yang       /*!
47*2661106aSZhong Yang        * Specifies the timestamp format used.
48*2661106aSZhong Yang        */
49*2661106aSZhong Yang       enum TimestampFormat {
50*2661106aSZhong Yang         //! The timestamp is of unknown format.
51*2661106aSZhong Yang         Unknown              = 0x00,
52*2661106aSZhong Yang         //! The timestamp represents the number of MPEG frames since
53*2661106aSZhong Yang         //! the beginning of the audio stream.
54*2661106aSZhong Yang         AbsoluteMpegFrames   = 0x01,
55*2661106aSZhong Yang         //! The timestamp represents the number of milliseconds since
56*2661106aSZhong Yang         //! the beginning of the audio stream.
57*2661106aSZhong Yang         AbsoluteMilliseconds = 0x02
58*2661106aSZhong Yang       };
59*2661106aSZhong Yang 
60*2661106aSZhong Yang       /*!
61*2661106aSZhong Yang        * Event types defined in id3v2.4.0-frames.txt 4.5. Event timing codes.
62*2661106aSZhong Yang        */
63*2661106aSZhong Yang       enum EventType {
64*2661106aSZhong Yang         Padding                = 0x00,
65*2661106aSZhong Yang         EndOfInitialSilence    = 0x01,
66*2661106aSZhong Yang         IntroStart             = 0x02,
67*2661106aSZhong Yang         MainPartStart          = 0x03,
68*2661106aSZhong Yang         OutroStart             = 0x04,
69*2661106aSZhong Yang         OutroEnd               = 0x05,
70*2661106aSZhong Yang         VerseStart             = 0x06,
71*2661106aSZhong Yang         RefrainStart           = 0x07,
72*2661106aSZhong Yang         InterludeStart         = 0x08,
73*2661106aSZhong Yang         ThemeStart             = 0x09,
74*2661106aSZhong Yang         VariationStart         = 0x0a,
75*2661106aSZhong Yang         KeyChange              = 0x0b,
76*2661106aSZhong Yang         TimeChange             = 0x0c,
77*2661106aSZhong Yang         MomentaryUnwantedNoise = 0x0d,
78*2661106aSZhong Yang         SustainedNoise         = 0x0e,
79*2661106aSZhong Yang         SustainedNoiseEnd      = 0x0f,
80*2661106aSZhong Yang         IntroEnd               = 0x10,
81*2661106aSZhong Yang         MainPartEnd            = 0x11,
82*2661106aSZhong Yang         VerseEnd               = 0x12,
83*2661106aSZhong Yang         RefrainEnd             = 0x13,
84*2661106aSZhong Yang         ThemeEnd               = 0x14,
85*2661106aSZhong Yang         Profanity              = 0x15,
86*2661106aSZhong Yang         ProfanityEnd           = 0x16,
87*2661106aSZhong Yang         NotPredefinedSynch0    = 0xe0,
88*2661106aSZhong Yang         NotPredefinedSynch1    = 0xe1,
89*2661106aSZhong Yang         NotPredefinedSynch2    = 0xe2,
90*2661106aSZhong Yang         NotPredefinedSynch3    = 0xe3,
91*2661106aSZhong Yang         NotPredefinedSynch4    = 0xe4,
92*2661106aSZhong Yang         NotPredefinedSynch5    = 0xe5,
93*2661106aSZhong Yang         NotPredefinedSynch6    = 0xe6,
94*2661106aSZhong Yang         NotPredefinedSynch7    = 0xe7,
95*2661106aSZhong Yang         NotPredefinedSynch8    = 0xe8,
96*2661106aSZhong Yang         NotPredefinedSynch9    = 0xe9,
97*2661106aSZhong Yang         NotPredefinedSynchA    = 0xea,
98*2661106aSZhong Yang         NotPredefinedSynchB    = 0xeb,
99*2661106aSZhong Yang         NotPredefinedSynchC    = 0xec,
100*2661106aSZhong Yang         NotPredefinedSynchD    = 0xed,
101*2661106aSZhong Yang         NotPredefinedSynchE    = 0xee,
102*2661106aSZhong Yang         NotPredefinedSynchF    = 0xef,
103*2661106aSZhong Yang         AudioEnd               = 0xfd,
104*2661106aSZhong Yang         AudioFileEnds          = 0xfe
105*2661106aSZhong Yang       };
106*2661106aSZhong Yang 
107*2661106aSZhong Yang       /*!
108*2661106aSZhong Yang        * Single entry of time stamp and event.
109*2661106aSZhong Yang        */
110*2661106aSZhong Yang       struct SynchedEvent {
SynchedEventSynchedEvent111*2661106aSZhong Yang         SynchedEvent(unsigned int ms, EventType t) : time(ms), type(t) {}
112*2661106aSZhong Yang         unsigned int time;
113*2661106aSZhong Yang         EventType type;
114*2661106aSZhong Yang       };
115*2661106aSZhong Yang 
116*2661106aSZhong Yang       /*!
117*2661106aSZhong Yang        * List of synchronized events.
118*2661106aSZhong Yang        */
119*2661106aSZhong Yang       typedef TagLib::List<SynchedEvent> SynchedEventList;
120*2661106aSZhong Yang 
121*2661106aSZhong Yang       /*!
122*2661106aSZhong Yang        * Construct an empty event timing codes frame.
123*2661106aSZhong Yang        */
124*2661106aSZhong Yang       explicit EventTimingCodesFrame();
125*2661106aSZhong Yang 
126*2661106aSZhong Yang       /*!
127*2661106aSZhong Yang        * Construct a event timing codes frame based on the data in \a data.
128*2661106aSZhong Yang        */
129*2661106aSZhong Yang       explicit EventTimingCodesFrame(const ByteVector &data);
130*2661106aSZhong Yang 
131*2661106aSZhong Yang       /*!
132*2661106aSZhong Yang        * Destroys this EventTimingCodesFrame instance.
133*2661106aSZhong Yang        */
134*2661106aSZhong Yang       virtual ~EventTimingCodesFrame();
135*2661106aSZhong Yang 
136*2661106aSZhong Yang       /*!
137*2661106aSZhong Yang        * Returns a null string.
138*2661106aSZhong Yang        */
139*2661106aSZhong Yang       virtual String toString() const;
140*2661106aSZhong Yang 
141*2661106aSZhong Yang       /*!
142*2661106aSZhong Yang        * Returns the timestamp format.
143*2661106aSZhong Yang        */
144*2661106aSZhong Yang       TimestampFormat timestampFormat() const;
145*2661106aSZhong Yang 
146*2661106aSZhong Yang       /*!
147*2661106aSZhong Yang        * Returns the events with the time stamps.
148*2661106aSZhong Yang        */
149*2661106aSZhong Yang       SynchedEventList synchedEvents() const;
150*2661106aSZhong Yang 
151*2661106aSZhong Yang       /*!
152*2661106aSZhong Yang        * Set the timestamp format.
153*2661106aSZhong Yang        *
154*2661106aSZhong Yang        * \see timestampFormat()
155*2661106aSZhong Yang        */
156*2661106aSZhong Yang       void setTimestampFormat(TimestampFormat f);
157*2661106aSZhong Yang 
158*2661106aSZhong Yang       /*!
159*2661106aSZhong Yang        * Sets the text with the time stamps.
160*2661106aSZhong Yang        *
161*2661106aSZhong Yang        * \see text()
162*2661106aSZhong Yang        */
163*2661106aSZhong Yang       void setSynchedEvents(const SynchedEventList &e);
164*2661106aSZhong Yang 
165*2661106aSZhong Yang     protected:
166*2661106aSZhong Yang       // Reimplementations.
167*2661106aSZhong Yang 
168*2661106aSZhong Yang       virtual void parseFields(const ByteVector &data);
169*2661106aSZhong Yang       virtual ByteVector renderFields() const;
170*2661106aSZhong Yang 
171*2661106aSZhong Yang     private:
172*2661106aSZhong Yang       /*!
173*2661106aSZhong Yang        * The constructor used by the FrameFactory.
174*2661106aSZhong Yang        */
175*2661106aSZhong Yang       EventTimingCodesFrame(const ByteVector &data, Header *h);
176*2661106aSZhong Yang       EventTimingCodesFrame(const EventTimingCodesFrame &);
177*2661106aSZhong Yang       EventTimingCodesFrame &operator=(const EventTimingCodesFrame &);
178*2661106aSZhong Yang 
179*2661106aSZhong Yang       class EventTimingCodesFramePrivate;
180*2661106aSZhong Yang       EventTimingCodesFramePrivate *d;
181*2661106aSZhong Yang     };
182*2661106aSZhong Yang 
183*2661106aSZhong Yang   }
184*2661106aSZhong Yang }
185*2661106aSZhong Yang #endif
186