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