Merge lp:~mixxxdevelopers/mixxx/features_sqlite into lp:~mixxxdevelopers/mixxx/trunk
- features_sqlite
- Merge into trunk
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 | ||||||||||||||||||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Albert Santoni | Approve | ||
Review via email: mp+30231@code.launchpad.net |
Commit message
Description of the change
The latest changes add a TrackPointer datatype which converts almost every use of TrackInfoObject* to a QSharedPointer<
- 2390. By RJ Skerry-Ryan
-
Merging from trunk.
- 2391. By Albert Santoni
-
Removed references to BPM stuff in TrackInfoObject for cleanup. Removed unused bpmreceiver.h
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:/
> 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
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); |
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