=== modified file 'mixxx/src/cachingreader.cpp' --- mixxx/src/cachingreader.cpp 2011-10-07 16:23:24 +0000 +++ mixxx/src/cachingreader.cpp 2011-10-13 22:01:41 +0000 @@ -33,14 +33,15 @@ m_pConfig(_config), m_pCurrentSoundSource(NULL), m_iTrackSampleRate(0), + m_readerStatus(INVALID), m_iTrackNumSamples(0), m_iTrackNumSamplesCallbackSafe(0), - m_readerStatus(INVALID), m_mruChunk(NULL), + m_chunkReadRequestFIFO(1024), m_lruChunk(NULL), - m_pRawMemoryBuffer(NULL), - m_chunkReadRequestFIFO(1024), - m_readerStatusFIFO(1024) { + m_readerStatusFIFO(1024), + m_pRawMemoryBuffer(NULL) +{ initialize(); } @@ -49,10 +50,17 @@ m_allocatedChunks.clear(); m_lruChunk = m_mruChunk = NULL; + for (int i=0; i < m_chunks.size(); i++) { + Chunk* c = m_chunks[i]; + delete c; + } + delete [] m_pSample; delete [] m_pRawMemoryBuffer; m_pRawMemoryBuffer = NULL; + + delete m_pCurrentSoundSource; } void CachingReader::initialize() { === modified file 'mixxx/src/controlpotmeter.cpp' --- mixxx/src/controlpotmeter.cpp 2011-04-03 20:35:29 +0000 +++ mixxx/src/controlpotmeter.cpp 2011-10-13 22:01:41 +0000 @@ -33,7 +33,7 @@ setStep(m_dValueRange/10.f); setSmallStep(m_dValueRange/100.f); - ControlPushButton * p; + // ControlPushButton * p; m_pControlUp = new ControlPushButton(ConfigKey(key.group, QString(key.item)+"_up")); connect(m_pControlUp, SIGNAL(valueChanged(double)), this, SLOT(incValue(double))); m_pControlDown = new ControlPushButton(ConfigKey(key.group, QString(key.item)+"_down")); @@ -46,10 +46,34 @@ ControlPotmeter::~ControlPotmeter() { - delete m_pControlUp; + // If the leaked controles are deleted by mixxx.cpp + // The subControls of ControlPotentiometer may have bin already delete. + // So check it before + /* + delete m_pControlUp; delete m_pControlDown; delete m_pControlUpSmall; delete m_pControlDownSmall; + */ + + ControlObject* p; + + p = ControlObject::getControl(ConfigKey(getKey().group, QString(getKey().item)+"_up")); + if (p) { + delete p; + } + p = ControlObject::getControl(ConfigKey(getKey().group, QString(getKey().item)+"_down")); + if (p) { + delete p; + } + p = ControlObject::getControl(ConfigKey(getKey().group, QString(getKey().item)+"_up_small")); + if (p) { + delete p; + } + p = ControlObject::getControl(ConfigKey(getKey().group, QString(getKey().item)+"_down_small")); + if (p) { + delete p; + } } double ControlPotmeter::getMin() === modified file 'mixxx/src/dlgprefcontrols.cpp' --- mixxx/src/dlgprefcontrols.cpp 2011-04-24 22:22:45 +0000 +++ mixxx/src/dlgprefcontrols.cpp 2011-10-13 22:01:41 +0000 @@ -282,6 +282,18 @@ DlgPrefControls::~DlgPrefControls() { + foreach (ControlObjectThreadMain* pControl, m_rateControls) { + delete pControl; + } + foreach (ControlObjectThreadMain* pControl, m_rateDirControls) { + delete pControl; + } + foreach (ControlObjectThreadMain* pControl, m_cueControls) { + delete pControl; + } + foreach (ControlObjectThreadMain* pControl, m_rateRangeControls) { + delete pControl; + } } void DlgPrefControls::slotUpdateSchemes() === modified file 'mixxx/src/dlgprefcrossfader.cpp' --- mixxx/src/dlgprefcrossfader.cpp 2011-03-30 06:00:45 +0000 +++ mixxx/src/dlgprefcrossfader.cpp 2011-10-13 22:01:41 +0000 @@ -70,6 +70,7 @@ DlgPrefCrossfader::~DlgPrefCrossfader() { + delete m_pxfScene; } /** Loads the config keys and sets the widgets in the dialog to match */ === modified file 'mixxx/src/dlgprefmidibindings.cpp' --- mixxx/src/dlgprefmidibindings.cpp 2010-12-01 14:22:49 +0000 +++ mixxx/src/dlgprefmidibindings.cpp 2011-10-13 22:01:41 +0000 @@ -68,12 +68,12 @@ //The above shortcut doesn't work yet, not quite sure why. -- Albert Feb 1 / 2009 //Set up the cool item delegates for the input mapping table - m_pMidiChannelDelegate = new MidiChannelDelegate(); - m_pMidiStatusDelegate = new MidiStatusDelegate(); - m_pMidiNoDelegate = new MidiNoDelegate(); - m_pMidiOptionDelegate = new MidiOptionDelegate(); - m_pControlGroupDelegate = new ControlGroupDelegate(); - m_pControlValueDelegate = new ControlValueDelegate(); + m_pMidiChannelDelegate = new MidiChannelDelegate(m_pInputMappingTableView); + m_pMidiStatusDelegate = new MidiStatusDelegate(m_pInputMappingTableView); + m_pMidiNoDelegate = new MidiNoDelegate(m_pInputMappingTableView); + m_pMidiOptionDelegate = new MidiOptionDelegate(m_pInputMappingTableView); + m_pControlGroupDelegate = new ControlGroupDelegate(m_pInputMappingTableView); + m_pControlValueDelegate = new ControlValueDelegate(m_pInputMappingTableView); m_pInputMappingTableView->setItemDelegateForColumn(MIDIINPUTTABLEINDEX_MIDISTATUS, m_pMidiStatusDelegate); m_pInputMappingTableView->setItemDelegateForColumn(MIDIINPUTTABLEINDEX_MIDICHANNEL, m_pMidiChannelDelegate); m_pInputMappingTableView->setItemDelegateForColumn(MIDIINPUTTABLEINDEX_MIDINO, m_pMidiNoDelegate); === modified file 'mixxx/src/dlgprefrecord.cpp' --- mixxx/src/dlgprefrecord.cpp 2011-03-29 16:21:39 +0000 +++ mixxx/src/dlgprefrecord.cpp 2011-10-13 22:01:41 +0000 @@ -214,8 +214,9 @@ DlgPrefRecord::~DlgPrefRecord() { + delete recordControl; +} -} void DlgPrefRecord::slotRecordPathChange() { confirmOverwrite = false; === modified file 'mixxx/src/dlgprefshoutcast.cpp' --- mixxx/src/dlgprefshoutcast.cpp 2010-10-28 11:47:39 +0000 +++ mixxx/src/dlgprefshoutcast.cpp 2011-10-13 22:01:41 +0000 @@ -129,7 +129,7 @@ DlgPrefShoutcast::~DlgPrefShoutcast() { - + delete m_pUpdateShoutcastFromPrefs; } void DlgPrefShoutcast::slotUpdate() === modified file 'mixxx/src/engine/bpmcontrol.cpp' --- mixxx/src/engine/bpmcontrol.cpp 2011-05-06 02:24:51 +0000 +++ mixxx/src/engine/bpmcontrol.cpp 2011-10-13 22:01:41 +0000 @@ -75,6 +75,7 @@ delete m_pFileBpm; delete m_pButtonSync; delete m_pButtonTap; + delete m_pTranslateBeats; } double BpmControl::getBpm() { @@ -132,7 +133,7 @@ return; double fThisBpm = m_pEngineBpm->get(); - double fThisRate = m_pRateDir->get() * m_pRateSlider->get() * m_pRateRange->get(); + //double fThisRate = m_pRateDir->get() * m_pRateSlider->get() * m_pRateRange->get(); double fThisFileBpm = m_pFileBpm->get(); double fOtherBpm = pOtherEngineBuffer->getBpm(); @@ -224,9 +225,9 @@ } // Get the file BPM of each song. - double dThisBpm = m_pBeats->getBpm(); - double dOtherBpm = ControlObject::getControl( - ConfigKey(pOtherEngineBuffer->getGroup(), "file_bpm"))->get(); +// double dThisBpm = m_pBeats->getBpm(); +// double dOtherBpm = ControlObject::getControl( +// ConfigKey(pOtherEngineBuffer->getGroup(), "file_bpm"))->get(); // Get the current position of both decks double dThisPosition = getCurrentSample(); === modified file 'mixxx/src/engine/enginebuffer.cpp' --- mixxx/src/engine/enginebuffer.cpp 2011-10-13 05:05:25 +0000 +++ mixxx/src/engine/enginebuffer.cpp 2011-10-13 22:01:41 +0000 @@ -76,7 +76,9 @@ m_pScaleST(NULL), m_bScalerChanged(false), m_bLastBufferPaused(true), - m_fRampValue(0.0) { + m_fRampValue(0.0), + m_iRampState(ENGINE_RAMP_NONE) +{ m_fLastSampleValue[0] = 0; m_fLastSampleValue[1] = 0; @@ -133,7 +135,8 @@ this, SLOT(slotControlEnd(double)), Qt::DirectConnection); - m_pMasterRate = ControlObject::getControl(ConfigKey("[Master]", "rate")); + // Not used + // m_pMasterRate = ControlObject::getControl(ConfigKey("[Master]", "rate")); // Actual rate (used in visuals, not for control) rateEngine = new ControlObject(ConfigKey(group, "rateEngine")); @@ -484,7 +487,7 @@ CSAMPLE * pOutput = (CSAMPLE *)pOut; bool bCurBufferPaused = false; - double rate; + double rate = 0; if (!m_pTrackEnd->get() && pause.tryLock()) { === modified file 'mixxx/src/engine/enginebufferscalest.cpp' --- mixxx/src/engine/enginebufferscalest.cpp 2010-08-16 18:04:27 +0000 +++ mixxx/src/engine/enginebufferscalest.cpp 2011-10-13 22:01:41 +0000 @@ -183,7 +183,7 @@ // } //Q_ASSERT(m_iReadAheadPos >= 0); - long total_received_frames = 0; + unsigned long total_received_frames = 0; long total_read_frames = 0; long remaining_frames = buf_size/2; === modified file 'mixxx/src/engine/engineclipping.cpp' --- mixxx/src/engine/engineclipping.cpp 2010-07-26 23:37:03 +0000 +++ mixxx/src/engine/engineclipping.cpp 2011-10-13 22:01:41 +0000 @@ -33,7 +33,7 @@ void EngineClipping::process(const CSAMPLE * pIn, const CSAMPLE * pOut, const int iBufferSize) { static const FLOAT_TYPE kfMaxAmp = 32767.; - static const FLOAT_TYPE kfClip = 0.8*kfMaxAmp; + // static const FLOAT_TYPE kfClip = 0.8*kfMaxAmp; CSAMPLE * pOutput = (CSAMPLE *)pOut; // SampleUtil clamps the buffer and if pIn and pOut are aliased will not copy. === modified file 'mixxx/src/engine/enginemaster.cpp' --- mixxx/src/engine/enginemaster.cpp 2011-10-03 05:57:07 +0000 +++ mixxx/src/engine/enginemaster.cpp 2011-10-13 22:01:41 +0000 @@ -48,14 +48,14 @@ m_pSyncWorker = new SyncWorker(m_pWorkerScheduler); // Master sample rate - ControlObject * sr = new ControlObject(ConfigKey(group, "samplerate")); - sr->set(44100.); + m_pMasterSampleRate = new ControlObject(ConfigKey(group, "samplerate")); + m_pMasterSampleRate->set(44100.); // Latency control - new ControlObject(ConfigKey(group, "latency")); + m_pMasterLatency = new ControlObject(ConfigKey(group, "latency")); // Master rate - new ControlPotmeter(ConfigKey(group, "rate"), -1.0, 1.0); + m_pMasterRate = new ControlPotmeter(ConfigKey(group, "rate"), -1.0, 1.0); #ifdef __LADSPA__ // LADSPA @@ -123,6 +123,10 @@ delete xFaderCalibration; delete xFaderCurve; + delete m_pMasterSampleRate; + delete m_pMasterLatency; + delete m_pMasterRate; + SampleUtil::free(m_pHead); SampleUtil::free(m_pMaster); === modified file 'mixxx/src/engine/enginemaster.h' --- mixxx/src/engine/enginemaster.h 2011-10-07 06:02:31 +0000 +++ mixxx/src/engine/enginemaster.h 2011-10-13 22:01:41 +0000 @@ -135,8 +135,13 @@ EngineWorkerScheduler *m_pWorkerScheduler; SyncWorker* m_pSyncWorker; - ControlObject *m_pMasterVolume, *m_pHeadVolume; + ControlObject* m_pMasterVolume; + ControlObject* m_pHeadVolume; + ControlObject* m_pMasterSampleRate; + ControlObject* m_pMasterLatency; + ControlPotmeter* m_pMasterRate; EngineClipping *clipping, *head_clipping; + #ifdef __LADSPA__ EngineLADSPA *ladspa; #endif === modified file 'mixxx/src/engine/enginemicrophone.cpp' --- mixxx/src/engine/enginemicrophone.cpp 2011-04-17 02:56:27 +0000 +++ mixxx/src/engine/enginemicrophone.cpp 2011-10-13 22:01:41 +0000 @@ -84,7 +84,7 @@ // There isn't a suitable SampleUtil method that can do mono->stereo and // short->float in one pass. // SampleUtil::convert(m_pConversionBuffer, pBuffer, iNumSamples); - for (int i = 0; i < iNumSamples; ++i) { + for (unsigned int i = 0; i < iNumSamples; ++i) { m_pConversionBuffer[i*2 + 0] = pBuffer[i]; m_pConversionBuffer[i*2 + 1] = pBuffer[i]; } === modified file 'mixxx/src/engine/loopingcontrol.cpp' --- mixxx/src/engine/loopingcontrol.cpp 2011-05-12 09:32:30 +0000 +++ mixxx/src/engine/loopingcontrol.cpp 2011-10-13 22:01:41 +0000 @@ -78,7 +78,7 @@ // Here we create corresponding beatloop_(SIZE) CO's which all call the same // BeatControl, but with a set value. - for (int i = 0; i < (sizeof(s_dBeatSizes) / sizeof(s_dBeatSizes[0])); ++i) { + for (unsigned int i = 0; i < (sizeof(s_dBeatSizes) / sizeof(s_dBeatSizes[0])); ++i) { BeatLoopingControl* pBeatLoop = new BeatLoopingControl(_group, s_dBeatSizes[i]); connect(pBeatLoop, SIGNAL(activateBeatLoop(BeatLoopingControl*)), this, SLOT(slotBeatLoopActivate(BeatLoopingControl*)), === modified file 'mixxx/src/engine/positionscratchcontroller.cpp' --- mixxx/src/engine/positionscratchcontroller.cpp 2011-05-27 23:44:42 +0000 +++ mixxx/src/engine/positionscratchcontroller.cpp 2011-10-13 22:01:41 +0000 @@ -61,7 +61,7 @@ // Indicator that can possibly tell if we've gone unstable and are // oscillating around the target. - const bool error_flip = (error < 0 && m_last_error > 0) || (error > 0 && m_last_error < 0); + //const bool error_flip = (error < 0 && m_last_error > 0) || (error > 0 && m_last_error < 0); if (isnan(error_change) || isinf(error_change)) error_change = 0.0; @@ -78,13 +78,13 @@ // Try to stabilize us if we're close to the target. Otherwise we might // overshoot and oscillate. - if (fabs(error) < m_samples_per_buffer) { - double percent_remaining = error / m_samples_per_buffer; - // Apply exponential decay to try and stop the stuttering. - double decay = (1.0 - pow(2, -fabs(percent_remaining))); + //if (fabs(error) < m_samples_per_buffer) { + //double percent_remaining = error / m_samples_per_buffer; + //// Apply exponential decay to try and stop the stuttering. + //double decay = (1.0 - pow(2, -fabs(percent_remaining))); //output = percent_remaining * decay; //qDebug() << "clamp decay" << decay << "output" << output; - } + //} m_last_velocity = output; m_last_error = error; === modified file 'mixxx/src/engine/ratecontrol.cpp' --- mixxx/src/engine/ratecontrol.cpp 2011-04-26 05:20:43 +0000 +++ mixxx/src/engine/ratecontrol.cpp 2011-10-13 22:01:41 +0000 @@ -188,6 +188,7 @@ delete m_pScratchToggle; delete m_pJog; delete m_pJogFilter; + delete m_pScratchController; } void RateControl::setRateRamp(bool linearMode) === modified file 'mixxx/src/engine/vinylcontrolcontrol.cpp' --- mixxx/src/engine/vinylcontrolcontrol.cpp 2011-05-26 22:20:48 +0000 +++ mixxx/src/engine/vinylcontrolcontrol.cpp 2011-10-13 22:01:41 +0000 @@ -44,6 +44,7 @@ VinylControlControl::~VinylControlControl() { delete m_pControlVinylSeek; delete m_pControlVinylStatus; + delete m_pControlVinylSpeedType; delete m_pControlVinylEnabled; delete m_pControlVinylMode; delete m_pControlVinylCueing; === modified file 'mixxx/src/ladspa/ladspapresetslot.cpp' --- mixxx/src/ladspa/ladspapresetslot.cpp 2009-01-31 21:34:53 +0000 +++ mixxx/src/ladspa/ladspapresetslot.cpp 2011-10-13 22:01:41 +0000 @@ -32,7 +32,7 @@ setAcceptDrops(true); m_pScrollArea = new QScrollArea(this); - m_pScrollWidget = new QWidget; + m_pScrollWidget = new QWidget(m_pScrollArea); m_pScrollArea->setWidget(m_pScrollWidget); //m_pScrollArea->setWidgetResizable(true); m_pScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); === modified file 'mixxx/src/library/browse/browsetablemodel.cpp' --- mixxx/src/library/browse/browsetablemodel.cpp 2011-09-25 08:08:35 +0000 +++ mixxx/src/library/browse/browsetablemodel.cpp 2011-10-13 22:01:41 +0000 @@ -17,11 +17,11 @@ BrowseTableModel::BrowseTableModel(QObject* parent, TrackCollection* pTrackCollection, RecordingManager* pRecordingManager) - : QStandardItemModel(parent), + : TrackModel(pTrackCollection->getDatabase(), // TrackCollections m_db (defaultConnection) + "mixxx.db.model.browse"), + QStandardItemModel(parent), m_pTrackCollection(pTrackCollection), - m_pRecordingManager(pRecordingManager), - TrackModel(pTrackCollection->getDatabase(), - "mixxx.db.model.browse") { + m_pRecordingManager(pRecordingManager) { QStringList header_data; header_data.insert(COLUMN_FILENAME, tr("Filename")); header_data.insert(COLUMN_ARTIST, tr("Artist")); @@ -105,18 +105,19 @@ } int BrowseTableModel::getTrackId(const QModelIndex& index) const { - // We can't implement this as it stands. + Q_UNUSED(index); + // We can't implement this as it stands. return -1; } const QLinkedList BrowseTableModel::getTrackRows(int trackId) const { - // We can't implement this as it stands. - return QLinkedList(); + Q_UNUSED(trackId); + // We can't implement this as it stands. + return QLinkedList(); } -void BrowseTableModel::search(const QString& searchText) -{ - +void BrowseTableModel::search(const QString& searchText) { + Q_UNUSED(searchText); } const QString BrowseTableModel::currentSearch() const { @@ -205,7 +206,9 @@ bool BrowseTableModel::addTrack(const QModelIndex& index, QString location) { - return false; + Q_UNUSED(index); + Q_UNUSED(location); + return false; } QMimeData* BrowseTableModel::mimeData(const QModelIndexList &indexes) const { @@ -268,7 +271,7 @@ QString track_location = getTrackLocation(index); - int row = index.row(); + //int row = index.row(); // unused int column = index.column(); if(isTrackInUse(track_location) || @@ -303,7 +306,9 @@ bool BrowseTableModel::setData(const QModelIndex &index, const QVariant &value, int role) { - if(!index.isValid()) + Q_UNUSED(role); + + if(!index.isValid()) return false; qDebug() << "BrowseTableModel::setData(" << index.data() << ")"; int row = index.row(); === modified file 'mixxx/src/library/dao/trackdao.cpp' --- mixxx/src/library/dao/trackdao.cpp 2011-10-12 17:29:43 +0000 +++ mixxx/src/library/dao/trackdao.cpp 2011-10-13 22:01:41 +0000 @@ -22,8 +22,8 @@ TrackDAO::TrackDAO(QSqlDatabase& database, CueDAO& cueDao, ConfigObject * pConfig) : m_database(database), m_cueDao(cueDao), - m_pConfig(pConfig), - m_trackCache(TRACK_CACHE_SIZE) { + m_trackCache(TRACK_CACHE_SIZE), + m_pConfig(pConfig) { } void TrackDAO::finish() { @@ -548,7 +548,7 @@ LOG_FAILED_QUERY(query); } - int locationId = -1; + //int locationId = -1; while (query.next()) { // Good god! Assign query.record() to a freaking variable! int trackId = query.value(query.record().indexOf("id")).toInt(); @@ -573,38 +573,37 @@ int timesplayed = query.value(query.record().indexOf("timesplayed")).toInt(); int played = query.value(query.record().indexOf("played")).toInt(); int channels = query.value(query.record().indexOf("channels")).toInt(); - int filesize = query.value(query.record().indexOf("filesize")).toInt(); + //int filesize = query.value(query.record().indexOf("filesize")).toInt(); QString filetype = query.value(query.record().indexOf("filetype")).toString(); QString location = query.value(query.record().indexOf("location")).toString(); bool header_parsed = query.value(query.record().indexOf("header_parsed")).toBool(); QDateTime date_created = query.value(query.record().indexOf("datetime_added")).toDateTime(); - TrackInfoObject* track = new TrackInfoObject(location, false); - TrackPointer pTrack = TrackPointer(track, &TrackDAO::deleteTrack); + TrackPointer pTrack = TrackPointer(new TrackInfoObject(location, false), &TrackDAO::deleteTrack); // TIO already stats the file to see if it exists, what its length is, // etc. So don't bother setting it. //track->setLength(filesize); - track->setId(trackId); - track->setArtist(artist); - track->setTitle(title); - track->setAlbum(album); - track->setYear(year); - track->setGenre(genre); - track->setTrackNumber(tracknumber); - track->setRating(rating); - track->setKey(key); + pTrack->setId(trackId); + pTrack->setArtist(artist); + pTrack->setTitle(title); + pTrack->setAlbum(album); + pTrack->setYear(year); + pTrack->setGenre(genre); + pTrack->setTrackNumber(tracknumber); + pTrack->setRating(rating); + pTrack->setKey(key); - track->setComment(comment); - track->setURL(url); - track->setDuration(duration); - track->setBitrate(bitrate); - track->setSampleRate(samplerate); - track->setCuePoint((float)cuepoint); - track->setBpm(bpm.toFloat()); - track->setReplayGain(replaygain.toFloat()); - track->setWaveSummary(wavesummaryhex, false); + pTrack->setComment(comment); + pTrack->setURL(url); + pTrack->setDuration(duration); + pTrack->setBitrate(bitrate); + pTrack->setSampleRate(samplerate); + pTrack->setCuePoint((float)cuepoint); + pTrack->setBpm(bpm.toFloat()); + pTrack->setReplayGain(replaygain.toFloat()); + pTrack->setWaveSummary(wavesummaryhex, false); delete wavesummaryhex; QString beatsVersion = query.value(query.record().indexOf("beats_version")).toString(); @@ -614,28 +613,28 @@ pTrack->setBeats(pBeats); } - track->setTimesPlayed(timesplayed); - track->setPlayed(played); - track->setChannels(channels); - track->setType(filetype); - track->setLocation(location); - track->setHeaderParsed(header_parsed); - track->setDateAdded(date_created); + pTrack->setTimesPlayed(timesplayed); + pTrack->setPlayed(played); + pTrack->setChannels(channels); + pTrack->setType(filetype); + pTrack->setLocation(location); + pTrack->setHeaderParsed(header_parsed); + pTrack->setDateAdded(date_created); - track->setCuePoints(m_cueDao.getCuesForTrack(trackId)); - track->setDirty(false); + pTrack->setCuePoints(m_cueDao.getCuesForTrack(trackId)); + pTrack->setDirty(false); // Listen to dirty and changed signals - connect(track, SIGNAL(dirty(TrackInfoObject*)), + connect(pTrack.data(), SIGNAL(dirty(TrackInfoObject*)), this, SLOT(slotTrackDirty(TrackInfoObject*)), Qt::DirectConnection); - connect(track, SIGNAL(clean(TrackInfoObject*)), + connect(pTrack.data(), SIGNAL(clean(TrackInfoObject*)), this, SLOT(slotTrackClean(TrackInfoObject*)), Qt::DirectConnection); - connect(track, SIGNAL(changed(TrackInfoObject*)), + connect(pTrack.data(), SIGNAL(changed(TrackInfoObject*)), this, SLOT(slotTrackChanged(TrackInfoObject*)), Qt::DirectConnection); - connect(track, SIGNAL(save(TrackInfoObject*)), + connect(pTrack.data(), SIGNAL(save(TrackInfoObject*)), this, SLOT(slotTrackSave(TrackInfoObject*)), Qt::DirectConnection); @@ -796,6 +795,7 @@ query.bindValue(":beats", pBeatsBlob ? *pBeatsBlob : QVariant(QVariant::ByteArray)); query.bindValue(":beats_version", beatsVersion); query.bindValue(":bpm", dBpm); + delete pBeatsBlob; if (!query.exec()) { LOG_FAILED_QUERY(query); === modified file 'mixxx/src/library/itunes/itunesplaylistmodel.cpp' --- mixxx/src/library/itunes/itunesplaylistmodel.cpp 2011-10-11 22:38:39 +0000 +++ mixxx/src/library/itunes/itunesplaylistmodel.cpp 2011-10-13 22:06:49 +0000 @@ -38,22 +38,22 @@ QString location = index.sibling( index.row(), fieldIndex("location")).data().toString(); - TrackInfoObject* pTrack = new TrackInfoObject(location); + TrackPointer pTrack = TrackPointer(new TrackInfoObject(location), &QObject::deleteLater); + pTrack->setArtist(artist); pTrack->setTitle(title); pTrack->setAlbum(album); pTrack->setYear(year); pTrack->setGenre(genre); pTrack->setBpm(bpm); - TrackPointer track(pTrack, &QObject::deleteLater); // If the track has a BPM, then give it a static beatgrid. if (bpm > 0) { - BeatsPointer pBeats = BeatFactory::makeBeatGrid(track, bpm, 0); - track->setBeats(pBeats); + BeatsPointer pBeats = BeatFactory::makeBeatGrid(pTrack, bpm, 0); + pTrack->setBeats(pBeats); } - return track; + return pTrack; } void ITunesPlaylistModel::search(const QString& searchText) { @@ -126,5 +126,6 @@ } bool ITunesPlaylistModel::isColumnHiddenByDefault(int column) { - return false; + Q_UNUSED(column); + return false; } === modified file 'mixxx/src/library/itunes/itunestrackmodel.cpp' --- mixxx/src/library/itunes/itunestrackmodel.cpp 2011-10-11 22:38:39 +0000 +++ mixxx/src/library/itunes/itunestrackmodel.cpp 2011-10-13 22:07:47 +0000 @@ -36,22 +36,20 @@ QString location = index.sibling(index.row(), fieldIndex("location")).data().toString(); - TrackInfoObject* pTrack = new TrackInfoObject(location); + TrackPointer pTrack = TrackPointer(new TrackInfoObject(location), &QObject::deleteLater); pTrack->setArtist(artist); pTrack->setTitle(title); pTrack->setAlbum(album); pTrack->setYear(year); pTrack->setGenre(genre); - pTrack->setBpm(bpm); - TrackPointer track(pTrack, &QObject::deleteLater); // If the track has a BPM, then give it a static beatgrid. if (bpm > 0) { - BeatsPointer pBeats = BeatFactory::makeBeatGrid(track, bpm, 0); - track->setBeats(pBeats); + BeatsPointer pBeats = BeatFactory::makeBeatGrid(pTrack, bpm, 0); + pTrack->setBeats(pBeats); } - return track; + return pTrack; } void ITunesTrackModel::search(const QString& searchText) { === modified file 'mixxx/src/library/libraryscanner.cpp' --- mixxx/src/library/libraryscanner.cpp 2011-10-12 17:29:43 +0000 +++ mixxx/src/library/libraryscanner.cpp 2011-10-13 22:01:41 +0000 @@ -27,6 +27,7 @@ LibraryScanner::LibraryScanner(TrackCollection* collection) : m_pCollection(collection), + m_pProgress(NULL), m_libraryHashDao(m_database), m_cueDao(m_database), m_trackDao(m_database, m_cueDao), @@ -138,8 +139,12 @@ //Lower our priority to help not grind crappy computers. setPriority(QThread::LowPriority); + + if (!m_database.isValid()) { + m_database = QSqlDatabase::addDatabase("QSQLITE", "LIBRARY_SCANNER"); + } + if (!m_database.isOpen()) { - m_database = QSqlDatabase::addDatabase("QSQLITE", "LIBRARY_SCANNER"); m_database.setHostName("localhost"); m_database.setDatabaseName(MIXXX_DB_PATH); m_database.setUserName("mixxx"); @@ -296,6 +301,7 @@ { m_qLibraryPath = libraryPath; m_pProgress = new LibraryScannerDlg(); + m_pProgress->setAttribute(Qt::WA_DeleteOnClose); //The important part here is that we need to use //Qt::BlockingQueuedConnection, because we're sending these signals across === modified file 'mixxx/src/library/libraryscannerdlg.cpp' --- mixxx/src/library/libraryscannerdlg.cpp 2010-08-16 18:04:27 +0000 +++ mixxx/src/library/libraryscannerdlg.cpp 2011-10-13 22:01:41 +0000 @@ -21,21 +21,21 @@ #include #include "libraryscannerdlg.h" -LibraryScannerDlg::LibraryScannerDlg() +LibraryScannerDlg::LibraryScannerDlg(QWidget * parent, Qt::WindowFlags f) : + QWidget(parent, f) { m_bCancelled = false; - m_progress = new QWidget(); - m_layout = new QVBoxLayout(); - m_label = new QLabel(tr("It's taking Mixxx a minute to scan your music library, please wait...")); + m_layout = new QVBoxLayout(this); + m_label = new QLabel(tr("It's taking Mixxx a minute to scan your music library, please wait..."),this); m_layout->addWidget(m_label); - m_cancel = new QPushButton(tr("Cancel"), m_progress); + m_cancel = new QPushButton(tr("Cancel"), this); m_layout->addWidget(m_cancel); - m_current = new QLabel(); + m_current = new QLabel(this); m_current->setMaximumWidth(600); m_current->setWordWrap(true); m_layout->addWidget(m_current); - m_progress->setLayout(m_layout); + setLayout(m_layout); connect(m_cancel, SIGNAL(clicked()), this, SLOT(slotCancel())); @@ -44,23 +44,23 @@ LibraryScannerDlg::~LibraryScannerDlg() { - delete m_current; - delete m_cancel; - delete m_progress; - delete m_layout; - delete m_label; + //deleted by the QT Object tree + //delete m_current; + //delete m_cancel; + //delete m_progress; + //delete m_layout; + //delete m_label; } void LibraryScannerDlg::slotUpdate(QString path) { //qDebug() << "LibraryScannerDlg slotUpdate" << m_timer.elapsed(); if (!m_bCancelled && m_timer.elapsed() > 2000) { - m_progress->setVisible(true); + setVisible(true); } - if (m_progress->isVisible()) { + if (isVisible()) { m_current->setText("Scanning: " + path); - //m_current->repaint(); } } @@ -73,9 +73,7 @@ // Need to use close() or else if you close the Mixxx window and then hit // Cancel, Mixxx will not shutdown. - - //m_progress->setVisible(false); - m_progress->close(); + close(); } void LibraryScannerDlg::slotScanFinished() @@ -85,6 +83,5 @@ // Need to use close() or else if you close the Mixxx window and then hit // Cancel, Mixxx will not shutdown. - //m_progress->setVisible(false); - m_progress->close(); + close(); } === modified file 'mixxx/src/library/libraryscannerdlg.h' --- mixxx/src/library/libraryscannerdlg.h 2009-08-22 17:32:38 +0000 +++ mixxx/src/library/libraryscannerdlg.h 2011-10-13 22:01:41 +0000 @@ -24,12 +24,12 @@ #include #include -class LibraryScannerDlg : public QObject +class LibraryScannerDlg : public QWidget { Q_OBJECT public: - LibraryScannerDlg(); + LibraryScannerDlg(QWidget * parent = 0, Qt::WindowFlags f = 0); ~LibraryScannerDlg(); public slots: void slotUpdate(QString path); @@ -44,7 +44,6 @@ QTime m_timer; QVBoxLayout* m_layout; QLabel* m_label; - QWidget* m_progress; QLabel* m_current; QPushButton* m_cancel; bool m_bCancelled; === modified file 'mixxx/src/library/trackcollection.cpp' --- mixxx/src/library/trackcollection.cpp 2011-10-12 17:29:43 +0000 +++ mixxx/src/library/trackcollection.cpp 2011-10-13 22:01:41 +0000 @@ -14,7 +14,7 @@ TrackCollection::TrackCollection(ConfigObject* pConfig) : m_pConfig(pConfig), - m_db(QSqlDatabase::addDatabase("QSQLITE")), + m_db(QSqlDatabase::addDatabase("QSQLITE")), // defaultConnection m_playlistDao(m_db), m_cueDao(m_db), m_trackDao(m_db, m_cueDao, pConfig), === modified file 'mixxx/src/library/traktor/traktorplaylistmodel.cpp' --- mixxx/src/library/traktor/traktorplaylistmodel.cpp 2011-10-11 22:38:39 +0000 +++ mixxx/src/library/traktor/traktorplaylistmodel.cpp 2011-10-13 22:08:49 +0000 @@ -38,23 +38,22 @@ QString location = index.sibling( index.row(), fieldIndex("location")).data().toString(); - TrackInfoObject* pTrack = new TrackInfoObject(location); + TrackPointer pTrack = TrackPointer(new TrackInfoObject(location), &QObject::deleteLater); pTrack->setArtist(artist); pTrack->setTitle(title); pTrack->setAlbum(album); pTrack->setYear(year); pTrack->setGenre(genre); pTrack->setBpm(bpm); - TrackPointer track(pTrack, &QObject::deleteLater); // If the track has a BPM, then give it a static beatgrid. TODO(XXX) load // traktor beatgrid information. if (bpm > 0) { - BeatsPointer pBeats = BeatFactory::makeBeatGrid(track, bpm, 0); - track->setBeats(pBeats); + BeatsPointer pBeats = BeatFactory::makeBeatGrid(pTrack, bpm, 0); + pTrack->setBeats(pBeats); } - return track; + return pTrack; } void TraktorPlaylistModel::search(const QString& searchText) { === modified file 'mixxx/src/library/traktor/traktortablemodel.cpp' --- mixxx/src/library/traktor/traktortablemodel.cpp 2011-10-11 22:38:39 +0000 +++ mixxx/src/library/traktor/traktortablemodel.cpp 2011-10-13 22:09:41 +0000 @@ -37,22 +37,21 @@ QString location = index.sibling(index.row(), fieldIndex("location")).data().toString(); - TrackInfoObject* pTrack = new TrackInfoObject(location); + TrackPointer pTrack = TrackPointer(new TrackInfoObject(location), &QObject::deleteLater); pTrack->setArtist(artist); pTrack->setTitle(title); pTrack->setAlbum(album); pTrack->setYear(year); pTrack->setGenre(genre); pTrack->setBpm(bpm); - TrackPointer track(pTrack, &QObject::deleteLater); // If the track has a BPM, then give it a static beatgrid. if (bpm > 0) { - BeatsPointer pBeats = BeatFactory::makeBeatGrid(track, bpm, 0); - track->setBeats(pBeats); + BeatsPointer pBeats = BeatFactory::makeBeatGrid(pTrack, bpm, 0); + pTrack->setBeats(pBeats); } - return track; + return pTrack; } void TraktorTableModel::search(const QString& searchText) { === modified file 'mixxx/src/main.cpp' --- mixxx/src/main.cpp 2011-10-07 06:02:31 +0000 +++ mixxx/src/main.cpp 2011-10-13 22:01:41 +0000 @@ -86,6 +86,7 @@ const char* s = ba.constData(); + if(!Logfile.isOpen()) { QString logFileName = QDir::homePath().append("/").append(SETTINGS_PATH).append("/mixxx.log"); @@ -134,7 +135,6 @@ Logfile.flush(); } - int main(int argc, char * argv[]) { // Check if an instance of Mixxx is already running @@ -175,22 +175,25 @@ // Only match supported file types since command line options are also parsed elsewhere QRegExp fileRx(SoundSourceProxy::supportedFileExtensionsRegex(), Qt::CaseInsensitive); - for (int i=0; i * pConfig) : QObject() { m_pConfig = pConfig; - m_pDeviceSettings = new ConfigObject(DEVICE_CONFIG_PATH); + + //m_pDeviceSettings = new ConfigObject(DEVICE_CONFIG_PATH); m_pPMEnumerator = new PortMidiEnumerator(); #ifdef __HSS1394__ === modified file 'mixxx/src/midi/mididevicemanager.h' --- mixxx/src/midi/mididevicemanager.h 2010-02-27 00:20:54 +0000 +++ mixxx/src/midi/mididevicemanager.h 2011-10-13 22:01:41 +0000 @@ -38,7 +38,7 @@ void saveMappings(bool onlyActive=false); //void closeDevices(); int setupDevices(); - ConfigObject* getDeviceSettings() { return m_pDeviceSettings; }; + //ConfigObject* getDeviceSettings() { return m_pDeviceSettings; }; void associateInputAndOutputDevices(MidiDevice* inputDevice, QString outputDeviceName); signals: void devicesChanged(); === modified file 'mixxx/src/midi/midimapping.cpp' --- mixxx/src/midi/midimapping.cpp 2011-04-28 21:54:22 +0000 +++ mixxx/src/midi/midimapping.cpp 2011-10-13 22:01:41 +0000 @@ -72,7 +72,8 @@ } MidiMapping::~MidiMapping() { - + delete m_pMidiInputMappingTableModel; + delete m_pMidiOutputMappingTableModel; } #ifdef __MIDISCRIPT__ === modified file 'mixxx/src/midi/midiscriptengine.cpp' --- mixxx/src/midi/midiscriptengine.cpp 2011-04-28 21:54:22 +0000 +++ mixxx/src/midi/midiscriptengine.cpp 2011-10-13 22:01:41 +0000 @@ -33,9 +33,9 @@ MidiScriptEngine::MidiScriptEngine(MidiDevice* midiDevice) : - m_pEngine(NULL), m_pMidiDevice(midiDevice), m_midiDebug(false), + m_pEngine(NULL), m_midiPopups(false) { // Handle error dialog buttons @@ -51,8 +51,8 @@ // Initialize arrays used for testing and pointers for (int i=0; i < decks; i++) { - m_dx[i]=NULL; - m_pitchFilter[i]=new PitchFilter(); // allocate RAM at startup + m_dx[i] = 0; + m_pitchFilter[i] = new PitchFilter(); // allocate RAM at startup m_ramp[i] = false; } } @@ -464,7 +464,7 @@ // get the byte array into ECMAScript complete and unharmed. // Don't change this or I will hurt you -- Sean QVector temp(length); - for (int i=0; i < length; i++) { + for (unsigned int i=0; i < length; i++) { temp[i]=data[i]; } QString buffer = QString(temp.constData(),length); @@ -1226,7 +1226,7 @@ killTimer(timerId); m_scratchTimers.remove(timerId); - m_dx[deck] = NULL; + m_dx[deck] = 0; } } @@ -1273,4 +1273,4 @@ MixxxControl mc = MixxxControl(group,name); if (set) m_st.enable(mc); else m_st.disable(mc); -} \ No newline at end of file +} === modified file 'mixxx/src/mixxx.cpp' --- mixxx/src/mixxx.cpp 2011-10-10 03:24:09 +0000 +++ mixxx/src/mixxx.cpp 2011-10-13 22:01:41 +0000 @@ -138,17 +138,28 @@ locale = QLocale::system().name(); } - QTranslator* qtTranslator = new QTranslator(); - qtTranslator->load("qt_" + locale, - QLibraryInfo::location(QLibraryInfo::TranslationsPath)); - a->installTranslator(qtTranslator); + // Load Qt translations for this locale + QTranslator* qtTranslator = new QTranslator(a); + if( qtTranslator->load("qt_" + locale, + QLibraryInfo::location(QLibraryInfo::TranslationsPath))) { + a->installTranslator(qtTranslator); + } + else{ + delete qtTranslator; + } // Load Mixxx specific translations for this locale - QTranslator* mixxxTranslator = new QTranslator(); + QTranslator* mixxxTranslator = new QTranslator(a); bool mixxxLoaded = mixxxTranslator->load("mixxx_" + locale, translationsFolder); qDebug() << "Loading translations for locale" << locale - << "from translations folder" << translationsFolder << ":" << (mixxxLoaded ? "success" : "fail"); - a->installTranslator(mixxxTranslator); + << "from translations folder" << translationsFolder << ":" + << (mixxxLoaded ? "success" : "fail"); + if (mixxxLoaded) { + a->installTranslator(mixxxTranslator); + } + else { + delete mixxxTranslator; + } #ifdef __C_METRICS__ // Initialize Case Metrics if User is OK with that @@ -245,6 +256,7 @@ // TODO(XXX) leak pKbdConfig, MixxxKeyboard owns it? Maybe roll all keyboard // initialization into MixxxKeyboard + // Workaround for today: MixxxKeyboard calls delete m_pKeyboard = new MixxxKeyboard(pKbdConfig); //create RecordingManager @@ -617,15 +629,31 @@ // Check for leaked ControlObjects and give warnings. QList leakedControls; + QList leakedConfigKeys; + ControlObject::getControls(&leakedControls); if (leakedControls.size() > 0) { - qDebug() << "WARNING: The following controls were leaked:"; + qDebug() << "WARNING: The following" << leakedControls.size() << "controls were leaked:"; foreach (ControlObject* pControl, leakedControls) { ConfigKey key = pControl->getKey(); qDebug() << key.group << key.item; + leakedConfigKeys.append(key); } - } + + foreach (ConfigKey key, leakedConfigKeys) { + // delete just to satisfy valgrind: + // check if the pointer is still valid, the control object may have bin already + // deleted by its parent in this loop + ControlObject* p = ControlObject::getControl(key); + if (p) { + delete p; + } + } + } + qDebug() << "~MixxxApp: All leaking controls deleted."; + + delete m_pKeyboard; } int MixxxApp::noSoundDlg(void) @@ -884,8 +912,8 @@ connect(m_pOptionsVinylControl, SIGNAL(toggled(bool)), this, SLOT(slotCheckboxVinylControl(bool))); - ControlObjectThreadMain *enabled1 = new ControlObjectThreadMain( - ControlObject::getControl(ConfigKey("[Channel1]", "vinylcontrol_enabled"))); + ControlObjectThreadMain* enabled1 = new ControlObjectThreadMain( + ControlObject::getControl(ConfigKey("[Channel1]", "vinylcontrol_enabled")),this); connect(enabled1, SIGNAL(valueChanged(double)), this, SLOT(slotControlVinylControl(double))); @@ -897,8 +925,8 @@ connect(m_pOptionsVinylControl2, SIGNAL(toggled(bool)), this, SLOT(slotCheckboxVinylControl2(bool))); - ControlObjectThreadMain *enabled2 = new ControlObjectThreadMain( - ControlObject::getControl(ConfigKey("[Channel2]", "vinylcontrol_enabled"))); + ControlObjectThreadMain* enabled2 = new ControlObjectThreadMain( + ControlObject::getControl(ConfigKey("[Channel2]", "vinylcontrol_enabled")),this); connect(enabled2, SIGNAL(valueChanged(double)), this, SLOT(slotControlVinylControl2(double))); #endif @@ -967,13 +995,13 @@ void MixxxApp::initMenuBar() { // MENUBAR - m_pFileMenu=new QMenu(tr("&File")); - m_pOptionsMenu=new QMenu(tr("&Options")); - m_pLibraryMenu=new QMenu(tr("&Library")); - m_pViewMenu=new QMenu(tr("&View")); - m_pHelpMenu=new QMenu(tr("&Help")); + m_pFileMenu = new QMenu(tr("&File"), menuBar()); + m_pOptionsMenu = new QMenu(tr("&Options"), menuBar()); + m_pLibraryMenu = new QMenu(tr("&Library"),menuBar()); + m_pViewMenu = new QMenu(tr("&View"), menuBar()); + m_pHelpMenu = new QMenu(tr("&Help"), menuBar()); #ifdef __SCRIPT__ - macroMenu=new QMenu(tr("&Macro")); + macroMenu=new QMenu(tr("&Macro"), menuBar()); #endif connect(m_pOptionsMenu, SIGNAL(aboutToShow()), this, SLOT(slotOptionsMenuShow())); @@ -987,7 +1015,7 @@ //optionsMenu->setCheckable(true); // optionsBeatMark->addTo(optionsMenu); #ifdef __VINYLCONTROL__ - m_pVinylControlMenu = new QMenu(tr("&Vinyl Control")); + m_pVinylControlMenu = new QMenu(tr("&Vinyl Control"), menuBar()); m_pVinylControlMenu->addAction(m_pOptionsVinylControl); m_pVinylControlMenu->addAction(m_pOptionsVinylControl2); m_pOptionsMenu->addMenu(m_pVinylControlMenu); === modified file 'mixxx/src/mixxxkeyboard.cpp' --- mixxx/src/mixxxkeyboard.cpp 2011-03-30 19:35:10 +0000 +++ mixxx/src/mixxxkeyboard.cpp 2011-10-13 22:01:41 +0000 @@ -30,6 +30,8 @@ MixxxKeyboard::~MixxxKeyboard() { + // TODO(XXX) ugly workaround to get no leak + delete m_pKbdConfigObject; } bool MixxxKeyboard::eventFilter(QObject *, QEvent * e) === modified file 'mixxx/src/recording/defs_recording.h' --- mixxx/src/recording/defs_recording.h 2011-03-29 16:21:39 +0000 +++ mixxx/src/recording/defs_recording.h 2011-10-13 22:01:41 +0000 @@ -29,6 +29,6 @@ #define SIZE_700MB 750000000 //bytes #define SIZE_1GB 1000000000 //bytes #define SIZE_2GB 2000000000 //bytes -#define SIZE_4GB 4000000000 //bytes +#define SIZE_4GB 4000000000l //bytes #endif === modified file 'mixxx/src/skin/legacyskinparser.cpp' --- mixxx/src/skin/legacyskinparser.cpp 2011-05-25 18:33:11 +0000 +++ mixxx/src/skin/legacyskinparser.cpp 2011-10-13 22:01:41 +0000 @@ -440,8 +440,10 @@ widget->installEventFilter(m_pKeyboard); // Hook up the wheel Control Object to the Visual Controller + + // Connect control proxy to widget, so delete can be handled by the QT object tree ControlObjectThreadWidget * p = new ControlObjectThreadWidget( - ControlObject::getControl(ConfigKey(channelStr, "wheel"))); + ControlObject::getControl(ConfigKey(channelStr, "wheel")), widget); p->setWidget((QWidget *)widget, true, true, ControlObjectThreadWidget::EMIT_ON_PRESS, Qt::LeftButton); === modified file 'mixxx/src/sounddeviceportaudio.cpp' --- mixxx/src/sounddeviceportaudio.cpp 2011-07-19 18:12:33 +0000 +++ mixxx/src/sounddeviceportaudio.cpp 2011-10-13 22:01:41 +0000 @@ -229,6 +229,10 @@ pControlObjectLatency->slotSet(latencyMSec); pControlObjectSampleRate->slotSet(m_dSampleRate); + delete pControlObjectLatency; + delete pControlObjectSampleRate; + + //qDebug() << "SampleRate" << pControlObjectSampleRate->get(); //qDebug() << "Latency" << pControlObjectLatency->get(); === modified file 'mixxx/src/soundmanager.cpp' --- mixxx/src/soundmanager.cpp 2011-10-03 18:50:45 +0000 +++ mixxx/src/soundmanager.cpp 2011-10-13 22:01:41 +0000 @@ -48,18 +48,20 @@ , m_inputDevicesOpened(0) , m_pErrorDevice(NULL) #ifdef __PORTAUDIO__ - , m_paInitialized(false) - , m_jackSampleRate(-1) + , m_paInitialized(false) + , m_jackSampleRate(-1) #endif { //These are ControlObjectThreadMains because all the code that //uses them is called from the GUI thread (stuff like opening soundcards). - ControlObjectThreadMain* pControlObjectLatency = new ControlObjectThreadMain(ControlObject::getControl(ConfigKey("[Master]", "latency"))); - ControlObjectThreadMain* pControlObjectSampleRate = new ControlObjectThreadMain(ControlObject::getControl(ConfigKey("[Master]", "samplerate"))); - ControlObjectThreadMain* pControlObjectVinylControlMode = new ControlObjectThreadMain(new ControlObject(ConfigKey("[VinylControl]", "mode"))); - ControlObjectThreadMain* pControlObjectVinylControlMode1 = new ControlObjectThreadMain(ControlObject::getControl(ConfigKey("[Channel1]", "vinylcontrol_mode"))); - ControlObjectThreadMain* pControlObjectVinylControlMode2 = new ControlObjectThreadMain(ControlObject::getControl(ConfigKey("[Channel2]", "vinylcontrol_mode"))); - ControlObjectThreadMain* pControlObjectVinylControlGain = new ControlObjectThreadMain(new ControlObject(ConfigKey("[VinylControl]", "gain"))); + // TODO(xxx) some of these ControlObject are not needed by soundmanager, or are unused here. + // It is possible to take them out? + m_pControlObjectLatency = new ControlObjectThreadMain(ControlObject::getControl(ConfigKey("[Master]", "latency"))); + m_pControlObjectSampleRate = new ControlObjectThreadMain(ControlObject::getControl(ConfigKey("[Master]", "samplerate"))); + m_pControlObjectVinylControlMode = new ControlObjectThreadMain(new ControlObject(ConfigKey("[VinylControl]", "mode"))); + m_pControlObjectVinylControlMode1 = new ControlObjectThreadMain(ControlObject::getControl(ConfigKey("[Channel1]", "vinylcontrol_mode"))); + m_pControlObjectVinylControlMode2 = new ControlObjectThreadMain(ControlObject::getControl(ConfigKey("[Channel2]", "vinylcontrol_mode"))); + m_pControlObjectVinylControlGain = new ControlObjectThreadMain(new ControlObject(ConfigKey("[VinylControl]", "gain"))); //Hack because PortAudio samplerate enumeration is slow as hell on Linux (ALSA dmix sucks, so we can't blame PortAudio) m_samplerates.push_back(44100); @@ -77,8 +79,9 @@ // TODO(bkgood) do these really need to be here? they're set in // SoundDevicePortAudio::open - pControlObjectLatency->slotSet(m_config.getFramesPerBuffer() / m_config.getSampleRate() * 1000); - pControlObjectSampleRate->slotSet(m_config.getSampleRate()); + m_pControlObjectLatency->slotSet( + m_config.getFramesPerBuffer() / m_config.getSampleRate() * 1000); + m_pControlObjectSampleRate->slotSet(m_config.getSampleRate()); } /** Destructor for the SoundManager class. Closes all the devices, cleans up their pointers @@ -88,12 +91,21 @@ //Clean up devices. clearDeviceList(); +#ifdef __PORTAUDIO__ if (m_paInitialized) { Pa_Terminate(); m_paInitialized = false; } +#endif // vinyl control proxies and input buffers are freed in closeDevices, called // by clearDeviceList -- bkgood + + delete m_pControlObjectLatency; + delete m_pControlObjectSampleRate; + delete m_pControlObjectVinylControlMode; + delete m_pControlObjectVinylControlMode1; + delete m_pControlObjectVinylControlMode2; + delete m_pControlObjectVinylControlGain; } /** === modified file 'mixxx/src/soundmanager.h' --- mixxx/src/soundmanager.h 2011-10-03 05:57:07 +0000 +++ mixxx/src/soundmanager.h 2011-10-13 22:01:41 +0000 @@ -21,6 +21,7 @@ #include "defs.h" #include "configobject.h" #include "soundmanagerconfig.h" +#include "controlobjectthreadmain.h" class SoundDevice; class EngineMaster; @@ -94,6 +95,13 @@ #endif QHash m_registeredSources; QHash m_registeredDestinations; + + ControlObjectThreadMain* m_pControlObjectLatency; + ControlObjectThreadMain* m_pControlObjectSampleRate; + ControlObjectThreadMain* m_pControlObjectVinylControlMode; + ControlObjectThreadMain* m_pControlObjectVinylControlMode1; + ControlObjectThreadMain* m_pControlObjectVinylControlMode2; + ControlObjectThreadMain* m_pControlObjectVinylControlGain; }; #endif === modified file 'mixxx/src/track/beatgrid.cpp' --- mixxx/src/track/beatgrid.cpp 2011-04-24 20:44:27 +0000 +++ mixxx/src/track/beatgrid.cpp 2011-10-13 22:01:41 +0000 @@ -45,6 +45,7 @@ QMutexLocker locker(&m_mutex); BeatGridData blob = { m_dBpm, (m_dFirstBeat / kFrameSize) }; QByteArray* pByteArray = new QByteArray((char *)&blob, sizeof(blob)); + // Caller is responsible for delete return pByteArray; } === modified file 'mixxx/src/vinylcontrol/vinylcontrolsignalwidget.cpp' --- mixxx/src/vinylcontrol/vinylcontrolsignalwidget.cpp 2011-09-17 22:45:05 +0000 +++ mixxx/src/vinylcontrol/vinylcontrolsignalwidget.cpp 2011-10-13 22:01:41 +0000 @@ -33,7 +33,8 @@ m_pVinylControl(NULL), m_iSize(MIXXX_VINYL_SCOPE_SIZE), m_qImage(), - m_bVinylActive(FALSE) { + m_bVinylActive(FALSE), + m_imageData(NULL) { } void VinylControlSignalWidget::setSize(int size) @@ -48,6 +49,9 @@ VinylControlSignalWidget::~VinylControlSignalWidget() { + if (m_imageData) { + delete [] m_imageData; + } } /** This gets called before the VinylControlProxy objects get destroyed, in === modified file 'mixxx/src/waveform/waveformrenderbeat.cpp' --- mixxx/src/waveform/waveformrenderbeat.cpp 2011-03-29 05:30:49 +0000 +++ mixxx/src/waveform/waveformrenderbeat.cpp 2011-10-13 22:01:41 +0000 @@ -42,6 +42,8 @@ } WaveformRenderBeat::~WaveformRenderBeat() { + delete m_pTrackSamples; + delete m_pBeatActive; qDebug() << this << "~WaveformRenderBeat()"; } @@ -100,7 +102,7 @@ void WaveformRenderBeat::draw(QPainter *pPainter, QPaintEvent *event, QVector *buffer, double dPlayPos, double rateAdjust) { - int i; + //int i; slotUpdateTrackSamples(m_pTrackSamples->get()); @@ -130,7 +132,7 @@ // where s is a /mono/ sample double subpixelsPerPixel = m_pParent->getSubpixelsPerPixel()*(1.0+rateAdjust); - const int oversample = (int)subpixelsPerPixel; + //const int oversample = (int)subpixelsPerPixel; pPainter->save(); pPainter->scale(1.0/subpixelsPerPixel,1.0); @@ -138,7 +140,7 @@ double subpixelWidth = m_iWidth * subpixelsPerPixel; double subpixelHalfWidth = subpixelWidth / 2.0; - double halfw = m_iWidth/2; + //double halfw = m_iWidth/2; double halfh = m_iHeight/2; // basePos and endPos are in samples === modified file 'mixxx/src/widget/wglwaveformviewer.cpp' --- mixxx/src/widget/wglwaveformviewer.cpp 2011-05-27 23:44:42 +0000 +++ mixxx/src/widget/wglwaveformviewer.cpp 2011-10-13 22:01:41 +0000 @@ -64,6 +64,14 @@ WGLWaveformViewer::~WGLWaveformViewer() { + delete m_pScratchEnable; + delete m_pScratch; + delete m_pPlayPosition; + delete m_pTrackSamples; + delete m_pTrackSampleRate; + delete m_pRate; + delete m_pRateRange; + delete m_pRateDir; } void WGLWaveformViewer::setup(QDomNode node) { === modified file 'mixxx/src/widget/wknob.cpp' --- mixxx/src/widget/wknob.cpp 2011-05-02 19:23:02 +0000 +++ mixxx/src/widget/wknob.cpp 2011-10-13 22:01:41 +0000 @@ -25,17 +25,21 @@ #include WKnob::WKnob(QWidget * parent, float defaultValue) - : WAbstractControl(parent, defaultValue) + : WAbstractControl(parent, defaultValue), + m_iPos(0), + m_iNoPos(0), + m_pPixmaps(NULL), + m_pPixmapBack(NULL), + m_bDisabledLoaded(false) { - m_pPixmaps = 0; - m_pPixmapBack = 0; - m_bDisabledLoaded = false; - setPositions(0); } WKnob::~WKnob() { resetPositions(); + if (m_pPixmapBack) { + WPixmapStore::deletePixmap(m_pPixmapBack); + } } void WKnob::setup(QDomNode node) @@ -67,11 +71,11 @@ void WKnob::setPositions(int iNoPos, bool bIncludingDisabled) { + resetPositions(); + m_iNoPos = iNoPos; m_iPos = 0; - resetPositions(); - if (m_iNoPos>0) { int pics = m_iNoPos; @@ -88,12 +92,17 @@ { if (m_pPixmaps) { - for (int i=0; i0) + if (m_pPixmaps) { int idx = (int)(((m_fValue-64.)*(((float)m_iNoPos-1.)/127.))+((float)m_iNoPos/2.)); // Range check === modified file 'mixxx/src/widget/wnumberpos.cpp' --- mixxx/src/widget/wnumberpos.cpp 2011-04-16 22:34:35 +0000 +++ mixxx/src/widget/wnumberpos.cpp 2011-10-13 22:01:41 +0000 @@ -23,6 +23,7 @@ this, SLOT(slotSetRemain(double))); slotSetRemain(m_pShowDurationRemaining->get()); + // TODO(xxx) possible unused m_pRateControl and m_pRateDirControl? m_pRateControl = new ControlObjectThreadWidget( ControlObject::getControl(ConfigKey(group, "rate"))); m_pRateDirControl = new ControlObjectThreadWidget( @@ -54,6 +55,12 @@ } WNumberPos::~WNumberPos() { + delete m_pTrackSampleRate; + delete m_pTrackSamples; + delete m_pShowDurationRemaining; + delete m_pRateControl; + delete m_pRateDirControl; + delete m_pDuration; } void WNumberPos::mousePressEvent(QMouseEvent* pEvent) { === modified file 'mixxx/src/widget/wpushbutton.cpp' --- mixxx/src/widget/wpushbutton.cpp 2011-09-25 06:19:26 +0000 +++ mixxx/src/widget/wpushbutton.cpp 2011-10-13 22:01:41 +0000 @@ -39,6 +39,8 @@ WPixmapStore::deletePixmap(m_pPixmaps[i]); } + delete [] m_pPixmaps; + WPixmapStore::deletePixmap(m_pPixmapBack); } @@ -123,10 +125,10 @@ // control. If no button is provided, then we have to assume the // connected control should be a toggle. - bool setAsToggleButton = iNumStates == 2 && - ((!isLeftButton && !isRightButton) || - ( (isLeftButton && !m_bLeftClickForcePush) || - (isRightButton && !m_bRightClickForcePush) ) ); + //bool setAsToggleButton = iNumStates == 2 && + // ((!isLeftButton && !isRightButton) || + // ( (isLeftButton && !m_bLeftClickForcePush) || + // (isRightButton && !m_bRightClickForcePush) ) ); // if (setAsToggleButton) // p->setToggleButton(true); === modified file 'mixxx/src/widget/wstatuslight.cpp' --- mixxx/src/widget/wstatuslight.cpp 2011-05-07 21:27:41 +0000 +++ mixxx/src/widget/wstatuslight.cpp 2011-10-13 22:01:41 +0000 @@ -64,8 +64,7 @@ void WStatusLight::setup(QDomNode node) { // Number of states. Add one to account for the background - m_iNoPos = selectNodeInt(node, "NumberPos") + 1; - setNoPos(m_iNoPos); + setNoPos( selectNodeInt(node, "NumberPos") + 1); // Set background pixmap if available if (!selectNode(node, "PathBack").isNull()) { === modified file 'mixxx/src/widget/wtracktableview.cpp' --- mixxx/src/widget/wtracktableview.cpp 2011-10-07 16:51:55 +0000 +++ mixxx/src/widget/wtracktableview.cpp 2011-10-13 22:01:41 +0000 @@ -90,6 +90,9 @@ //delete m_pRenamePlaylistAct; delete m_pTrackInfo; + + delete m_pNumSamplers; + delete m_pNumDecks; } void WTrackTableView::loadTrackModel(QAbstractItemModel *model) { @@ -439,7 +442,8 @@ } void WTrackTableView::mouseMoveEvent(QMouseEvent* pEvent) { - TrackModel* trackModel = getTrackModel(); + Q_UNUSED(pEvent); + TrackModel* trackModel = getTrackModel(); if (!trackModel) return;