diff options
68 files changed, 234 insertions, 248 deletions
diff --git a/src/engine/enginedelay.cpp b/src/engine/enginedelay.cpp index 72c13b84e0..fea2383373 100644 --- a/src/engine/enginedelay.cpp +++ b/src/engine/enginedelay.cpp @@ -28,7 +28,7 @@ const int kiMaxDelay = (kdMaxDelayPot + 8) / 1000 * mixxx::audio::SampleRate::kValueMax * mixxx::kEngineChannelCount; } // anonymous namespace -EngineDelay::EngineDelay(const char* group, ConfigKey delayControl, bool bPersist) +EngineDelay::EngineDelay(const QString& group, ConfigKey delayControl, bool bPersist) : m_iDelayPos(0), m_iDelay(0) { m_pDelayBuffer = SampleUtil::alloc(kiMaxDelay); diff --git a/src/engine/enginedelay.h b/src/engine/enginedelay.h index 8fab4b867e..5f2d16f689 100644 --- a/src/engine/enginedelay.h +++ b/src/engine/enginedelay.h @@ -26,7 +26,7 @@ class ControlProxy; class EngineDelay : public EngineObject { Q_OBJECT public: - EngineDelay(const char* group, ConfigKey delayControl, bool bPersist = true); + EngineDelay(const QString& group, ConfigKey delayControl, bool bPersist = true); virtual ~EngineDelay(); void process(CSAMPLE* pInOut, const int iBufferSize); diff --git a/src/engine/enginemaster.cpp b/src/engine/enginemaster.cpp index d5e207d95a..76deaf7140 100644 --- a/src/engine/enginemaster.cpp +++ b/src/engine/enginemaster.cpp @@ -29,8 +29,9 @@ #include "util/timer.h" #include "util/trace.h" -EngineMaster::EngineMaster(UserSettingsPointer pConfig, - const char* group, +EngineMaster::EngineMaster( + UserSettingsPointer pConfig, + const QString& group, EffectsManager* pEffectsManager, ChannelHandleFactoryPointer pChannelHandleFactory, bool bEnableSidechain) diff --git a/src/engine/enginemaster.h b/src/engine/enginemaster.h index 73b4edb939..5b5a1f2405 100644 --- a/src/engine/enginemaster.h +++ b/src/engine/enginemaster.h @@ -56,7 +56,7 @@ class EngineMaster : public QObject, public AudioSource { Q_OBJECT public: EngineMaster(UserSettingsPointer pConfig, - const char* pGroup, + const QString& group, EffectsManager* pEffectsManager, ChannelHandleFactoryPointer pChannelHandleFactory, bool bEnableSidechain); diff --git a/src/engine/enginesidechaincompressor.cpp b/src/engine/enginesidechaincompressor.cpp index 0dc9a6bdac..bfc6b49739 100644 --- a/src/engine/enginesidechaincompressor.cpp +++ b/src/engine/enginesidechaincompressor.cpp @@ -2,7 +2,7 @@ #include "engine/enginesidechaincompressor.h" -EngineSideChainCompressor::EngineSideChainCompressor(const char* group) +EngineSideChainCompressor::EngineSideChainCompressor(const QString& group) : m_compressRatio(1.0), m_bAboveThreshold(false), m_threshold(1.0), diff --git a/src/engine/enginesidechaincompressor.h b/src/engine/enginesidechaincompressor.h index e7b043f267..ca124d39b4 100644 --- a/src/engine/enginesidechaincompressor.h +++ b/src/engine/enginesidechaincompressor.h @@ -5,7 +5,7 @@ class EngineSideChainCompressor { public: - EngineSideChainCompressor(const char* group); + EngineSideChainCompressor(const QString& group); virtual ~EngineSideChainCompressor() { }; void setParameters(CSAMPLE threshold, CSAMPLE strength, diff --git a/src/engine/enginetalkoverducking.cpp b/src/engine/enginetalkoverducking.cpp index 02e9830e9c..e67df8b131 100644 --- a/src/engine/enginetalkoverducking.cpp +++ b/src/engine/enginetalkoverducking.cpp @@ -4,10 +4,10 @@ #define DUCK_THRESHOLD 0.1 EngineTalkoverDucking::EngineTalkoverDucking( - UserSettingsPointer pConfig, const char* group) - : EngineSideChainCompressor(group), - m_pConfig(pConfig), - m_group(group) { + UserSettingsPointer pConfig, const QString& group) + : EngineSideChainCompressor(group), + m_pConfig(pConfig), + m_group(group) { m_pMasterSampleRate = new ControlProxy(m_group, "samplerate", this); m_pMasterSampleRate->connectValueChanged(this, &EngineTalkoverDucking::slotSampleRateChanged, Qt::DirectConnection); diff --git a/src/engine/enginetalkoverducking.h b/src/engine/enginetalkoverducking.h index ef98284404..090b683af8 100644 --- a/src/engine/enginetalkoverducking.h +++ b/src/engine/enginetalkoverducking.h @@ -15,7 +15,7 @@ class EngineTalkoverDucking : public QObject, public EngineSideChainCompressor { MANUAL, }; - EngineTalkoverDucking(UserSettingsPointer pConfig, const char* group); + EngineTalkoverDucking(UserSettingsPointer pConfig, const QString& group); virtual ~EngineTalkoverDucking(); TalkoverDuckSetting getMode() const { @@ -31,7 +31,7 @@ class EngineTalkoverDucking : public QObject, public EngineSideChainCompressor { private: UserSettingsPointer m_pConfig; - const char* m_group; + const QString m_group; ControlProxy* m_pMasterSampleRate; ControlPotmeter* m_pDuckStrength; diff --git a/src/engine/sync/basesyncablelistener.cpp b/src/engine/sync/basesyncablelistener.cpp index f3cde3f886..d0318aafd1 100644 --- a/src/engine/sync/basesyncablelistener.cpp +++ b/src/engine/sync/basesyncablelistener.cpp @@ -4,7 +4,7 @@ #include "engine/sync/internalclock.h" -static const char* kInternalClockGroup = "[InternalClock]"; +const QString kInternalClockGroup = QStringLiteral("[InternalClock]"); BaseSyncableListener::BaseSyncableListener(UserSettingsPointer pConfig) : m_pConfig(pConfig), diff --git a/src/engine/sync/internalclock.cpp b/src/engine/sync/internalclock.cpp index c2e7071424..0f598743c0 100644 --- a/src/engine/sync/internalclock.cpp +++ b/src/engine/sync/internalclock.cpp @@ -13,8 +13,8 @@ namespace { const mixxx::Logger kLogger("InternalClock"); } // namespace -InternalClock::InternalClock(const char* pGroup, SyncableListener* pEngineSync) - : m_group(pGroup), +InternalClock::InternalClock(const QString& group, SyncableListener* pEngineSync) + : m_group(group), m_pEngineSync(pEngineSync), m_mode(SYNC_NONE), m_iOldSampleRate(44100), @@ -28,8 +28,8 @@ InternalClock::InternalClock(const char* pGroup, SyncableListener* pEngineSync) // and bpm_down controls. // bpm_up / bpm_down steps by 1 // bpm_up_small / bpm_down_small steps by 0.1 - m_pClockBpm.reset(new ControlLinPotmeter(ConfigKey(m_group, "bpm"), - 1, 200, 1, 0.1, true)); + m_pClockBpm.reset( + new ControlLinPotmeter(ConfigKey(m_group, "bpm"), 1, 200, 1, 0.1, true)); connect(m_pClockBpm.data(), &ControlObject::valueChanged, this, &InternalClock::slotBpmChanged, Qt::DirectConnection); @@ -41,11 +41,10 @@ InternalClock::InternalClock(const char* pGroup, SyncableListener* pEngineSync) Qt::DirectConnection); m_pSyncMasterEnabled.reset( - new ControlPushButton(ConfigKey(pGroup, "sync_master"))); + new ControlPushButton(ConfigKey(m_group, "sync_master"))); m_pSyncMasterEnabled->setButtonMode(ControlPushButton::TOGGLE); m_pSyncMasterEnabled->connectValueChangeRequest( - this, &InternalClock::slotSyncMasterEnabledChangeRequest, - Qt::DirectConnection); + this, &InternalClock::slotSyncMasterEnabledChangeRequest, Qt::DirectConnection); } InternalClock::~InternalClock() { diff --git a/src/engine/sync/internalclock.h b/src/engine/sync/internalclock.h index 085fe7d9c5..21d819e6f4 100644 --- a/src/engine/sync/internalclock.h +++ b/src/engine/sync/internalclock.h @@ -22,7 +22,7 @@ class EngineSync; class InternalClock : public QObject, public Clock, public Syncable { Q_OBJECT public: - InternalClock(const char* pGroup, SyncableListener* pEngineSync); + InternalClock(const QString& group, SyncableListener* pEngineSync); ~InternalClock() override; const QString& getGroup() const override { diff --git a/src/skin/legacyskinparser.cpp b/src/skin/legacyskinparser.cpp index 0a3978a183..6ad00f9b40 100644 --- a/src/skin/legacyskinparser.cpp +++ b/src/skin/legacyskinparser.cpp @@ -89,8 +89,9 @@ using mixxx::skin::SkinManifest; -QList<const char*> LegacySkinParser::s_channelStrs; -QMutex LegacySkinParser::s_safeStringMutex; +/// This QSet allows to make use of the implicit sharing +/// of QString instead of every widget keeping its own copy. +QSet<QString> LegacySkinParser::s_sharedGroupStrings; static bool sDebug = false; @@ -248,14 +249,9 @@ QList<QString> LegacySkinParser::getSchemeList(const QString& qSkinPath) { } // static -void LegacySkinParser::freeChannelStrings() { - QMutexLocker lock(&s_safeStringMutex); - for (int i = 0; i < s_channelStrs.length(); ++i) { - if (s_channelStrs[i]) { - delete [] s_channelStrs[i]; - } - s_channelStrs[i] = NULL; - } +void LegacySkinParser::clearSharedGroupStrings() { + // This frees up the memory allocated by the QString objects + s_sharedGroupStrings.clear(); } SkinManifest LegacySkinParser::getSkinManifest(const QDomElement& skinDocument) { @@ -919,25 +915,22 @@ void LegacySkinParser::setupLabelWidget(const QDomElement& element, WLabel* pLab } QWidget* LegacySkinParser::parseOverview(const QDomElement& node) { - QString channelStr = lookupNodeGroup(node); - - const char* pSafeChannelStr = safeChannelString(channelStr); - - BaseTrackPlayer* pPlayer = m_pPlayerManager->getPlayer(channelStr); - - if (pPlayer == NULL) - return NULL; + QString group = lookupNodeGroup(node); + BaseTrackPlayer* pPlayer = m_pPlayerManager->getPlayer(group); + if (!pPlayer) { + return nullptr; + } - WOverview* overviewWidget = NULL; + WOverview* overviewWidget = nullptr; // "RGB" = "2", "HSV" = "1" or "Filtered" = "0" (LMH) waveform overview type int type = m_pConfig->getValue(ConfigKey("[Waveform]","WaveformOverviewType"), 2); if (type == 0) { - overviewWidget = new WOverviewLMH(pSafeChannelStr, m_pPlayerManager, m_pConfig, m_pParent); + overviewWidget = new WOverviewLMH(group, m_pPlayerManager, m_pConfig, m_pParent); } else if (type == 1) { - overviewWidget = new WOverviewHSV(pSafeChannelStr, m_pPlayerManager, m_pConfig, m_pParent); + overviewWidget = new WOverviewHSV(group, m_pPlayerManager, m_pConfig, m_pParent); } else { - overviewWidget = new WOverviewRGB(pSafeChannelStr, m_pPlayerManager, m_pConfig, m_pParent); + overviewWidget = new WOverviewRGB(group, m_pPlayerManager, m_pConfig, m_pParent); } connect(overviewWidget, SIGNAL(trackDropped(QString, QString)), @@ -965,15 +958,13 @@ QWidget* LegacySkinParser::parseOverview(const QDomElement& node) { } QWidget* LegacySkinParser::parseVisual(const QDomElement& node) { - QString channelStr = lookupNodeGroup(node); - BaseTrackPlayer* pPlayer = m_pPlayerManager->getPlayer(channelStr); - - const char* pSafeChannelStr = safeChannelString(channelStr); - - if (pPlayer == NULL) - return NULL; + QString group = lookupNodeGroup(node); + BaseTrackPlayer* pPlayer = m_pPlayerManager->getPlayer(group); + if (!pPlayer) { + return nullptr; + } - WWaveformViewer* viewer = new WWaveformViewer(pSafeChannelStr, m_pConfig, m_pParent); + WWaveformViewer* viewer = new WWaveformViewer(group, m_pConfig, m_pParent); viewer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); WaveformWidgetFactory* factory = WaveformWidgetFactory::instance(); factory->setWaveformWidget(viewer, node, *m_pContext); @@ -1004,18 +995,16 @@ QWidget* LegacySkinParser::parseVisual(const QDomElement& node) { } QWidget* LegacySkinParser::parseText(const QDomElement& node) { - QString channelStr = lookupNodeGroup(node); - const char* pSafeChannelStr = safeChannelString(channelStr); - - BaseTrackPlayer* pPlayer = m_pPlayerManager->getPlayer(channelStr); - - if (!pPlayer) - return NULL; + QString group = lookupNodeGroup(node); + BaseTrackPlayer* pPlayer = m_pPlayerManager->getPlayer(group); + if (!pPlayer) { + return nullptr; + } WTrackText* p = new WTrackText(m_pParent, m_pConfig, m_pLibrary->trackCollections(), - pSafeChannelStr); + group); setupLabelWidget(node, p); connect(pPlayer, SIGNAL(newTrackLoaded(TrackPointer)), @@ -1036,18 +1025,17 @@ QWidget* LegacySkinParser::parseText(const QDomElement& node) { } QWidget* LegacySkinParser::parseTrackProperty(const QDomElement& node) { - QString channelStr = lookupNodeGroup(node); - const char* pSafeChannelStr = safeChannelString(channelStr); - - BaseTrackPlayer* pPlayer = m_pPlayerManager->getPlayer(channelStr); - - if (!pPlayer) - return NULL; + QString group = lookupNodeGroup(node); + BaseTrackPlayer* pPlayer = m_pPlayerManager->getPlayer(group); + if (!pPlayer) { + return nullptr; + } - WTrackProperty* p = new WTrackProperty(m_pParent, + WTrackProperty* p = new WTrackProperty( + m_pParent, m_pConfig, m_pLibrary->trackCollections(), - pSafeChannelStr); + group); setupLabelWidget(node, p); connect(pPlayer, SIGNAL(newTrackLoaded(TrackPointer)), @@ -1068,15 +1056,13 @@ QWidget* LegacySkinParser::parseTrackProperty(const QDomElement& node) { } QWidget* LegacySkinParser::parseStarRating(const QDomElement& node) { - QString channelStr = lookupNodeGroup(node); - const char* pSafeChannelStr = safeChannelString(channelStr); - - BaseTrackPlayer* pPlayer = m_pPlayerManager->getPlayer(channelStr); - - if (!pPlayer) - return NULL; + QString group = lookupNodeGroup(node); + BaseTrackPlayer* pPlayer = m_pPlayerManager->getPlayer(group); + if (!pPlayer) { + return nullptr; + } - WStarRating* p = new WStarRating(pSafeChannelStr, m_pParent); + WStarRating* p = new WStarRating(group, m_pParent); commonWidgetSetup(node, p, false); p->setup(node, *m_pContext); @@ -1096,10 +1082,7 @@ QWidget* LegacySkinParser::parseStarRating(const QDomElement& node) { QWidget* LegacySkinParser::parseNumberRate(const QDomElement& node) { - QString channelStr = lookupNodeGroup(node); - - const char* pSafeChannelStr = safeChannelString(channelStr); - + QString group = lookupNodeGroup(node); QColor c(255,255,255); QString cStr; if (m_pContext->hasNodeSelectString(node, "BgColor", &cStr)) { @@ -1110,7 +1093,7 @@ QWidget* LegacySkinParser::parseNumberRate(const QDomElement& node) { //palette.setBrush(QPalette::Background, WSkinColor::getCorrectColor(c)); palette.setBrush(QPalette::Button, Qt::NoBrush); - WNumberRate* p = new WNumberRate(pSafeChannelStr, m_pParent); + WNumberRate* p = new WNumberRate(group, m_pParent); setupLabelWidget(node, p); // TODO(rryan): Let's look at removing this palette change in 1.12.0. I @@ -1121,19 +1104,15 @@ QWidget* LegacySkinParser::parseNumberRate(const QDomElement& node) { } QWidget* LegacySkinParser::parseNumberPos(const QDomElement& node) { - QString channelStr = lookupNodeGroup(node); - - const char* pSafeChannelStr = safeChannelString(channelStr); - - WNumberPos* p = new WNumberPos(pSafeChannelStr, m_pParent); + QString group = lookupNodeGroup(node); + WNumberPos* p = new WNumberPos(group, m_pParent); setupLabelWidget(node, p); return p; } QWidget* LegacySkinParser::parseEngineKey(const QDomElement& node) { - QString channelStr = lookupNodeGroup(node); - const char* pSafeChannelStr = safeChannelString(channelStr); - WKey* pEngineKey = new WKey(pSafeChannelStr, m_pParent); + QString group = lookupNodeGroup(node); + WKey* pEngineKey = new WKey(group, m_pParent); setupLabelWidget(node, pEngineKey); return pEngineKey; } @@ -1181,7 +1160,6 @@ QWidget* LegacySkinParser::parseRecordingDuration(const QDomElement& node) { } QWidget* LegacySkinParser::parseSpinny(const QDomElement& node) { - QString channelStr = lookupNodeGroup(node); if (CmdlineArgs::Instance().getSafeMode()) { WLabel* dummy = new WLabel(m_pParent); //: Shown when Mixxx is running in safe mode. @@ -1199,9 +1177,9 @@ QWidget* LegacySkinParser::parseSpinny(const QDomElement& node) { return dummy; } - BaseTrackPlayer* pPlayer = m_pPlayerManager->getPlayer(channelStr); - WSpinny* spinny = new WSpinny(m_pParent, channelStr, m_pConfig, - m_pVCManager, pPlayer); + QString group = lookupNodeGroup(node); + BaseTrackPlayer* pPlayer = m_pPlayerManager->getPlayer(group); + WSpinny* spinny = new WSpinny(m_pParent, group, m_pConfig, m_pVCManager, pPlayer); commonWidgetSetup(node, spinny); connect(waveformWidgetFactory, SIGNAL(renderSpinnies(VSyncThread*)), spinny, SLOT(render(VSyncThread*))); @@ -1563,24 +1541,14 @@ QString LegacySkinParser::lookupNodeGroup(const QDomElement& node) { } } - return group; + QString sharedGroup = getSharedGroupString(group); + return sharedGroup; } // static -const char* LegacySkinParser::safeChannelString(const QString& channelStr) { - QMutexLocker lock(&s_safeStringMutex); - foreach (const char *s, s_channelStrs) { - if (channelStr == s) { // calls QString::operator==(const char*) - return s; - } - } - QByteArray qba(channelStr.toLatin1()); - char *safe = new char[qba.size() + 1]; // +1 for \0 - int i = 0; - // Copy string - while ((safe[i] = qba[i])) ++i; - s_channelStrs.append(safe); - return safe; +QString LegacySkinParser::getSharedGroupString(const QString& channelStr) { + QSet<QString>::iterator i = s_sharedGroupStrings.insert(channelStr); + return *i; } QWidget* LegacySkinParser::parseEffectChainName(const QDomElement& node) { diff --git a/src/skin/legacyskinparser.h b/src/skin/legacyskinparser.h index 0a992855d4..6a32f0a8d4 100644 --- a/src/skin/legacyskinparser.h +++ b/src/skin/legacyskinparser.h @@ -48,7 +48,7 @@ class LegacySkinParser : public QObject, public SkinParser { static QList<QString> getSchemeList(const QString& qSkinPath); // Parse a skin manifest from the provided skin document root. static mixxx::skin::SkinManifest getSkinManifest(const QDomElement& skinDocument); - static void freeChannelStrings(); + static void clearSharedGroupStrings(); static Qt::MouseButton parseButtonState(const QDomNode& node, const SkinContext& context); @@ -129,7 +129,7 @@ class LegacySkinParser : public QObject, public SkinParser { QString getLibraryStyle(const QDomNode& node); QString lookupNodeGroup(const QDomElement& node); - static const char* safeChannelString(const QString& channelStr); + static QString getSh |