Merge lp:~mixxxdevelopers/mixxx/features_sqlite into lp:~mixxxdevelopers/mixxx/trunk

Proposed by RJ Skerry-Ryan
Status: Merged
Merged at revision: 2436
Proposed branch: lp:~mixxxdevelopers/mixxx/features_sqlite
Merge into: lp:~mixxxdevelopers/mixxx/trunk
Diff against target: 4444 lines (+710/-654)
117 files modified
mixxx/src/analyser.h (+5/-5)
mixxx/src/analyserbpm.cpp (+5/-5)
mixxx/src/analyserbpm.h (+14/-14)
mixxx/src/analyserqueue.cpp (+14/-9)
mixxx/src/analyserqueue.h (+14/-14)
mixxx/src/analyserwaveform.cpp (+11/-11)
mixxx/src/analyserwaveform.h (+8/-8)
mixxx/src/analyserwavesummary.cpp (+2/-2)
mixxx/src/analyserwavesummary.h (+7/-7)
mixxx/src/bpm/bpmreceiver.h (+0/-47)
mixxx/src/cachingreader.cpp (+5/-5)
mixxx/src/cachingreader.h (+7/-7)
mixxx/src/dlgautodj.cpp (+7/-7)
mixxx/src/dlgautodj.h (+3/-2)
mixxx/src/dlgprepare.cpp (+16/-15)
mixxx/src/dlgprepare.h (+4/-4)
mixxx/src/dlgtrackinfo.cpp (+3/-3)
mixxx/src/dlgtrackinfo.h (+4/-3)
mixxx/src/encodermp3.cpp (+30/-30)
mixxx/src/encodermp3.h (+3/-3)
mixxx/src/encodervorbis.cpp (+8/-8)
mixxx/src/encodervorbis.h (+3/-3)
mixxx/src/engine/cuecontrol.cpp (+6/-6)
mixxx/src/engine/cuecontrol.h (+4/-4)
mixxx/src/engine/enginebuffer.cpp (+8/-8)
mixxx/src/engine/enginebuffer.h (+6/-6)
mixxx/src/engine/engineclipping.cpp (+1/-1)
mixxx/src/engine/engineshoutcast.cpp (+2/-2)
mixxx/src/engine/engineshoutcast.h (+2/-2)
mixxx/src/library/abstractxmltrackmodel.cpp (+7/-12)
mixxx/src/library/abstractxmltrackmodel.h (+3/-5)
mixxx/src/library/autodjfeature.cpp (+4/-4)
mixxx/src/library/basesqltablemodel.cpp (+1/-1)
mixxx/src/library/basesqltablemodel.h (+0/-1)
mixxx/src/library/browsefeature.cpp (+4/-4)
mixxx/src/library/browsetablemodel.cpp (+3/-3)
mixxx/src/library/browsetablemodel.h (+2/-2)
mixxx/src/library/cratetablemodel.cpp (+1/-1)
mixxx/src/library/cratetablemodel.h (+1/-1)
mixxx/src/library/dao/cue.h (+1/-2)
mixxx/src/library/dao/cuedao.h (+2/-2)
mixxx/src/library/dao/playlistdao.h (+0/-1)
mixxx/src/library/dao/trackdao.cpp (+99/-16)
mixxx/src/library/dao/trackdao.h (+20/-6)
mixxx/src/library/itunesplaylistmodel.cpp (+4/-4)
mixxx/src/library/itunesplaylistmodel.h (+1/-2)
mixxx/src/library/itunestrackmodel.cpp (+6/-5)
mixxx/src/library/itunestrackmodel.h (+2/-3)
mixxx/src/library/legacylibraryimporter.cpp (+9/-3)
mixxx/src/library/library.cpp (+12/-13)
mixxx/src/library/library.h (+6/-6)
mixxx/src/library/libraryfeature.h (+4/-3)
mixxx/src/library/librarytablemodel.cpp (+1/-1)
mixxx/src/library/librarytablemodel.h (+1/-1)
mixxx/src/library/missingtablemodel.cpp (+1/-1)
mixxx/src/library/missingtablemodel.h (+1/-1)
mixxx/src/library/playlisttablemodel.cpp (+1/-1)
mixxx/src/library/playlisttablemodel.h (+1/-1)
mixxx/src/library/preparefeature.cpp (+4/-4)
mixxx/src/library/promotracksfeature.cpp (+10/-6)
mixxx/src/library/promotracksfeature.h (+3/-3)
mixxx/src/library/promotrackswebview.cpp (+9/-7)
mixxx/src/library/promotrackswebview.h (+5/-5)
mixxx/src/library/proxytrackmodel.cpp (+1/-1)
mixxx/src/library/proxytrackmodel.h (+1/-1)
mixxx/src/library/rhythmboxplaylistmodel.cpp (+2/-2)
mixxx/src/library/rhythmboxplaylistmodel.h (+1/-2)
mixxx/src/library/rhythmboxtrackmodel.cpp (+3/-2)
mixxx/src/library/rhythmboxtrackmodel.h (+1/-2)
mixxx/src/library/trackcollection.h (+0/-1)
mixxx/src/library/trackmodel.h (+2/-3)
mixxx/src/mixxx.cpp (+30/-27)
mixxx/src/mixxx.h (+3/-3)
mixxx/src/mixxxview.cpp (+55/-55)
mixxx/src/mixxxview.h (+7/-7)
mixxx/src/player.cpp (+15/-15)
mixxx/src/player.h (+7/-7)
mixxx/src/playerinfo.cpp (+6/-6)
mixxx/src/playerinfo.h (+5/-5)
mixxx/src/soundsourcemp3.h (+0/-1)
mixxx/src/soundsourceoggvorbis.h (+0/-3)
mixxx/src/soundsourceproxy.cpp (+15/-16)
mixxx/src/soundsourceproxy.h (+4/-4)
mixxx/src/soundsourcesndfile.h (+1/-2)
mixxx/src/test/analyserbpmtest.cpp (+2/-2)
mixxx/src/test/analyserwaveformtest.cpp (+2/-2)
mixxx/src/test/analyserwavesummarytest.cpp (+2/-2)
mixxx/src/trackinfoobject.cpp (+6/-2)
mixxx/src/trackinfoobject.h (+12/-4)
mixxx/src/waveform/glwaveformrenderer.cpp (+26/-26)
mixxx/src/waveform/glwaveformrenderer.h (+4/-5)
mixxx/src/waveform/renderobject.h (+3/-3)
mixxx/src/waveform/waveformrenderbackground.cpp (+3/-3)
mixxx/src/waveform/waveformrenderbackground.h (+1/-2)
mixxx/src/waveform/waveformrenderbeat.cpp (+2/-2)
mixxx/src/waveform/waveformrenderbeat.h (+2/-3)
mixxx/src/waveform/waveformrenderer.cpp (+3/-3)
mixxx/src/waveform/waveformrenderer.h (+4/-4)
mixxx/src/waveform/waveformrendermark.cpp (+1/-1)
mixxx/src/waveform/waveformrendermark.h (+2/-3)
mixxx/src/waveform/waveformrendermarkrange.cpp (+1/-1)
mixxx/src/waveform/waveformrendermarkrange.h (+2/-3)
mixxx/src/waveform/waveformrendersignal.cpp (+1/-1)
mixxx/src/waveform/waveformrendersignal.h (+2/-3)
mixxx/src/waveform/waveformrendersignalpixmap.cpp (+8/-8)
mixxx/src/waveform/waveformrendersignalpixmap.h (+2/-3)
mixxx/src/waveform/waveformrendersignaltiles.cpp (+1/-1)
mixxx/src/waveform/waveformrendersignaltiles.h (+2/-3)
mixxx/src/widget/wglwaveformviewer.h (+0/-1)
mixxx/src/widget/wlibrarytableview.h (+3/-3)
mixxx/src/widget/woverview.cpp (+6/-1)
mixxx/src/widget/woverview.h (+3/-2)
mixxx/src/widget/wvisualsimple.cpp (+3/-7)
mixxx/src/widget/wvisualsimple.h (+1/-3)
mixxx/src/widget/wwaveformviewer.h (+2/-3)
mixxx/src/wtracktableview.cpp (+4/-4)
mixxx/src/wtracktableview.h (+4/-3)
To merge this branch: bzr merge lp:~mixxxdevelopers/mixxx/features_sqlite
Reviewer Review Type Date Requested Status
Albert Santoni Approve
Review via email: mp+30231@code.launchpad.net

Description of the change

The latest changes add a TrackPointer datatype which converts almost every use of TrackInfoObject* to a QSharedPointer<TrackInfoObject>. This provides reference counting for TIO's and allows them to be deleted when their reference count drops to 0 instead of leaking the memory. 20 tracks are cached in memory with an LRU cache. This allows more recent tracks to stay in memory so they do not have to be re-analyzed (waveform) when reloaded very soon after being unloaded.

To post a comment you must log in.
2390. By RJ Skerry-Ryan

Merging from trunk.

Revision history for this message
Albert Santoni (gamegod) wrote :

I've looked over all the instances where TrackPointer is used, and everywhere TrackInfoObject pointers are still used.

Questions and comments:
- Why does CachingReader only use TrackWeakPointer in its track queue? (after which the weak pointer is promoted to a TrackPointer again)

- If we're still in agreement that slotTrackDirty() and slotTrackChanged() do not pose a safety risk with their casted sender() calls because we use Qt's deleteLater() to free memory at the _end_ of an event loop, then the comments in those functions should be updated.

- I've removed bpmreceiver.h as it's not used and contained some references to TrackInfoObject. This class was probably an attempt at implementing the observer design pattern, though it doesn't make any sense since Qt provides slots and signals as a much nicer solution. (Committed in r2391.)

- I think the minor "memory leaks" I saw while testing (which I said were comparable to 1.8) may have just been the TIO cache of 20 songs. I doubt I tested more songs than that.

Thanks!
Albert

review: Approve
2391. By Albert Santoni

Removed references to BPM stuff in TrackInfoObject for cleanup. Removed unused bpmreceiver.h

Revision history for this message
RJ Skerry-Ryan (rryan) wrote :

On Thu, Jul 22, 2010 at 9:57 AM, Albert Santoni <email address hidden> wrote:

> Review: Approve
> I've looked over all the instances where TrackPointer is used, and
> everywhere TrackInfoObject pointers are still used.
>
> Questions and comments:
> - Why does CachingReader only use TrackWeakPointer in its track queue?
> (after which the weak pointer is promoted to a TrackPointer again)
>
> Well, hm. I originally did this so that if a track was queued and then
rapidly some other track was loaded that there wouldn't be a dangling
reference to the track which could cause a leak. This actually doesn't make
much sense. It makes more sense on the AnalyserQueue, but I found that if I
enqueued a weak reference to the track the TIO reference count would drop to
0 and nothing would load. The motivation was, if you queue up 5 tracks, but
only leave the 5th in the player, the analyser queue should skip the 4 and
just work on the 5th. Now that the track cache is in place, this is mostly
irrelevant. I changed it to a TrackPointer.

> - If we're still in agreement that slotTrackDirty() and slotTrackChanged()
> do not pose a safety risk with their casted sender() calls because we use
> Qt's deleteLater() to free memory at the _end_ of an event loop, then the
> comments in those functions should be updated.
>

Done.

>
> - I've removed bpmreceiver.h as it's not used and contained some references
> to TrackInfoObject. This class was probably an attempt at implementing the
> observer design pattern, though it doesn't make any sense since Qt provides
> slots and signals as a much nicer solution. (Committed in r2391.)
>
> Sounds good.

> - I think the minor "memory leaks" I saw while testing (which I said were
> comparable to 1.8) may have just been the TIO cache of 20 songs. I doubt I
> tested more songs than that.
>

Thanks I'll merge this into trunk then,
RJ

>
> Thanks!
> Albert
> --
>
> https://code.launchpad.net/~mixxxdevelopers/mixxx/features_sqlite/+merge/30231
> Your team Mixxx Development Team is subscribed to branch lp:mixxx.
>

2392. By RJ Skerry-Ryan

