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