1 #pragma once 2 3 #include <QColor> 4 #include <QMutex> 5 #include <QObject> 6 #include <memory> 7 #include <type_traits> // static_assert 8 9 #include "audio/types.h" 10 #include "track/cueinfo.h" 11 #include "track/trackid.h" 12 #include "util/color/rgbcolor.h" 13 #include "util/db/dbid.h" 14 15 class CueDAO; 16 class Track; 17 18 class Cue : public QObject { 19 Q_OBJECT 20 21 public: 22 static constexpr double kNoPosition = -1.0; 23 24 /// Invalid hot cue index 25 static constexpr int kNoHotCue = -1; 26 27 static_assert(kNoHotCue != mixxx::kFirstHotCueIndex, 28 "Conflicting definitions of invalid and first hot cue index"); 29 30 Cue(); 31 Cue( 32 const mixxx::CueInfo& cueInfo, 33 mixxx::audio::SampleRate sampleRate, 34 bool setDirty); 35 /// Load entity from database. 36 Cue( 37 DbId id, 38 TrackId trackId, 39 mixxx::CueType type, 40 double position, 41 double length, 42 int hotCue, 43 const QString& label, 44 mixxx::RgbColor color); 45 ~Cue() override = default; 46 47 bool isDirty() const; 48 DbId getId() const; 49 TrackId getTrackId() const; 50 51 mixxx::CueType getType() const; 52 void setType(mixxx::CueType type); 53 54 double getPosition() const; 55 void setStartPosition( 56 double samplePosition = kNoPosition); 57 void setEndPosition( 58 double samplePosition = kNoPosition); 59 void shiftPositionFrames(double frameOffset); 60 61 double getLength() const; 62 63 int getHotCue() const; 64 void setHotCue( 65 int hotCue = kNoHotCue); 66 67 QString getLabel() const; 68 void setLabel( 69 const QString& label = QString()); 70 71 mixxx::RgbColor getColor() const; 72 void setColor(mixxx::RgbColor color); 73 74 double getEndPosition() const; 75 76 mixxx::CueInfo getCueInfo( 77 mixxx::audio::SampleRate sampleRate) const; 78 79 signals: 80 void updated(); 81 82 private: 83 void setDirty(bool dirty); 84 85 void setId(DbId dbId); 86 void setTrackId(TrackId trackId); 87 88 mutable QMutex m_mutex; 89 90 bool m_bDirty; 91 DbId m_dbId; 92 TrackId m_trackId; 93 mixxx::CueType m_type; 94 double m_sampleStartPosition; 95 double m_sampleEndPosition; 96 int m_iHotCue; 97 QString m_label; 98 mixxx::RgbColor m_color; 99 100 friend class Track; 101 friend class CueDAO; 102 }; 103 104 class CuePointer : public std::shared_ptr<Cue> { 105 public: 106 CuePointer() = default; CuePointer(Cue * pCue)107 explicit CuePointer(Cue* pCue) 108 : std::shared_ptr<Cue>(pCue, deleteLater) { 109 } 110 111 private: 112 static void deleteLater(Cue* pCue); 113 }; 114 115 class CuePosition { 116 public: CuePosition()117 CuePosition() 118 : m_position(0.0) { 119 } CuePosition(double position)120 CuePosition(double position) 121 : m_position(position) { 122 } 123 getPosition()124 double getPosition() const { 125 return m_position; 126 } 127 setPosition(double position)128 void setPosition(double position) { 129 m_position = position; 130 } 131 set(double position)132 void set(double position) { 133 m_position = position; 134 } 135 reset()136 void reset() { 137 m_position = 0.0; 138 } 139 140 private: 141 double m_position; 142 }; 143 144 bool operator==(const CuePosition& lhs, const CuePosition& rhs); 145 146 inline bool operator!=(const CuePosition& lhs, const CuePosition& rhs) { 147 return !(lhs == rhs); 148 } 149 150 inline QDebug operator<<(QDebug dbg, const CuePosition& arg) { 151 return dbg << "position =" << arg.getPosition(); 152 } 153