Update comments and remove use of TrackWeakPointer as per Albert's review.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'mixxx/src/analyser.h'
2--- mixxx/src/analyser.h 2009-02-02 20:43:30 +0000
3+++ mixxx/src/analyser.h 2010-07-22 07:29:40 +0000
4@@ -11,15 +11,15 @@
5 * -- Adam
6 */
7
8-class TrackInfoObject;
9+#include "trackinfoobject.h"
10
11 class Analyser {
12
13 public:
14- virtual void initialise(TrackInfoObject* tio, int sampleRate, int totalSamples) { }
15- virtual void process(const CSAMPLE* pIn, const int iLen) = 0;
16- virtual void finalise(TrackInfoObject* tio) { }
17- virtual ~Analyser() {}
18+ virtual void initialise(TrackPointer tio, int sampleRate, int totalSamples) { }
19+ virtual void process(const CSAMPLE* pIn, const int iLen) = 0;
20+ virtual void finalise(TrackPointer tio) { }
21+ virtual ~Analyser() {}
22 };
23
24 #endif
25
26=== modified file 'mixxx/src/analyserbpm.cpp'
27--- mixxx/src/analyserbpm.cpp 2010-01-14 23:32:38 +0000
28+++ mixxx/src/analyserbpm.cpp 2010-07-22 07:29:40 +0000
29@@ -11,7 +11,7 @@
30 m_pDetector = NULL;
31 }
32
33-void AnalyserBPM::initialise(TrackInfoObject* tio, int sampleRate, int totalSamples) {
34+void AnalyserBPM::initialise(TrackPointer tio, int sampleRate, int totalSamples) {
35 m_iMinBpm = m_pConfig->getValueString(ConfigKey("[BPM]","BPMRangeStart")).toInt();
36 m_iMaxBpm = m_pConfig->getValueString(ConfigKey("[BPM]","BPMRangeEnd")).toInt();
37 m_bProcessEntireSong = (bool)m_pConfig->getValueString(ConfigKey("[BPM]","AnalyzeEntireSong")).toInt();
38@@ -57,17 +57,17 @@
39 return BPM;
40 }
41
42-void AnalyserBPM::finalise(TrackInfoObject *tio) {
43+void AnalyserBPM::finalise(TrackPointer tio) {
44 // Check if BPM detection is enabled
45 if(m_pDetector == NULL) {
46 return;
47 }
48-
49+
50 float bpm = m_pDetector->getBpm();
51 if(bpm != 0) {
52 // Shift it by 2's until it is in the desired range
53 float newbpm = correctBPM(bpm, m_iMinBpm, m_iMaxBpm, m_pConfig->getValueString(ConfigKey("[BPM]","BPMAboveRangeEnabled")).toInt());
54-
55+
56 tio->setBpm(newbpm);
57 tio->setBpmConfirm();
58 //if(pBpmReceiver) {
59@@ -83,4 +83,4 @@
60 delete m_pDetector;
61 m_pDetector = NULL;
62
63-}
64+}
65
66=== modified file 'mixxx/src/analyserbpm.h'
67--- mixxx/src/analyserbpm.h 2010-01-14 23:32:38 +0000
68+++ mixxx/src/analyserbpm.h 2010-07-22 07:29:40 +0000
69@@ -9,20 +9,20 @@
70
71 class AnalyserBPM : public Analyser {
72
73- public:
74- AnalyserBPM(ConfigObject<ConfigValue> *_config);
75- void initialise(TrackInfoObject* tio, int sampleRate, int totalSamples);
76- void process(const CSAMPLE *pIn, const int iLen);
77- void finalise(TrackInfoObject* tio);
78-
79- private:
80- float correctBPM(float BPM, int min, int max, int aboveRange);
81-
82- ConfigObject<ConfigValue> *m_pConfig;
83- soundtouch::BPMDetect *m_pDetector;
84- int m_iMinBpm, m_iMaxBpm;
85- bool m_bProcessEntireSong;
86-
87+ public:
88+ AnalyserBPM(ConfigObject<ConfigValue> *_config);
89+ void initialise(TrackPointer tio, int sampleRate, int totalSamples);
90+ void process(const CSAMPLE *pIn, const int iLen);
91+ void finalise(TrackPointer tio);
92+
93+ private:
94+ float correctBPM(float BPM, int min, int max, int aboveRange);
95+
96+ ConfigObject<ConfigValue> *m_pConfig;
97+ soundtouch::BPMDetect *m_pDetector;
98+ int m_iMinBpm, m_iMaxBpm;
99+ bool m_bProcessEntireSong;
100+
101 };
102
103 #endif
104
105=== modified file 'mixxx/src/analyserqueue.cpp'
106--- mixxx/src/analyserqueue.cpp 2010-03-10 07:25:55 +0000
107+++ mixxx/src/analyserqueue.cpp 2010-07-22 07:29:40 +0000
108@@ -33,7 +33,7 @@
109 m_aq.push_back(an);
110 }
111
112-TrackInfoObject* AnalyserQueue::dequeueNextBlocking() {
113+TrackPointer AnalyserQueue::dequeueNextBlocking() {
114 m_qm.lock();
115
116 if (m_tioq.isEmpty()) {
117@@ -41,20 +41,20 @@
118
119 if (m_exit) {
120 m_qm.unlock();
121- return NULL;
122+ return TrackPointer();
123 }
124 }
125
126- TrackInfoObject* tio = m_tioq.dequeue();
127+ // Implicit cast to TrackPointer from weak pointer
128+ TrackPointer pTrack = m_tioq.dequeue();
129
130 m_qm.unlock();
131
132- Q_ASSERT(tio != NULL);
133-
134- return tio;
135+ // pTrack might be NULL, up to the caller to check.
136+ return pTrack;
137 }
138
139-void AnalyserQueue::doAnalysis(TrackInfoObject* tio, SoundSourceProxy *pSoundSource) {
140+void AnalyserQueue::doAnalysis(TrackPointer tio, SoundSourceProxy *pSoundSource) {
141
142 // TonalAnalyser requires a block size of 65536. Using a different value
143 // breaks the tonal analyser. We need to use a smaller block size becuase on
144@@ -133,11 +133,16 @@
145 return;
146
147 while (!m_exit) {
148- TrackInfoObject* next = dequeueNextBlocking();
149+ TrackPointer next = dequeueNextBlocking();
150
151 if (m_exit) //When exit is set, it makes the above unblock first.
152 return;
153
154+ // If the track is NULL, get the next one. Could happen if the track was
155+ // queued but then deleted.
156+ if (!next)
157+ continue;
158+
159 // Get the audio
160 SoundSourceProxy * pSoundSource = new SoundSourceProxy(next);
161 pSoundSource->open(); //Open the file for reading
162@@ -168,7 +173,7 @@
163 }
164 }
165
166-void AnalyserQueue::queueAnalyseTrack(TrackInfoObject* tio) {
167+void AnalyserQueue::queueAnalyseTrack(TrackPointer tio) {
168 m_qm.lock();
169 m_tioq.enqueue(tio);
170 m_qwait.wakeAll();
171
172=== modified file 'mixxx/src/analyserqueue.h'
173--- mixxx/src/analyserqueue.h 2009-11-15 21:30:38 +0000
174+++ mixxx/src/analyserqueue.h 2010-07-22 07:29:40 +0000
175@@ -14,7 +14,7 @@
176
177 class AnalyserQueue : public QThread {
178 Q_OBJECT
179-
180+
181 public:
182 AnalyserQueue();
183 virtual ~AnalyserQueue();
184@@ -26,27 +26,27 @@
185 static AnalyserQueue* createAnalyserQueue(QList<Analyser*> analysers);
186
187 public slots:
188- void queueAnalyseTrack(TrackInfoObject* tio);
189-
190+ void queueAnalyseTrack(TrackPointer tio);
191+
192 signals:
193- void trackProgress(TrackInfoObject*,int);
194- void trackFinished(TrackInfoObject*);
195-
196+ void trackProgress(TrackPointer pTrack,int progress);
197+ void trackFinished(TrackPointer pTrack);
198+
199 protected:
200 void run();
201-
202+
203 private:
204 void addAnalyser(Analyser* an);
205-
206+
207 QList<Analyser*> m_aq;
208-
209- TrackInfoObject* dequeueNextBlocking();
210- void doAnalysis(TrackInfoObject* tio, SoundSourceProxy *pSoundSource);
211-
212+
213+ TrackPointer dequeueNextBlocking();
214+ void doAnalysis(TrackPointer tio, SoundSourceProxy *pSoundSource);
215+
216 bool m_exit;
217-
218+
219 // The processing queue and associated mutex
220- QQueue<TrackInfoObject*> m_tioq;
221+ QQueue<TrackPointer> m_tioq;
222 QMutex m_qm;
223 QWaitCondition m_qwait;
224 };
225
226=== modified file 'mixxx/src/analyserwaveform.cpp'
227--- mixxx/src/analyserwaveform.cpp 2009-07-14 19:01:34 +0000
228+++ mixxx/src/analyserwaveform.cpp 2010-07-22 07:29:40 +0000
229@@ -11,24 +11,24 @@
230 downsampleVector = NULL;
231 }
232
233-void AnalyserWaveform::initialise(TrackInfoObject* tio, int sampleRate, int totalSamples) {
234+void AnalyserWaveform::initialise(TrackPointer tio, int sampleRate, int totalSamples) {
235
236 if(tio->getVisualWaveform() != NULL) {
237 return;
238 }
239-
240+
241 if(totalSamples == 0) {
242 return; //?
243 }
244
245 double mz = tio->getVisualResampleRate();
246 double n = double(sampleRate) / mz;
247-
248- QByteArray err_tmp = QString("TrackInfoObject %1 returned bad data: VisualResampleRate=%2, n=%3") .arg(tio->getId()).arg(mz).arg(n).toAscii();
249+
250+ QByteArray err_tmp = QString("TrackPointer %1 returned bad data: VisualResampleRate=%2, n=%3") .arg(tio->getId()).arg(mz).arg(n).toAscii();
251 Q_ASSERT_X(mz != 0 && n > 0,"AnalyserWaveform::initialise",err_tmp);
252-
253+
254 if (mz == 0 || n <= 0) {
255- qDebug() << "TrackInfoObject" << tio->getId() << "returned bad data: tio->getVisualResampleRate()=" << mz << "n=" << n << "Aborting analysis";
256+ qDebug() << "TrackPointer" << tio->getId() << "returned bad data: tio->getVisualResampleRate()=" << mz << "n=" << n << "Aborting analysis";
257 return;
258 }
259
260@@ -72,7 +72,7 @@
261
262 //qDebug() << "AnalyserWaveform::process() processing " << iLen << " samples";
263 for(int i=0; i<iLen; i+=2) {
264-
265+
266 if(m_iBufferPos >= m_iStrideLength) {
267 //(*downsample)[m_iCurPos] = m_fLMax;
268 *(downsampleVector++) = m_fLMax;
269@@ -81,7 +81,7 @@
270 //(*downsample)[m_iCurPos] = m_fRMax;
271 *(downsampleVector++) = m_fRMax;
272 m_iCurPos++;
273-
274+
275 m_iBufferPos = 0;
276 m_fLMax = -1.0f;
277 m_fRMax = -1.0f;
278@@ -95,19 +95,19 @@
279 if(sr > m_fRMax)
280 m_fRMax = sr;
281 }
282-
283+
284 m_iBufferPos += 2;
285 }
286 }
287
288-void AnalyserWaveform::finalise(TrackInfoObject *tio) {
289+void AnalyserWaveform::finalise(TrackPointer tio) {
290 if(downsample == NULL) {
291 return;
292 }
293
294 downsample = NULL;
295 downsampleVector = NULL;
296-
297+
298 qDebug() << "AnalyserWaveform :: Waveform downsampling finished.";
299 m_iStartTime = clock() - m_iStartTime;
300 qDebug() << "AnalyserWaveform :: Generation took " << double(m_iStartTime) / CLOCKS_PER_SEC << " seconds";
301
302=== modified file 'mixxx/src/analyserwaveform.h'
303--- mixxx/src/analyserwaveform.h 2009-02-01 21:40:44 +0000
304+++ mixxx/src/analyserwaveform.h 2010-07-22 07:29:40 +0000
305@@ -5,16 +5,16 @@
306
307 class AnalyserWaveform : public Analyser {
308
309-public:
310- AnalyserWaveform();
311- void initialise(TrackInfoObject* tio, int sampleRate, int totalSamples);
312- void process(const CSAMPLE *pIn, const int iLen);
313- void finalise(TrackInfoObject* tio);
314+ public:
315+ AnalyserWaveform();
316+ void initialise(TrackPointer tio, int sampleRate, int totalSamples);
317+ void process(const CSAMPLE *pIn, const int iLen);
318+ void finalise(TrackPointer tio);
319
320-private:
321- QVector<float> *downsample;
322+ private:
323+ QVector<float> *downsample;
324 float *downsampleVector;
325-
326+
327 int m_iStartTime;
328 int m_iStrideLength;
329 int m_iCurPos;
330
331=== modified file 'mixxx/src/analyserwavesummary.cpp'
332--- mixxx/src/analyserwavesummary.cpp 2009-12-22 17:19:20 +0000
333+++ mixxx/src/analyserwavesummary.cpp 2010-07-22 07:29:40 +0000
334@@ -17,7 +17,7 @@
335 m_pData = NULL;
336 }
337
338-void AnalyserWavesummary::initialise(TrackInfoObject* tio, int sampleRate, int totalSamples) {
339+void AnalyserWavesummary::initialise(TrackPointer tio, int sampleRate, int totalSamples) {
340 // Check if the preview has already been generated
341 const QByteArray* p = tio->getWaveSummary();
342 if(p != NULL && p->size() > 0) {
343@@ -69,7 +69,7 @@
344 }
345 }
346
347-void AnalyserWavesummary::finalise(TrackInfoObject *tio) {
348+void AnalyserWavesummary::finalise(TrackPointer tio) {
349 if(m_pData == NULL)
350 return;
351 tio->setWaveSummary(m_pData, true);
352
353=== modified file 'mixxx/src/analyserwavesummary.h'
354--- mixxx/src/analyserwavesummary.h 2009-08-13 21:42:47 +0000
355+++ mixxx/src/analyserwavesummary.h 2010-07-22 07:29:40 +0000
356@@ -7,14 +7,14 @@
357
358 class AnalyserWavesummary : public Analyser {
359
360-public:
361- AnalyserWavesummary();
362- void initialise(TrackInfoObject* tio, int sampleRate, int totalSamples);
363- void process(const CSAMPLE *pIn, const int iLen);
364- void finalise(TrackInfoObject* tio);
365+ public:
366+ AnalyserWavesummary();
367+ void initialise(TrackPointer tio, int sampleRate, int totalSamples);
368+ void process(const CSAMPLE *pIn, const int iLen);
369+ void finalise(TrackPointer tio);
370
371-private:
372- QByteArray *m_pData;
373+ private:
374+ QByteArray *m_pData;
375 int m_iCurPos;
376 int m_iBufferPos;
377 int m_iStrideLength;
378
379=== removed file 'mixxx/src/bpm/bpmreceiver.h'
380--- mixxx/src/bpm/bpmreceiver.h 2009-01-24 01:52:06 +0000
381+++ mixxx/src/bpm/bpmreceiver.h 1970-01-01 00:00:00 +0000
382@@ -1,47 +0,0 @@
383-/***************************************************************************
384-bpmreceiver.h - The base class for objects that need to receive
385- notifications from the bpm detection.
386--------------------
387-begin : Sat, Aug 17, 2007
388-copyright : (C) 2007 by Micah Lee
389-email : snipexv@gmail.com
390-***************************************************************************/
391-
392-/***************************************************************************
393-* *
394-* This program is free software; you can redistribute it and/or modify *
395-* it under the terms of the GNU General Public License as published by *
396-* the Free Software Foundation; either version 2 of the License, or *
397-* (at your option) any later version. *
398-* *
399-***************************************************************************/
400-
401-#ifndef BPMRECEIVER_H
402-#define BPMRECEIVER_H
403-
404-class TrackInfoObject;
405-
406-/**
407- * Base class for recieving BPM detection information
408- *
409- *@author Micah Lee
410- */
411-
412-class BpmReceiver
413-{
414-public:
415- BpmReceiver(){}
416- virtual ~BpmReceiver(){}
417- /** Sent from the bpm detection when the detection progress has changed for a
418- particular TrackInfoObject. */
419- virtual void setProgress(TrackInfoObject *tio, int progress) = 0;
420-
421- /** Sent from the bpm detection when processing of this TrackInfoObject is complete.
422- Also notifies whether or not the detection was succesful. */
423-
424- /** NOTE: The TrackInfoObject will already have the new BPM and confirm status before
425- this method is called.*/
426- virtual void setComplete(TrackInfoObject *tio, bool failed, float rBpm) = 0;
427-};
428-
429-#endif
430
431=== modified file 'mixxx/src/cachingreader.cpp'
432--- mixxx/src/cachingreader.cpp 2010-06-17 09:23:28 +0000
433+++ mixxx/src/cachingreader.cpp 2010-07-22 07:29:40 +0000
434@@ -30,7 +30,7 @@
435 ConfigObject<ConfigValue>* _config) :
436 m_pGroup(_group),
437 m_pConfig(_config),
438- m_pCurrentTrack(NULL),
439+ m_pCurrentTrack(),
440 m_pCurrentSoundSource(NULL),
441 m_iTrackSampleRate(0),
442 m_iTrackNumSamples(0),
443@@ -291,7 +291,7 @@
444 return true;
445 }
446
447-void CachingReader::newTrack(TrackInfoObject* pTrack) {
448+void CachingReader::newTrack(TrackPointer pTrack) {
449 m_trackQueueMutex.lock();
450 m_trackQueue.enqueue(pTrack);
451 m_trackQueueMutex.unlock();
452@@ -476,12 +476,12 @@
453 emit(workStarting());
454
455 QList<Hint> hintList;
456- TrackInfoObject* pLoadTrack = NULL;
457+ TrackPointer pLoadTrack = TrackPointer();
458
459 m_readerMutex.lock();
460
461 m_trackQueueMutex.lock();
462- pLoadTrack = NULL;
463+
464 if (!m_trackQueue.isEmpty()) {
465 pLoadTrack = m_trackQueue.takeLast();
466 m_trackQueue.clear();
467@@ -510,7 +510,7 @@
468 emit(workReady());
469 }
470
471-void CachingReader::loadTrack(TrackInfoObject *pTrack) {
472+void CachingReader::loadTrack(TrackPointer pTrack) {
473 freeAllChunks();
474
475 if (m_pCurrentSoundSource != NULL) {
476
477=== modified file 'mixxx/src/cachingreader.h'
478--- mixxx/src/cachingreader.h 2010-06-15 09:08:01 +0000
479+++ mixxx/src/cachingreader.h 2010-07-22 07:29:40 +0000
480@@ -16,10 +16,10 @@
481
482 #include "defs.h"
483 #include "configobject.h"
484+#include "trackinfoobject.h"
485 #include "engine/engineworker.h"
486
487 class SoundSource;
488-class TrackInfoObject;
489 class ControlObjectThread;
490
491 // A Hint is an indication to the CachingReader that a certain section of a
492@@ -93,7 +93,7 @@
493 // Request that the CachingReader load a new track. These requests are
494 // processed in the work thread, so the reader must be woken up via wake()
495 // for this to take effect.
496- void newTrack(TrackInfoObject* pTrack);
497+ void newTrack(TrackPointer pTrack);
498
499 // Wake the reader up so that it will process newTrack requests and hints.
500 void wake();
501@@ -104,8 +104,8 @@
502
503 signals:
504 // Emitted once a new track is loaded and ready to be read from.
505- void trackLoaded(TrackInfoObject *pTrack, int iSampleRate, int iNumSamples);
506- void trackLoadFailed(TrackInfoObject *pTrack, QString reason);
507+ void trackLoaded(TrackPointer pTrack, int iSampleRate, int iNumSamples);
508+ void trackLoadFailed(TrackPointer pTrack, QString reason);
509
510 private:
511
512@@ -123,11 +123,11 @@
513 void initialize();
514
515 // Internal method to load a track. Emits trackLoaded when finished.
516- void loadTrack(TrackInfoObject *pTrack);
517+ void loadTrack(TrackPointer pTrack);
518
519 // Queue of Tracks to load, and the corresponding lock.
520 QMutex m_trackQueueMutex;
521- QQueue<TrackInfoObject*> m_trackQueue;
522+ QQueue<TrackWeakPointer> m_trackQueue;
523
524 // Held when the Reader is working: read() vs. run()
525 QMutex m_readerMutex;
526@@ -189,7 +189,7 @@
527 const ConfigObject<ConfigValue>* m_pConfig;
528
529 // The current track loaded
530- TrackInfoObject* m_pCurrentTrack;
531+ TrackPointer m_pCurrentTrack;
532 // The current sound source of the track loaded
533 SoundSource* m_pCurrentSoundSource;
534 int m_iTrackSampleRate;
535
536=== modified file 'mixxx/src/dlgautodj.cpp'
537--- mixxx/src/dlgautodj.cpp 2010-07-09 08:54:55 +0000
538+++ mixxx/src/dlgautodj.cpp 2010-07-22 07:29:40 +0000
539@@ -21,10 +21,10 @@
540 m_bPlayer2Primed = false;
541 m_pTrackTableView = new WTrackTableView(this, pConfig);
542
543- connect(m_pTrackTableView, SIGNAL(loadTrack(TrackInfoObject*)),
544- this, SIGNAL(loadTrack(TrackInfoObject*)));
545- connect(m_pTrackTableView, SIGNAL(loadTrackToPlayer(TrackInfoObject*, int)),
546- this, SIGNAL(loadTrackToPlayer(TrackInfoObject*, int)));
547+ connect(m_pTrackTableView, SIGNAL(loadTrack(TrackPointer)),
548+ this, SIGNAL(loadTrack(TrackPointer)));
549+ connect(m_pTrackTableView, SIGNAL(loadTrackToPlayer(TrackPointer, int)),
550+ this, SIGNAL(loadTrackToPlayer(TrackPointer, int)));
551
552 QBoxLayout* box = dynamic_cast<QBoxLayout*>(layout());
553 Q_ASSERT(box); //Assumes the form layout is a QVBox/QHBoxLayout!
554@@ -164,7 +164,7 @@
555 return;
556 }*/ //don't need this code, above block takes care of this case.
557
558- //If only one of the players is playing...
559+ //If only one of the players is playing...
560 if ((m_pCOPlay1->get() == 1.0f && m_pCOPlay2->get() == 0.0f) ||
561 (m_pCOPlay1->get() == 0.0f && m_pCOPlay2->get() == 1.0f))
562 {
563@@ -264,7 +264,7 @@
564 float crossfadeValue = 1.0f - 2*(value-posThreshold)/(1.0f-posThreshold);
565 m_pCOCrossfader->slotSet(crossfadeValue); //Move crossfader to the right!
566
567- //If the first player doesn't have the next track loaded, load a track into
568+ //If the first player doesn't have the next track loaded, load a track into
569 //it and start playing it!
570 if (!m_bPlayer1Primed)
571 {
572@@ -306,7 +306,7 @@
573 }
574
575 //Get the track at the top of the playlist...
576- TrackInfoObject* nextTrack = m_pAutoDJTableModel->getTrack(m_pAutoDJTableModel->index(0, 0));
577+ TrackPointer nextTrack = m_pAutoDJTableModel->getTrack(m_pAutoDJTableModel->index(0, 0));
578
579 if (!nextTrack) //We ran out of tracks in the queue...
580 {
581
582=== modified file 'mixxx/src/dlgautodj.h'
583--- mixxx/src/dlgautodj.h 2010-07-09 08:54:55 +0000
584+++ mixxx/src/dlgautodj.h 2010-07-22 07:29:40 +0000
585@@ -4,6 +4,7 @@
586 #include <QItemSelection>
587 #include "ui_dlgautodj.h"
588 #include "configobject.h"
589+#include "trackinfoobject.h"
590 #include "library/dao/playlistdao.h"
591 #include "library/libraryview.h"
592 #include "library/trackcollection.h"
593@@ -30,8 +31,8 @@
594 void player1PositionChanged(double value);
595 void player2PositionChanged(double value);
596 signals:
597- void loadTrack(TrackInfoObject* tio);
598- void loadTrackToPlayer(TrackInfoObject* tio, int player);
599+ void loadTrack(TrackPointer tio);
600+ void loadTrackToPlayer(TrackPointer tio, int player);
601 private:
602 bool loadNextTrackFromQueue(bool removeTopMostBeforeLoading);
603
604
605=== modified file 'mixxx/src/dlgprepare.cpp'
606--- mixxx/src/dlgprepare.cpp 2010-04-12 00:29:18 +0000
607+++ mixxx/src/dlgprepare.cpp 2010-07-22 07:29:40 +0000
608@@ -23,10 +23,10 @@
609
610 m_pPrepareLibraryTableView = new WPrepareLibraryTableView(this, pConfig,
611 ConfigKey(), ConfigKey());
612- connect(m_pPrepareLibraryTableView, SIGNAL(loadTrack(TrackInfoObject*)),
613- this, SIGNAL(loadTrack(TrackInfoObject*)));
614- connect(m_pPrepareLibraryTableView, SIGNAL(loadTrackToPlayer(TrackInfoObject*, int)),
615- this, SIGNAL(loadTrackToPlayer(TrackInfoObject*, int)));
616+ connect(m_pPrepareLibraryTableView, SIGNAL(loadTrack(TrackPointer)),
617+ this, SIGNAL(loadTrack(TrackPointer)));
618+ connect(m_pPrepareLibraryTableView, SIGNAL(loadTrackToPlayer(TrackPointer, int)),
619+ this, SIGNAL(loadTrackToPlayer(TrackPointer, int)));
620
621 QBoxLayout* box = dynamic_cast<QBoxLayout*>(layout());
622 Q_ASSERT(box); //Assumes the form layout is a QVBox/QHBoxLayout!
623@@ -197,16 +197,16 @@
624 {
625 m_pAnalyserQueue = AnalyserQueue::createPrepareViewAnalyserQueue(m_pConfig);
626
627- connect(m_pAnalyserQueue, SIGNAL(trackProgress(TrackInfoObject*, int)),
628- this, SLOT(trackAnalysisProgress(TrackInfoObject*, int)));
629- connect(m_pAnalyserQueue, SIGNAL(trackFinished(TrackInfoObject*)),
630- this, SLOT(trackAnalysisFinished(TrackInfoObject*)));
631+ connect(m_pAnalyserQueue, SIGNAL(trackProgress(TrackPointer, int)),
632+ this, SLOT(trackAnalysisProgress(TrackPointer, int)));
633+ connect(m_pAnalyserQueue, SIGNAL(trackFinished(TrackPointer)),
634+ this, SLOT(trackAnalysisFinished(TrackPointer)));
635
636 QModelIndex selectedIndex;
637 m_indexesBeingAnalyzed = m_pPrepareLibraryTableView->selectionModel()->selectedRows();
638 foreach(selectedIndex, m_indexesBeingAnalyzed)
639 {
640- TrackInfoObject* tio = m_pPrepareLibraryTableModel->getTrack(selectedIndex);
641+ TrackPointer tio = m_pPrepareLibraryTableModel->getTrack(selectedIndex);
642 qDebug() << "Queueing track" << tio->getLocation();
643 m_pAnalyserQueue->queueAnalyseTrack(tio);
644 }
645@@ -214,13 +214,14 @@
646 }
647 }
648
649-void DlgPrepare::trackAnalysisFinished(TrackInfoObject* tio)
650+void DlgPrepare::trackAnalysisFinished(TrackPointer tio)
651 {
652- qDebug() << "Analysis finished!";
653+ qDebug() << "Analysis finished on track:" << tio->getInfo();
654+
655+ // TrackPointer auto-deletes once nobody is referencing it anymore.
656 m_pTrackCollection->getTrackDAO().saveTrack(tio);
657- qDebug() << "FIXME: Free the TIO when we're using autopointers";
658- //XXX: Delete the TIO once we're using auto-pointers !
659- //delete tio;
660+
661+
662
663 //If the analyser has already been deleted by the time we get this signal
664 //or there are no tracks in it when we do get the signal, then say we're done.
665@@ -230,7 +231,7 @@
666 }
667 }
668
669-void DlgPrepare::trackAnalysisProgress(TrackInfoObject* tio, int progress)
670+void DlgPrepare::trackAnalysisProgress(TrackPointer tio, int progress)
671 {
672 QString text = "Analyzing";
673 labelProgress->setText(QString("%1 %2\%").arg(text).arg(progress));
674
675=== modified file 'mixxx/src/dlgprepare.h'
676--- mixxx/src/dlgprepare.h 2010-02-23 20:06:25 +0000
677+++ mixxx/src/dlgprepare.h 2010-07-22 07:29:40 +0000
678@@ -29,14 +29,14 @@
679 void tableSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected);
680 void selectAll();
681 void analyze();
682- void trackAnalysisFinished(TrackInfoObject* tio);
683- void trackAnalysisProgress(TrackInfoObject* tio, int progress);
684+ void trackAnalysisFinished(TrackPointer tio);
685+ void trackAnalysisProgress(TrackPointer tio, int progress);
686 void showRecentSongs();
687 void showAllSongs();
688 void installEventFilter(QObject* pFilter);
689 signals:
690- void loadTrack(TrackInfoObject* pTrack);
691- void loadTrackToPlayer(TrackInfoObject* pTrack, int player);
692+ void loadTrack(TrackPointer pTrack);
693+ void loadTrackToPlayer(TrackPointer pTrack, int player);
694
695 private:
696 void stopAnalysis();
697
698=== modified file 'mixxx/src/dlgtrackinfo.cpp'
699--- mixxx/src/dlgtrackinfo.cpp 2010-06-18 06:16:00 +0000
700+++ mixxx/src/dlgtrackinfo.cpp 2010-07-22 07:29:40 +0000
701@@ -9,7 +9,7 @@
702
703 DlgTrackInfo::DlgTrackInfo(QWidget* parent) :
704 QDialog(parent),
705- m_pLoadedTrack(NULL) {
706+ m_pLoadedTrack() {
707
708 setupUi(this);
709
710@@ -89,7 +89,7 @@
711 }
712 }
713
714-void DlgTrackInfo::loadTrack(TrackInfoObject* pTrack) {
715+void DlgTrackInfo::loadTrack(TrackPointer pTrack) {
716 m_pLoadedTrack = pTrack;
717 clear();
718
719@@ -220,7 +220,7 @@
720 }
721 }
722
723- m_pLoadedTrack = NULL;
724+ m_pLoadedTrack.clear();
725 clear();
726 }
727
728
729=== modified file 'mixxx/src/dlgtrackinfo.h'
730--- mixxx/src/dlgtrackinfo.h 2010-06-18 06:16:00 +0000
731+++ mixxx/src/dlgtrackinfo.h 2010-07-22 07:29:40 +0000
732@@ -9,7 +9,8 @@
733
734 #include "ui_dlgtrackinfo.h"
735
736-class TrackInfoObject;
737+#include "trackinfoobject.h"
738+
739 class Cue;
740
741 class DlgTrackInfo : public QDialog, public Ui::DlgTrackInfo {
742@@ -21,7 +22,7 @@
743 public slots:
744 // Not thread safe. Only invoke via AutoConnection or QueuedConnection, not
745 // directly!
746- void loadTrack(TrackInfoObject* pTrack);
747+ void loadTrack(TrackPointer pTrack);
748
749 signals:
750 void next();
751@@ -46,7 +47,7 @@
752 void clear();
753
754 QHash<int, Cue*> m_cueMap;
755- TrackInfoObject* m_pLoadedTrack;
756+ TrackPointer m_pLoadedTrack;
757 QMutex m_mutex;
758 };
759
760
761=== modified file 'mixxx/src/encodermp3.cpp'
762--- mixxx/src/encodermp3.cpp 2010-05-19 02:41:33 +0000
763+++ mixxx/src/encodermp3.cpp 2010-07-22 07:29:40 +0000
764@@ -14,8 +14,8 @@
765 * *
766 ***************************************************************************/
767
768-#include <stdlib.h> // needed for random num
769-#include <time.h> // needed for random num
770+#include <stdlib.h> // needed for random num
771+#include <time.h> // needed for random num
772 #include <string.h> // needed for memcpy
773 #include <QDebug>
774
775@@ -31,7 +31,7 @@
776 {
777 pEngine = engine;
778 metaDataTitle = metaDataArtist = "";
779- m_pMetaData = NULL;
780+ m_pMetaData.clear();
781 m_bufferIn[0] = NULL;
782 m_bufferIn[1] = NULL;
783 m_bufferOut = NULL;
784@@ -44,16 +44,16 @@
785 * At runtime the Integer field was inialized by a large random value
786 * such that the following pointer fields were never initialized in the
787 * methods 'bufferOutGrow()' and 'bufferInGrow()' --> Valgrind shows invalid writes :-)
788- *
789+ *
790 * m_bufferOut = (unsigned char *)realloc(m_bufferOut, size);
791 * m_bufferIn[0] = (float *)realloc(m_bufferIn[0], size * sizeof(float));
792 * m_bufferIn[1] = (float *)realloc(m_bufferIn[1], size * sizeof(float));
793 *
794- * This has solved many segfaults when using and even closing shoutcast along with LAME.
795- * This bug was detected by using Valgrind memory analyser
796+ * This has solved many segfaults when using and even closing shoutcast along with LAME.
797+ * This bug was detected by using Valgrind memory analyser
798 *
799 */
800- m_bufferInSize = 0;
801+ m_bufferInSize = 0;
802 }
803
804 // Destructor
805@@ -75,11 +75,11 @@
806 {
807 if ( m_bufferOutSize >= size )
808 return 0;
809-
810+
811 m_bufferOut = (unsigned char *)realloc(m_bufferOut, size);
812 if ( m_bufferOut == NULL )
813 return -1;
814-
815+
816 m_bufferOutSize = size;
817 return 0;
818 }
819@@ -92,12 +92,12 @@
820 {
821 if ( m_bufferInSize >= size )
822 return 0;
823-
824+
825 m_bufferIn[0] = (float *)realloc(m_bufferIn[0], size * sizeof(float));
826 m_bufferIn[1] = (float *)realloc(m_bufferIn[1], size * sizeof(float));
827 if ((m_bufferIn[0] == NULL) || (m_bufferIn[1] == NULL))
828 return -1;
829-
830+
831 m_bufferInSize = size;
832 return 0;
833 }
834@@ -105,8 +105,8 @@
835 void EncoderMp3::flushStream()
836 {
837 int rc;
838-
839-
840+
841+
842 rc = lame_encode_flush_nogap(m_lameFlags, m_bufferOut, m_bufferOutSize);
843 pEngine->writePage(NULL, m_bufferOut, 0, rc);
844 }
845@@ -116,25 +116,25 @@
846 int outsize;
847 int rc;
848 int i;
849-
850-
851+
852+
853 outsize = (int)((1.25 * size + 7200) + 1);
854 bufferOutGrow(outsize);
855-
856+
857 bufferInGrow(size);
858-
859+
860 // Deinterleave samples
861 for (i = 0; i < size/2; ++i)
862 {
863 m_bufferIn[0][i] = samples[i*2];
864 m_bufferIn[1][i] = samples[i*2+1];
865 }
866-
867- rc = lame_encode_buffer_float(m_lameFlags, m_bufferIn[0], m_bufferIn[1],
868+
869+ rc = lame_encode_buffer_float(m_lameFlags, m_bufferIn[0], m_bufferIn[1],
870 size/2, m_bufferOut, m_bufferOutSize);
871 if ( rc < 0 )
872 return;
873-
874+
875 pEngine->writePage(NULL, m_bufferOut, 0, rc);
876 }
877
878@@ -142,24 +142,24 @@
879 {
880 m_bufferOutSize = (int)((1.25 * 20000 + 7200) + 1);
881 m_bufferOut = (unsigned char *)malloc(m_bufferOutSize);
882-
883+
884 m_bufferIn[0] = (float *)malloc(m_bufferOutSize * sizeof(float));
885 m_bufferIn[1] = (float *)malloc(m_bufferOutSize * sizeof(float));
886-
887+
888 return;
889 }
890
891 int EncoderMp3::initEncoder(int bitrate)
892 {
893 unsigned long samplerate = m_pConfig->getValueString(ConfigKey("[Soundcard]","Samplerate")).toULong();
894-
895-
896+
897+
898 m_lameFlags = lame_init();
899 if ( m_lameFlags == NULL ) {
900 qDebug() << "Unable to initialize MP3";
901 return -1;
902 }
903-
904+
905 lame_set_num_channels(m_lameFlags, 2);
906 lame_set_in_samplerate(m_lameFlags, samplerate);
907 lame_set_out_samplerate(m_lameFlags, samplerate);
908@@ -167,15 +167,15 @@
909 lame_set_mode(m_lameFlags, STEREO);
910 lame_set_quality(m_lameFlags, 2);
911 lame_set_bWriteVbrTag(m_lameFlags, 0);
912-
913-
914+
915+
916 if (( lame_init_params(m_lameFlags)) < 0) {
917 qDebug() << "Unable to initialize MP3 parameters";
918 return -1;
919 }
920-
921+
922 initStream();
923-
924+
925 return 0;
926 }
927
928@@ -224,7 +224,7 @@
929 case 10:
930 return this->initEncoder(500);
931 }
932-
933+
934 return -1;
935 }
936
937
938=== modified file 'mixxx/src/encodermp3.h'
939--- mixxx/src/encodermp3.h 2009-02-18 04:28:21 +0000
940+++ mixxx/src/encodermp3.h 2010-07-22 07:29:40 +0000
941@@ -20,12 +20,12 @@
942 #include <QObject>
943 #include "defs.h"
944 #include "configobject.h"
945+#include "trackinfoobject.h"
946 #include "encoder.h"
947
948 #include <lame/lame.h> // may be elsewhere on other distros besides Ubuntu
949
950 class EngineAbstractRecord;
951-class TrackInfoObject;
952
953 class EncoderMp3 : public Encoder {
954
955@@ -49,9 +49,9 @@
956 int m_bufferOutSize;
957 float *m_bufferIn[2];
958 int m_bufferInSize;
959-
960+
961 EngineAbstractRecord *pEngine;
962- TrackInfoObject *m_pMetaData;
963+ TrackPointer m_pMetaData;
964 char *metaDataTitle;
965 char *metaDataArtist;
966 };
967
968=== modified file 'mixxx/src/encodervorbis.cpp'
969--- mixxx/src/encodervorbis.cpp 2010-05-16 20:50:53 +0000
970+++ mixxx/src/encodervorbis.cpp 2010-07-22 07:29:40 +0000
971@@ -47,7 +47,7 @@
972 pEngine = engine;
973 metaDataTitle = metaDataArtist = NULL;
974 m_pMetaData = NULL;
975-
976+
977 m_pConfig = _config;
978 }
979
980@@ -102,7 +102,7 @@
981 case 1:
982 // track 1 is playing
983 {
984- TrackInfoObject *newMetaData = PlayerInfo::Instance().getTrackInfo(1);
985+ TrackPointer newMetaData = PlayerInfo::Instance().getTrackInfo(1);
986 if (newMetaData != m_pMetaData)
987 {
988 m_pMetaData = newMetaData;
989@@ -113,7 +113,7 @@
990 case 2:
991 // track 2 is playing
992 {
993- TrackInfoObject *newMetaData = PlayerInfo::Instance().getTrackInfo(2);
994+ TrackPointer newMetaData = PlayerInfo::Instance().getTrackInfo(2);
995 if (newMetaData != m_pMetaData)
996 {
997 m_pMetaData = newMetaData;
998@@ -128,14 +128,14 @@
999 "[Master]","crossfader")));
1000 if (m_pCrossfader->get() <= 0)
1001 {
1002- TrackInfoObject *newMetaData = PlayerInfo::Instance().getTrackInfo(1);
1003+ TrackPointer newMetaData = PlayerInfo::Instance().getTrackInfo(1);
1004 if (newMetaData != m_pMetaData)
1005 {
1006 m_pMetaData = newMetaData;
1007 changed = true;
1008 }
1009 } else {
1010- TrackInfoObject *newMetaData = PlayerInfo::Instance().getTrackInfo(2);
1011+ TrackPointer newMetaData = PlayerInfo::Instance().getTrackInfo(2);
1012 if (newMetaData != m_pMetaData)
1013 {
1014 m_pMetaData = newMetaData;
1015@@ -189,7 +189,7 @@
1016 sendPackages();
1017 }
1018
1019-void EncoderVorbis::updateMetaData(TrackInfoObject *trackInfoObj)
1020+void EncoderVorbis::updateMetaData(TrackPointer trackInfoObj)
1021 {
1022 // convert QStrings to char*s
1023 QByteArray baArtist = m_pMetaData->getArtist().toLatin1();
1024@@ -243,11 +243,11 @@
1025 {
1026 int ret;
1027 vorbis_info_init(&vinfo);
1028-
1029+
1030 // initialize VBR quality based mode
1031 unsigned long samplerate = m_pConfig->getValueString(ConfigKey("[Soundcard]","Samplerate")).toULong();
1032 ret = vorbis_encode_init_vbr(&vinfo, 2, samplerate, quality);
1033-
1034+
1035 if (ret == 0) {
1036 initStream();
1037 } else {
1038
1039=== modified file 'mixxx/src/encodervorbis.h'
1040--- mixxx/src/encodervorbis.h 2009-02-18 04:28:21 +0000
1041+++ mixxx/src/encodervorbis.h 2010-07-22 07:29:40 +0000
1042@@ -21,11 +21,11 @@
1043 #include "defs.h"
1044 #include "configobject.h"
1045 #include "encoder.h"
1046+#include "trackinfoobject.h"
1047
1048 #include <vorbis/vorbisenc.h> // this also includes vorbis/codec.h
1049
1050 class EngineAbstractRecord;
1051-class TrackInfoObject;
1052
1053 class EncoderVorbis : public Encoder {
1054 Q_OBJECT
1055@@ -40,7 +40,7 @@
1056
1057
1058 private slots:
1059- void updateMetaData(TrackInfoObject *trackInfoObj);
1060+ void updateMetaData(TrackPointer trackInfoObj);
1061
1062 private:
1063 int getSerial();
1064@@ -60,7 +60,7 @@
1065 vorbis_comment vcomment; /* stores all user comments */
1066
1067 EngineAbstractRecord *pEngine;
1068- TrackInfoObject *m_pMetaData;
1069+ TrackPointer m_pMetaData;
1070 char *metaDataTitle;
1071 char *metaDataArtist;
1072 };
1073
1074=== modified file 'mixxx/src/engine/cuecontrol.cpp'
1075--- mixxx/src/engine/cuecontrol.cpp 2010-06-18 00:39:22 +0000
1076+++ mixxx/src/engine/cuecontrol.cpp 2010-07-22 07:29:40 +0000
1077@@ -21,7 +21,7 @@
1078 m_bPreviewingHotcue(false),
1079 m_pPlayButton(ControlObject::getControl(ConfigKey(_group, "play"))),
1080 m_iNumHotCues(NUM_HOT_CUES),
1081- m_pLoadedTrack(NULL),
1082+ m_pLoadedTrack(),
1083 m_mutex(QMutex::Recursive) {
1084 createControls();
1085
1086@@ -154,7 +154,7 @@
1087 m_hotcueEnabled[hotCue]->set(0);
1088 }
1089
1090-void CueControl::loadTrack(TrackInfoObject* pTrack) {
1091+void CueControl::loadTrack(TrackPointer pTrack) {
1092 Q_ASSERT(pTrack);
1093
1094 QMutexLocker lock(&m_mutex);
1095@@ -162,7 +162,7 @@
1096 unloadTrack(m_pLoadedTrack);
1097
1098 m_pLoadedTrack = pTrack;
1099- connect(pTrack, SIGNAL(cuesUpdated()),
1100+ connect(pTrack.data(), SIGNAL(cuesUpdated()),
1101 this, SLOT(trackCuesUpdated()));
1102
1103 Cue* loadCue = NULL;
1104@@ -208,9 +208,9 @@
1105 }
1106 }
1107
1108-void CueControl::unloadTrack(TrackInfoObject* pTrack) {
1109+void CueControl::unloadTrack(TrackPointer pTrack) {
1110 QMutexLocker lock(&m_mutex);
1111- disconnect(pTrack, 0, this, 0);
1112+ disconnect(pTrack.data(), 0, this, 0);
1113 for (int i = 0; i < m_iNumHotCues; ++i) {
1114 detachCue(i);
1115 }
1116@@ -237,7 +237,7 @@
1117 loadCue->setPosition(cuePoint);
1118 }
1119
1120- m_pLoadedTrack = NULL;
1121+ m_pLoadedTrack.clear();
1122 }
1123
1124 void CueControl::cueUpdated() {
1125
1126=== modified file 'mixxx/src/engine/cuecontrol.h'
1127--- mixxx/src/engine/cuecontrol.h 2010-06-18 00:39:22 +0000
1128+++ mixxx/src/engine/cuecontrol.h 2010-07-22 07:29:40 +0000
1129@@ -9,11 +9,11 @@
1130
1131 #include "engine/enginecontrol.h"
1132 #include "configobject.h"
1133+#include "trackinfoobject.h"
1134
1135 class ControlObject;
1136 class ControlPushButton;
1137 class Cue;
1138-class TrackInfoObject;
1139
1140 class CueControl : public EngineControl {
1141 Q_OBJECT
1142@@ -25,8 +25,8 @@
1143 virtual void hintReader(QList<Hint>& hintList);
1144
1145 public slots:
1146- void loadTrack(TrackInfoObject* pTrack);
1147- void unloadTrack(TrackInfoObject* pTrack);
1148+ void loadTrack(TrackPointer pTrack);
1149+ void unloadTrack(TrackPointer pTrack);
1150
1151 private slots:
1152 void cueUpdated();
1153@@ -82,7 +82,7 @@
1154 ControlPushButton* m_pCueGotoAndStop;
1155 ControlPushButton* m_pCuePreview;
1156
1157- TrackInfoObject* m_pLoadedTrack;
1158+ TrackPointer m_pLoadedTrack;
1159
1160 // Tells us which controls map to which hotcue
1161 QMap<QObject*, int> m_controlMap;
1162
1163=== modified file 'mixxx/src/engine/enginebuffer.cpp'
1164--- mixxx/src/engine/enginebuffer.cpp 2010-07-09 08:54:55 +0000
1165+++ mixxx/src/engine/enginebuffer.cpp 2010-07-22 07:29:40 +0000
1166@@ -154,10 +154,10 @@
1167 addControl(m_pBpmControl);
1168
1169 m_pReader = new CachingReader(_group, _config);
1170- connect(m_pReader, SIGNAL(trackLoaded(TrackInfoObject*, int, int)),
1171- this, SLOT(slotTrackLoaded(TrackInfoObject*, int, int)));
1172- connect(m_pReader, SIGNAL(trackLoadFailed(TrackInfoObject*, QString)),
1173- this, SLOT(slotTrackLoadFailed(TrackInfoObject*, QString)));
1174+ connect(m_pReader, SIGNAL(trackLoaded(TrackPointer, int, int)),
1175+ this, SLOT(slotTrackLoaded(TrackPointer, int, int)));
1176+ connect(m_pReader, SIGNAL(trackLoadFailed(TrackPointer, QString)),
1177+ this, SLOT(slotTrackLoadFailed(TrackPointer, QString)));
1178
1179 m_pReadAheadManager = new ReadAheadManager(m_pReader);
1180 m_pReadAheadManager->addEngineControl(m_pLoopingControl);
1181@@ -277,7 +277,7 @@
1182 return m_pRateControl->getRawRate();
1183 }
1184
1185-void EngineBuffer::slotTrackLoaded(TrackInfoObject *pTrack,
1186+void EngineBuffer::slotTrackLoaded(TrackPointer pTrack,
1187 int iTrackSampleRate,
1188 int iTrackNumSamples) {
1189 pause.lock();
1190@@ -294,7 +294,7 @@
1191 emit(trackLoaded(pTrack));
1192 }
1193
1194-void EngineBuffer::slotTrackLoadFailed(TrackInfoObject* pTrack,
1195+void EngineBuffer::slotTrackLoadFailed(TrackPointer pTrack,
1196 QString reason) {
1197 pause.lock();
1198 file_srate_old = 0;
1199@@ -701,10 +701,10 @@
1200 m_engineLock.unlock();
1201 }
1202
1203-void EngineBuffer::loadTrack(TrackInfoObject *pTrack) {
1204+void EngineBuffer::loadTrack(TrackPointer pTrack) {
1205 // Raise the track end flag so the EngineBuffer stops processing frames
1206 m_pTrackEndCOT->slotSet(1.0);
1207-
1208+
1209 //Stop playback
1210 playButtonCOT->slotSet(0.0);
1211
1212
1213=== modified file 'mixxx/src/engine/enginebuffer.h'
1214--- mixxx/src/engine/enginebuffer.h 2010-07-09 08:54:55 +0000
1215+++ mixxx/src/engine/enginebuffer.h 2010-07-22 07:29:40 +0000
1216@@ -22,6 +22,7 @@
1217 #include <qmutex.h>
1218 #include "defs.h"
1219 #include "engineobject.h"
1220+#include "trackinfoobject.h"
1221 #include "configobject.h"
1222 // #include "monitor.h"
1223 #include "rotary.h"
1224@@ -41,7 +42,6 @@
1225 class EngineBufferScale;
1226 class EngineBufferScaleLinear;
1227 class EngineBufferScaleST;
1228-class TrackInfoObject;
1229 class EngineWorkerScheduler;
1230
1231 struct Hint;
1232@@ -85,7 +85,7 @@
1233 // Request that the EngineBuffer load a track. Since the process is
1234 // asynchronous, EngineBuffer will emit a trackLoaded signal when the load
1235 // has completed.
1236- void loadTrack(TrackInfoObject* pTrack);
1237+ void loadTrack(TrackPointer pTrack);
1238
1239 // Add an engine control to the EngineBuffer
1240 void addControl(EngineControl* pControl);
1241@@ -112,14 +112,14 @@
1242 void slotControlSeekAbs(double);
1243
1244 signals:
1245- void trackLoaded(TrackInfoObject *pTrack);
1246- void trackLoadFailed(TrackInfoObject *pTrack, QString reason);
1247+ void trackLoaded(TrackPointer pTrack);
1248+ void trackLoadFailed(TrackPointer pTrack, QString reason);
1249 void loadNextTrack();
1250
1251 private slots:
1252- void slotTrackLoaded(TrackInfoObject *pTrack,
1253+ void slotTrackLoaded(TrackPointer pTrack,
1254 int iSampleRate, int iNumSamples);
1255- void slotTrackLoadFailed(TrackInfoObject *pTrack,
1256+ void slotTrackLoadFailed(TrackPointer pTrack,
1257 QString reason);
1258
1259 private:
1260
1261=== modified file 'mixxx/src/engine/engineclipping.cpp'
1262--- mixxx/src/engine/engineclipping.cpp 2009-01-24 04:39:32 +0000
1263+++ mixxx/src/engine/engineclipping.cpp 2010-07-22 07:29:40 +0000
1264@@ -95,7 +95,7 @@
1265 pOutput[i] = pIn[i];
1266 }
1267 }
1268- if(clipped == true)
1269+ if(clipped)
1270 m_ctrlClipping->set(1.);
1271 else
1272 m_ctrlClipping->set(0);
1273
1274=== modified file 'mixxx/src/engine/engineshoutcast.cpp'
1275--- mixxx/src/engine/engineshoutcast.cpp 2010-05-17 02:33:01 +0000
1276+++ mixxx/src/engine/engineshoutcast.cpp 2010-07-22 07:29:40 +0000
1277@@ -38,7 +38,7 @@
1278 * Initialize EngineShoutcast
1279 */
1280 EngineShoutcast::EngineShoutcast(ConfigObject<ConfigValue> *_config)
1281- : m_pMetaData(NULL),
1282+ : m_pMetaData(),
1283 m_pShout(NULL),
1284 m_pShoutMetaData(NULL),
1285 m_pConfig(_config),
1286@@ -437,7 +437,7 @@
1287 {
1288 QMutexLocker locker(&m_shoutMutex);
1289 int tracks;
1290- TrackInfoObject *newMetaData;
1291+ TrackPointer newMetaData;
1292 bool changed = false;
1293
1294
1295
1296=== modified file 'mixxx/src/engine/engineshoutcast.h'
1297--- mixxx/src/engine/engineshoutcast.h 2010-05-17 02:33:01 +0000
1298+++ mixxx/src/engine/engineshoutcast.h 2010-07-22 07:29:40 +0000
1299@@ -23,6 +23,7 @@
1300 #include "configobject.h"
1301 #include "controlobject.h"
1302 #include "controlobjectthreadmain.h"
1303+#include "trackinfoobject.h"
1304
1305 #include <shout/shout.h>
1306
1307@@ -34,7 +35,6 @@
1308 //class ControlLogpotmeter;
1309 //class ConfigKey;
1310 class EncoderVorbis;
1311-class TrackInfoObject;
1312
1313 class EngineShoutcast : public EngineAbstractRecord {
1314 Q_OBJECT
1315@@ -60,7 +60,7 @@
1316 int getActiveTracks();
1317 bool metaDataHasChanged();
1318 void updateMetaData();
1319- TrackInfoObject *m_pMetaData;
1320+ TrackPointer m_pMetaData;
1321 shout_t *m_pShout;
1322 shout_metadata_t *m_pShoutMetaData;
1323 int m_pMetaDataLife;
1324
1325=== modified file 'mixxx/src/library/abstractxmltrackmodel.cpp'
1326--- mixxx/src/library/abstractxmltrackmodel.cpp 2010-06-18 09:07:12 +0000
1327+++ mixxx/src/library/abstractxmltrackmodel.cpp 2010-07-22 07:29:40 +0000
1328@@ -121,34 +121,29 @@
1329
1330 QString AbstractXmlTrackModel::getTrackLocation(const QModelIndex& index) const
1331 {
1332- TrackInfoObject *track;
1333- QString location;
1334-
1335- track = getTrack(index);
1336- location = track->getLocation();
1337-
1338- delete track;
1339-
1340+ TrackPointer track = getTrack(index);
1341+ QString location = track->getLocation();
1342+ // track is auto-deleted
1343 return location;
1344 }
1345
1346-TrackInfoObject * AbstractXmlTrackModel::getTrack(const QModelIndex& index) const
1347+TrackPointer AbstractXmlTrackModel::getTrack(const QModelIndex& index) const
1348 {
1349 QDomNode songNode = m_trackNodes.at(index.row());
1350 return parseTrackNode(songNode);
1351 }
1352
1353-TrackInfoObject * AbstractXmlTrackModel::getTrackByLocation(const QString& location) const
1354+TrackPointer AbstractXmlTrackModel::getTrackByLocation(const QString& location) const
1355 {
1356 if ( !m_mTracksByLocation.contains(location))
1357- return NULL;
1358+ return TrackPointer();
1359
1360 QDomNode songNode = m_mTracksByLocation[location];
1361 return parseTrackNode(songNode);
1362 }
1363
1364 /*
1365-TrackInfoObject *AbstractXmlTrackModel::parseTrackNode(QDomNode node)
1366+TrackPointer AbstractXmlTrackModel::parseTrackNode(QDomNode node)
1367 {
1368 qDebug() << "Child class has not implemented parseTrackNode";
1369 return NULL;
1370
1371=== modified file 'mixxx/src/library/abstractxmltrackmodel.h'
1372--- mixxx/src/library/abstractxmltrackmodel.h 2010-04-03 23:26:07 +0000
1373+++ mixxx/src/library/abstractxmltrackmodel.h 2010-07-22 07:29:40 +0000
1374@@ -35,8 +35,6 @@
1375 #include <QtXml>
1376 #include "trackmodel.h"
1377
1378-class TrackInfoObject;
1379-
1380 class AbstractXmlTrackModel : public QAbstractTableModel, public TrackModel
1381 {
1382 Q_OBJECT
1383@@ -52,9 +50,9 @@
1384 virtual int columnCount(const QModelIndex& parent) const;
1385
1386 //Track Model stuff
1387- virtual TrackInfoObject* getTrack(const QModelIndex& index) const;
1388+ virtual TrackPointer getTrack(const QModelIndex& index) const;
1389 virtual QString getTrackLocation(const QModelIndex& index) const;
1390- virtual TrackInfoObject *getTrackByLocation(const QString& location) const;
1391+ virtual TrackPointer getTrackByLocation(const QString& location) const;
1392 virtual void search(const QString& searchText);
1393 virtual const QList<int>& searchColumns() const;
1394 virtual const QString currentSearch();
1395@@ -76,7 +74,7 @@
1396
1397 protected:
1398 /* Implemented by AbstractXmlTrackModel implementations to parse the DOM Node into a TrackInfoObject */
1399- virtual TrackInfoObject *parseTrackNode(QDomNode node) const = 0;
1400+ virtual TrackPointer parseTrackNode(QDomNode node) const = 0;
1401 /* Implemented by AbstractXmlTrackModel implementations to return the data for song columns */
1402 virtual QVariant getTrackColumnData(QDomNode node, const QModelIndex& index) const = 0;
1403 /* Called by AbstractXmlTrackModel implementations to enumerate their columns */
1404
1405=== modified file 'mixxx/src/library/autodjfeature.cpp'
1406--- mixxx/src/library/autodjfeature.cpp 2010-07-06 10:02:24 +0000
1407+++ mixxx/src/library/autodjfeature.cpp 2010-07-22 07:29:40 +0000
1408@@ -44,10 +44,10 @@
1409 m_pTrackCollection);
1410 pAutoDJView->installEventFilter(keyboard);
1411 libraryWidget->registerView(m_sAutoDJViewName, pAutoDJView);
1412- connect(pAutoDJView, SIGNAL(loadTrack(TrackInfoObject*)),
1413- this, SIGNAL(loadTrack(TrackInfoObject*)));
1414- connect(pAutoDJView, SIGNAL(loadTrackToPlayer(TrackInfoObject*, int)),
1415- this, SIGNAL(loadTrackToPlayer(TrackInfoObject*, int)));
1416+ connect(pAutoDJView, SIGNAL(loadTrack(TrackPointer)),
1417+ this, SIGNAL(loadTrack(TrackPointer)));
1418+ connect(pAutoDJView, SIGNAL(loadTrackToPlayer(TrackPointer, int)),
1419+ this, SIGNAL(loadTrackToPlayer(TrackPointer, int)));
1420 }
1421
1422 QAbstractItemModel* AutoDJFeature::getChildModel() {
1423
1424=== modified file 'mixxx/src/library/basesqltablemodel.cpp'
1425--- mixxx/src/library/basesqltablemodel.cpp 2010-07-15 09:55:40 +0000
1426+++ mixxx/src/library/basesqltablemodel.cpp 2010-07-22 07:29:40 +0000
1427@@ -63,7 +63,7 @@
1428
1429 if (role == Qt::DisplayRole && m_trackOverrides.contains(trackId)) {
1430 qDebug() << "Returning override for track" << trackId;
1431- TrackInfoObject* pTrack = m_trackDAO.getTrack(trackId);
1432+ TrackPointer pTrack = m_trackDAO.getTrack(trackId);
1433
1434 // TODO(XXX) Qt properties could really help here.
1435 if (fieldIndex(LIBRARYTABLE_ARTIST) == col) {
1436
1437=== modified file 'mixxx/src/library/basesqltablemodel.h'
1438--- mixxx/src/library/basesqltablemodel.h 2010-05-20 07:23:14 +0000
1439+++ mixxx/src/library/basesqltablemodel.h 2010-07-22 07:29:40 +0000
1440@@ -10,7 +10,6 @@
1441 #include "library/dao/trackdao.h"
1442
1443 class TrackCollection;
1444-class TrackInfoObject;
1445
1446 class BaseSqlTableModel : public QSqlTableModel {
1447 Q_OBJECT
1448
1449=== modified file 'mixxx/src/library/browsefeature.cpp'
1450--- mixxx/src/library/browsefeature.cpp 2010-06-05 09:28:18 +0000
1451+++ mixxx/src/library/browsefeature.cpp 2010-07-22 07:29:40 +0000
1452@@ -123,11 +123,11 @@
1453 emit(setRootIndex(absIndexProxy));
1454 } else {
1455 TrackDAO& trackDao = m_pTrackCollection->getTrackDAO();
1456- TrackInfoObject* track = trackDao.getTrack(trackDao.getTrackId(absPath));
1457+ TrackPointer track = trackDao.getTrack(trackDao.getTrackId(absPath));
1458
1459 // The track doesn't exist in the database.
1460 if (track == NULL) {
1461- track = new TrackInfoObject(info);
1462+ track = TrackPointer(new TrackInfoObject(info), &QObject::deleteLater);
1463 }
1464
1465 emit(loadTrack(track));
1466@@ -142,11 +142,11 @@
1467
1468 if (!m_browseModel.isDir(sourceIndex)) {
1469 TrackDAO& trackDao = m_pTrackCollection->getTrackDAO();
1470- TrackInfoObject* track = trackDao.getTrack(trackDao.getTrackId(absPath));
1471+ TrackPointer track = trackDao.getTrack(trackDao.getTrackId(absPath));
1472
1473 // The track doesn't exist in the database.
1474 if (track == NULL) {
1475- track = new TrackInfoObject(info);
1476+ track = TrackPointer(new TrackInfoObject(info), &QObject::deleteLater);
1477 }
1478
1479 emit(loadTrackToPlayer(track, player));
1480
1481=== modified file 'mixxx/src/library/browsetablemodel.cpp'
1482--- mixxx/src/library/browsetablemodel.cpp 2010-06-01 07:05:57 +0000
1483+++ mixxx/src/library/browsetablemodel.cpp 2010-07-22 07:29:40 +0000
1484@@ -20,16 +20,16 @@
1485
1486 }
1487
1488-TrackInfoObject* BrowseTableModel::getTrack(const QModelIndex& index) const
1489+TrackPointer BrowseTableModel::getTrack(const QModelIndex& index) const
1490 {
1491 //TODO
1492
1493- return NULL;
1494+ return TrackPointer();
1495 }
1496
1497 QString BrowseTableModel::getTrackLocation(const QModelIndex& index) const
1498 {
1499- return filePath(index);
1500+ return filePath(index);
1501 }
1502
1503 void BrowseTableModel::search(const QString& searchText)
1504
1505=== modified file 'mixxx/src/library/browsetablemodel.h'
1506--- mixxx/src/library/browsetablemodel.h 2010-06-01 07:05:57 +0000
1507+++ mixxx/src/library/browsetablemodel.h 2010-07-22 07:29:40 +0000
1508@@ -5,13 +5,13 @@
1509 #include "trackmodel.h"
1510 class QMimeData;
1511
1512-class BrowseTableModel : public QFileSystemModel, public TrackModel
1513+class BrowseTableModel : public QFileSystemModel, public TrackModel
1514 {
1515 Q_OBJECT
1516 public:
1517 BrowseTableModel(QObject* parent);
1518 ~BrowseTableModel();
1519- virtual TrackInfoObject* getTrack(const QModelIndex& index) const;
1520+ virtual TrackPointer getTrack(const QModelIndex& index) const;
1521 virtual QString getTrackLocation(const QModelIndex& index) const;
1522 virtual void search(const QString& searchText);
1523 virtual void removeTrack(const QModelIndex& index);
1524
1525=== modified file 'mixxx/src/library/cratetablemodel.cpp'
1526--- mixxx/src/library/cratetablemodel.cpp 2010-07-15 09:55:40 +0000
1527+++ mixxx/src/library/cratetablemodel.cpp 2010-07-22 07:29:40 +0000
1528@@ -119,7 +119,7 @@
1529 }
1530 }
1531
1532-TrackInfoObject* CrateTableModel::getTrack(const QModelIndex& index) const {
1533+TrackPointer CrateTableModel::getTrack(const QModelIndex& index) const {
1534 int trackId = index.sibling(index.row(), fieldIndex(LIBRARYTABLE_ID)).data().toInt();
1535 return m_pTrackCollection->getTrackDAO().getTrack(trackId);
1536 }
1537
1538=== modified file 'mixxx/src/library/cratetablemodel.h'
1539--- mixxx/src/library/cratetablemodel.h 2010-04-03 23:26:07 +0000
1540+++ mixxx/src/library/cratetablemodel.h 2010-07-22 07:29:40 +0000
1541@@ -25,7 +25,7 @@
1542 Qt::ItemFlags flags(const QModelIndex &index) const;
1543
1544 // From TrackModel
1545- virtual TrackInfoObject* getTrack(const QModelIndex& index) const;
1546+ virtual TrackPointer getTrack(const QModelIndex& index) const;
1547 virtual QString getTrackLocation(const QModelIndex& index) const;
1548 virtual void search(const QString& searchText);
1549 virtual const QString currentSearch();
1550
1551=== modified file 'mixxx/src/library/dao/cue.h'
1552--- mixxx/src/library/dao/cue.h 2009-11-10 22:37:53 +0000
1553+++ mixxx/src/library/dao/cue.h 2010-07-22 07:29:40 +0000
1554@@ -7,8 +7,7 @@
1555 #include <QObject>
1556 #include <QMutex>
1557
1558-#include "library/dao/cuedao.h"
1559-
1560+class CueDAO;
1561 class TrackInfoObject;
1562
1563 class Cue : public QObject {
1564
1565=== modified file 'mixxx/src/library/dao/cuedao.h'
1566--- mixxx/src/library/dao/cuedao.h 2009-11-13 18:25:35 +0000
1567+++ mixxx/src/library/dao/cuedao.h 2010-07-22 07:29:40 +0000
1568@@ -7,19 +7,19 @@
1569 #include <QMap>
1570 #include <QSqlDatabase>
1571
1572+#include "trackinfoobject.h"
1573 #include "library/dao/dao.h"
1574
1575 #define CUE_TABLE "cues"
1576
1577 class Cue;
1578-class TrackInfoObject;
1579
1580 class CueDAO : public DAO {
1581 public:
1582 CueDAO(QSqlDatabase& database);
1583 virtual ~CueDAO();
1584 void setDatabase(QSqlDatabase& database) { m_database = database; };
1585-
1586+
1587 void initialize();
1588 int cueCount();
1589 int numCuesForTrack(int trackId);
1590
1591=== modified file 'mixxx/src/library/dao/playlistdao.h'
1592--- mixxx/src/library/dao/playlistdao.h 2010-01-05 12:17:30 +0000
1593+++ mixxx/src/library/dao/playlistdao.h 2010-07-22 07:29:40 +0000
1594@@ -3,7 +3,6 @@
1595
1596 #include <QSqlDatabase>
1597 #include "library/dao/dao.h"
1598-class TrackInfoObject;
1599
1600 const QString PLAYLISTTRACKSTABLE_POSITION = "position";
1601 const QString PLAYLISTTRACKSTABLE_PLAYLISTID = "playlist_id";
1602
1603=== modified file 'mixxx/src/library/dao/trackdao.cpp'
1604--- mixxx/src/library/dao/trackdao.cpp 2010-07-17 17:37:55 +0000
1605+++ mixxx/src/library/dao/trackdao.cpp 2010-07-22 07:29:40 +0000
1606@@ -5,9 +5,17 @@
1607 #include "trackinfoobject.h"
1608 #include "library/dao/trackdao.h"
1609
1610+// The number of tracks to cache in memory at once. Once the n+1'th track is
1611+// created, the TrackDAO's QCache deletes its TrackPointer to the track, which
1612+// allows the track reference count to drop to zero. The track cache basically
1613+// functions to hold a reference to the track so its reference count stays above
1614+// 0.
1615+#define TRACK_CACHE_SIZE 20
1616+
1617 TrackDAO::TrackDAO(QSqlDatabase& database, CueDAO& cueDao)
1618 : m_database(database),
1619- m_cueDao(cueDao) {
1620+ m_cueDao(cueDao),
1621+ m_trackCache(TRACK_CACHE_SIZE) {
1622
1623 }
1624
1625@@ -77,6 +85,12 @@
1626 return (getTrackId(absoluteFilePath) != -1);
1627 }
1628
1629+void TrackDAO::saveTrack(TrackPointer track) {
1630+
1631+ if (track)
1632+ saveTrack(track.data());
1633+}
1634+
1635 void TrackDAO::saveTrack(TrackInfoObject* pTrack) {
1636 // If track's id is not -1, then update, otherwise add.
1637 int trackId = pTrack->getId();
1638@@ -99,6 +113,11 @@
1639 }
1640
1641 void TrackDAO::slotTrackDirty() {
1642+ // This is a private slot that is connected to TIO's created by this
1643+ // TrackDAO. It is a way for the track to ask that it be saved. The only
1644+ // time this could be unsafe is when the TIO's reference count drops to
1645+ // 0. When that happens, the TIO is deleted with QObject:deleteLater, so Qt
1646+ // will wait for this slot to comlete.
1647 TrackInfoObject* pTrack = dynamic_cast<TrackInfoObject*>(sender());
1648 if (pTrack) {
1649 int id = pTrack->getId();
1650@@ -110,6 +129,11 @@
1651 }
1652
1653 void TrackDAO::slotTrackChanged() {
1654+ // This is a private slot that is connected to TIO's created by this
1655+ // TrackDAO. It is a way for the track to ask that it be saved. The only
1656+ // time this could be unsafe is when the TIO's reference count drops to
1657+ // 0. When that happens, the TIO is deleted with QObject:deleteLater, so Qt
1658+ // will wait for this slot to comlete.
1659 TrackInfoObject* pTrack = dynamic_cast<TrackInfoObject*>(sender());
1660 if (pTrack) {
1661 int id = pTrack->getId();
1662@@ -119,11 +143,24 @@
1663 }
1664 }
1665
1666+void TrackDAO::slotTrackSave() {
1667+ // This is a private slot that is connected to TIO's created by this
1668+ // TrackDAO. It is a way for the track to ask that it be saved. The last
1669+ // time it is used is when the track is being deleted (i.e. its reference
1670+ // count has dropped to 0). The TIO is deleted with QObject:deleteLater, so
1671+ // Qt will wait for this slot to comlete.
1672+ TrackInfoObject* pTrack = dynamic_cast<TrackInfoObject*>(sender());
1673+ if (pTrack) {
1674+ saveTrack(pTrack);
1675+ }
1676+}
1677+
1678 void TrackDAO::saveDirtyTracks() {
1679- QHashIterator<int, TrackInfoObject*> it(m_tracks);
1680+ QHashIterator<int, TrackWeakPointer> it(m_tracks);
1681 while (it.hasNext()) {
1682 it.next();
1683- TrackInfoObject* pTrack = it.value();
1684+ // Auto-cast from TrackWeakPointer to TrackPointer
1685+ TrackPointer pTrack = it.value();
1686 if (pTrack && pTrack->isDirty()) {
1687 saveTrack(pTrack);
1688 }
1689@@ -148,7 +185,7 @@
1690 return addTrack(fileInfo);
1691 }
1692
1693-void TrackDAO::addTrack(TrackInfoObject * pTrack)
1694+void TrackDAO::addTrack(TrackInfoObject* pTrack)
1695 {
1696 QTime time;
1697 time.start();
1698@@ -302,9 +339,25 @@
1699 }
1700 }
1701
1702-TrackInfoObject *TrackDAO::getTrackFromDB(QSqlQuery &query) const
1703+// static
1704+void TrackDAO::deleteTrack(TrackInfoObject* pTrack) {
1705+ Q_ASSERT(pTrack);
1706+
1707+ qDebug() << "Got deletion call for track" << pTrack << "ID" << pTrack->getId() << pTrack->getInfo();
1708+
1709+ // Save dirty tracks.
1710+ pTrack->save();
1711+
1712+ // if (iId != -1 && isDirty(iId)) {
1713+ // saveTrack(track);
1714+ // }
1715+
1716+ // Now Qt will delete it in the event loop.
1717+ pTrack->deleteLater();
1718+}
1719+
1720+TrackPointer TrackDAO::getTrackFromDB(QSqlQuery &query) const
1721 {
1722- TrackInfoObject* track = NULL;
1723 if (!query.isValid()) {
1724 //query.exec();
1725 }
1726@@ -340,7 +393,7 @@
1727 QString location = query.value(query.record().indexOf("location")).toString();
1728 bool header_parsed = query.value(query.record().indexOf("header_parsed")).toBool();
1729
1730- track = new TrackInfoObject(location);
1731+ TrackInfoObject* track = new TrackInfoObject(location);
1732
1733 // TIO already stats the file to see if it exists, what its length is,
1734 // etc. So don't bother setting it.
1735@@ -377,22 +430,51 @@
1736 this, SLOT(slotTrackDirty()));
1737 connect(track, SIGNAL(changed()),
1738 this, SLOT(slotTrackChanged()));
1739-
1740- m_tracks[trackId] = track;
1741-
1742+ connect(track, SIGNAL(save()),
1743+ this, SLOT(slotTrackSave()));
1744+
1745+ TrackPointer pTrack = TrackPointer(track, this->deleteTrack);
1746+
1747+ // Automatic conversion to a weak pointer
1748+ m_tracks[trackId] = pTrack;
1749+ m_trackCache.insert(trackId, new TrackPointer(pTrack));
1750+
1751+ return pTrack;
1752 }
1753 //query.finish();
1754
1755- return track;
1756+ return TrackPointer();
1757 }
1758
1759-TrackInfoObject *TrackDAO::getTrack(int id) const
1760+TrackPointer TrackDAO::getTrack(int id) const
1761 {
1762 //qDebug() << "TrackDAO::getTrack" << QThread::currentThread() << m_database.connectionName();
1763
1764+
1765+ // If the track cache contains the track, use it to get a strong reference
1766+ // to the track. We do this first so that the QCache keeps track of the
1767+ // least-recently-used track so that it expires them intelligently.
1768+ if (m_trackCache.contains(id)) {
1769+ TrackPointer& pTrack = *m_trackCache[id];
1770+
1771+ // If the strong reference is still valid (it should be), then return
1772+ // it. Otherwise query the DB for the track.
1773+ if (pTrack)
1774+ return pTrack;
1775+ }
1776+
1777+ // Next, check the weak-reference cache to see if the track was ever loaded
1778+ // into memory. It's possible that something is currently using this track,
1779+ // so its reference count is non-zero despite it not being present in the
1780+ // track cache. m_tracks is a map of weak pointers to the tracks.
1781 if (m_tracks.contains(id)) {
1782 //qDebug() << "Returning cached TIO for track" << id;
1783- return m_tracks[id];
1784+ TrackPointer pTrack = m_tracks[id];
1785+
1786+ // If the pointer to the cached copy is still valid, return
1787+ // it. Otherwise, re-query the DB for the track.
1788+ if (pTrack)
1789+ return pTrack;
1790 }
1791
1792 QTime time;
1793@@ -400,15 +482,16 @@
1794 QSqlQuery query(m_database);
1795
1796 query.prepare("SELECT library.id, artist, title, album, year, genre, tracknumber, filetype, track_locations.location as location, track_locations.filesize as filesize, comment, url, duration, bitrate, samplerate, cuepoint, bpm, wavesummaryhex, channels, header_parsed FROM Library INNER JOIN track_locations ON library.location = track_locations.id WHERE library.id=" + QString("%1").arg(id));
1797- TrackInfoObject* track = NULL;
1798+ TrackPointer pTrack;
1799+
1800 if (query.exec()) {
1801- track = getTrackFromDB(query);
1802+ pTrack = getTrackFromDB(query);
1803 } else {
1804 qDebug() << QString("getTrack(%1)").arg(id) << query.lastError();
1805 }
1806 qDebug() << "getTrack hit the database, took " << time.elapsed() << "ms";
1807
1808- return track;
1809+ return pTrack;
1810 }
1811
1812 /** Saves a track's info back to the database */
1813
1814=== modified file 'mixxx/src/library/dao/trackdao.h'
1815--- mixxx/src/library/dao/trackdao.h 2010-07-17 03:39:13 +0000
1816+++ mixxx/src/library/dao/trackdao.h 2010-07-22 07:29:40 +0000
1817@@ -8,9 +8,13 @@
1818 #include <QSet>
1819 #include <QHash>
1820 #include <QSqlDatabase>
1821+#include <QSharedPointer>
1822+#include <QWeakPointer>
1823+#include <QCache>
1824+
1825+#include "trackinfoobject.h"
1826 #include "library/dao/cuedao.h"
1827 #include "library/dao/dao.h"
1828-class TrackInfoObject;
1829
1830 const QString LIBRARYTABLE_ID = "id";
1831 const QString LIBRARYTABLE_ARTIST = "artist";
1832@@ -49,7 +53,7 @@
1833 int addTrack(QString absoluteFilePath);
1834 int addTrack(QFileInfo& fileInfo);
1835 void removeTrack(int id);
1836- TrackInfoObject *getTrack(int id) const;
1837+ TrackPointer getTrack(int id) const;
1838 bool isDirty(int trackId);
1839
1840 // Scanning related calls. Should be elsewhere or private somehow.
1841@@ -65,7 +69,11 @@
1842 void trackChanged(int trackId);
1843
1844 public slots:
1845- void saveTrack(TrackInfoObject* pTrack);
1846+ // The public interface to the TrackDAO requires a TrackPointer so that we
1847+ // have a guarantee that the track will not be deleted while we are working
1848+ // on it. However, private parts of TrackDAO can use the raw saveTrack(TIO*)
1849+ // call.
1850+ void saveTrack(TrackPointer pTrack);
1851
1852 // TrackDAO provides a cache of TrackInfoObject's that have been requested
1853 // via getTrack(). saveDirtyTracks() saves all cached tracks marked dirty
1854@@ -75,13 +83,18 @@
1855 private slots:
1856 void slotTrackDirty();
1857 void slotTrackChanged();
1858+ void slotTrackSave();
1859
1860 private:
1861+ void saveTrack(TrackInfoObject* pTrack);
1862 void updateTrack(TrackInfoObject* pTrack);
1863- void addTrack(TrackInfoObject * pTrack);
1864- TrackInfoObject *getTrackFromDB(QSqlQuery &query) const;
1865+ void addTrack(TrackInfoObject* pTrack);
1866+ TrackPointer getTrackFromDB(QSqlQuery &query) const;
1867 QString absoluteFilePath(QString location);
1868
1869+ // Called when the TIO reference count drops to 0
1870+ static void deleteTrack(TrackInfoObject* pTrack);
1871+
1872 // Prevents evil copy constructors! (auto-generated ones by the compiler
1873 // that don't compile)
1874 TrackDAO(TrackDAO&);
1875@@ -99,8 +112,9 @@
1876
1877 QSqlDatabase &m_database;
1878 CueDAO &m_cueDao;
1879- mutable QHash<int, TrackInfoObject*> m_tracks;
1880+ mutable QHash<int, TrackWeakPointer> m_tracks;
1881 mutable QSet<int> m_dirtyTracks;
1882+ mutable QCache<int,TrackPointer> m_trackCache;
1883 };
1884
1885 #endif //TRACKDAO_H
1886
1887=== modified file 'mixxx/src/library/itunesplaylistmodel.cpp'
1888--- mixxx/src/library/itunesplaylistmodel.cpp 2010-06-18 09:07:12 +0000
1889+++ mixxx/src/library/itunesplaylistmodel.cpp 2010-07-22 07:29:40 +0000
1890@@ -41,7 +41,7 @@
1891 if (!index.isValid())
1892 return QVariant();
1893
1894- TrackInfoObject *pTrack = getTrack(index);
1895+ TrackPointer pTrack = getTrack(index);
1896 if ( pTrack == NULL )
1897 return QVariant();
1898
1899@@ -159,13 +159,13 @@
1900 return QString();
1901 }
1902
1903-TrackInfoObject * ITunesPlaylistModel::getTrack(const QModelIndex& index) const
1904+TrackPointer ITunesPlaylistModel::getTrack(const QModelIndex& index) const
1905 {
1906 int row = index.row();
1907
1908 if (!m_pTrackModel ||
1909 !m_pTrackModel->m_mPlaylists.contains(m_sCurrentPlaylist)) {
1910- return NULL;
1911+ return TrackPointer();
1912 }
1913
1914 // Qt should do this by reference for us so we aren't actually making a copy
1915@@ -173,7 +173,7 @@
1916 QList<QString> songIds = m_pTrackModel->m_mPlaylists[m_sCurrentPlaylist];
1917
1918 if (row < 0 || row >= songIds.length()) {
1919- return NULL;
1920+ return TrackPointer();
1921 }
1922
1923 return m_pTrackModel->getTrackById(songIds.at(row));
1924
1925=== modified file 'mixxx/src/library/itunesplaylistmodel.h'
1926--- mixxx/src/library/itunesplaylistmodel.h 2010-04-03 23:26:07 +0000
1927+++ mixxx/src/library/itunesplaylistmodel.h 2010-07-22 07:29:40 +0000
1928@@ -10,7 +10,6 @@
1929 #include "trackmodel.h"
1930
1931 class ITunesTrackModel;
1932-class TrackInfoObject;
1933
1934 class ITunesPlaylistModel : public QAbstractTableModel, public TrackModel {
1935
1936@@ -43,7 +42,7 @@
1937 virtual int columnCount(const QModelIndex& parent) const;
1938
1939 //Playlist Model stuff
1940- virtual TrackInfoObject* getTrack(const QModelIndex& index) const;
1941+ virtual TrackPointer getTrack(const QModelIndex& index) const;
1942 virtual QString getTrackLocation(const QModelIndex& index) const;
1943 virtual void search(const QString& searchText);
1944 virtual const QString currentSearch();
1945
1946=== modified file 'mixxx/src/library/itunestrackmodel.cpp'
1947--- mixxx/src/library/itunestrackmodel.cpp 2010-06-18 08:32:27 +0000
1948+++ mixxx/src/library/itunestrackmodel.cpp 2010-07-22 07:29:40 +0000
1949@@ -243,7 +243,7 @@
1950 return false;
1951 }
1952
1953-TrackInfoObject *ITunesTrackModel::parseTrackNode(QDomNode songNode) const
1954+TrackPointer ITunesTrackModel::parseTrackNode(QDomNode songNode) const
1955 {
1956 QString strloc = findValueByKey(songNode,"Location");
1957 QByteArray strlocbytes = strloc.toUtf8();
1958@@ -258,7 +258,7 @@
1959 #endif
1960 //pTrack->setLocation(QUrl(findValueByKey(songNode,"Location")).toLocalFile());
1961
1962- TrackInfoObject *pTrack = new TrackInfoObject(trackLocation);
1963+ TrackInfoObject* pTrack = new TrackInfoObject(trackLocation);
1964
1965 pTrack->setArtist(findValueByKey(songNode, "Artist"));
1966 pTrack->setTitle(findValueByKey(songNode, "Name"));
1967@@ -270,12 +270,13 @@
1968 // ITunes stores time in total milliseconds
1969 pTrack->setDuration(findValueByKey(songNode,"Total Time").toInt() / 1000);
1970
1971- return pTrack;
1972+ // Let Qt handle deleting the track since it isn't owned by the library.
1973+ return TrackPointer(pTrack, &QObject::deleteLater);
1974 }
1975
1976-TrackInfoObject* ITunesTrackModel::getTrackById(QString id) {
1977+TrackPointer ITunesTrackModel::getTrackById(QString id) {
1978 if (!m_mTracksById.contains(id)) {
1979- return NULL;
1980+ return TrackPointer();
1981 }
1982 return parseTrackNode(m_mTracksById[id]);
1983 }
1984
1985=== modified file 'mixxx/src/library/itunestrackmodel.h'
1986--- mixxx/src/library/itunestrackmodel.h 2010-02-23 00:21:50 +0000
1987+++ mixxx/src/library/itunestrackmodel.h 2010-07-22 07:29:40 +0000
1988@@ -24,7 +24,6 @@
1989 #include "abstractxmltrackmodel.h"
1990 #include "itunesplaylistmodel.h"
1991
1992-class TrackInfoObject;
1993 class QSqlDatabase;
1994
1995 /**
1996@@ -62,7 +61,7 @@
1997 void finishedLoading();
1998
1999 protected:
2000- virtual TrackInfoObject *parseTrackNode(QDomNode node) const;
2001+ virtual TrackPointer parseTrackNode(QDomNode node) const;
2002 /* Implemented by AbstractXmlTrackModel implementations to return the data for song columns */
2003 virtual QVariant getTrackColumnData(QDomNode node, const QModelIndex& index) const;
2004 /* Called by AbstractXmlTrackModel implementations to enumerate their columns */
2005@@ -70,7 +69,7 @@
2006 private:
2007 QString findValueByKey(QDomNode dictNode, QString key) const;
2008 QDomElement findNodeByKey(QDomNode dictNode, QString key) const;
2009- TrackInfoObject* getTrackById(QString id);
2010+ TrackPointer getTrackById(QString id);
2011
2012 QHash<QString, QDomNode> m_mTracksById;
2013 QHash<QString, QList<QString> > m_mPlaylists;
2014
2015=== modified file 'mixxx/src/library/legacylibraryimporter.cpp'
2016--- mixxx/src/library/legacylibraryimporter.cpp 2010-07-15 09:55:40 +0000
2017+++ mixxx/src/library/legacylibraryimporter.cpp 2010-07-22 07:29:40 +0000
2018@@ -24,6 +24,10 @@
2019 QList<int> indexes;
2020 };
2021
2022+void doNothing(TrackInfoObject*) {
2023+
2024+}
2025+
2026 LegacyLibraryImporter::LegacyLibraryImporter(TrackDAO& trackDao,
2027 PlaylistDAO& playlistDao) : QObject(),
2028 m_trackDao(trackDao),
2029@@ -102,8 +106,8 @@
2030 // Read the metadata we couldn't support in <1.8 from file.
2031 QFileInfo fileInfo(trackInfo17.getLocation());
2032 //Ensure we have the absolute file path stored
2033- trackInfo17.setLocation(fileInfo.absoluteFilePath());
2034- TrackInfoObject trackInfoNew(trackInfo17.getLocation());
2035+ trackInfo17.setLocation(fileInfo.absoluteFilePath());
2036+ TrackInfoObject trackInfoNew(trackInfo17.getLocation());
2037 trackInfo17.setGenre(trackInfoNew.getGenre());
2038 trackInfo17.setAlbum(trackInfoNew.getAlbum());
2039 trackInfo17.setYear(trackInfoNew.getYear());
2040@@ -118,7 +122,9 @@
2041 pCue->setPosition(fCuePoint);
2042 }
2043
2044- m_trackDao.saveTrack(&trackInfo17);
2045+ // Provide a no-op deleter b/c this Track is on the stack.
2046+ TrackPointer pTrack(&trackInfo17, &doNothing);
2047+ m_trackDao.saveTrack(pTrack);
2048
2049 //Check if this track is used in a playlist anywhere. If it is, save the
2050 //track location. (The "id" of a track in 1.8 is a database index, so it's totally
2051
2052=== modified file 'mixxx/src/library/library.cpp'
2053--- mixxx/src/library/library.cpp 2010-05-19 06:11:04 +0000
2054+++ mixxx/src/library/library.cpp 2010-07-22 07:29:40 +0000
2055@@ -3,7 +3,6 @@
2056
2057 #include <QItemSelectionModel>
2058
2059-#include "trackinfoobject.h"
2060 #include "library/library.h"
2061 #include "library/libraryfeature.h"
2062 #include "library/librarytablemodel.h"
2063@@ -95,10 +94,10 @@
2064 pTrackTableView->installEventFilter(pKeyboard);
2065 connect(this, SIGNAL(showTrackModel(QAbstractItemModel*)),
2066 pTrackTableView, SLOT(loadTrackModel(QAbstractItemModel*)));
2067- connect(pTrackTableView, SIGNAL(loadTrack(TrackInfoObject*)),
2068- this, SLOT(slotLoadTrack(TrackInfoObject*)));
2069- connect(pTrackTableView, SIGNAL(loadTrackToPlayer(TrackInfoObject*, int)),
2070- this, SLOT(slotLoadTrackToPlayer(TrackInfoObject*, int)));
2071+ connect(pTrackTableView, SIGNAL(loadTrack(TrackPointer)),
2072+ this, SLOT(slotLoadTrack(TrackPointer)));
2073+ connect(pTrackTableView, SIGNAL(loadTrackToPlayer(TrackPointer, int)),
2074+ this, SLOT(slotLoadTrackToPlayer(TrackPointer, int)));
2075 pLibraryWidget->registerView(m_sTrackViewName, pTrackTableView);
2076
2077 connect(this, SIGNAL(switchToView(const QString&)),
2078@@ -135,10 +134,10 @@
2079 this, SLOT(slotShowTrackModel(QAbstractItemModel*)));
2080 connect(feature, SIGNAL(switchToView(const QString&)),
2081 this, SLOT(slotSwitchToView(const QString&)));
2082- connect(feature, SIGNAL(loadTrack(TrackInfoObject*)),
2083- this, SLOT(slotLoadTrack(TrackInfoObject*)));
2084- connect(feature, SIGNAL(loadTrackToPlayer(TrackInfoObject*, int)),
2085- this, SLOT(slotLoadTrackToPlayer(TrackInfoObject*, int)));
2086+ connect(feature, SIGNAL(loadTrack(TrackPointer)),
2087+ this, SLOT(slotLoadTrack(TrackPointer)));
2088+ connect(feature, SIGNAL(loadTrackToPlayer(TrackPointer, int)),
2089+ this, SLOT(slotLoadTrackToPlayer(TrackPointer, int)));
2090 connect(feature, SIGNAL(restoreSearch(const QString&)),
2091 this, SLOT(slotRestoreSearch(const QString&)));
2092 }
2093@@ -157,11 +156,11 @@
2094 emit(switchToView(view));
2095 }
2096
2097-void Library::slotLoadTrack(TrackInfoObject* pTrack) {
2098+void Library::slotLoadTrack(TrackPointer pTrack) {
2099 emit(loadTrack(pTrack));
2100 }
2101
2102-void Library::slotLoadTrackToPlayer(TrackInfoObject* pTrack, int player) {
2103+void Library::slotLoadTrackToPlayer(TrackPointer pTrack, int player) {
2104 emit(loadTrackToPlayer(pTrack, player));
2105 }
2106
2107@@ -179,10 +178,10 @@
2108 m_pPlaylistFeature->slotCreatePlaylist();
2109 }
2110
2111-QList<TrackInfoObject*> Library::getTracksToAutoLoad()
2112+QList<TrackPointer> Library::getTracksToAutoLoad()
2113 {
2114 if (m_pPromoTracksFeature)
2115 return m_pPromoTracksFeature->getTracksToAutoLoad();
2116 else
2117- return QList<TrackInfoObject*>();
2118+ return QList<TrackPointer>();
2119 }
2120
2121=== modified file 'mixxx/src/library/library.h'
2122--- mixxx/src/library/library.h 2010-02-23 20:06:25 +0000
2123+++ mixxx/src/library/library.h 2010-07-22 07:29:40 +0000
2124@@ -12,10 +12,10 @@
2125 #include <QAbstractItemModel>
2126
2127 #include "configobject.h"
2128+#include "trackinfoobject.h"
2129
2130 class TrackModel;
2131 class TrackCollection;
2132-class TrackInfoObject;
2133 class SidebarModel;
2134 class LibraryFeature;
2135 class LibraryTableModel;
2136@@ -40,7 +40,7 @@
2137 WLibrary* libraryWidget,
2138 MixxxKeyboard* pKeyboard);
2139 void addFeature(LibraryFeature* feature);
2140- QList<TrackInfoObject*> getTracksToAutoLoad();
2141+ QList<TrackPointer> getTracksToAutoLoad();
2142
2143 // TODO(rryan) Transitionary only -- the only reason this is here is so the
2144 // waveform widgets can signal to a player to load a track. This can be
2145@@ -55,16 +55,16 @@
2146 public slots:
2147 void slotShowTrackModel(QAbstractItemModel* model);
2148 void slotSwitchToView(const QString& view);
2149- void slotLoadTrack(TrackInfoObject* pTrack);
2150- void slotLoadTrackToPlayer(TrackInfoObject* pTrack, int player);
2151+ void slotLoadTrack(TrackPointer pTrack);
2152+ void slotLoadTrackToPlayer(TrackPointer pTrack, int player);
2153 void slotRestoreSearch(const QString& text);
2154 void slotRefreshLibraryModels();
2155 void slotCreatePlaylist();
2156 signals:
2157 void showTrackModel(QAbstractItemModel* model);
2158 void switchToView(const QString& view);
2159- void loadTrack(TrackInfoObject* tio);
2160- void loadTrackToPlayer(TrackInfoObject* tio, int n);
2161+ void loadTrack(TrackPointer tio);
2162+ void loadTrackToPlayer(TrackPointer tio, int n);
2163 void restoreSearch(const QString&);
2164
2165 private:
2166
2167=== modified file 'mixxx/src/library/libraryfeature.h'
2168--- mixxx/src/library/libraryfeature.h 2010-02-23 20:06:25 +0000
2169+++ mixxx/src/library/libraryfeature.h 2010-07-22 07:29:40 +0000
2170@@ -13,8 +13,9 @@
2171 #include <QAbstractItemModel>
2172 #include <QUrl>
2173
2174+#include "trackinfoobject.h"
2175+
2176 class TrackModel;
2177-class TrackInfoObject;
2178 class WLibrarySidebar;
2179 class WLibrary;
2180 class MixxxKeyboard;
2181@@ -48,8 +49,8 @@
2182 void featureUpdated();
2183 void showTrackModel(QAbstractItemModel* model);
2184 void switchToView(const QString& view);
2185- void loadTrack(TrackInfoObject* pTrack);
2186- void loadTrackToPlayer(TrackInfoObject* pTrack, int player);
2187+ void loadTrack(TrackPointer pTrack);
2188+ void loadTrackToPlayer(TrackPointer pTrack, int player);
2189 void restoreSearch(const QString&);
2190 };
2191
2192
2193=== modified file 'mixxx/src/library/librarytablemodel.cpp'
2194--- mixxx/src/library/librarytablemodel.cpp 2010-07-15 09:55:40 +0000
2195+++ mixxx/src/library/librarytablemodel.cpp 2010-07-22 07:29:40 +0000
2196@@ -112,7 +112,7 @@
2197 return false;
2198 }
2199
2200-TrackInfoObject* LibraryTableModel::getTrack(const QModelIndex& index) const
2201+TrackPointer LibraryTableModel::getTrack(const QModelIndex& index) const
2202 {
2203 int trackId = index.sibling(index.row(), fieldIndex(LIBRARYTABLE_ID)).data().toInt();
2204 return m_trackDao.getTrack(trackId);
2205
2206=== modified file 'mixxx/src/library/librarytablemodel.h'
2207--- mixxx/src/library/librarytablemodel.h 2010-04-03 23:26:07 +0000
2208+++ mixxx/src/library/librarytablemodel.h 2010-07-22 07:29:40 +0000
2209@@ -17,7 +17,7 @@
2210 LibraryTableModel(QObject* parent, TrackCollection* pTrackCollection);
2211 virtual ~LibraryTableModel();
2212
2213- virtual TrackInfoObject* getTrack(const QModelIndex& index) const;
2214+ virtual TrackPointer getTrack(const QModelIndex& index) const;
2215 virtual QString getTrackLocation(const QModelIndex& index) const;
2216 virtual void search(const QString& searchText);
2217 virtual const QString currentSearch();
2218
2219=== modified file 'mixxx/src/library/missingtablemodel.cpp'
2220--- mixxx/src/library/missingtablemodel.cpp 2010-07-15 09:55:40 +0000
2221+++ mixxx/src/library/missingtablemodel.cpp 2010-07-22 07:29:40 +0000
2222@@ -103,7 +103,7 @@
2223 return false;
2224 }
2225
2226-TrackInfoObject* MissingTableModel::getTrack(const QModelIndex& index) const
2227+TrackPointer MissingTableModel::getTrack(const QModelIndex& index) const
2228 {
2229 //FIXME: use position instead of location for playlist tracks?
2230
2231
2232=== modified file 'mixxx/src/library/missingtablemodel.h'
2233--- mixxx/src/library/missingtablemodel.h 2010-04-03 23:26:07 +0000
2234+++ mixxx/src/library/missingtablemodel.h 2010-07-22 07:29:40 +0000
2235@@ -17,7 +17,7 @@
2236 public:
2237 MissingTableModel(QObject* parent, TrackCollection* pTrackCollection);
2238 virtual ~MissingTableModel();
2239- virtual TrackInfoObject* getTrack(const QModelIndex& index) const;
2240+ virtual TrackPointer getTrack(const QModelIndex& index) const;
2241 virtual QString getTrackLocation(const QModelIndex& index) const;
2242 virtual void search(const QString& searchText);
2243 virtual const QString currentSearch();
2244
2245=== modified file 'mixxx/src/library/playlisttablemodel.cpp'
2246--- mixxx/src/library/playlisttablemodel.cpp 2010-07-15 09:55:40 +0000
2247+++ mixxx/src/library/playlisttablemodel.cpp 2010-07-22 07:29:40 +0000
2248@@ -146,7 +146,7 @@
2249 return true;
2250 }
2251
2252-TrackInfoObject* PlaylistTableModel::getTrack(const QModelIndex& index) const
2253+TrackPointer PlaylistTableModel::getTrack(const QModelIndex& index) const
2254 {
2255 //FIXME: use position instead of location for playlist tracks?
2256
2257
2258=== modified file 'mixxx/src/library/playlisttablemodel.h'
2259--- mixxx/src/library/playlisttablemodel.h 2010-04-03 23:26:07 +0000
2260+++ mixxx/src/library/playlisttablemodel.h 2010-07-22 07:29:40 +0000
2261@@ -19,7 +19,7 @@
2262 PlaylistTableModel(QObject* parent, TrackCollection* pTrackCollection);
2263 virtual ~PlaylistTableModel();
2264 void setPlaylist(int playlistId);
2265- virtual TrackInfoObject* getTrack(const QModelIndex& index) const;
2266+ virtual TrackPointer getTrack(const QModelIndex& index) const;
2267 virtual QString getTrackLocation(const QModelIndex& index) const;
2268 virtual void search(const QString& searchText);
2269 virtual const QString currentSearch();
2270
2271=== modified file 'mixxx/src/library/preparefeature.cpp'
2272--- mixxx/src/library/preparefeature.cpp 2010-02-23 20:06:25 +0000
2273+++ mixxx/src/library/preparefeature.cpp 2010-07-22 07:29:40 +0000
2274@@ -41,10 +41,10 @@
2275 DlgPrepare* pPrepareView = new DlgPrepare(libraryWidget,
2276 m_pConfig,
2277 m_pTrackCollection);
2278- connect(pPrepareView, SIGNAL(loadTrack(TrackInfoObject*)),
2279- this, SIGNAL(loadTrack(TrackInfoObject*)));
2280- connect(pPrepareView, SIGNAL(loadTrackToPlayer(TrackInfoObject*, int)),
2281- this, SIGNAL(loadTrackToPlayer(TrackInfoObject*, int)));
2282+ connect(pPrepareView, SIGNAL(loadTrack(TrackPointer)),
2283+ this, SIGNAL(loadTrack(TrackPointer)));
2284+ connect(pPrepareView, SIGNAL(loadTrackToPlayer(TrackPointer, int)),
2285+ this, SIGNAL(loadTrackToPlayer(TrackPointer, int)));
2286 pPrepareView->installEventFilter(keyboard);
2287
2288 libraryWidget->registerView(m_sPrepareViewName, pPrepareView);
2289
2290=== modified file 'mixxx/src/library/promotracksfeature.cpp'
2291--- mixxx/src/library/promotracksfeature.cpp 2010-02-23 20:06:25 +0000
2292+++ mixxx/src/library/promotracksfeature.cpp 2010-07-22 07:29:40 +0000
2293@@ -56,7 +56,11 @@
2294 {
2295 QString trackPath = extra.readLine();
2296 qDebug() << "PROMO: Auto-loading track" << trackPath;
2297- m_tracksToAutoLoad.append(new TrackInfoObject(m_pConfig->getConfigPath() + "/" + trackPath));
2298+ TrackInfoObject* track = new TrackInfoObject(m_pConfig->getConfigPath() + "/" + trackPath);
2299+ // TODO(XXX) These tracks are probably getting leaked b/c
2300+ // m_tracksToAutoLoad is never cleared.
2301+ TrackPointer pTrack = TrackPointer(track, &QObject::deleteLater);
2302+ m_tracksToAutoLoad.append(pTrack);
2303 }
2304 file.close();
2305 }
2306@@ -79,7 +83,7 @@
2307 return (QFile::exists(m_sPromoLocalHTMLLocation));
2308 }
2309
2310-QList<TrackInfoObject*> PromoTracksFeature::getTracksToAutoLoad()
2311+QList<TrackPointer> PromoTracksFeature::getTracksToAutoLoad()
2312 {
2313 return m_tracksToAutoLoad;
2314 }
2315@@ -91,10 +95,10 @@
2316 m_pPromoTracksView = new PromoTracksWebView(libraryWidget, m_pConfig->getConfigPath(), m_sPromoLocalHTMLLocation, m_sPromoRemoteHTMLLocation);
2317
2318 libraryWidget->registerView(m_sPromoTracksViewName, m_pPromoTracksView);
2319- connect(m_pPromoTracksView, SIGNAL(loadTrack(TrackInfoObject*)),
2320- this, SIGNAL(loadTrack(TrackInfoObject*)));
2321- connect(m_pPromoTracksView, SIGNAL(loadTrackToPlayer(TrackInfoObject*, int)),
2322- this, SIGNAL(loadTrackToPlayer(TrackInfoObject*, int)));
2323+ connect(m_pPromoTracksView, SIGNAL(loadTrack(TrackPointer)),
2324+ this, SIGNAL(loadTrack(TrackPointer)));
2325+ connect(m_pPromoTracksView, SIGNAL(loadTrackToPlayer(TrackPointer, int)),
2326+ this, SIGNAL(loadTrackToPlayer(TrackPointer, int)));
2327 }
2328
2329 QAbstractItemModel* PromoTracksFeature::getChildModel() {
2330
2331=== modified file 'mixxx/src/library/promotracksfeature.h'
2332--- mixxx/src/library/promotracksfeature.h 2010-02-23 20:06:25 +0000
2333+++ mixxx/src/library/promotracksfeature.h 2010-07-22 07:29:40 +0000
2334@@ -20,6 +20,7 @@
2335
2336 #include <QStringListModel>
2337
2338+#include "trackinfoobject.h"
2339 #include "library/libraryfeature.h"
2340 #include "library/dao/playlistdao.h"
2341 #include "configobject.h"
2342@@ -27,7 +28,6 @@
2343 class PlaylistTableModel;
2344 class ProxyTrackModel;
2345 class TrackCollection;
2346-class TrackInfoObject;
2347 class PromoTracksWebView;
2348
2349 class PromoTracksFeature : public LibraryFeature {
2350@@ -38,7 +38,7 @@
2351 TrackCollection* pTrackCollection);
2352 virtual ~PromoTracksFeature();
2353 static bool isSupported(ConfigObject<ConfigValue>* config);
2354- QList<TrackInfoObject*> getTracksToAutoLoad();
2355+ QList<TrackPointer> getTracksToAutoLoad();
2356
2357 QVariant title();
2358 QIcon getIcon();
2359@@ -69,7 +69,7 @@
2360 static QString m_sPromoRemoteHTMLLocation;
2361 QString m_sPromoAutoloadLocation;
2362 QStringListModel m_childModel;
2363- QList<TrackInfoObject*> m_tracksToAutoLoad;
2364+ QList<TrackPointer> m_tracksToAutoLoad;
2365 };
2366
2367
2368
2369=== modified file 'mixxx/src/library/promotrackswebview.cpp'
2370--- mixxx/src/library/promotrackswebview.cpp 2010-02-08 07:49:29 +0000
2371+++ mixxx/src/library/promotrackswebview.cpp 2010-07-22 07:29:40 +0000
2372@@ -35,8 +35,8 @@
2373 //fails, and display a local copy instead.
2374 connect(this, SIGNAL(loadFinished(bool)),
2375 this, SLOT(handleLoadFinished(bool)));
2376-
2377- //Load the promo tracks webpage
2378+
2379+ //Load the promo tracks webpage
2380 QWebView::load(QUrl(m_sRemoteURL));
2381
2382 //Let us manually handle links that are clicked via the linkClicked()
2383@@ -44,11 +44,11 @@
2384 QWebPage* page = QWebView::page();
2385 page->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
2386
2387- connect(this, SIGNAL(linkClicked(const QUrl&)),
2388+ connect(this, SIGNAL(linkClicked(const QUrl&)),
2389 this, SLOT(handleClickedLink(const QUrl&)));
2390
2391 QTimer* loadingTimer = new QTimer(this);
2392- connect(loadingTimer, SIGNAL(timeout()),
2393+ connect(loadingTimer, SIGNAL(timeout()),
2394 this, SLOT(checkWebpageLoadingProgress()));
2395 loadingTimer->start(LOAD_TIMEOUT);
2396 }
2397@@ -97,17 +97,19 @@
2398
2399 void PromoTracksWebView::handleClickedLink(const QUrl& url)
2400 {
2401- qDebug() << "link clicked!" << url;
2402+ qDebug() << "link clicked!" << url;
2403
2404 if (url.scheme() == "deck1")
2405 {
2406 TrackInfoObject* track = new TrackInfoObject(m_sMixxxPath + "/" + url.path());
2407- emit(loadTrackToPlayer(track, 1));
2408+ TrackPointer pTrack = TrackPointer(track, &QObject::deleteLater);
2409+ emit(loadTrackToPlayer(pTrack, 1));
2410 }
2411 else if (url.scheme() == "deck2")
2412 {
2413 TrackInfoObject* track = new TrackInfoObject(m_sMixxxPath + "/" + url.path());
2414- emit(loadTrackToPlayer(track, 2));
2415+ TrackPointer pTrack = TrackPointer(track, &QObject::deleteLater);
2416+ emit(loadTrackToPlayer(pTrack, 2));
2417 }
2418 else
2419 {
2420
2421=== modified file 'mixxx/src/library/promotrackswebview.h'
2422--- mixxx/src/library/promotrackswebview.h 2010-02-08 07:49:29 +0000
2423+++ mixxx/src/library/promotrackswebview.h 2010-07-22 07:29:40 +0000
2424@@ -27,9 +27,9 @@
2425
2426 class PromoTracksWebView : public QWebView, public LibraryView
2427 {
2428- Q_OBJECT
2429+ Q_OBJECT
2430 public:
2431- PromoTracksWebView(QWidget* parent, QString mixxxPath,
2432+ PromoTracksWebView(QWidget* parent, QString mixxxPath,
2433 QString localURL, QString remoteURL);
2434 ~PromoTracksWebView();
2435 virtual void setup(QDomNode node);
2436@@ -40,14 +40,14 @@
2437 virtual QWidget* getWidgetForMIDIControl() { return this; };
2438 virtual void keyPressEvent(QKeyEvent* event);
2439
2440- public slots:
2441+ public slots:
2442 void handleClickedLink(const QUrl& url);
2443 void handleLoadFinished(bool ok);
2444 void checkWebpageLoadingProgress();
2445
2446 signals:
2447- void loadTrack(TrackInfoObject* pTrack);
2448- void loadTrackToPlayer(TrackInfoObject* pTrack, int player);
2449+ void loadTrack(TrackPointer pTrack);
2450+ void loadTrackToPlayer(TrackPointer pTrack, int player);
2451 protected:
2452 //virtual QString userAgentForUrl (const QUrl & url) const;
2453
2454
2455=== modified file 'mixxx/src/library/proxytrackmodel.cpp'
2456--- mixxx/src/library/proxytrackmodel.cpp 2010-04-03 23:26:07 +0000
2457+++ mixxx/src/library/proxytrackmodel.cpp 2010-07-22 07:29:40 +0000
2458@@ -20,7 +20,7 @@
2459 ProxyTrackModel::~ProxyTrackModel() {
2460 }
2461
2462-TrackInfoObject* ProxyTrackModel::getTrack(const QModelIndex& index) const {
2463+TrackPointer ProxyTrackModel::getTrack(const QModelIndex& index) const {
2464 QModelIndex indexSource = mapToSource(index);
2465 return m_pTrackModel->getTrack(indexSource);
2466 }
2467
2468=== modified file 'mixxx/src/library/proxytrackmodel.h'
2469--- mixxx/src/library/proxytrackmodel.h 2010-04-03 23:26:07 +0000
2470+++ mixxx/src/library/proxytrackmodel.h 2010-07-22 07:29:40 +0000
2471@@ -25,7 +25,7 @@
2472 ProxyTrackModel(QAbstractItemModel* pTrackModel, bool bHandleSearches=true);
2473 virtual ~ProxyTrackModel();
2474
2475- virtual TrackInfoObject* getTrack(const QModelIndex& index) const;
2476+ virtual TrackPointer getTrack(const QModelIndex& index) const;
2477 virtual QString getTrackLocation(const QModelIndex& index) const;
2478 virtual void search(const QString& searchText);
2479 virtual const QString currentSearch();
2480
2481=== modified file 'mixxx/src/library/rhythmboxplaylistmodel.cpp'
2482--- mixxx/src/library/rhythmboxplaylistmodel.cpp 2010-06-18 09:07:12 +0000
2483+++ mixxx/src/library/rhythmboxplaylistmodel.cpp 2010-07-22 07:29:40 +0000
2484@@ -100,7 +100,7 @@
2485 // TODO(XXX) THIS IS SOAKED IN WASTE. It creates a new TIO for every
2486 // row. The trackmodel need some sort of 'getIndexOfTrack' call, and then
2487 // you simply pass this whole call off to RhythmboxTrackModel::data(index).
2488- TrackInfoObject *pTrack = getTrack(index);
2489+ TrackPointer pTrack = getTrack(index);
2490 if ( pTrack == NULL )
2491 return QVariant();
2492
2493@@ -213,7 +213,7 @@
2494 return QString();
2495 }
2496
2497-TrackInfoObject * RhythmboxPlaylistModel::getTrack(const QModelIndex& index) const
2498+TrackPointer RhythmboxPlaylistModel::getTrack(const QModelIndex& index) const
2499 {
2500 QDomNodeList playlistTrackList = m_mPlaylists[m_sCurrentPlaylist];
2501 QDomNode pnode = playlistTrackList.at(index.row());
2502
2503=== modified file 'mixxx/src/library/rhythmboxplaylistmodel.h'
2504--- mixxx/src/library/rhythmboxplaylistmodel.h 2010-04-03 23:26:07 +0000
2505+++ mixxx/src/library/rhythmboxplaylistmodel.h 2010-07-22 07:29:40 +0000
2506@@ -25,7 +25,6 @@
2507 #include "trackmodel.h"
2508 #include "rhythmboxtrackmodel.h"
2509
2510-class TrackInfoObject;
2511
2512 #define MIXXX_RHYTHMBOX_DB_LOCATION QDir::homePath() + "/.gnome2/rhythmbox/playlists.xml"
2513 #define MIXXX_RHYTHMBOX_DB_LOCATION_ALT QDir::homePath() + "/.local/share/rhythmbox/playlists.xml"
2514@@ -63,7 +62,7 @@
2515 virtual int columnCount(const QModelIndex& parent) const;
2516
2517 //Playlist Model stuff
2518- virtual TrackInfoObject* getTrack(const QModelIndex& index) const;
2519+ virtual TrackPointer getTrack(const QModelIndex& index) const;
2520 virtual QString getTrackLocation(const QModelIndex& index) const;
2521 virtual void search(const QString& searchText);
2522 virtual const QString currentSearch();
2523
2524=== modified file 'mixxx/src/library/rhythmboxtrackmodel.cpp'
2525--- mixxx/src/library/rhythmboxtrackmodel.cpp 2010-06-18 09:07:12 +0000
2526+++ mixxx/src/library/rhythmboxtrackmodel.cpp 2010-07-22 07:29:40 +0000
2527@@ -136,7 +136,7 @@
2528 }
2529 }
2530
2531-TrackInfoObject *RhythmboxTrackModel::parseTrackNode(QDomNode songNode) const
2532+TrackPointer RhythmboxTrackModel::parseTrackNode(QDomNode songNode) const
2533 {
2534 QString trackLocation = QUrl(songNode.firstChildElement("location").text()).toLocalFile();
2535 TrackInfoObject *pTrack = new TrackInfoObject(trackLocation);
2536@@ -156,5 +156,6 @@
2537 pTrack->setGenre(songNode.firstChildElement("genre").text());
2538 pTrack->setDuration(songNode.firstChildElement("duration").text().toUInt());
2539
2540- return pTrack;
2541+ // Have QObject handle deleting this track
2542+ return TrackPointer(pTrack, &QObject::deleteLater);
2543 }
2544
2545=== modified file 'mixxx/src/library/rhythmboxtrackmodel.h'
2546--- mixxx/src/library/rhythmboxtrackmodel.h 2009-10-27 23:04:38 +0000
2547+++ mixxx/src/library/rhythmboxtrackmodel.h 2010-07-22 07:29:40 +0000
2548@@ -24,7 +24,6 @@
2549 #include "abstractxmltrackmodel.h"
2550
2551
2552-class TrackInfoObject;
2553 class QSqlDatabase;
2554
2555
2556@@ -53,7 +52,7 @@
2557 virtual QVariant data(const QModelIndex& item, int role) const;
2558
2559 protected:
2560- virtual TrackInfoObject *parseTrackNode(QDomNode node) const;
2561+ virtual TrackPointer parseTrackNode(QDomNode node) const;
2562 /* Implemented by AbstractXmlTrackModel implementations to return the data for song columns */
2563 virtual QVariant getTrackColumnData(QDomNode node, const QModelIndex& index) const;
2564 /* Called by AbstractXmlTrackModel implementations to enumerate their columns */
2565
2566=== modified file 'mixxx/src/library/trackcollection.h'
2567--- mixxx/src/library/trackcollection.h 2010-06-05 09:28:18 +0000
2568+++ mixxx/src/library/trackcollection.h 2010-07-22 07:29:40 +0000
2569@@ -32,7 +32,6 @@
2570
2571 const QString MIXXX_DB_PATH = QDir::homePath().append("/").append(SETTINGS_PATH).append("mixxxdb.sqlite");
2572
2573-class TrackInfoObject;
2574 class BpmDetector;
2575
2576
2577
2578=== modified file 'mixxx/src/library/trackmodel.h'
2579--- mixxx/src/library/trackmodel.h 2010-04-03 23:26:07 +0000
2580+++ mixxx/src/library/trackmodel.h 2010-07-22 07:29:40 +0000
2581@@ -5,10 +5,9 @@
2582 #include <QItemDelegate>
2583 #include <QtSql>
2584
2585+#include "trackinfoobject.h"
2586 #include "library/dao/settingsdao.h"
2587
2588-class TrackInfoObject;
2589-
2590 /** Pure virtual (abstract) class that provides an interface for data models which
2591 display track lists. */
2592 class TrackModel {
2593@@ -32,7 +31,7 @@
2594
2595 typedef int CapabilitiesFlags; /** Enables us to do ORing */
2596
2597- virtual TrackInfoObject* getTrack(const QModelIndex& index) const = 0;
2598+ virtual TrackPointer getTrack(const QModelIndex& index) const = 0;
2599 virtual QString getTrackLocation(const QModelIndex& index) const = 0;
2600 bool isTrackModel() { return true;}
2601 virtual void search(const QString& searchText) = 0;
2602
2603=== modified file 'mixxx/src/mixxx.cpp'
2604--- mixxx/src/mixxx.cpp 2010-07-13 18:49:27 +0000
2605+++ mixxx/src/mixxx.cpp 2010-07-22 07:29:40 +0000
2606@@ -216,6 +216,7 @@
2607 frame = new QFrame;
2608 setCentralWidget(frame);
2609
2610+ qRegisterMetaType<TrackPointer>("TrackPointer");
2611 m_pLibrary = new Library(this, config, bFirstRun);
2612
2613 //Create the "players" (virtual playback decks)
2614@@ -224,12 +225,12 @@
2615
2616 //Connect the player to the track collection so that when a track is unloaded,
2617 //it's data (eg. waveform summary) is saved back to the database.
2618- connect(m_pPlayer1, SIGNAL(unloadingTrack(TrackInfoObject*)),
2619- &(m_pLibrary->getTrackCollection()->getTrackDAO()),
2620- SLOT(saveTrack(TrackInfoObject*)));
2621- connect(m_pPlayer2, SIGNAL(unloadingTrack(TrackInfoObject*)),
2622- &(m_pLibrary->getTrackCollection()->getTrackDAO()),
2623- SLOT(saveTrack(TrackInfoObject*)));
2624+ connect(m_pPlayer1, SIGNAL(unloadingTrack(TrackPointer)),
2625+ &(m_pLibrary->getTrackCollection()->getTrackDAO()),
2626+ SLOT(saveTrack(TrackPointer)));
2627+ connect(m_pPlayer2, SIGNAL(unloadingTrack(TrackPointer)),
2628+ &(m_pLibrary->getTrackCollection()->getTrackDAO()),
2629+ SLOT(saveTrack(TrackPointer)));
2630
2631 view=new MixxxView(frame, kbdconfig, qSkinPath, config, m_pPlayer1, m_pPlayer2,
2632 m_pLibrary);
2633@@ -286,10 +287,10 @@
2634
2635 // Setup the analyser queue to automatically process new tracks loaded by either player
2636 m_pAnalyserQueue = AnalyserQueue::createDefaultAnalyserQueue(config);
2637- connect(m_pPlayer1, SIGNAL(newTrackLoaded(TrackInfoObject*)),
2638- m_pAnalyserQueue, SLOT(queueAnalyseTrack(TrackInfoObject*)));
2639- connect(m_pPlayer2, SIGNAL(newTrackLoaded(TrackInfoObject*)),
2640- m_pAnalyserQueue, SLOT(queueAnalyseTrack(TrackInfoObject*)));
2641+ connect(m_pPlayer1, SIGNAL(newTrackLoaded(TrackPointer)),
2642+ m_pAnalyserQueue, SLOT(queueAnalyseTrack(TrackPointer)));
2643+ connect(m_pPlayer2, SIGNAL(newTrackLoaded(TrackPointer)),
2644+ m_pAnalyserQueue, SLOT(queueAnalyseTrack(TrackPointer)));
2645
2646
2647
2648@@ -312,16 +313,16 @@
2649 this, SLOT(slotLoadPlayer2(QString)));
2650
2651 if (view->m_pWaveformRendererCh1)
2652- connect(m_pPlayer1, SIGNAL(newTrackLoaded(TrackInfoObject *)),
2653- view->m_pWaveformRendererCh1, SLOT(slotNewTrack(TrackInfoObject *)));
2654+ connect(m_pPlayer1, SIGNAL(newTrackLoaded(TrackPointer)),
2655+ view->m_pWaveformRendererCh1, SLOT(slotNewTrack(TrackPointer)));
2656 if (view->m_pWaveformRendererCh2)
2657- connect(m_pPlayer2, SIGNAL(newTrackLoaded(TrackInfoObject *)),
2658- view->m_pWaveformRendererCh2, SLOT(slotNewTrack(TrackInfoObject *)));
2659+ connect(m_pPlayer2, SIGNAL(newTrackLoaded(TrackPointer)),
2660+ view->m_pWaveformRendererCh2, SLOT(slotNewTrack(TrackPointer)));
2661
2662- connect(m_pLibrary, SIGNAL(loadTrackToPlayer(TrackInfoObject*, int)),
2663- this, SLOT(slotLoadTrackToPlayer(TrackInfoObject*, int)));
2664- connect(m_pLibrary, SIGNAL(loadTrack(TrackInfoObject*)),
2665- this, SLOT(slotLoadTrackIntoNextAvailablePlayer(TrackInfoObject*)));
2666+ connect(m_pLibrary, SIGNAL(loadTrackToPlayer(TrackPointer, int)),
2667+ this, SLOT(slotLoadTrackToPlayer(TrackPointer, int)));
2668+ connect(m_pLibrary, SIGNAL(loadTrack(TrackPointer)),
2669+ this, SLOT(slotLoadTrackIntoNextAvailablePlayer(TrackPointer)));
2670
2671 // Setup state of End of track controls from config database
2672 ControlObject::getControl(ConfigKey("[Channel1]","TrackEndMode"))->queueFromThread(config->getValueString(ConfigKey("[Controls]","TrackEndModeCh1")).toDouble());
2673@@ -369,7 +370,7 @@
2674 //Automatically load specially marked promotional tracks on first run
2675 if (bFirstRun)
2676 {
2677- QList<TrackInfoObject*> tracksToAutoLoad = m_pLibrary->getTracksToAutoLoad();
2678+ QList<TrackPointer> tracksToAutoLoad = m_pLibrary->getTracksToAutoLoad();
2679 if (tracksToAutoLoad.count() > 0)
2680 m_pPlayer1->slotLoadTrack(tracksToAutoLoad.at(0));
2681 if (tracksToAutoLoad.count() > 1)
2682@@ -892,7 +893,8 @@
2683 if (!(s == QString::null)) {
2684 // TODO(XXX) Lookup track in the Library and load that.
2685 TrackInfoObject * pTrack = new TrackInfoObject(s);
2686- m_pPlayer1->slotLoadTrack(pTrack);
2687+ TrackPointer track = TrackPointer(pTrack, &QObject::deleteLater);
2688+ m_pPlayer1->slotLoadTrack(track);
2689 }
2690 }
2691
2692@@ -916,7 +918,8 @@
2693 if (!(s == QString::null)) {
2694 // TODO(XXX) Lookup track in the Library and load that.
2695 TrackInfoObject * pTrack = new TrackInfoObject(s);
2696- m_pPlayer2->slotLoadTrack(pTrack);
2697+ TrackPointer track = TrackPointer(pTrack, &QObject::deleteLater);
2698+ m_pPlayer2->slotLoadTrack(track);
2699 }
2700 }
2701
2702@@ -1286,7 +1289,7 @@
2703
2704 }
2705
2706-void MixxxApp::slotLoadTrackToPlayer(TrackInfoObject* pTrack, int player) {
2707+void MixxxApp::slotLoadTrackToPlayer(TrackPointer pTrack, int player) {
2708 // TODO(XXX) In the future, when we support multiple decks, this method will
2709 // be less of a hack.
2710 if (player == 1) {
2711@@ -1295,7 +1298,7 @@
2712 m_pPlayer2->slotLoadTrack(pTrack);
2713 }
2714 }
2715-void MixxxApp::slotLoadTrackIntoNextAvailablePlayer(TrackInfoObject* pTrack)
2716+void MixxxApp::slotLoadTrackIntoNextAvailablePlayer(TrackPointer pTrack)
2717 {
2718 if (ControlObject::getControl(ConfigKey("[Channel1]","play"))->get()!=1.)
2719 m_pPlayer1->slotLoadTrack(pTrack, false);
2720@@ -1307,11 +1310,11 @@
2721 {
2722 // Try to get TrackInfoObject* from library, identified by location.
2723 TrackDAO& trackDao = m_pLibrary->getTrackCollection()->getTrackDAO();
2724- TrackInfoObject* pTrack = trackDao.getTrack(trackDao.getTrackId(location));
2725+ TrackPointer pTrack = trackDao.getTrack(trackDao.getTrackId(location));
2726 // If not, create a new TrackInfoObject*
2727 if (pTrack == NULL)
2728 {
2729- pTrack = new TrackInfoObject(location);
2730+ pTrack = TrackPointer(new TrackInfoObject(location), &QObject::deleteLater);
2731 }
2732 //Load the track into the Player.
2733 m_pPlayer1->slotLoadTrack(pTrack);
2734@@ -1321,11 +1324,11 @@
2735 {
2736 // Try to get TrackInfoObject* from library, identified by location.
2737 TrackDAO& trackDao = m_pLibrary->getTrackCollection()->getTrackDAO();
2738- TrackInfoObject* pTrack = trackDao.getTrack(trackDao.getTrackId(location));
2739+ TrackPointer pTrack = trackDao.getTrack(trackDao.getTrackId(location));
2740 // If not, create a new TrackInfoObject*
2741 if (pTrack == NULL)
2742 {
2743- pTrack = new TrackInfoObject(location);
2744+ pTrack = TrackPointer(new TrackInfoObject(location), &QObject::deleteLater);
2745 }
2746 //Load the track into the Player.
2747 m_pPlayer2->slotLoadTrack(pTrack);
2748
2749=== modified file 'mixxx/src/mixxx.h'
2750--- mixxx/src/mixxx.h 2010-01-05 03:57:34 +0000
2751+++ mixxx/src/mixxx.h 2010-07-22 07:29:40 +0000
2752@@ -48,6 +48,7 @@
2753 // application specific includes
2754 #include "defs.h"
2755 #include "mixxxview.h"
2756+#include "trackinfoobject.h"
2757 #include "engine/enginebuffer.h"
2758 #include "engine/enginechannel.h"
2759 #include "engine/enginemaster.h"
2760@@ -63,7 +64,6 @@
2761 #endif
2762
2763 class WVisual;
2764-class TrackInfoObject;
2765 class PlayerProxy;
2766 class BpmDetector;
2767 class QSplashScreen;
2768@@ -131,10 +131,10 @@
2769
2770 void slotlibraryMenuAboutToShow();
2771 // Load a track into the next available (non-playing) Player
2772- void slotLoadTrackIntoNextAvailablePlayer(TrackInfoObject* track);
2773+ void slotLoadTrackIntoNextAvailablePlayer(TrackPointer track);
2774 // Load a track into the specified player. Does nothing if an invalid player
2775 // is specified. player is indexed from 1.
2776- void slotLoadTrackToPlayer(TrackInfoObject* track, int player);
2777+ void slotLoadTrackToPlayer(TrackPointer track, int player);
2778 /** Load a track into Player 1 */
2779 void slotLoadPlayer1(QString location);
2780 /** Load a track into Player 2 */
2781
2782=== modified file 'mixxx/src/mixxxview.cpp'
2783--- mixxx/src/mixxxview.cpp 2010-02-25 10:14:57 +0000
2784+++ mixxx/src/mixxxview.cpp 2010-07-22 07:29:40 +0000
2785@@ -94,10 +94,10 @@
2786 m_pWaveformRendererCh1 = new WaveformRenderer("[Channel1]");
2787 m_pWaveformRendererCh2 = new WaveformRenderer("[Channel2]");
2788
2789- connect(m_pPlayer1, SIGNAL(unloadingTrack(TrackInfoObject*)),
2790- m_pWaveformRendererCh1, SLOT(slotUnloadTrack(TrackInfoObject*)));
2791- connect(m_pPlayer2, SIGNAL(unloadingTrack(TrackInfoObject*)),
2792- m_pWaveformRendererCh2, SLOT(slotUnloadTrack(TrackInfoObject*)));
2793+ connect(m_pPlayer1, SIGNAL(unloadingTrack(TrackPointer)),
2794+ m_pWaveformRendererCh1, SLOT(slotUnloadTrack(TrackPointer)));
2795+ connect(m_pPlayer2, SIGNAL(unloadingTrack(TrackPointer)),
2796+ m_pWaveformRendererCh2, SLOT(slotUnloadTrack(TrackPointer)));
2797
2798 // Default values for visuals
2799 m_pTextCh1 = 0;
2800@@ -140,25 +140,25 @@
2801
2802 //Connect the players to the waveform overview widgets so they
2803 //update when a new track is loaded.
2804- connect(m_pPlayer1, SIGNAL(newTrackLoaded(TrackInfoObject*)),
2805- m_pOverviewCh1, SLOT(slotLoadNewWaveform(TrackInfoObject*)));
2806- connect(m_pPlayer1, SIGNAL(unloadingTrack(TrackInfoObject*)),
2807- m_pOverviewCh1, SLOT(slotUnloadTrack(TrackInfoObject*)));
2808- connect(m_pPlayer2, SIGNAL(newTrackLoaded(TrackInfoObject*)),
2809- m_pOverviewCh2, SLOT(slotLoadNewWaveform(TrackInfoObject*)));
2810- connect(m_pPlayer2, SIGNAL(unloadingTrack(TrackInfoObject*)),
2811- m_pOverviewCh2, SLOT(slotUnloadTrack(TrackInfoObject*)));
2812+ connect(m_pPlayer1, SIGNAL(newTrackLoaded(TrackPointer)),
2813+ m_pOverviewCh1, SLOT(slotLoadNewWaveform(TrackPointer)));
2814+ connect(m_pPlayer1, SIGNAL(unloadingTrack(TrackPointer)),
2815+ m_pOverviewCh1, SLOT(slotUnloadTrack(TrackPointer)));
2816+ connect(m_pPlayer2, SIGNAL(newTrackLoaded(TrackPointer)),
2817+ m_pOverviewCh2, SLOT(slotLoadNewWaveform(TrackPointer)));
2818+ connect(m_pPlayer2, SIGNAL(unloadingTrack(TrackPointer)),
2819+ m_pOverviewCh2, SLOT(slotUnloadTrack(TrackPointer)));
2820
2821 //Connect the players to some other widgets, so they get updated when a
2822 //new track is loaded.
2823- connect(m_pPlayer1, SIGNAL(newTrackLoaded(TrackInfoObject*)),
2824- this, SLOT(slotUpdateTrackTextCh1(TrackInfoObject*)));
2825- connect(m_pPlayer1, SIGNAL(unloadingTrack(TrackInfoObject*)),
2826- this, SLOT(slotClearTrackTextCh1(TrackInfoObject*)));
2827- connect(m_pPlayer2, SIGNAL(newTrackLoaded(TrackInfoObject*)),
2828- this, SLOT(slotUpdateTrackTextCh2(TrackInfoObject*)));
2829- connect(m_pPlayer2, SIGNAL(unloadingTrack(TrackInfoObject*)),
2830- this, SLOT(slotClearTrackTextCh2(TrackInfoObject*)));
2831+ connect(m_pPlayer1, SIGNAL(newTrackLoaded(TrackPointer)),
2832+ this, SLOT(slotUpdateTrackTextCh1(TrackPointer)));
2833+ connect(m_pPlayer1, SIGNAL(unloadingTrack(TrackPointer)),
2834+ this, SLOT(slotClearTrackTextCh1(TrackPointer)));
2835+ connect(m_pPlayer2, SIGNAL(newTrackLoaded(TrackPointer)),
2836+ this, SLOT(slotUpdateTrackTextCh2(TrackPointer)));
2837+ connect(m_pPlayer2, SIGNAL(unloadingTrack(TrackPointer)),
2838+ this, SLOT(slotClearTrackTextCh2(TrackPointer)));
2839
2840 //Setup a connection that allows us to connect the TrackInfoObjects that
2841 //get loaded into the players to the waveform overview widgets. We don't
2842@@ -167,10 +167,10 @@
2843 //notify the waveform overview widgets to update once the waveform
2844 //summary has finished generating. This connection gives us a way to
2845 //create that connection at runtime.)
2846- connect(m_pPlayer1, SIGNAL(newTrackLoaded(TrackInfoObject*)),
2847- this, SLOT(slotSetupTrackConnectionsCh1(TrackInfoObject*)));
2848- connect(m_pPlayer2, SIGNAL(newTrackLoaded(TrackInfoObject*)),
2849- this, SLOT(slotSetupTrackConnectionsCh2(TrackInfoObject*)));
2850+ connect(m_pPlayer1, SIGNAL(newTrackLoaded(TrackPointer)),
2851+ this, SLOT(slotSetupTrackConnectionsCh1(TrackPointer)));
2852+ connect(m_pPlayer2, SIGNAL(newTrackLoaded(TrackPointer)),
2853+ this, SLOT(slotSetupTrackConnectionsCh2(TrackPointer)));
2854
2855 // Connect search box signals to the library
2856 connect(m_pLineEditSearch, SIGNAL(search(const QString&)),
2857@@ -1014,52 +1014,52 @@
2858
2859 }
2860
2861-void MixxxView::slotSetupTrackConnectionsCh1(TrackInfoObject* pTrack)
2862-{
2863- //Note: This slot gets called when Player emits a newTrackLoaded() signal.
2864-
2865- //Connect the track to the waveform overview widget, so it updates when the wavesummary is finished
2866- //generating.
2867- connect(pTrack, SIGNAL(wavesummaryUpdated(TrackInfoObject*)),
2868- m_pOverviewCh1, SLOT(slotLoadNewWaveform(TrackInfoObject*)));
2869- //Connect the track to the BPM readout in the GUI, so it updates when the BPM is finished being calculated.
2870- connect(pTrack, SIGNAL(bpmUpdated(double)),
2871- m_pNumberBpmCh1, SLOT(setValue(double)));
2872-}
2873-
2874-void MixxxView::slotSetupTrackConnectionsCh2(TrackInfoObject* pTrack)
2875-{
2876- //Note: This slot gets called when Player emits a newTrackLoaded() signal.
2877-
2878- //Connect the track to the waveform overview widget, so it updates when the wavesummary is finished
2879- //generating.
2880- connect(pTrack, SIGNAL(wavesummaryUpdated(TrackInfoObject*)),
2881- m_pOverviewCh2, SLOT(slotLoadNewWaveform(TrackInfoObject*)));
2882- //Connect the track to the BPM readout in the GUI, so it updates when the BPM is finished being calculated.
2883- connect(pTrack, SIGNAL(bpmUpdated(double)),
2884- m_pNumberBpmCh2, SLOT(setValue(double)));
2885-
2886-}
2887-
2888-void MixxxView::slotUpdateTrackTextCh1(TrackInfoObject* pTrack)
2889+void MixxxView::slotSetupTrackConnectionsCh1(TrackPointer pTrack)
2890+{
2891+ //Note: This slot gets called when Player emits a newTrackLoaded() signal.
2892+ //Connect the track to the waveform overview widget, so it updates when the
2893+ //wavesummary is finished generating.
2894+ connect(pTrack.data(), SIGNAL(wavesummaryUpdated(TrackInfoObject*)),
2895+ m_pOverviewCh1, SLOT(slotLoadNewWaveform(TrackInfoObject*)));
2896+ //Connect the track to the BPM readout in the GUI, so it updates when the
2897+ //BPM is finished being calculated.
2898+ connect(pTrack.data(), SIGNAL(bpmUpdated(double)),
2899+ m_pNumberBpmCh1, SLOT(setValue(double)));
2900+}
2901+
2902+void MixxxView::slotSetupTrackConnectionsCh2(TrackPointer pTrack)
2903+{
2904+ //Note: This slot gets called when Player emits a newTrackLoaded() signal.
2905+ //Connect the track to the waveform overview widget, so it updates when the
2906+ //wavesummary is finished generating.
2907+ connect(pTrack.data(), SIGNAL(wavesummaryUpdated(TrackInfoObject*)),
2908+ m_pOverviewCh2, SLOT(slotLoadNewWaveform(TrackInfoObject*)));
2909+ //Connect the track to the BPM readout in the GUI, so it updates when the
2910+ //BPM is finished being calculated.
2911+ connect(pTrack.data(), SIGNAL(bpmUpdated(double)),
2912+ m_pNumberBpmCh2, SLOT(setValue(double)));
2913+
2914+}
2915+
2916+void MixxxView::slotUpdateTrackTextCh1(TrackPointer pTrack)
2917 {
2918 if (m_pTextCh1)
2919 m_pTextCh1->setText(pTrack->getInfo());
2920 }
2921
2922-void MixxxView::slotUpdateTrackTextCh2(TrackInfoObject* pTrack)
2923+void MixxxView::slotUpdateTrackTextCh2(TrackPointer pTrack)
2924 {
2925 if (m_pTextCh2)
2926 m_pTextCh2->setText(pTrack->getInfo());
2927 }
2928
2929-void MixxxView::slotClearTrackTextCh1(TrackInfoObject* pTrack)
2930+void MixxxView::slotClearTrackTextCh1(TrackPointer pTrack)
2931 {
2932 if (m_pTextCh1)
2933 m_pTextCh1->setText("");
2934 }
2935
2936-void MixxxView::slotClearTrackTextCh2(TrackInfoObject* pTrack)
2937+void MixxxView::slotClearTrackTextCh2(TrackPointer pTrack)
2938 {
2939 if (m_pTextCh2)
2940 m_pTextCh2->setText("");
2941
2942=== modified file 'mixxx/src/mixxxview.h'
2943--- mixxx/src/mixxxview.h 2010-02-25 10:14:57 +0000
2944+++ mixxx/src/mixxxview.h 2010-07-22 07:29:40 +0000
2945@@ -25,6 +25,7 @@
2946 #include <QList>
2947
2948 #include "configobject.h"
2949+#include "trackinfoobject.h"
2950 #include "imgsource.h"
2951
2952 class ControlObject;
2953@@ -53,7 +54,6 @@
2954 class LADSPAView;
2955 class WaveformRenderer;
2956 class Player;
2957-class TrackInfoObject;
2958 class QStandardItemModel;
2959 class Library;
2960 class WLibrary;
2961@@ -103,12 +103,12 @@
2962
2963 static QList<QString> getSchemeList(QString qSkinPath);
2964 public slots:
2965- void slotSetupTrackConnectionsCh1(TrackInfoObject* pTrack);
2966- void slotSetupTrackConnectionsCh2(TrackInfoObject* pTrack);
2967- void slotUpdateTrackTextCh1(TrackInfoObject* pTrack);
2968- void slotClearTrackTextCh1(TrackInfoObject* pTrack);
2969- void slotUpdateTrackTextCh2(TrackInfoObject* pTrack);
2970- void slotClearTrackTextCh2(TrackInfoObject* pTrack);
2971+ void slotSetupTrackConnectionsCh1(TrackPointer pTrack);
2972+ void slotSetupTrackConnectionsCh2(TrackPointer pTrack);
2973+ void slotUpdateTrackTextCh1(TrackPointer pTrack);
2974+ void slotClearTrackTextCh1(TrackPointer pTrack);
2975+ void slotUpdateTrackTextCh2(TrackPointer pTrack);
2976+ void slotClearTrackTextCh2(TrackPointer pTrack);
2977
2978 private:
2979 void setupColorScheme(QDomElement docElem, ConfigObject<ConfigValue> *pConfig);
2980
2981=== modified file 'mixxx/src/player.cpp'
2982--- mixxx/src/player.cpp 2010-02-21 10:36:49 +0000
2983+++ mixxx/src/player.cpp 2010-07-22 07:29:40 +0000
2984@@ -19,21 +19,21 @@
2985 : m_pConfig(pConfig),
2986 m_pEngineBuffer(buffer),
2987 m_strChannel(channel),
2988- m_pLoadedTrack(NULL) {
2989+ m_pLoadedTrack() {
2990
2991 CueControl* pCueControl = new CueControl(channel, pConfig);
2992- connect(this, SIGNAL(newTrackLoaded(TrackInfoObject*)),
2993- pCueControl, SLOT(loadTrack(TrackInfoObject*)));
2994- connect(this, SIGNAL(unloadingTrack(TrackInfoObject*)),
2995- pCueControl, SLOT(unloadTrack(TrackInfoObject*)));
2996+ connect(this, SIGNAL(newTrackLoaded(TrackPointer)),
2997+ pCueControl, SLOT(loadTrack(TrackPointer)));
2998+ connect(this, SIGNAL(unloadingTrack(TrackPointer)),
2999+ pCueControl, SLOT(unloadTrack(TrackPointer)));
3000 m_pEngineBuffer->addControl(pCueControl);
3001
3002 //Tell the reader to notify us when it's done loading a track so we can
3003 //finish doing stuff.
3004- connect(m_pEngineBuffer, SIGNAL(trackLoaded(TrackInfoObject*)),
3005- this, SLOT(slotFinishLoading(TrackInfoObject*)));
3006- connect(m_pEngineBuffer, SIGNAL(trackLoadFailed(TrackInfoObject*, QString)),
3007- this, SLOT(slotLoadFailed(TrackInfoObject*, QString)));
3008+ connect(m_pEngineBuffer, SIGNAL(trackLoaded(TrackPointer)),
3009+ this, SLOT(slotFinishLoading(TrackPointer)));
3010+ connect(m_pEngineBuffer, SIGNAL(trackLoadFailed(TrackPointer, QString)),
3011+ this, SLOT(slotLoadFailed(TrackPointer, QString)));
3012
3013 //Get cue point control object
3014 m_pCuePoint = new ControlObjectThreadMain(
3015@@ -65,7 +65,7 @@
3016 delete m_pBPM;
3017 }
3018
3019-void Player::slotLoadTrack(TrackInfoObject* track, bool bStartFromEndPos)
3020+void Player::slotLoadTrack(TrackPointer track, bool bStartFromEndPos)
3021 {
3022 //Disconnect the old track's signals.
3023 if (m_pLoadedTrack) {
3024@@ -107,14 +107,14 @@
3025 m_pLoadedTrack = track;
3026
3027 // Listen for updates to the file's BPM
3028- connect(m_pLoadedTrack, SIGNAL(bpmUpdated(double)),
3029+ connect(m_pLoadedTrack.data(), SIGNAL(bpmUpdated(double)),
3030 m_pBPM, SLOT(slotSet(double)));
3031
3032 //Request a new track from the reader
3033 m_pEngineBuffer->loadTrack(track);
3034 }
3035
3036-void Player::slotLoadFailed(TrackInfoObject* track, QString reason) {
3037+void Player::slotLoadFailed(TrackPointer track, QString reason) {
3038 qDebug() << "Failed to load track" << track->getLocation() << reason;
3039 // Alert user.
3040 QMessageBox::warning(NULL, tr("Couldn't load track."), reason);
3041@@ -132,14 +132,14 @@
3042 m_pBPM->slotSet(0);
3043 m_pLoopInPoint->slotSet(-1);
3044 m_pLoopOutPoint->slotSet(-1);
3045- m_pLoadedTrack = NULL;
3046+ m_pLoadedTrack.clear();
3047 }
3048
3049-void Player::slotFinishLoading(TrackInfoObject* pTrackInfoObject)
3050+void Player::slotFinishLoading(TrackPointer pTrackInfoObject)
3051 {
3052 // Read the tags if required
3053 if(!m_pLoadedTrack->getHeaderParsed())
3054- SoundSourceProxy::ParseHeader(m_pLoadedTrack);
3055+ SoundSourceProxy::ParseHeader(m_pLoadedTrack.data());
3056
3057 // Generate waveform summary
3058 //TODO: Consider reworking this visual resample stuff... need to ask rryan about this -- Albert.
3059
3060=== modified file 'mixxx/src/player.h'
3061--- mixxx/src/player.h 2010-01-27 08:45:03 +0000
3062+++ mixxx/src/player.h 2010-07-22 07:29:40 +0000
3063@@ -4,9 +4,9 @@
3064 #include <QtCore>
3065
3066 #include "configobject.h"
3067+#include "trackinfoobject.h"
3068
3069 class EngineBuffer;
3070-class TrackInfoObject;
3071 class ControlObjectThreadMain;
3072
3073 class Player : public QObject
3074@@ -17,18 +17,18 @@
3075 QString channel);
3076 ~Player();
3077 public slots:
3078- void slotLoadTrack(TrackInfoObject* track, bool bStartFromEndPos=false);
3079- void slotFinishLoading(TrackInfoObject* pTrackInfoObject);
3080- void slotLoadFailed(TrackInfoObject* pTrackInfoObject, QString reason);
3081+ void slotLoadTrack(TrackPointer track, bool bStartFromEndPos=false);
3082+ void slotFinishLoading(TrackPointer pTrackInfoObject);
3083+ void slotLoadFailed(TrackPointer pTrackInfoObject, QString reason);
3084 signals:
3085- void newTrackLoaded(TrackInfoObject* m_pLoadedTrack);
3086- void unloadingTrack(TrackInfoObject* m_pAboutToBeUnloaded);
3087+ void newTrackLoaded(TrackPointer m_pLoadedTrack);
3088+ void unloadingTrack(TrackPointer m_pAboutToBeUnloaded);
3089 private:
3090 ConfigObject<ConfigValue>* m_pConfig;
3091 EngineBuffer* m_pEngineBuffer;
3092 QString m_strChannel;
3093
3094- TrackInfoObject* m_pLoadedTrack;
3095+ TrackPointer m_pLoadedTrack;
3096
3097 ControlObjectThreadMain* m_pCuePoint;
3098 ControlObjectThreadMain* m_pLoopInPoint;
3099
3100=== modified file 'mixxx/src/playerinfo.cpp'
3101--- mixxx/src/playerinfo.cpp 2009-10-14 00:48:44 +0000
3102+++ mixxx/src/playerinfo.cpp 2010-07-22 07:29:40 +0000
3103@@ -25,17 +25,17 @@
3104 }
3105
3106 PlayerInfo::PlayerInfo()
3107- : m_pTrack1(NULL),
3108- m_pTrack2(NULL) {
3109+ : m_pTrack1(),
3110+ m_pTrack2() {
3111 }
3112
3113 PlayerInfo::~PlayerInfo()
3114 {
3115 }
3116
3117-TrackInfoObject *PlayerInfo::getTrackInfo(int track)
3118+TrackPointer PlayerInfo::getTrackInfo(int track)
3119 {
3120- TrackInfoObject* pRet = NULL;
3121+ TrackPointer pRet;
3122 m_mutex.lock();
3123 switch (track)
3124 {
3125@@ -47,13 +47,13 @@
3126 break;
3127 default:
3128 // incorrect track number
3129- pRet = NULL;
3130+ break;
3131 }
3132 m_mutex.unlock();
3133 return pRet;
3134 }
3135
3136-void PlayerInfo::setTrackInfo(int track, TrackInfoObject *trackInfoObj)
3137+void PlayerInfo::setTrackInfo(int track, TrackPointer trackInfoObj)
3138 {
3139 m_mutex.lock();
3140 switch (track) {
3141
3142=== modified file 'mixxx/src/playerinfo.h'
3143--- mixxx/src/playerinfo.h 2009-10-14 00:48:44 +0000
3144+++ mixxx/src/playerinfo.h 2010-07-22 07:29:40 +0000
3145@@ -20,23 +20,23 @@
3146 #include <QObject>
3147 #include <QMutex>
3148
3149-class TrackInfoObject;
3150+#include "trackinfoobject.h"
3151
3152 class PlayerInfo : public QObject
3153 {
3154 Q_OBJECT
3155 public:
3156 static PlayerInfo &Instance();
3157- TrackInfoObject *getTrackInfo(int track);
3158- void setTrackInfo(int track, TrackInfoObject *trackInfoObj);
3159+ TrackPointer getTrackInfo(int track);
3160+ void setTrackInfo(int track, TrackPointer trackInfoObj);
3161 private:
3162 PlayerInfo();
3163 ~PlayerInfo();
3164 PlayerInfo(PlayerInfo const&);
3165 PlayerInfo &operator= (PlayerInfo const&);
3166 QMutex m_mutex;
3167- TrackInfoObject *m_pTrack1;
3168- TrackInfoObject *m_pTrack2;
3169+ TrackPointer m_pTrack1;
3170+ TrackPointer m_pTrack2;
3171 };
3172
3173 #endif
3174
3175=== modified file 'mixxx/src/soundsourcemp3.h'
3176--- mixxx/src/soundsourcemp3.h 2010-05-25 02:23:10 +0000
3177+++ mixxx/src/soundsourcemp3.h 2010-07-22 07:29:40 +0000
3178@@ -49,7 +49,6 @@
3179 /**
3180 *@author Tue and Ken Haste Andersen
3181 */
3182-class TrackInfoObject;
3183
3184 class SoundSourceMp3 : public SoundSource {
3185 public:
3186
3187=== modified file 'mixxx/src/soundsourceoggvorbis.h'
3188--- mixxx/src/soundsourceoggvorbis.h 2010-03-10 07:25:55 +0000
3189+++ mixxx/src/soundsourceoggvorbis.h 2010-07-22 07:29:40 +0000
3190@@ -22,9 +22,6 @@
3191 #include <vorbis/codec.h>
3192 #include <vorbis/vorbisfile.h>
3193
3194-class TrackInfoObject;
3195-
3196-
3197 class SoundSourceOggVorbis : public SoundSource {
3198 public:
3199 SoundSourceOggVorbis(QString qFilename);
3200
3201=== modified file 'mixxx/src/soundsourceproxy.cpp'
3202--- mixxx/src/soundsourceproxy.cpp 2010-07-14 15:20:46 +0000
3203+++ mixxx/src/soundsourceproxy.cpp 2010-07-22 07:29:40 +0000
3204@@ -46,14 +46,13 @@
3205 //Constructor
3206 SoundSourceProxy::SoundSourceProxy(QString qFilename)
3207 : SoundSource(qFilename),
3208- m_pSoundSource(NULL) {
3209+ m_pSoundSource(NULL),
3210+ m_pTrack() {
3211 m_pSoundSource = initialize(qFilename);
3212- m_pTrack = NULL;
3213-
3214 }
3215
3216 //Other constructor
3217-SoundSourceProxy::SoundSourceProxy(TrackInfoObject * pTrack)
3218+SoundSourceProxy::SoundSourceProxy(TrackPointer pTrack)
3219 : SoundSource(pTrack->getLocation()),
3220 m_pSoundSource(NULL) {
3221
3222@@ -64,7 +63,7 @@
3223 void SoundSourceProxy::loadPlugins()
3224 {
3225 /** Scan for and initialize all plugins */
3226-
3227+
3228 QList<QDir> pluginDirs;
3229 QStringList nameFilters;
3230
3231@@ -85,7 +84,7 @@
3232 bundlePluginDir.remove("MacOS");
3233 //blah/Mixxx.app/Contents/PlugIns/soundsource
3234 //bundlePluginDir.append("PlugIns/soundsource"); //Our SCons bundle target doesn't handle plugin subdirectories :(
3235- bundlePluginDir.append("PlugIns/");
3236+ bundlePluginDir.append("PlugIns/");
3237 pluginDirs.append(QDir(bundlePluginDir));
3238 pluginDirs.append(QDir("/Library/Application Support/Mixxx/Plugins/soundsource/"));
3239 nameFilters << "libsoundsource*";
3240@@ -126,7 +125,7 @@
3241 return getter(qFilename);
3242 }
3243 else {
3244- qDebug() << "Failed to resolve getSoundSource in plugin for" <<
3245+ qDebug() << "Failed to resolve getSoundSource in plugin for" <<
3246 extension;
3247 return NULL; //Failed to load plugin
3248 }
3249@@ -156,7 +155,7 @@
3250 if (!plugin->load()) {
3251 qDebug() << "Failed to dynamically load" << lib_filename << plugin->errorString();
3252 } else {
3253- qDebug() << "Dynamically loaded" << lib_filename;
3254+ qDebug() << "Dynamically loaded" << lib_filename;
3255 //Add the plugin to our list of loaded QLibraries/plugins
3256 m_plugins.insert(lib_filename, plugin);
3257
3258@@ -174,7 +173,7 @@
3259 //Map the file extensions this plugin supports onto a function
3260 //pointer to the "getter" function that gets a SoundSourceBlah.
3261 getSoundSourceFunc getter = (getSoundSourceFunc)plugin->resolve("getSoundSource");
3262- Q_ASSERT(getter); //Getter function not found.
3263+ Q_ASSERT(getter); //Getter function not found.
3264 //Did you export it properly in your plugin?
3265 getSupportedFileExtensionsFunc getFileExts = (getSupportedFileExtensionsFunc)plugin->resolve("supportedFileExtensions");
3266 Q_ASSERT(getFileExts);
3267@@ -189,8 +188,8 @@
3268 }
3269 free(supportedFileExtensions);
3270 //So now we have a list of file extensions (eg. "m4a", "mp4", etc)
3271- //that map onto the getter function for this plugin (eg. the
3272- //function that returns a SoundSourceM4A object)
3273+ //that map onto the getter function for this plugin (eg. the
3274+ //function that returns a SoundSourceM4A object)
3275 }
3276 }
3277 return plugin;
3278@@ -251,9 +250,9 @@
3279 return 0;
3280 }
3281
3282-int SoundSourceProxy::ParseHeader(TrackInfoObject * p)
3283+int SoundSourceProxy::ParseHeader(TrackInfoObject* p)
3284 {
3285-
3286+
3287 QString qFilename = p->getLocation();
3288 SoundSource* sndsrc = initialize(qFilename);
3289 if (sndsrc == NULL)
3290@@ -301,7 +300,7 @@
3291 supportedFileExtensions.append(SoundSourceOggVorbis::supportedFileExtensions());
3292 supportedFileExtensions.append(SoundSourceSndFile::supportedFileExtensions());
3293 supportedFileExtensions.append(m_extensionsSupportedByPlugins.keys());
3294-
3295+
3296 return supportedFileExtensions;
3297 }
3298
3299@@ -320,7 +319,7 @@
3300 if (it.hasNext())
3301 supportedFileExtString.append(" ");
3302 }
3303-
3304+
3305 return supportedFileExtString;
3306 }
3307
3308@@ -340,7 +339,7 @@
3309 supportedFileExtRegex.append("|");
3310 }
3311 supportedFileExtRegex.append(")");
3312-
3313+
3314 return supportedFileExtRegex;
3315 }
3316
3317
3318=== modified file 'mixxx/src/soundsourceproxy.h'
3319--- mixxx/src/soundsourceproxy.h 2010-06-15 18:05:28 +0000
3320+++ mixxx/src/soundsourceproxy.h 2010-07-22 07:29:40 +0000
3321@@ -20,9 +20,9 @@
3322
3323 #include <QMutex>
3324 #include "soundsource.h"
3325+#include "trackinfoobject.h"
3326
3327 class QLibrary;
3328-class TrackInfoObject;
3329
3330 /**
3331 *@author Tue Haste Andersen
3332@@ -36,7 +36,7 @@
3333 {
3334 public:
3335 SoundSourceProxy(QString qFilename);
3336- SoundSourceProxy(TrackInfoObject *pTrack);
3337+ SoundSourceProxy(TrackPointer pTrack);
3338 ~SoundSourceProxy();
3339 static void loadPlugins();
3340 int open();
3341@@ -44,7 +44,7 @@
3342 unsigned read(unsigned long size, const SAMPLE*);
3343 long unsigned length();
3344 int parseHeader();
3345- static int ParseHeader(TrackInfoObject *p);
3346+ static int ParseHeader(TrackInfoObject* p);
3347 unsigned int getSampleRate();
3348 /** Returns filename */
3349 QString getFilename();
3350@@ -58,7 +58,7 @@
3351 static QLibrary* getPlugin(QString lib_filename);
3352
3353 SoundSource *m_pSoundSource;
3354- TrackInfoObject* m_pTrack;
3355+ TrackPointer m_pTrack;
3356 static QMap<QString, QLibrary*> m_plugins;
3357 static QMap<QString, getSoundSourceFunc> m_extensionsSupportedByPlugins;
3358 static QMutex m_extensionsMutex;
3359
3360=== modified file 'mixxx/src/soundsourcesndfile.h'
3361--- mixxx/src/soundsourcesndfile.h 2010-03-10 07:25:55 +0000
3362+++ mixxx/src/soundsourcesndfile.h 2010-07-22 07:29:40 +0000
3363@@ -20,9 +20,8 @@
3364 #include "soundsource.h"
3365 #include <stdio.h>
3366 #include <sndfile.h>
3367-class TrackInfoObject;
3368
3369-class SoundSourceSndFile : public SoundSource
3370+class SoundSourceSndFile : public SoundSource
3371 {
3372 public:
3373 SoundSourceSndFile(QString qFilename);
3374
3375=== modified file 'mixxx/src/test/analyserbpmtest.cpp'
3376--- mixxx/src/test/analyserbpmtest.cpp 2010-01-02 22:09:12 +0000
3377+++ mixxx/src/test/analyserbpmtest.cpp 2010-07-22 07:29:40 +0000
3378@@ -24,7 +24,7 @@
3379 qDebug() << "SetUp";
3380 config = new ConfigObject<ConfigValue>(QDir::homePath().append("/").append(SETTINGS_PATH).append(SETTINGS_FILE));
3381 abpm = new AnalyserBPM(config);
3382- tio = new TrackInfoObject("foo");
3383+ tio = TrackPointer(new TrackInfoObject("foo"));
3384 //Subpixels per second, from waveformrenderer.cpp:247
3385 tio->setVisualResampleRate(200);
3386
3387@@ -54,7 +54,7 @@
3388
3389 AnalyserBPM* abpm;
3390 ConfigObject<ConfigValue>* config;
3391- TrackInfoObject* tio;
3392+ TrackPointer tio;
3393 CSAMPLE* bigbuf;
3394 CSAMPLE* canaryBigBuf;
3395 };
3396
3397=== modified file 'mixxx/src/test/analyserwaveformtest.cpp'
3398--- mixxx/src/test/analyserwaveformtest.cpp 2010-01-02 22:09:12 +0000
3399+++ mixxx/src/test/analyserwaveformtest.cpp 2010-07-22 07:29:40 +0000
3400@@ -21,7 +21,7 @@
3401 virtual void SetUp() {
3402 qDebug() << "SetUp";
3403 aw = new AnalyserWaveform();
3404- tio = new TrackInfoObject("foo");
3405+ tio = TrackPointer(new TrackInfoObject("foo"));
3406 //Subpixels per second, from waveformrenderer.cpp:247
3407 tio->setVisualResampleRate(200);
3408
3409@@ -51,7 +51,7 @@
3410 }
3411
3412 AnalyserWaveform* aw;
3413- TrackInfoObject* tio;
3414+ TrackPointer tio;
3415 CSAMPLE* bigbuf;
3416 CSAMPLE* canaryBigBuf;
3417 };
3418
3419=== modified file 'mixxx/src/test/analyserwavesummarytest.cpp'
3420--- mixxx/src/test/analyserwavesummarytest.cpp 2010-01-02 22:09:12 +0000
3421+++ mixxx/src/test/analyserwavesummarytest.cpp 2010-07-22 07:29:40 +0000
3422@@ -21,7 +21,7 @@
3423 virtual void SetUp() {
3424 qDebug() << "SetUp";
3425 aw = new AnalyserWavesummary();
3426- tio = new TrackInfoObject("foo");
3427+ tio = TrackPointer(new TrackInfoObject("foo"));
3428 //Subpixels per second, from waveformrenderer.cpp:247
3429 tio->setVisualResampleRate(200);
3430
3431@@ -51,7 +51,7 @@
3432 }
3433
3434 AnalyserWavesummary* aw;
3435- TrackInfoObject* tio;
3436+ TrackPointer tio;
3437 CSAMPLE* bigbuf;
3438 CSAMPLE* canaryBigBuf;
3439 };
3440
3441=== modified file 'mixxx/src/trackinfoobject.cpp'
3442--- mixxx/src/trackinfoobject.cpp 2010-07-13 12:08:02 +0000
3443+++ mixxx/src/trackinfoobject.cpp 2010-07-22 07:29:40 +0000
3444@@ -25,8 +25,6 @@
3445
3446 #include "trackinfoobject.h"
3447
3448-#include "bpm/bpmscheme.h"
3449-#include "bpm/bpmreceiver.h"
3450 #include "soundsourceproxy.h"
3451 #include "xmlparse.h"
3452 #include "controlobject.h"
3453@@ -132,6 +130,10 @@
3454 TrackInfoObject::~TrackInfoObject() {
3455 }
3456
3457+void TrackInfoObject::doSave() {
3458+ emit(save());
3459+}
3460+
3461 bool TrackInfoObject::isValid() const {
3462 QMutexLocker lock(&m_qMutex);
3463 return m_bIsValid;
3464@@ -167,6 +169,8 @@
3465
3466 }
3467
3468+static void doNothing(TrackInfoObject* pTrack) {}
3469+
3470 int TrackInfoObject::parse()
3471 {
3472 // Add basic information derived from the filename:
3473
3474=== modified file 'mixxx/src/trackinfoobject.h'
3475--- mixxx/src/trackinfoobject.h 2010-06-05 09:28:18 +0000
3476+++ mixxx/src/trackinfoobject.h 2010-07-22 07:29:40 +0000
3477@@ -25,23 +25,26 @@
3478 #include <q3valuelist.h>
3479 #include <QMutex>
3480 #include <QVector>
3481+#include <QSharedPointer>
3482+#include <QWeakPointer>
3483
3484 #include "defs.h"
3485
3486 #include "library/dao/cue.h"
3487-#include "library/dao/trackdao.h"
3488
3489 class QString;
3490 class QDomElement;
3491 class QDomDocument;
3492 class QDomNode;
3493 class ControlObject;
3494-class BpmDetector;
3495-class BpmReceiver;
3496-class BpmScheme;
3497 class TrackPlaylist;
3498 class Cue;
3499
3500+class TrackInfoObject;
3501+
3502+typedef QSharedPointer<TrackInfoObject> TrackPointer;
3503+typedef QWeakPointer<TrackInfoObject> TrackWeakPointer;
3504+
3505 #include "segmentation.h"
3506
3507 class TrackInfoObject : public QObject
3508@@ -192,6 +195,10 @@
3509
3510 bool isDirty();
3511
3512+ // Signals to the creator of this TrackInfoObject to save the Track as it
3513+ // may be deleted.
3514+ void doSave();
3515+
3516 // Returns true if the track location has changed
3517 bool locationChanged();
3518
3519@@ -211,6 +218,7 @@
3520 void changed();
3521 void dirty();
3522 void clean();
3523+ void save();
3524
3525 private:
3526
3527
3528=== modified file 'mixxx/src/waveform/glwaveformrenderer.cpp'
3529--- mixxx/src/waveform/glwaveformrenderer.cpp 2009-01-31 21:34:53 +0000
3530+++ mixxx/src/waveform/glwaveformrenderer.cpp 2010-07-22 07:29:40 +0000
3531@@ -40,7 +40,7 @@
3532 {
3533 m_pPlayPos = new ControlObjectThreadMain(ControlObject::getControl(ConfigKey(group,"playposition")));
3534 connect(m_pPlayPos, SIGNAL(valueChanged(double)), this, SLOT(slotUpdatePlayPos(double)));
3535-
3536+
3537 m_pCOVisualResample = new ControlObject(ConfigKey(group,"VisualResample"));
3538 m_pCOVerticalScale = new ControlObject(ConfigKey(group, "VisualVerticalScale"));
3539 }
3540@@ -77,7 +77,7 @@
3541 m_pInternalBuffer[i*3+0] = i-10;
3542 m_pInternalBuffer[i*3+1] = 0.5;
3543 m_pInternalBuffer[i*3+2] = 1.0;
3544-
3545+
3546
3547 }
3548
3549@@ -89,7 +89,7 @@
3550 gluLookAt(0,0,15.0, // look along z-axis
3551 0,0,0, // from the origin
3552 0,1.0,0); // with y being 'up'
3553-
3554+
3555 setupControlObjects();
3556 }
3557
3558@@ -101,7 +101,7 @@
3559 int verticalScale = ((1<<15)-1)*2/ m_iHeight;
3560 m_pCOVerticalScale->set(verticalScale);
3561
3562-
3563+
3564 // the resample rate is the number of seconds that correspond to one pixel
3565 // on the visual waveform display.
3566
3567@@ -128,7 +128,7 @@
3568 bgColor = WSkinColor::getCorrectColor(bgColor);
3569
3570 qDebug() << "Got bgColor " << bgColor;
3571-
3572+
3573 signalColor.setNamedColor(WWidget::selectNodeQString(node, "SignalColor"));
3574 signalColor = WSkinColor::getCorrectColor(signalColor);
3575
3576@@ -151,7 +151,7 @@
3577 }
3578
3579 bool GLWaveformRenderer::fetchWaveformFromTrack() {
3580-
3581+
3582 if(!m_pTrack)
3583 return false;
3584
3585@@ -165,11 +165,11 @@
3586
3587 return true;
3588 }
3589-
3590+
3591
3592
3593 void GLWaveformRenderer::drawSignalLines() {
3594-
3595+
3596 if(m_pSampleBuffer == NULL) {
3597 return;
3598 }
3599@@ -178,7 +178,7 @@
3600 if(m_dPlayPos != -1) {
3601 iCurPos = (int)(m_dPlayPos*m_iNumSamples);
3602 }
3603-
3604+
3605 if((iCurPos % 2) != 0)
3606 iCurPos--;
3607
3608@@ -193,10 +193,10 @@
3609
3610 m_pInternalBuffer[i*3+1] = sampl;
3611 }
3612-
3613+
3614
3615 }
3616-
3617+
3618 /*
3619 pPainter->scale(1.0/float(SCALE_TEST),m_iHeight*0.40);
3620 int halfw = m_iWidth*SCALE_TEST/2;
3621@@ -241,7 +241,7 @@
3622 if(m_pSampleBuffer != NULL)
3623 qDebug() << "Received waveform from track";
3624 }
3625-
3626+
3627 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
3628 glMatrixMode(GL_MODELVIEW);
3629 glLoadIdentity();
3630@@ -251,29 +251,29 @@
3631 0,1,0);
3632
3633 glDrawBuffer(GL_BACK);
3634-
3635-
3636+
3637+
3638 glPushMatrix();
3639
3640 glScalef(1.0/5.0,m_iHeight/2, 1.0);
3641
3642 drawSignalLines();
3643-
3644+
3645 glBegin(GL_LINES);
3646
3647 glVertex3f(0,0,1.0);
3648 glVertex3f(0,1.0,1.0);
3649
3650-
3651+
3652 glEnd();
3653
3654 glEnableClientState(GL_VERTEX_ARRAY);
3655 glVertexPointer(3, GL_FLOAT, 0, m_pInternalBuffer);
3656 glDrawArrays(GL_LINE_LOOP,0,m_iInternalBufferSize);
3657-
3658+
3659 glPopMatrix();
3660-
3661-
3662+
3663+
3664
3665 glFlush();
3666 }
3667@@ -281,10 +281,10 @@
3668 void GLWaveformRenderer::draw(QPainter* pPainter, QPaintEvent *pEvent) {
3669 pPainter->fillRect(pEvent->rect(), QBrush(bgColor));
3670 pPainter->setPen(signalColor);
3671-
3672+
3673 if(m_iWidth == 0 || m_iHeight == 0)
3674 return;
3675-
3676+
3677 //int scaley = 32767*2/ m_iHeight;
3678 //int scaley2 = 32767*4/ m_iHeight;
3679 //int sca = m_iWidth*2/ m_iHeight;
3680@@ -296,17 +296,17 @@
3681 qDebug() << "Received waveform from track";
3682 }
3683
3684-
3685+
3686
3687 //drawSignalPixmap(pPainter);
3688
3689-
3690-
3691+
3692+
3693 pPainter->translate(0,m_iHeight/2);
3694 pPainter->scale(1.0,-1.0);
3695 //drawSignalLines(pPainter);
3696
3697-
3698+
3699 // Draw various markers.
3700 pPainter->setPen(colorMarker);
3701
3702@@ -318,7 +318,7 @@
3703
3704 }
3705
3706-void GLWaveformRenderer::newTrack(TrackInfoObject* pTrack) {
3707+void GLWaveformRenderer::newTrack(TrackPointer pTrack) {
3708 m_pTrack = pTrack;
3709 m_pSampleBuffer = 0;
3710 m_iNumSamples = 0;
3711
3712=== modified file 'mixxx/src/waveform/glwaveformrenderer.h'
3713--- mixxx/src/waveform/glwaveformrenderer.h 2008-07-14 03:21:19 +0000
3714+++ mixxx/src/waveform/glwaveformrenderer.h 2010-07-22 07:29:40 +0000
3715@@ -9,9 +9,8 @@
3716 #include <qgl.h>
3717
3718 #include "defs.h"
3719-
3720-
3721-class TrackInfoObject;
3722+#include "trackinfoobject.h"
3723+
3724 class ControlObjectThreadMain;
3725 class QDomNode;
3726 class WaveformRenderBeat;
3727@@ -28,7 +27,7 @@
3728 void glDraw();
3729 void drawSignalLines();
3730 void drawSignalPixmap(QPainter* p);
3731- void newTrack(TrackInfoObject *pTrack);
3732+ void newTrack(TrackPointer pTrack);
3733 void setup(QDomNode node);
3734 void precomputePixmap();
3735 void setDesiredSecondsToDisplay(int seconds);
3736@@ -51,7 +50,7 @@
3737 ControlObject *m_pCOVisualResample;
3738
3739 int m_iDesiredSecondsToDisplay;
3740- TrackInfoObject *m_pTrack;
3741+ TrackPointer m_pTrack;
3742
3743 GLfloat *m_pInternalBuffer;
3744 int m_iInternalBufferSize;
3745
3746=== modified file 'mixxx/src/waveform/renderobject.h'
3747--- mixxx/src/waveform/renderobject.h 2009-09-27 06:04:04 +0000
3748+++ mixxx/src/waveform/renderobject.h 2010-07-22 07:29:40 +0000
3749@@ -5,12 +5,12 @@
3750 #include <QDomNode>
3751 #include <QVector>
3752
3753+#include "trackinfoobject.h"
3754+
3755 class QDomNode;
3756 class QPainter;
3757 class QPaintEvent;
3758
3759-class TrackInfoObject;
3760-
3761 class RenderObject : public QObject {
3762 Q_OBJECT
3763 public:
3764@@ -21,7 +21,7 @@
3765 virtual void draw(QPainter *pPainter, QPaintEvent *pEvent,
3766 QVector<float> *buffer, double playpos,
3767 double rateAdjust) = 0;
3768- virtual void newTrack(TrackInfoObject *pTrack) = 0;
3769+ virtual void newTrack(TrackPointer pTrack) = 0;
3770 };
3771
3772 #endif
3773
3774=== modified file 'mixxx/src/waveform/waveformrenderbackground.cpp'
3775--- mixxx/src/waveform/waveformrenderbackground.cpp 2009-03-05 20:35:06 +0000
3776+++ mixxx/src/waveform/waveformrenderbackground.cpp 2010-07-22 07:29:40 +0000
3777@@ -34,7 +34,7 @@
3778 m_bRepaintBackground = true;
3779 }
3780
3781-void WaveformRenderBackground::newTrack(TrackInfoObject* pTrack) {
3782+void WaveformRenderBackground::newTrack(TrackPointer pTrack) {
3783 }
3784
3785 void WaveformRenderBackground::setup(QDomNode node) {
3786@@ -56,7 +56,7 @@
3787 linearGrad.setColorAt(0.0, bgColor);
3788 linearGrad.setColorAt(0.5, bgColor.light(180));
3789 linearGrad.setColorAt(1.0, bgColor);
3790-
3791+
3792 // linearGrad.setColorAt(0.0, Qt::black);
3793 // linearGrad.setColorAt(0.3, bgColor);
3794 // linearGrad.setColorAt(0.7, bgColor);
3795@@ -67,6 +67,6 @@
3796 newPainter.begin(&m_backgroundPixmap);
3797 newPainter.fillRect(m_backgroundPixmap.rect(), brush);
3798 newPainter.end();
3799-
3800+
3801 m_bRepaintBackground = false;
3802 }
3803
3804=== modified file 'mixxx/src/waveform/waveformrenderbackground.h'
3805--- mixxx/src/waveform/waveformrenderbackground.h 2009-02-06 09:20:10 +0000
3806+++ mixxx/src/waveform/waveformrenderbackground.h 2010-07-22 07:29:40 +0000
3807@@ -14,7 +14,6 @@
3808 class QPaintEvent;
3809
3810 class WaveformRenderer;
3811-class TrackInfoObject;
3812
3813 class WaveformRenderBackground : public RenderObject {
3814 Q_OBJECT
3815@@ -23,7 +22,7 @@
3816 void resize(int w, int h);
3817 void setup(QDomNode node);
3818 void draw(QPainter *pPainter, QPaintEvent *event, QVector<float> *buffer, double playPos, double rateAdjust);
3819- void newTrack(TrackInfoObject *pTrack);
3820+ void newTrack(TrackPointer pTrack);
3821
3822 private:
3823 void generatePixmap();
3824
3825=== modified file 'mixxx/src/waveform/waveformrenderbeat.cpp'
3826--- mixxx/src/waveform/waveformrenderbeat.cpp 2010-06-18 06:43:20 +0000
3827+++ mixxx/src/waveform/waveformrenderbeat.cpp 2010-07-22 07:29:40 +0000
3828@@ -20,7 +20,7 @@
3829 m_pBpm(NULL),
3830 m_pBeatFirst(NULL),
3831 m_pTrackSamples(NULL),
3832- m_pTrack(NULL),
3833+ m_pTrack(),
3834 m_iWidth(0),
3835 m_iHeight(0),
3836 m_dBpm(-1),
3837@@ -63,7 +63,7 @@
3838 m_iHeight = h;
3839 }
3840
3841-void WaveformRenderBeat::newTrack(TrackInfoObject* pTrack) {
3842+void WaveformRenderBeat::newTrack(TrackPointer pTrack) {
3843 m_pTrack = pTrack;
3844 m_dBpm = -1;
3845 m_dBeatFirst = -1;
3846
3847=== modified file 'mixxx/src/waveform/waveformrenderbeat.h'
3848--- mixxx/src/waveform/waveformrenderbeat.h 2010-01-21 10:50:22 +0000
3849+++ mixxx/src/waveform/waveformrenderbeat.h 2010-07-22 07:29:40 +0000
3850@@ -15,7 +15,6 @@
3851
3852 class ControlObjectThreadMain;
3853 class WaveformRenderer;
3854-class TrackInfoObject;
3855 class SoundSourceProxy;
3856
3857 class WaveformRenderBeat : public RenderObject {
3858@@ -25,7 +24,7 @@
3859 void resize(int w, int h);
3860 void setup(QDomNode node);
3861 void draw(QPainter *pPainter, QPaintEvent *event, QVector<float> *buffer, double playPos, double rateAdjust);
3862- void newTrack(TrackInfoObject *pTrack);
3863+ void newTrack(TrackPointer pTrack);
3864
3865 public slots:
3866 void slotUpdateBpm(double bpm);
3867@@ -36,7 +35,7 @@
3868 ControlObjectThreadMain *m_pBpm;
3869 ControlObjectThreadMain *m_pBeatFirst;
3870 ControlObjectThreadMain *m_pTrackSamples;
3871- TrackInfoObject *m_pTrack;
3872+ TrackPointer m_pTrack;
3873 int m_iWidth, m_iHeight;
3874 double m_dBpm;
3875 double m_dBeatFirst;
3876
3877=== modified file 'mixxx/src/waveform/waveformrenderer.cpp'
3878--- mixxx/src/waveform/waveformrenderer.cpp 2010-02-18 21:07:35 +0000
3879+++ mixxx/src/waveform/waveformrenderer.cpp 2010-07-22 07:29:40 +0000
3880@@ -533,12 +533,12 @@
3881
3882 }
3883
3884-void WaveformRenderer::slotUnloadTrack(TrackInfoObject* pTrack) {
3885+void WaveformRenderer::slotUnloadTrack(TrackPointer pTrack) {
3886 // All RenderObject's must support newTrack() calls with NULL
3887- slotNewTrack(NULL);
3888+ slotNewTrack(TrackPointer());
3889 }
3890
3891-void WaveformRenderer::slotNewTrack(TrackInfoObject* pTrack) {
3892+void WaveformRenderer::slotNewTrack(TrackPointer pTrack) {
3893
3894 m_pTrack = pTrack;
3895 m_pSampleBuffer = NULL;
3896
3897=== modified file 'mixxx/src/waveform/waveformrenderer.h'
3898--- mixxx/src/waveform/waveformrenderer.h 2010-02-18 21:07:35 +0000
3899+++ mixxx/src/waveform/waveformrenderer.h 2010-07-22 07:29:40 +0000
3900@@ -13,8 +13,8 @@
3901 #include <QVector>
3902
3903 #include "defs.h"
3904+#include "trackinfoobject.h"
3905
3906-class TrackInfoObject;
3907 class ControlObjectThreadMain;
3908 class RenderObject;
3909 class WaveformRenderBackground;
3910@@ -39,8 +39,8 @@
3911 int getPixelsPerSecond();
3912
3913 public slots:
3914- void slotNewTrack(TrackInfoObject *pTrack);
3915- void slotUnloadTrack(TrackInfoObject* pTrack);
3916+ void slotNewTrack(TrackPointer pTrack);
3917+ void slotUnloadTrack(TrackPointer pTrack);
3918 void slotUpdateLatency(double latency);
3919 void slotUpdatePlayPos(double playpos);
3920 void slotUpdateRate(double rate);
3921@@ -87,7 +87,7 @@
3922
3923 const int m_iSubpixelsPerPixel;
3924 const int m_iPixelsPerSecond;
3925- TrackInfoObject *m_pTrack;
3926+ TrackPointer m_pTrack;
3927
3928 bool m_bQuit;
3929 };
3930
3931=== modified file 'mixxx/src/waveform/waveformrendermark.cpp'
3932--- mixxx/src/waveform/waveformrendermark.cpp 2010-02-18 21:07:35 +0000
3933+++ mixxx/src/waveform/waveformrendermark.cpp 2010-07-22 07:29:40 +0000
3934@@ -53,7 +53,7 @@
3935 m_iHeight = h;
3936 }
3937
3938-void WaveformRenderMark::newTrack(TrackInfoObject* pTrack) {
3939+void WaveformRenderMark::newTrack(TrackPointer pTrack) {
3940 m_pTrack = pTrack;
3941 m_iMarkPoint = -1;
3942 m_iNumSamples = 0;
3943
3944=== modified file 'mixxx/src/waveform/waveformrendermark.h'
3945--- mixxx/src/waveform/waveformrendermark.h 2009-11-18 00:10:55 +0000
3946+++ mixxx/src/waveform/waveformrendermark.h 2010-07-22 07:29:40 +0000
3947@@ -17,7 +17,6 @@
3948 class ConfigKey;
3949 class ControlObjectThreadMain;
3950 class WaveformRenderer;
3951-class TrackInfoObject;
3952
3953 class WaveformRenderMark : public RenderObject {
3954 Q_OBJECT
3955@@ -28,7 +27,7 @@
3956 void setup(QDomNode node);
3957 void draw(QPainter *pPainter, QPaintEvent *event,
3958 QVector<float> *buffer, double playPos, double rateAdjust);
3959- void newTrack(TrackInfoObject *pTrack);
3960+ void newTrack(TrackPointer pTrack);
3961
3962 public slots:
3963 void slotUpdateMarkPoint(double mark);
3964@@ -46,7 +45,7 @@
3965 WaveformRenderer *m_pParent;
3966 ControlObjectThreadMain *m_pMarkPoint;
3967 ControlObjectThreadMain *m_pTrackSamples;
3968- TrackInfoObject *m_pTrack;
3969+ TrackPointer m_pTrack;
3970
3971 int m_iMarkPoint;
3972 int m_iWidth, m_iHeight;
3973
3974=== modified file 'mixxx/src/waveform/waveformrendermarkrange.cpp'
3975--- mixxx/src/waveform/waveformrendermarkrange.cpp 2010-02-18 21:07:35 +0000
3976+++ mixxx/src/waveform/waveformrendermarkrange.cpp 2010-07-22 07:29:40 +0000
3977@@ -69,7 +69,7 @@
3978 m_iHeight = h;
3979 }
3980
3981-void WaveformRenderMarkRange::newTrack(TrackInfoObject* pTrack) {
3982+void WaveformRenderMarkRange::newTrack(TrackPointer pTrack) {
3983 m_pTrack = pTrack;
3984 m_iMarkStartPoint = -1;
3985 m_iMarkEndPoint = -1;
3986
3987=== modified file 'mixxx/src/waveform/waveformrendermarkrange.h'
3988--- mixxx/src/waveform/waveformrendermarkrange.h 2009-11-15 00:35:33 +0000
3989+++ mixxx/src/waveform/waveformrendermarkrange.h 2010-07-22 07:29:40 +0000
3990@@ -18,7 +18,6 @@
3991 class ConfigKey;
3992 class ControlObjectThreadMain;
3993 class WaveformRenderer;
3994-class TrackInfoObject;
3995
3996 class WaveformRenderMarkRange : public RenderObject {
3997 Q_OBJECT
3998@@ -29,7 +28,7 @@
3999 void setup(QDomNode node);
4000 void draw(QPainter *pPainter, QPaintEvent *event,
4001 QVector<float> *buffer, double playPos, double rateAdjust);
4002- void newTrack(TrackInfoObject *pTrack);
4003+ void newTrack(TrackPointer pTrack);
4004
4005 public slots:
4006 void slotUpdateMarkStartPoint(double mark);
4007@@ -44,7 +43,7 @@
4008 ControlObjectThreadMain *m_pMarkEndPoint;
4009 ControlObjectThreadMain *m_pMarkEnabled;
4010 ControlObjectThreadMain *m_pTrackSamples;
4011- TrackInfoObject *m_pTrack;
4012+ TrackPointer m_pTrack;
4013
4014 bool m_bMarkEnabled;
4015 int m_iMarkStartPoint, m_iMarkEndPoint;
4016
4017=== modified file 'mixxx/src/waveform/waveformrendersignal.cpp'
4018--- mixxx/src/waveform/waveformrendersignal.cpp 2010-03-10 18:14:34 +0000
4019+++ mixxx/src/waveform/waveformrendersignal.cpp 2010-07-22 07:29:40 +0000
4020@@ -30,7 +30,7 @@
4021 m_iHeight = h;
4022 }
4023
4024-void WaveformRenderSignal::newTrack(TrackInfoObject* pTrack) {
4025+void WaveformRenderSignal::newTrack(TrackPointer pTrack) {
4026 m_pTrack = pTrack;
4027 }
4028
4029
4030=== modified file 'mixxx/src/waveform/waveformrendersignal.h'
4031--- mixxx/src/waveform/waveformrendersignal.h 2009-02-06 09:20:10 +0000
4032+++ mixxx/src/waveform/waveformrendersignal.h 2010-07-22 07:29:40 +0000
4033@@ -17,7 +17,6 @@
4034
4035 class ControlObjectThreadMain;
4036 class WaveformRenderer;
4037-class TrackInfoObject;
4038 class SoundSourceProxy;
4039
4040 class WaveformRenderSignal : public RenderObject {
4041@@ -27,13 +26,13 @@
4042 void resize(int w, int h);
4043 void setup(QDomNode node);
4044 void draw(QPainter *pPainter, QPaintEvent *event, QVector<float> *buffer, double playPos, double rateAdjust);
4045- void newTrack(TrackInfoObject *pTrack);
4046+ void newTrack(TrackPointer pTrack);
4047
4048 private:
4049 WaveformRenderer *m_pParent;
4050 int m_iWidth, m_iHeight;
4051 QVector<QLineF> m_lines;
4052- TrackInfoObject *m_pTrack;
4053+ TrackPointer m_pTrack;
4054 QColor signalColor;
4055 };
4056
4057
4058=== modified file 'mixxx/src/waveform/waveformrendersignalpixmap.cpp'
4059--- mixxx/src/waveform/waveformrendersignalpixmap.cpp 2009-02-10 08:42:18 +0000
4060+++ mixxx/src/waveform/waveformrendersignalpixmap.cpp 2010-07-22 07:29:40 +0000
4061@@ -34,7 +34,7 @@
4062 m_screenPixmap.fill(QColor(0,0,0,0));
4063 }
4064
4065-void WaveformRenderSignalPixmap::newTrack(TrackInfoObject* pTrack) {
4066+void WaveformRenderSignalPixmap::newTrack(TrackPointer pTrack) {
4067 m_pTrack = pTrack;
4068 }
4069
4070@@ -60,7 +60,7 @@
4071 if(dPlayPos >= 0) {
4072 iCurPos = (int)(dPlayPos*numBufferSamples);
4073 }
4074-
4075+
4076 if((iCurPos % 2) != 0)
4077 iCurPos--;
4078
4079@@ -112,7 +112,7 @@
4080
4081 //qDebug() << "startPixel " << startPixel;
4082 //qDebug() << "endPixel " << endPixel;
4083-
4084+
4085 painter.scale(1.0/subpixelsPerPixel,m_iHeight*0.40);
4086
4087 // If the array is not large enough, expand it.
4088@@ -121,12 +121,12 @@
4089 m_lines.resize(2*subpixelWidth);
4090 }
4091
4092-
4093+
4094 painter.drawPixmap(oldPoint, m_screenPixmap);
4095 painter.eraseRect(newRect);
4096-
4097+
4098 //painter.fillRect(newRect, QColor(0,0,0,0));
4099-
4100+
4101 int halfw = subpixelWidth/2;
4102 for(int i=startPixel;i<endPixel;i++) {
4103 // Start at curPos minus half the waveform viewer
4104@@ -142,9 +142,9 @@
4105
4106 // Only draw lines that we have provided
4107 painter.drawLines(m_lines.data()+startPixel, endPixel-startPixel);
4108-
4109+
4110 painter.end();
4111-
4112+
4113 m_iLastPlaypos = iCurPos;
4114
4115 }
4116
4117=== modified file 'mixxx/src/waveform/waveformrendersignalpixmap.h'
4118--- mixxx/src/waveform/waveformrendersignalpixmap.h 2009-02-10 08:42:18 +0000
4119+++ mixxx/src/waveform/waveformrendersignalpixmap.h 2010-07-22 07:29:40 +0000
4120@@ -18,7 +18,6 @@
4121
4122 class ControlObjectThreadMain;
4123 class WaveformRenderer;
4124-class TrackInfoObject;
4125 class SoundSourceProxy;
4126
4127 class WaveformRenderSignalPixmap : public RenderObject {
4128@@ -28,7 +27,7 @@
4129 void resize(int w, int h);
4130 void setup(QDomNode node);
4131 void draw(QPainter *pPainter, QPaintEvent *event, QVector<float> *buffer, double playPos, double rateAdjust);
4132- void newTrack(TrackInfoObject *pTrack);
4133+ void newTrack(TrackPointer pTrack);
4134
4135 private:
4136 void updatePixmap(QVector<float> *buffer, double playPos, double rateAdjust);
4137@@ -37,7 +36,7 @@
4138 int m_iWidth, m_iHeight;
4139 int m_iLastPlaypos;
4140 QVector<QLineF> m_lines;
4141- TrackInfoObject *m_pTrack;
4142+ TrackPointer m_pTrack;
4143 QColor signalColor;
4144 QPixmap m_screenPixmap;
4145 };
4146
4147=== modified file 'mixxx/src/waveform/waveformrendersignaltiles.cpp'
4148--- mixxx/src/waveform/waveformrendersignaltiles.cpp 2010-03-10 22:48:52 +0000
4149+++ mixxx/src/waveform/waveformrendersignaltiles.cpp 2010-07-22 07:29:40 +0000
4150@@ -31,7 +31,7 @@
4151 resetTiles();
4152 }
4153
4154-void WaveformRenderSignalTiles::newTrack(TrackInfoObject* pTrack) {
4155+void WaveformRenderSignalTiles::newTrack(TrackPointer pTrack) {
4156 m_pTrack = pTrack;
4157 }
4158
4159
4160=== modified file 'mixxx/src/waveform/waveformrendersignaltiles.h'
4161--- mixxx/src/waveform/waveformrendersignaltiles.h 2010-03-10 22:48:52 +0000
4162+++ mixxx/src/waveform/waveformrendersignaltiles.h 2010-07-22 07:29:40 +0000
4163@@ -16,7 +16,6 @@
4164
4165 class ControlObjectThreadMain;
4166 class WaveformRenderer;
4167-class TrackInfoObject;
4168 class SoundSourceProxy;
4169
4170 struct Tile {
4171@@ -32,7 +31,7 @@
4172 void resize(int w, int h);
4173 void setup(QDomNode node);
4174 void draw(QPainter *pPainter, QPaintEvent *event, QVector<float> *buffer, double playPos, double rateAdjust);
4175- void newTrack(TrackInfoObject *pTrack);
4176+ void newTrack(TrackPointer pTrack);
4177
4178 private:
4179 Tile* getTileForSubpixel(int subpixel, QVector<float> *buffer);
4180@@ -40,7 +39,7 @@
4181
4182 WaveformRenderer *m_pParent;
4183 int m_iWidth, m_iHeight;
4184- TrackInfoObject *m_pTrack;
4185+ TrackPointer m_pTrack;
4186 QColor signalColor;
4187
4188 QHash<int, Tile*> m_qTileMap;
4189
4190=== modified file 'mixxx/src/widget/wglwaveformviewer.h'
4191--- mixxx/src/widget/wglwaveformviewer.h 2009-11-15 01:01:15 +0000
4192+++ mixxx/src/widget/wglwaveformviewer.h 2010-07-22 07:29:40 +0000
4193@@ -16,7 +16,6 @@
4194
4195 class EngineBuffer;
4196 class WaveformRenderer;
4197-class TrackInfoObject;
4198
4199 class WGLWaveformViewer : public QGLWidget
4200 {
4201
4202=== modified file 'mixxx/src/widget/wlibrarytableview.h'
4203--- mixxx/src/widget/wlibrarytableview.h 2010-01-03 21:54:29 +0000
4204+++ mixxx/src/widget/wlibrarytableview.h 2010-07-22 07:29:40 +0000
4205@@ -9,8 +9,8 @@
4206
4207 #include "configobject.h"
4208 #include "library/libraryview.h"
4209+#include "trackinfoobject.h"
4210
4211-class TrackInfoObject;
4212
4213 class WLibraryTableView : public QTableView, public virtual LibraryView {
4214 Q_OBJECT
4215@@ -23,8 +23,8 @@
4216 virtual void setup(QDomNode node);
4217
4218 signals:
4219- void loadTrack(TrackInfoObject* pTrack);
4220- void loadTrackToPlayer(TrackInfoObject* pTrack, int player);
4221+ void loadTrack(TrackPointer pTrack);
4222+ void loadTrackToPlayer(TrackPointer pTrack, int player);
4223
4224 public slots:
4225 void saveVScrollBarPos();
4226
4227=== modified file 'mixxx/src/widget/woverview.cpp'
4228--- mixxx/src/widget/woverview.cpp 2010-02-18 21:07:35 +0000
4229+++ mixxx/src/widget/woverview.cpp 2010-07-22 07:29:40 +0000
4230@@ -161,6 +161,11 @@
4231 }
4232 }
4233
4234+void WOverview::slotLoadNewWaveform(TrackPointer pTrack)
4235+{
4236+ slotLoadNewWaveform(pTrack.data());
4237+}
4238+
4239 void WOverview::slotLoadNewWaveform(TrackInfoObject* pTrack)
4240 {
4241 //Update this widget with new waveform summary data from the new track.
4242@@ -169,7 +174,7 @@
4243 update();
4244 }
4245
4246-void WOverview::slotUnloadTrack(TrackInfoObject* pTrack) {
4247+void WOverview::slotUnloadTrack(TrackPointer pTrack) {
4248 QByteArray ba;
4249 setData(&ba, 0);
4250 update();
4251
4252=== modified file 'mixxx/src/widget/woverview.h'
4253--- mixxx/src/widget/woverview.h 2010-02-18 21:07:35 +0000
4254+++ mixxx/src/widget/woverview.h 2010-07-22 07:29:40 +0000
4255@@ -20,6 +20,7 @@
4256 #include <QList>
4257 #include <q3valuelist.h>
4258
4259+#include "trackinfoobject.h"
4260 #include "widget/wwidget.h"
4261
4262
4263@@ -29,7 +30,6 @@
4264 @author Tue Haste Andersen
4265 */
4266
4267-class TrackInfoObject;
4268 class ControlObject;
4269
4270 class WOverview : public WWidget
4271@@ -50,7 +50,8 @@
4272 public slots:
4273 void setValue(double);
4274 void slotLoadNewWaveform(TrackInfoObject* pTrack);
4275- void slotUnloadTrack(TrackInfoObject* pTrack);
4276+ void slotLoadNewWaveform(TrackPointer pTrack);
4277+ void slotUnloadTrack(TrackPointer pTrack);
4278 private slots:
4279 void cueChanged(double v);
4280 void loopStartChanged(double v);
4281
4282=== modified file 'mixxx/src/widget/wvisualsimple.cpp'
4283--- mixxx/src/widget/wvisualsimple.cpp 2009-03-05 20:35:06 +0000
4284+++ mixxx/src/widget/wvisualsimple.cpp 2010-07-22 07:29:40 +0000
4285@@ -64,7 +64,7 @@
4286 {
4287 // Setup position and connections
4288 WWidget::setup(node);
4289-
4290+
4291 // Size
4292 QString size = selectNodeQString(node, "Size");
4293 int x = size.left(size.indexOf(",")).toInt();
4294@@ -73,7 +73,7 @@
4295
4296 m_pWaveformRenderer->resize(x,y);
4297 m_pWaveformRenderer->setup(node);
4298-
4299+
4300 // Set constants for line drawing
4301 m_qMarkerPos1.setX(x/2);
4302 m_qMarkerPos1.setY(0);
4303@@ -88,7 +88,7 @@
4304 {
4305 c.setNamedColor(selectNodeQString(node, "BgColor"));
4306 }
4307-
4308+
4309 //the simple view seems to look fine even if we never set a background colour at all
4310 //but since the code used to do it, we'll continue to do it --kousu 2009/03
4311 QPalette palette = this->palette();
4312@@ -102,10 +102,6 @@
4313 colorMarker = WSkinColor::getCorrectColor(colorMarker);
4314 }
4315
4316-void WVisualSimple::slotNewTrack(TrackInfoObject* track)
4317-{
4318-}
4319-
4320 void WVisualSimple::mouseMoveEvent(QMouseEvent * e)
4321 {
4322 // Only process mouse move if it was initiated by a left click
4323
4324=== modified file 'mixxx/src/widget/wvisualsimple.h'
4325--- mixxx/src/widget/wvisualsimple.h 2009-03-05 15:14:48 +0000
4326+++ mixxx/src/widget/wvisualsimple.h 2010-07-22 07:29:40 +0000
4327@@ -32,7 +32,6 @@
4328 */
4329
4330 class WaveformRenderer;
4331-class TrackInfoObject;
4332
4333 class WVisualSimple : public WWidget
4334 {
4335@@ -53,8 +52,7 @@
4336
4337 public slots:
4338 void setValue(double) {};
4339- void slotNewTrack(TrackInfoObject* track);
4340-
4341+
4342 protected:
4343 int m_iStartPosX, m_iValue;
4344 QPoint m_qMarkerPos1, m_qMarkerPos2, m_qMousePos;
4345
4346=== modified file 'mixxx/src/widget/wwaveformviewer.h'
4347--- mixxx/src/widget/wwaveformviewer.h 2009-04-15 01:40:11 +0000
4348+++ mixxx/src/widget/wwaveformviewer.h 2010-07-22 07:29:40 +0000
4349@@ -16,7 +16,6 @@
4350
4351 class EngineBuffer;
4352 class WaveformRenderer;
4353-class TrackInfoObject;
4354
4355 class WWaveformViewer : public QWidget
4356 {
4357@@ -38,7 +37,7 @@
4358 void trackDropped(QString filename);
4359
4360 protected:
4361-
4362+
4363 void timerEvent(QTimerEvent *);
4364 void paintEvent(QPaintEvent* event);
4365
4366@@ -51,7 +50,7 @@
4367
4368 /** Waveform Renderer does all the work for us */
4369 WaveformRenderer *m_pWaveformRenderer;
4370-
4371+
4372 bool m_painting;
4373 QMutex m_paintMutex;
4374
4375
4376=== modified file 'mixxx/src/wtracktableview.cpp'
4377--- mixxx/src/wtracktableview.cpp 2010-07-11 05:05:32 +0000
4378+++ mixxx/src/wtracktableview.cpp 2010-07-22 07:29:40 +0000
4379@@ -178,7 +178,7 @@
4380 void WTrackTableView::slotMouseDoubleClicked(const QModelIndex &index)
4381 {
4382 TrackModel* trackModel = getTrackModel();
4383- TrackInfoObject* pTrack = NULL;
4384+ TrackPointer pTrack;
4385 if (trackModel && (pTrack = trackModel->getTrack(index))) {
4386 emit(loadTrack(pTrack));
4387 }
4388@@ -188,7 +188,7 @@
4389 if (m_selectedIndices.size() > 0) {
4390 QModelIndex index = m_selectedIndices.at(0);
4391 TrackModel* trackModel = getTrackModel();
4392- TrackInfoObject* pTrack = NULL;
4393+ TrackPointer pTrack;
4394 if (trackModel &&
4395 (pTrack = trackModel->getTrack(index))) {
4396 emit(loadTrackToPlayer(pTrack, 1));
4397@@ -200,7 +200,7 @@
4398 if (m_selectedIndices.size() > 0) {
4399 QModelIndex index = m_selectedIndices.at(0);
4400 TrackModel* trackModel = getTrackModel();
4401- TrackInfoObject* pTrack = NULL;
4402+ TrackPointer pTrack;
4403 if (trackModel &&
4404 (pTrack = trackModel->getTrack(index))) {
4405 emit(loadTrackToPlayer(pTrack, 2));
4406@@ -263,7 +263,7 @@
4407 if (!trackModel)
4408 return;
4409
4410- TrackInfoObject* pTrack = trackModel->getTrack(index);
4411+ TrackPointer pTrack = trackModel->getTrack(index);
4412 // NULL is fine.
4413 pTrackInfo->loadTrack(pTrack);
4414 currentTrackInfoIndex = index;
4415
4416=== modified file 'mixxx/src/wtracktableview.h'
4417--- mixxx/src/wtracktableview.h 2010-06-18 06:14:53 +0000
4418+++ mixxx/src/wtracktableview.h 2010-07-22 07:29:40 +0000
4419@@ -5,12 +5,13 @@
4420 #include <QSortFilterProxyModel>
4421
4422 #include "configobject.h"
4423+#include "trackinfoobject.h"
4424 #include "library/libraryview.h"
4425 #include "library/searchthread.h"
4426 #include "library/trackmodel.h" // Can't forward declare enums
4427 #include "widget/wlibrarytableview.h"
4428
4429-class TrackInfoObject;
4430+
4431 class DlgTrackInfo;
4432
4433 const QString WTRACKTABLEVIEW_VSCROLLBARPOS_KEY = "VScrollBarPos"; /** ConfigValue key for QTable vertical scrollbar position */
4434@@ -41,8 +42,8 @@
4435 void slotNextTrackInfo();
4436 void slotPrevTrackInfo();
4437 signals:
4438- void loadTrack(TrackInfoObject* pTrack);
4439- void loadTrackToPlayer(TrackInfoObject* pTrack, int player);
4440+ void loadTrack(TrackPointer pTrack);
4441+ void loadTrackToPlayer(TrackPointer pTrack, int player);
4442
4443 private:
4444 void showTrackInfo(QModelIndex index);