forked from mixxxdj/mixxx
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtrack.h
395 lines (330 loc) · 12.7 KB
/
track.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
#pragma once
#include <QList>
#include <QMutex>
#include <QObject>
#include <QUrl>
#include "track/beats.h"
#include "track/cue.h"
#include "track/trackfile.h"
#include "track/trackrecord.h"
#include "util/memory.h"
#include "util/sandbox.h"
#include "waveform/waveform.h"
#include "sources/metadatasource.h"
// forward declaration(s)
class Track;
typedef std::shared_ptr<Track> TrackPointer;
typedef std::weak_ptr<Track> TrackWeakPointer;
Q_DECLARE_METATYPE(TrackPointer);
enum class ExportTrackMetadataResult {
Succeeded,
Failed,
Skipped,
};
class Track : public QObject {
Q_OBJECT
public:
Track(TrackFile fileInfo,
SecurityTokenPointer pSecurityToken,
TrackId trackId = TrackId());
Track(const Track&) = delete;
~Track() override;
// Creates a new empty temporary instance for fake tracks or for
// testing purposes. The resulting track will neither be stored
// in the database nor will the metadata of the corresponding file
// be updated.
// Use SoundSourceProxy::importTemporaryTrack() for importing files
// to ensure that the file will not be written while reading it!
static TrackPointer newTemporary(
TrackFile fileInfo = TrackFile(),
SecurityTokenPointer pSecurityToken = SecurityTokenPointer());
// Creates a dummy instance only for testing purposes.
static TrackPointer newDummy(
TrackFile fileInfo,
TrackId trackId);
Q_PROPERTY(QString artist READ getArtist WRITE setArtist)
Q_PROPERTY(QString title READ getTitle WRITE setTitle)
Q_PROPERTY(QString album READ getAlbum WRITE setAlbum)
Q_PROPERTY(QString albumArtist READ getAlbumArtist WRITE setAlbumArtist)
Q_PROPERTY(QString genre READ getGenre WRITE setGenre)
Q_PROPERTY(QString composer READ getComposer WRITE setComposer)
Q_PROPERTY(QString grouping READ getGrouping WRITE setGrouping)
Q_PROPERTY(QString year READ getYear WRITE setYear)
Q_PROPERTY(QString track_number READ getTrackNumber WRITE setTrackNumber)
Q_PROPERTY(QString track_total READ getTrackTotal WRITE setTrackTotal)
Q_PROPERTY(int times_played READ getTimesPlayed)
Q_PROPERTY(QString comment READ getComment WRITE setComment)
Q_PROPERTY(double bpm READ getBpm WRITE setBpm)
Q_PROPERTY(QString bpmFormatted READ getBpmText STORED false)
Q_PROPERTY(QString key READ getKeyText WRITE setKeyText)
Q_PROPERTY(double duration READ getDuration WRITE setDuration)
Q_PROPERTY(QString durationFormatted READ getDurationTextSeconds STORED false)
Q_PROPERTY(QString durationFormattedCentiseconds READ getDurationTextCentiseconds STORED false)
Q_PROPERTY(QString durationFormattedMilliseconds READ getDurationTextMilliseconds STORED false)
TrackFile getFileInfo() const {
// Copying TrackFile/QFileInfo is thread-safe (implicit sharing), no locking needed.
return m_fileInfo;
}
SecurityTokenPointer getSecurityToken() const {
// Copying a QSharedPointer is thread-safe, no locking needed.
return m_pSecurityToken;
}
TrackId getId() const;
// Returns absolute path to the file, including the filename.
QString getLocation() const {
return m_fileInfo.location();
}
// The (refreshed) canonical location
QString getCanonicalLocation() const;
// Checks if the file exists
bool checkFileExists() const {
return m_fileInfo.checkFileExists();
}
// File/format type
void setType(const QString&);
QString getType() const;
// Set number of channels
void setChannels(int iChannels);
// Get number of channels
int getChannels() const;
// Set sample rate
void setSampleRate(int iSampleRate);
// Get sample rate
int getSampleRate() const;
// Sets the bitrate
void setBitrate(int);
// Returns the bitrate
int getBitrate() const;
// Returns the bitrate as a string
QString getBitrateText() const;
void setDuration(mixxx::Duration duration);
void setDuration(double duration);
double getDuration() const {
return getDuration(DurationRounding::NONE);
}
// Returns the duration rounded to seconds
int getDurationInt() const {
return static_cast<int>(getDuration(DurationRounding::SECONDS));
}
// Returns the duration formatted as a string (H:MM:SS or H:MM:SS.cc or H:MM:SS.mmm)
QString getDurationText(mixxx::Duration::Precision precision) const;
// Helper functions for Q_PROPERTYs
QString getDurationTextSeconds() const {
return getDurationText(mixxx::Duration::Precision::SECONDS);
}
QString getDurationTextCentiseconds() const {
return getDurationText(mixxx::Duration::Precision::CENTISECONDS);
}
QString getDurationTextMilliseconds() const {
return getDurationText(mixxx::Duration::Precision::MILLISECONDS);
}
// Set BPM
double setBpm(double);
// Returns BPM
double getBpm() const;
// Returns BPM as a string
QString getBpmText() const;
// A track with a locked BPM will not be re-analyzed by the beats or bpm
// analyzer.
void setBpmLocked(bool bpmLocked = true);
bool isBpmLocked() const;
// Set ReplayGain
void setReplayGain(const mixxx::ReplayGain&);
// Returns ReplayGain
mixxx::ReplayGain getReplayGain() const;
// Indicates if the metadata has been parsed from file tags.
bool isMetadataSynchronized() const;
// Only used by a free function in TrackDAO!
void setMetadataSynchronized(bool metadataSynchronized);
void setDateAdded(const QDateTime& dateAdded);
QDateTime getDateAdded() const;
// Getter/Setter methods for metadata
// Return title
QString getTitle() const;
// Set title
void setTitle(const QString&);
// Return artist
QString getArtist() const;
// Set artist
void setArtist(const QString&);
// Return album
QString getAlbum() const;
// Set album
void setAlbum(const QString&);
// Return album artist
QString getAlbumArtist() const;
// Set album artist
void setAlbumArtist(const QString&);
// Return Year
QString getYear() const;
// Set year
void setYear(const QString&);
// Return genre
QString getGenre() const;
// Set genre
void setGenre(const QString&);
// Returns the track color
mixxx::RgbColor::optional_t getColor() const;
// Sets the track color
void setColor(mixxx::RgbColor::optional_t);
// Returns the user comment
QString getComment() const;
// Sets the user commnet
void setComment(const QString&);
// Return composer
QString getComposer() const;
// Set composer
void setComposer(const QString&);
// Return grouping
QString getGrouping() const;
// Set grouping
void setGrouping(const QString&);
// Return track number/total
QString getTrackNumber() const;
QString getTrackTotal() const;
// Set track number/total
void setTrackNumber(const QString&);
void setTrackTotal(const QString&);
PlayCounter getPlayCounter() const;
void setPlayCounter(const PlayCounter& playCounter);
void resetPlayCounter(int iTimesPlayed = 0) {
setPlayCounter(PlayCounter(iTimesPlayed));
}
// Sets played status and increments or decrements the play count
void updatePlayCounter(bool bPlayed = true);
// Only required for the times_played property
int getTimesPlayed() const {
return getPlayCounter().getTimesPlayed();
}
// Returns rating
int getRating() const;
// Sets rating
void setRating(int);
// Get URL for track
QString getURL() const;
// Set URL for track
void setURL(const QString& url);
// Output a formatted string with artist and title.
QString getInfo() const;
ConstWaveformPointer getWaveform() const;
void setWaveform(ConstWaveformPointer pWaveform);
ConstWaveformPointer getWaveformSummary() const;
void setWaveformSummary(ConstWaveformPointer pWaveform);
// Get the track's main cue point
CuePosition getCuePoint() const;
// Set the track's main cue point
void setCuePoint(CuePosition cue);
// Calls for managing the track's cue points
CuePointer createAndAddCue();
CuePointer findCueByType(mixxx::CueType type) const; // NOTE: Cannot be used for hotcues.
void removeCue(const CuePointer& pCue);
void removeCuesOfType(mixxx::CueType);
QList<CuePointer> getCuePoints() const;
void setCuePoints(const QList<CuePointer>& cuePoints);
void importCuePoints(const QList<mixxx::CueInfo>& cueInfos);
bool isDirty();
// Get the track's Beats list
BeatsPointer getBeats() const;
// Set the track's Beats
void setBeats(BeatsPointer beats);
void resetKeys();
void setKeys(const Keys& keys);
Keys getKeys() const;
void setKey(mixxx::track::io::key::ChromaticKey key,
mixxx::track::io::key::Source keySource);
void setKeyText(const QString& keyText,
mixxx::track::io::key::Source keySource = mixxx::track::io::key::USER);
mixxx::track::io::key::ChromaticKey getKey() const;
QString getKeyText() const;
void setCoverInfo(const CoverInfoRelative& coverInfo);
CoverInfoRelative getCoverInfo() const;
CoverInfo getCoverInfoWithLocation() const;
quint16 getCoverHash() const;
// Set/get track metadata and cover art (optional) all at once.
void importMetadata(
mixxx::TrackMetadata importedMetadata,
QDateTime metadataSynchronized = QDateTime());
// Merge additional metadata that is not (yet) stored in the database
// and only available from file tags.
void mergeImportedMetadata(
const mixxx::TrackMetadata& importedMetadata);
void readTrackMetadata(
mixxx::TrackMetadata* pTrackMetadata,
bool* pMetadataSynchronized = nullptr) const;
void readTrackRecord(
mixxx::TrackRecord* pTrackRecord,
bool* pDirty = nullptr) const;
// Mark the track dirty if it isn't already.
void markDirty();
// Mark the track clean if it isn't already.
void markClean();
// Explicitly request to export the track's metadata. The actual
// export is deferred to prevent race conditions when writing into
// files that are still opened for reading.
void markForMetadataExport();
bool isMarkedForMetadataExport() const;
signals:
void waveformUpdated();
void waveformSummaryUpdated();
void coverArtUpdated();
void bpmUpdated(double bpm);
void beatsUpdated();
void keyUpdated(double key);
void keysUpdated();
void ReplayGainUpdated(mixxx::ReplayGain replayGain);
void cuesUpdated();
void changed(TrackId trackId);
void dirty(TrackId trackId);
void clean(TrackId trackId);
private slots:
void slotCueUpdated();
void slotBeatsUpdated();
private:
// Set a unique identifier for the track. Only used by
// GlobalTrackCacheResolver!
void initId(TrackId id);
// Reset the unique identifier after purged from library
// which undos a previous add. Only used by
// GlobalTrackCacheResolver!
void resetId();
void relocate(
TrackFile fileInfo,
SecurityTokenPointer pSecurityToken = SecurityTokenPointer());
// Set whether the TIO is dirty or not and unlock before emitting
// any signals. This must only be called from member functions
// while the TIO is locked.
void markDirtyAndUnlock(QMutexLocker* pLock, bool bDirty = true);
void setDirtyAndUnlock(QMutexLocker* pLock, bool bDirty);
void setBeatsAndUnlock(QMutexLocker* pLock, BeatsPointer pBeats);
void afterKeysUpdated(QMutexLocker* pLock);
enum class DurationRounding {
SECONDS, // rounded to full seconds
NONE // unmodified
};
double getDuration(DurationRounding rounding) const;
ExportTrackMetadataResult exportMetadata(
mixxx::MetadataSourcePointer pMetadataSource);
// Mutex protecting access to object
mutable QMutex m_qMutex;
// The file
mutable TrackFile m_fileInfo;
SecurityTokenPointer m_pSecurityToken;
mixxx::TrackRecord m_record;
// Flag that indicates whether or not the TIO has changed. This is used by
// TrackDAO to determine whether or not to write the Track back.
bool m_bDirty;
// Flag indicating that the user has explicitly requested to save
// the metadata.
bool m_bMarkedForMetadataExport;
// The list of cue points for the track
QList<CuePointer> m_cuePoints;
// Storage for the track's beats
BeatsPointer m_pBeats;
//Visual waveform data
ConstWaveformPointer m_waveform;
ConstWaveformPointer m_waveformSummary;
friend class TrackDAO;
friend class GlobalTrackCache;
friend class GlobalTrackCacheResolver;
friend class SoundSourceProxy;
};