From 39bfdc071ba4f585b02d714f67d4eb9aaac4b9e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sun, 23 Oct 2016 21:08:34 +0200 Subject: [PATCH 01/34] Sort dlgprefbroadcastdlg.ui file and name GroupBoxes --- src/preferences/dialog/dlgprefbroadcastdlg.ui | 284 +++++++++--------- 1 file changed, 142 insertions(+), 142 deletions(-) diff --git a/src/preferences/dialog/dlgprefbroadcastdlg.ui b/src/preferences/dialog/dlgprefbroadcastdlg.ui index df57d901fa20..9f315f195a3a 100644 --- a/src/preferences/dialog/dlgprefbroadcastdlg.ui +++ b/src/preferences/dialog/dlgprefbroadcastdlg.ui @@ -14,27 +14,127 @@ Live Broadcasting Preferences - - - - Metadata format + + + + Enable Live Broadcasting - - false + + true - - - - - $artist - $title - - + + + + + + Server connection + + + + + + + + + 0 + 0 + + + + + + + + Type + + + + + + + Host + + + + + + + + + + + + + + Login + + + + + + + source + + + + + + + Mount + + + + + + + + + + + + + + Port + + + + + + + + 0 + 0 + + + + + + + + + + + Password + + + + + + + + + + QLineEdit::Password + + + + - + 300 @@ -232,7 +332,7 @@ p, li { white-space: pre-wrap; } - + Encoding @@ -333,31 +433,27 @@ p, li { white-space: pre-wrap; } - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Enable Live Broadcasting + + + + Metadata format - - true + + false + + + + + $artist - $title + + + + - + Custom metadata @@ -413,114 +509,18 @@ p, li { white-space: pre-wrap; } - - - - Server connection + + + + Qt::Vertical - - - - - - - - 0 - 0 - - - - - - - - Type - - - - - - - Host - - - - - - - - - - - - - - Login - - - - - - - source - - - - - - - Mount - - - - - - - - - - - - - - Port - - - - - - - - 0 - 0 - - - - - - - - - - - Password - - - - - - - - - - QLineEdit::Password - - - - - - - + + + 20 + 40 + + + From 02182b4aaffe91756d0db822fdc7f938a1cd947f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sun, 23 Oct 2016 21:38:45 +0200 Subject: [PATCH 02/34] more ui file sorting --- src/preferences/dialog/dlgprefbroadcastdlg.ui | 146 +++++++++--------- 1 file changed, 73 insertions(+), 73 deletions(-) diff --git a/src/preferences/dialog/dlgprefbroadcastdlg.ui b/src/preferences/dialog/dlgprefbroadcastdlg.ui index 9f315f195a3a..3a71da9e71f5 100644 --- a/src/preferences/dialog/dlgprefbroadcastdlg.ui +++ b/src/preferences/dialog/dlgprefbroadcastdlg.ui @@ -32,6 +32,13 @@ + + + + Type + + + @@ -42,50 +49,29 @@ - - - - Type - - - - - + + - Host + Mount - - + + - - - - Login - - - - - - - source - - - - - + + - Mount + Host - - + + @@ -111,6 +97,20 @@ + + + + Login + + + + + + + source + + + @@ -145,19 +145,6 @@ Stream settings - - - - - 0 - 0 - - - - Mixxx Icecast Testing - - - @@ -171,16 +158,26 @@ - - + + + + Use UTF-8 encoding for metadata. + + + + + - + 0 0 + + Due to flaws in some streaming clients, updating Ogg Vorbis metadata dynamically can cause listener glitches and disconnections. Check this box to update the metadata anyway. + - http://www.mixxx.org + Dynamically update Ogg Vorbis metadata. @@ -203,19 +200,16 @@ - - + + - + 0 0 - - Due to flaws in some streaming clients, updating Ogg Vorbis metadata dynamically can cause listener glitches and disconnections. Check this box to update the metadata anyway. - - Dynamically update Ogg Vorbis metadata. + Mixxx Icecast Testing @@ -238,8 +232,8 @@ - - + + 0 @@ -247,12 +241,12 @@ - Live mix + http://www.mixxx.org - - + + 0 @@ -260,20 +254,13 @@ - Genre + Description Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - stream_genre - - - - - - - Use UTF-8 encoding for metadata. + stream_desc @@ -309,8 +296,8 @@ p, li { white-space: pre-wrap; } - - + + 0 @@ -318,13 +305,26 @@ p, li { white-space: pre-wrap; } - Description + Genre Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - stream_desc + stream_genre + + + + + + + + 0 + 0 + + + + Live mix From 58d630f357b12b8b96dfa5ee126c20d1e73dae1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sun, 23 Oct 2016 21:42:12 +0200 Subject: [PATCH 03/34] Add inner layout to stream info --- src/preferences/dialog/dlgprefbroadcastdlg.ui | 370 +++++++++--------- 1 file changed, 187 insertions(+), 183 deletions(-) diff --git a/src/preferences/dialog/dlgprefbroadcastdlg.ui b/src/preferences/dialog/dlgprefbroadcastdlg.ui index 3a71da9e71f5..f3eb287dc114 100644 --- a/src/preferences/dialog/dlgprefbroadcastdlg.ui +++ b/src/preferences/dialog/dlgprefbroadcastdlg.ui @@ -142,191 +142,195 @@ - Stream settings + Stream info - - - - - 0 - 0 - - - - Public stream - - - - - - - Use UTF-8 encoding for metadata. - - - - - - - - 0 - 0 - - - - Due to flaws in some streaming clients, updating Ogg Vorbis metadata dynamically can cause listener glitches and disconnections. Check this box to update the metadata anyway. - - - Dynamically update Ogg Vorbis metadata. - - - - - - - - 0 - 0 - - - - Stream name - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - comboBoxServerType - - - - - - - - 0 - 0 - - - - Mixxx Icecast Testing - - - - - - - - 0 - 0 - - - - Website - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - mountpoint - - - - - - - - 0 - 0 - - - - http://www.mixxx.org - - - - - - - - 0 - 0 - - - - Description - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - stream_desc - - - - - - - - 0 - 0 - - - - - 0 - 50 - - - - - 16777215 - 50 - - - - true - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:10pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Lucida Grande'; font-size:13pt;"><br /></p></body></html> - - - - - - - - 0 - 0 - - - - Genre - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - stream_genre - - - - - - - - 0 - 0 - - - - Live mix - - + + + + + + + 0 + 0 + + + + Public stream + + + + + + + Use UTF-8 encoding for metadata. + + + + + + + + 0 + 0 + + + + Due to flaws in some streaming clients, updating Ogg Vorbis metadata dynamically can cause listener glitches and disconnections. Check this box to update the metadata anyway. + + + Dynamically update Ogg Vorbis metadata. + + + + + + + + 0 + 0 + + + + Stream name + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + comboBoxServerType + + + + + + + + 0 + 0 + + + + Mixxx Icecast Testing + + + + + + + + 0 + 0 + + + + Website + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + mountpoint + + + + + + + + 0 + 0 + + + + http://www.mixxx.org + + + + + + + + 0 + 0 + + + + Description + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + stream_desc + + + + + + + + 0 + 0 + + + + + 0 + 50 + + + + + 16777215 + 50 + + + + true + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> + p, li { white-space: pre-wrap; } + </style></head><body style=" font-family:'Ubuntu'; font-size:10pt; font-weight:400; font-style:normal;"> + <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Lucida Grande'; font-size:13pt;"><br /></p></body></html> + + + + + + + + 0 + 0 + + + + Genre + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + stream_genre + + + + + + + + 0 + 0 + + + + Live mix + + + + From 537b09c30a3d0640a9cc4e222293f1bb57c62626 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sun, 23 Oct 2016 22:27:33 +0200 Subject: [PATCH 04/34] Add Automatic Reconnect GroupBox to broadcast preferences --- src/preferences/dialog/dlgprefbroadcastdlg.ui | 404 ++++++++++-------- 1 file changed, 215 insertions(+), 189 deletions(-) diff --git a/src/preferences/dialog/dlgprefbroadcastdlg.ui b/src/preferences/dialog/dlgprefbroadcastdlg.ui index f3eb287dc114..4ec05bb6a2a4 100644 --- a/src/preferences/dialog/dlgprefbroadcastdlg.ui +++ b/src/preferences/dialog/dlgprefbroadcastdlg.ui @@ -14,6 +14,19 @@ Live Broadcasting Preferences + + + + Qt::Vertical + + + + 20 + 40 + + + + @@ -133,76 +146,156 @@ - - - - - 300 - 0 - + + + + Automatic reconnect + + + + + + + Maximum reties + + + + + + + + + + Retry delay [s] + + + + + + + + + + + + + - Stream info + Encoding - - - - - + + + + + - + 0 0 - Public stream + Bitrate - - + + + + + 0 + 0 + + + + + + + + + + - Use UTF-8 encoding for metadata. + Format + + + comboBoxEncodingFormat - - + + 0 0 - - Due to flaws in some streaming clients, updating Ogg Vorbis metadata dynamically can cause listener glitches and disconnections. Check this box to update the metadata anyway. + + + + + + + + + + QFrame::NoFrame + + + 1 - Dynamically update Ogg Vorbis metadata. + Channels + + + Qt::AutoText + + + false + + + comboBoxEncodingChannels - - + + - + 0 0 - - Stream name - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - comboBoxServerType + + + 80 + 16777215 + - + + + + + + + + + + 300 + 0 + + + + Stream info + + + + + @@ -215,7 +308,26 @@ - + + + + + 0 + 0 + + + + Stream name + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + comboBoxServerType + + + + @@ -234,7 +346,7 @@ - + @@ -247,7 +359,7 @@ - + @@ -266,7 +378,7 @@ - + @@ -291,14 +403,15 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> - <html><head><meta name="qrichtext" content="1" /><style type="text/css"> - p, li { white-space: pre-wrap; } - </style></head><body style=" font-family:'Ubuntu'; font-size:10pt; font-weight:400; font-style:normal;"> - <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Lucida Grande'; font-size:13pt;"><br /></p></body></html> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Lucida Grande'; font-size:13pt;"><br /></p></body></html> - + @@ -317,7 +430,7 @@ - + @@ -330,181 +443,107 @@ + + + + Public stream + + + - - + + - Encoding + Metadata - + + false + + - - - - - - 0 - 0 - - + + + - Bitrate + Format - - - - - 0 - 0 - + + + + $artist - $title - - - - - - + + - Format + Static artist - comboBoxEncodingFormat + custom_artist - - - - - 0 - 0 - + + + + %mainartist - - - - - - - - QFrame::NoFrame - - - 1 - + + - Channels - - - Qt::AutoText - - - false + Static title - comboBoxEncodingChannels + custom_title - - - - - 0 - 0 - - - - - 80 - 16777215 - + + + + %maintitle - - - - - - - - - Metadata format - - - false - - - - - - $artist - $title - - - - - - - - - - Custom metadata - - - - - - Enable custom metadata - - - true - - - - - - - + + - Artist + Use static artist and title. - - custom_artist + + true - - - - %mainartist + + + + + 0 + 0 + - - - - - - Title + + Due to flaws in some streaming clients, updating Ogg Vorbis metadata dynamically can cause listener glitches and disconnections. Check this box to update the metadata anyway. - - custom_title + + Dynamically update Ogg Vorbis metadata. - - + + - %maintitle + Use UTF-8 encoding for metadata. @@ -513,19 +552,6 @@ - - - - Qt::Vertical - - - - 20 - 40 - - - - From b7c7e28d517a3b36204b8682c64f6460d3d71e0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sun, 23 Oct 2016 22:33:42 +0200 Subject: [PATCH 05/34] Update dlg init code according to the new gui layout --- src/preferences/dialog/dlgprefbroadcast.cpp | 53 +++++++++++---------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/src/preferences/dialog/dlgprefbroadcast.cpp b/src/preferences/dialog/dlgprefbroadcast.cpp index 8a4bb5a3d4fa..d76e23de93b3 100644 --- a/src/preferences/dialog/dlgprefbroadcast.cpp +++ b/src/preferences/dialog/dlgprefbroadcast.cpp @@ -55,6 +55,12 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) password->setText(m_pConfig->getValueString( ConfigKey(BROADCAST_PREF_KEY,"password"))); + + + // Stream "public" checkbox + stream_public->setChecked((bool)m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY,"stream_public")).toInt()); + // Stream name stream_name->setText(m_pConfig->getValueString( ConfigKey(BROADCAST_PREF_KEY,"stream_name"))); @@ -83,13 +89,6 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) } stream_genre->setText(tmp_string); - // Stream "public" checkbox - stream_public->setChecked((bool)m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"stream_public")).toInt()); - - // OGG "dynamicupdate" checkbox - ogg_dynamicupdate->setChecked((bool)m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"ogg_dynamicupdate")).toInt()); // Encoding bitrate combobox QString kbps_pattern = QString("%1 kbps"); @@ -138,24 +137,6 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) } comboBoxEncodingChannels->setCurrentIndex(tmp_index); - // "Enable UTF-8 metadata" checkbox - // TODO(rryan): allow arbitrary codecs in the future? - QString charset = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "metadata_charset")); - enableUtf8Metadata->setChecked(charset == "UTF-8"); - - // "Enable custom metadata" checkbox - enableCustomMetadata->setChecked((bool)m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"enable_metadata")).toInt()); - - // Custom artist - custom_artist->setText(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"custom_artist"))); - - // Custom title - custom_title->setText(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"custom_title"))); - // Metadata format tmp_string = m_pConfig->getValueString( ConfigKey(BROADCAST_PREF_KEY,"metadata_format")); @@ -165,6 +146,28 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) } metadata_format->setText(tmp_string); + // Static artist + custom_artist->setText(m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY,"custom_artist"))); + + // Static title + custom_title->setText(m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY,"custom_title"))); + + // "Enable static artist and title" checkbox + enableCustomMetadata->setChecked((bool)m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY,"enable_metadata")).toInt()); + + // "Enable UTF-8 metadata" checkbox + // TODO(rryan): allow arbitrary codecs in the future? + QString charset = m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "metadata_charset")); + enableUtf8Metadata->setChecked(charset == "UTF-8"); + + // OGG "dynamicupdate" checkbox + ogg_dynamicupdate->setChecked((bool)m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY,"ogg_dynamicupdate")).toInt()); + slotApply(); } From d9078646baf76cbede844cfa97a511e7a42983a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sun, 23 Oct 2016 22:43:43 +0200 Subject: [PATCH 06/34] Added "maximum_retries" "retry_delay" to mixxx.cfg --- src/preferences/dialog/dlgprefbroadcast.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/preferences/dialog/dlgprefbroadcast.cpp b/src/preferences/dialog/dlgprefbroadcast.cpp index d76e23de93b3..93f7b4855271 100644 --- a/src/preferences/dialog/dlgprefbroadcast.cpp +++ b/src/preferences/dialog/dlgprefbroadcast.cpp @@ -57,6 +57,17 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) + // Maximum Retries + spinBoxMaximumReties->setValue(m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY,"maximum_retries"), "10").toInt()); + + // Retry Delay + spinBoxRetryDelay->setValue(m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY,"retry_delay")).toInt()); + + + + // Stream "public" checkbox stream_public->setChecked((bool)m_pConfig->getValueString( ConfigKey(BROADCAST_PREF_KEY,"stream_public")).toInt()); @@ -183,6 +194,8 @@ void DlgPrefBroadcast::slotResetToDefaults() { port->setText(""); login->setText(""); password->setText(""); + spinBoxMaximumReties->setValue(10); + spinBoxRetryDelay->setValue(0); stream_name->setText(""); stream_website->setText(MIXXX_WEBSITE_URL); stream_desc->setText(tr("This stream is online for testing purposes!")); @@ -250,6 +263,10 @@ void DlgPrefBroadcast::slotApply() ConfigValue(login->text())); m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "password"), ConfigValue(password->text())); + m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), + ConfigValue(spinBoxMaximumReties->value())); + m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "retry_delay"), + ConfigValue(spinBoxRetryDelay->value())); m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "stream_name"), ConfigValue(stream_name->text())); m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "stream_website"), From a044138302fc5876299daa389ed2c0aaab9c05de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sun, 23 Oct 2016 22:48:13 +0200 Subject: [PATCH 07/34] remove right alignmend in stream info section --- src/preferences/dialog/dlgprefbroadcastdlg.ui | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/preferences/dialog/dlgprefbroadcastdlg.ui b/src/preferences/dialog/dlgprefbroadcastdlg.ui index 4ec05bb6a2a4..4d5a688598de 100644 --- a/src/preferences/dialog/dlgprefbroadcastdlg.ui +++ b/src/preferences/dialog/dlgprefbroadcastdlg.ui @@ -162,7 +162,14 @@ - + + + + 0 + 0 + + + @@ -172,7 +179,14 @@ - + + + + 0 + 0 + + + @@ -319,9 +333,6 @@ Stream name - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - comboBoxServerType @@ -338,9 +349,6 @@ Website - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - mountpoint @@ -370,9 +378,6 @@ Description - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - stream_desc @@ -422,9 +427,6 @@ p, li { white-space: pre-wrap; } Genre - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - stream_genre From 9dce82b860affd29deeaba3dfc0702cdbe8c182f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 24 Oct 2016 21:11:04 +0200 Subject: [PATCH 08/34] Add extra space in the Server connection grid --- src/preferences/dialog/dlgprefbroadcastdlg.ui | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/preferences/dialog/dlgprefbroadcastdlg.ui b/src/preferences/dialog/dlgprefbroadcastdlg.ui index 4d5a688598de..cecafcc634ff 100644 --- a/src/preferences/dialog/dlgprefbroadcastdlg.ui +++ b/src/preferences/dialog/dlgprefbroadcastdlg.ui @@ -63,13 +63,23 @@ + + + + 10 + 0 + + + + + Mount - + @@ -90,14 +100,14 @@ - + Port - + @@ -124,14 +134,14 @@ - + Password - + From 74fb81e24c3abf9643ab7eb703ae4f7d9f83a902 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 24 Oct 2016 22:21:00 +0200 Subject: [PATCH 09/34] Added checkbox "use maximum retries" --- src/preferences/dialog/dlgprefbroadcast.cpp | 32 +++++++++++-------- src/preferences/dialog/dlgprefbroadcastdlg.ui | 15 ++++++--- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/preferences/dialog/dlgprefbroadcast.cpp b/src/preferences/dialog/dlgprefbroadcast.cpp index 93f7b4855271..deb7998df2cf 100644 --- a/src/preferences/dialog/dlgprefbroadcast.cpp +++ b/src/preferences/dialog/dlgprefbroadcast.cpp @@ -28,7 +28,7 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) comboBoxServerType->addItem(tr("Icecast 1"), BROADCAST_SERVER_ICECAST1); int tmp_index = comboBoxServerType->findData(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"servertype"))); + ConfigKey(BROADCAST_PREF_KEY, "servertype"))); if (tmp_index < 0) { //Set default if invalid. tmp_index = 0; } @@ -36,7 +36,7 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) // Mountpoint mountpoint->setText(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"mountpoint"))); + ConfigKey(BROADCAST_PREF_KEY, "mountpoint"))); // Host host->setText(m_pConfig->getValueString( @@ -53,28 +53,29 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) // Password password->setText(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"password"))); + ConfigKey(BROADCAST_PREF_KEY, "password"))); + // Retry Delay + spinBoxReconnectDelay->setValue(m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "reconnect_delay")).toInt()); // Maximum Retries spinBoxMaximumReties->setValue(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"maximum_retries"), "10").toInt()); - - // Retry Delay - spinBoxRetryDelay->setValue(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"retry_delay")).toInt()); - + ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), "10").toInt()); + // Use Maximum Retries + checkBoxUseMaximumRetries->setChecked(m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "use_maximum_retries"), "1").toInt()); // Stream "public" checkbox stream_public->setChecked((bool)m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"stream_public")).toInt()); + ConfigKey(BROADCAST_PREF_KEY, "stream_public")).toInt()); // Stream name stream_name->setText(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"stream_name"))); + ConfigKey(BROADCAST_PREF_KEY, "stream_name"))); // Stream website tmp_string = m_pConfig->getValueString( @@ -194,8 +195,9 @@ void DlgPrefBroadcast::slotResetToDefaults() { port->setText(""); login->setText(""); password->setText(""); + spinBoxReconnectDelay->setValue(0); spinBoxMaximumReties->setValue(10); - spinBoxRetryDelay->setValue(0); + checkBoxUseMaximumRetries->setChecked(true); stream_name->setText(""); stream_website->setText(MIXXX_WEBSITE_URL); stream_desc->setText(tr("This stream is online for testing purposes!")); @@ -263,10 +265,12 @@ void DlgPrefBroadcast::slotApply() ConfigValue(login->text())); m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "password"), ConfigValue(password->text())); + m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "reconnect_delay"), + ConfigValue(spinBoxReconnectDelay->value())); m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), ConfigValue(spinBoxMaximumReties->value())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "retry_delay"), - ConfigValue(spinBoxRetryDelay->value())); + m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "use_maximum_retries"), + ConfigValue(checkBoxUseMaximumRetries->isChecked())); m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "stream_name"), ConfigValue(stream_name->text())); m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "stream_website"), diff --git a/src/preferences/dialog/dlgprefbroadcastdlg.ui b/src/preferences/dialog/dlgprefbroadcastdlg.ui index cecafcc634ff..fd9ad85f7ae2 100644 --- a/src/preferences/dialog/dlgprefbroadcastdlg.ui +++ b/src/preferences/dialog/dlgprefbroadcastdlg.ui @@ -164,14 +164,14 @@ - + Maximum reties - + @@ -184,12 +184,12 @@ - Retry delay [s] + Reconnect delay [s] - + 0 @@ -198,6 +198,13 @@ + + + + Use maximum retires + + + From 4091992173b474bc84e76afe92e0e6d23ae38fb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Wed, 26 Oct 2016 19:43:31 +0200 Subject: [PATCH 10/34] Added waitForRetry() function --- src/engine/sidechain/enginebroadcast.cpp | 35 +++++++++++++++++++++--- src/engine/sidechain/enginebroadcast.h | 10 +++++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/engine/sidechain/enginebroadcast.cpp b/src/engine/sidechain/enginebroadcast.cpp index 3dd9ddfbef86..63bc4e3f4df0 100644 --- a/src/engine/sidechain/enginebroadcast.cpp +++ b/src/engine/sidechain/enginebroadcast.cpp @@ -48,7 +48,11 @@ EngineBroadcast::EngineBroadcast(UserSettingsPointer pConfig) m_protocol_is_shoutcast(false), m_ogg_dynamic_update(false), m_threadWaiting(false), - m_pOutputFifo(nullptr) { + m_pOutputFifo(nullptr), + m_retryCount(0), + m_reconnectDelay(0), + m_maximumRetries(10), + m_useMaximumRetries(true) { const bool persist = true; m_pBroadcastEnabled = new ControlPushButton( ConfigKey(BROADCAST_PREF_KEY,"enabled"), persist); @@ -242,6 +246,14 @@ void EngineBroadcast::updateFromPreferences() { m_metadataFormat = m_pConfig->getValueString( ConfigKey(BROADCAST_PREF_KEY, "metadata_format")); + m_reconnectDelay = m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "reconnect_delay")).toInt(); + m_maximumRetries = m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), "10").toInt(); + m_useMaximumRetries = m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "use_maximum_retries"), "1").toInt(); + + int format; int protocol; @@ -466,9 +478,9 @@ bool EngineBroadcast::processConnect() { // If we don't have any fatal errors let's try to connect if ((m_iShoutStatus == SHOUTERR_BUSY || - m_iShoutStatus == SHOUTERR_CONNECTED || - m_iShoutStatus == SHOUTERR_SUCCESS) && - m_iShoutFailures < kMaxShoutFailures) { + m_iShoutStatus == SHOUTERR_CONNECTED || + m_iShoutStatus == SHOUTERR_SUCCESS) && + m_iShoutFailures < kMaxShoutFailures) { m_iShoutFailures = 0; int timeout = 0; while (m_iShoutStatus == SHOUTERR_BUSY && @@ -907,3 +919,18 @@ void EngineBroadcast::slotEnableCO(double v) { serverConnect(); } } + +bool EngineBroadcast::waitForRetry() { + if (m_useMaximumRetries && + m_retryCount >= m_maximumRetries) { + return false; + } + ++m_retryCount; + + int delay500 = m_reconnectDelay * 2; + while (m_pBroadcastEnabled->toBool() && + --delay500 > 0) { + QThread::msleep(500); + } + return true; +} diff --git a/src/engine/sidechain/enginebroadcast.h b/src/engine/sidechain/enginebroadcast.h index f14b53f0016d..94b748f6a991 100644 --- a/src/engine/sidechain/enginebroadcast.h +++ b/src/engine/sidechain/enginebroadcast.h @@ -102,6 +102,10 @@ class EngineBroadcast bool writeSingle(const unsigned char *data, size_t len); QByteArray encodeString(const QString& string); + + bool waitForRetry(); + + QTextCodec* m_pTextCodec; TrackPointer m_pMetaData; shout_t *m_pShout; @@ -133,7 +137,13 @@ class EngineBroadcast QAtomicInt m_threadWaiting; QSemaphore m_readSema; FIFO* m_pOutputFifo; + QString m_lastErrorStr; + int m_retryCount; + + int m_reconnectDelay; + int m_maximumRetries; + bool m_useMaximumRetries; }; #endif // ENGINE_SIDECHAIN_ENGINEBROADCAST_H From 56fac7ea3503e1cef06c936a8a47c37f939c0f2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Wed, 26 Oct 2016 20:57:59 +0200 Subject: [PATCH 11/34] Added tryReconnect() with includes the new reconnect behaviour --- src/encoder/encodervorbis.cpp | 6 ++- src/engine/sidechain/enginebroadcast.cpp | 60 ++++++++++++++---------- src/engine/sidechain/enginebroadcast.h | 2 + 3 files changed, 42 insertions(+), 26 deletions(-) diff --git a/src/encoder/encodervorbis.cpp b/src/encoder/encodervorbis.cpp index 4a557fb4b6ef..ce929f239e6a 100644 --- a/src/encoder/encodervorbis.cpp +++ b/src/encoder/encodervorbis.cpp @@ -122,7 +122,11 @@ void EncoderVorbis::writePage() { result = ogg_stream_flush(&m_oggs, &m_oggpage); if (result == 0) break; - m_pCallback->write(m_oggpage.header, m_oggpage.body, m_oggpage.header_len, m_oggpage.body_len); + m_pCallback->write( + m_oggpage.header, + m_oggpage.body, + m_oggpage.header_len, + m_oggpage.body_len); } m_header_write = false; } diff --git a/src/engine/sidechain/enginebroadcast.cpp b/src/engine/sidechain/enginebroadcast.cpp index 63bc4e3f4df0..16a7db1579e6 100644 --- a/src/engine/sidechain/enginebroadcast.cpp +++ b/src/engine/sidechain/enginebroadcast.cpp @@ -71,16 +71,19 @@ EngineBroadcast::EngineBroadcast(UserSettingsPointer pConfig) shout_init(); if (!(m_pShout = shout_new())) { - errorDialog(tr("Mixxx encountered a problem"), tr("Could not allocate shout_t")); + errorDialog(tr("Mixxx encountered a problem"), + tr("Could not allocate shout_t")); } if (!(m_pShoutMetaData = shout_metadata_new())) { - errorDialog(tr("Mixxx encountered a problem"), tr("Could not allocate shout_metadata_t")); + errorDialog(tr("Mixxx encountered a problem"), + tr("Could not allocate shout_metadata_t")); } setFunctionCode(14); if (shout_set_nonblocking(m_pShout, 1) != SHOUTERR_SUCCESS) { - errorDialog(tr("Error setting non-blocking mode:"), shout_get_error(m_pShout)); + errorDialog(tr("Error setting non-blocking mode:"), + shout_get_error(m_pShout)); } } @@ -269,7 +272,8 @@ void EngineBroadcast::updateFromPreferences() { return; } - if (shout_set_port(m_pShout, static_cast(serverUrl.port(BROADCAST_DEFAULT_PORT))) + if (shout_set_port(m_pShout, + static_cast(serverUrl.port(BROADCAST_DEFAULT_PORT))) != SHOUTERR_SUCCESS) { errorDialog(tr("Error setting port!"), shout_get_error(m_pShout)); return; @@ -281,12 +285,14 @@ void EngineBroadcast::updateFromPreferences() { return; } - if (shout_set_mount(m_pShout, serverUrl.path().toLatin1().constData()) != SHOUTERR_SUCCESS) { + if (shout_set_mount(m_pShout, serverUrl.path().toLatin1().constData()) + != SHOUTERR_SUCCESS) { errorDialog(tr("Error setting mount!"), shout_get_error(m_pShout)); return; } - if (shout_set_user(m_pShout, serverUrl.userName().toLatin1().constData()) != SHOUTERR_SUCCESS) { + if (shout_set_user(m_pShout, serverUrl.userName().toLatin1().constData()) + != SHOUTERR_SUCCESS) { errorDialog(tr("Error setting username!"), shout_get_error(m_pShout)); return; } @@ -590,13 +596,7 @@ void EngineBroadcast::write(unsigned char *header, unsigned char *body, qDebug() << "shout_queuelen" << queuelen; NetworkStreamWorker::debugState(); if (queuelen > kMaxNetworkCache) { - m_pStatusCO->setAndConfirm(STATUSCO_FAILURE); - processDisconnect(); - if (!processConnect()) { - errorDialog(tr("Lost connection to streaming server and the attempt to reconnect failed"), - m_lastErrorStr + "\n" + - tr("Please check your connection to the Internet")); - } + tryReconnect(); } } } @@ -611,16 +611,8 @@ bool EngineBroadcast::writeSingle(const unsigned char* data, size_t len) { qDebug() << "EngineBroadcast::write() header error:" << ret << shout_get_error(m_pShout); NetworkStreamWorker::debugState(); - if (m_iShoutFailures > kMaxShoutFailures) { - m_pStatusCO->setAndConfirm(STATUSCO_FAILURE); - processDisconnect(); - if (!processConnect()) { - errorDialog(tr("Lost connection to streaming server and the attempt to reconnect failed"), - m_lastErrorStr + "\n" + - tr("Please check your connection to the Internet")); - } - } else{ - m_iShoutFailures++; + if (++m_iShoutFailures > kMaxShoutFailures) { + tryReconnect(); } return false; } else { @@ -928,9 +920,27 @@ bool EngineBroadcast::waitForRetry() { ++m_retryCount; int delay500 = m_reconnectDelay * 2; - while (m_pBroadcastEnabled->toBool() && - --delay500 > 0) { + while (--delay500 > 0) { + if (!m_pBroadcastEnabled->toBool()) { + return false; + } QThread::msleep(500); } return true; } + +void EngineBroadcast::tryReconnect() { + m_pStatusCO->setAndConfirm(STATUSCO_FAILURE); + processDisconnect(); + while (waitForRetry()) { + if (processConnect()) { + break; + } + } + + if (m_pStatusCO->get() == STATUSCO_FAILURE) { + errorDialog(tr("Lost connection to streaming server and the attempt to reconnect failed"), + m_lastErrorStr + "\n" + + tr("Please check your connection to the Internet")); + } +} diff --git a/src/engine/sidechain/enginebroadcast.h b/src/engine/sidechain/enginebroadcast.h index 94b748f6a991..f1c4bc11e8ae 100644 --- a/src/engine/sidechain/enginebroadcast.h +++ b/src/engine/sidechain/enginebroadcast.h @@ -105,6 +105,8 @@ class EngineBroadcast bool waitForRetry(); + void tryReconnect(); + QTextCodec* m_pTextCodec; TrackPointer m_pMetaData; From 42194b234d5cc10d6f7bec62f86a17f15176c453 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Wed, 26 Oct 2016 22:44:32 +0200 Subject: [PATCH 12/34] Improve state changes and pop-up messages --- src/engine/sidechain/enginebroadcast.cpp | 39 ++++++++++++++++-------- src/engine/sidechain/enginebroadcast.h | 2 +- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/engine/sidechain/enginebroadcast.cpp b/src/engine/sidechain/enginebroadcast.cpp index 16a7db1579e6..bde98ee38cd5 100644 --- a/src/engine/sidechain/enginebroadcast.cpp +++ b/src/engine/sidechain/enginebroadcast.cpp @@ -427,7 +427,6 @@ bool EngineBroadcast::processConnect() { if (!m_encoder) { // updateFromPreferences failed m_pStatusCO->setAndConfirm(STATUSCO_FAILURE); - m_pBroadcastEnabled->set(0); qDebug() << "EngineBroadcast::processConnect() returning false"; return false; } @@ -514,8 +513,7 @@ bool EngineBroadcast::processConnect() { setState(NETWORKSTREAMWORKER_STATE_READY); qDebug() << "***********Connected to streaming server..."; - // Signal user also that we are connected - infoDialog(tr("Mixxx has successfully connected to the streaming server"), ""); + m_retryCount = 0; if (m_pOutputFifo->readAvailable()) { m_pOutputFifo->flushReadData(m_pOutputFifo->readAvailable()); @@ -546,7 +544,6 @@ bool EngineBroadcast::processConnect() { } if (m_pBroadcastEnabled->toBool()) { m_pStatusCO->setAndConfirm(STATUSCO_FAILURE); - m_pBroadcastEnabled->set(0); } else { m_pStatusCO->setAndConfirm(STATUSCO_UNCONNECTED); } @@ -554,15 +551,16 @@ bool EngineBroadcast::processConnect() { return false; } -void EngineBroadcast::processDisconnect() { +bool EngineBroadcast::processDisconnect() { qDebug() << "EngineBroadcast::processDisconnect()"; + bool disconnected = false; if (isConnected()) { m_threadWaiting = false; - // We are conneced but broadcast is disabled. Disconnect. + // We are connected but broadcast is disabled. Disconnect. shout_close(m_pShout); - infoDialog(tr("Mixxx has successfully disconnected from the streaming server"), ""); m_iShoutStatus = SHOUTERR_UNCONNECTED; emit(broadcastDisconnected()); + disconnected = true; } if (m_encoder) { @@ -570,6 +568,7 @@ void EngineBroadcast::processDisconnect() { delete m_encoder; m_encoder = nullptr; } + return disconnected; } void EngineBroadcast::write(unsigned char *header, unsigned char *body, @@ -596,6 +595,7 @@ void EngineBroadcast::write(unsigned char *header, unsigned char *body, qDebug() << "shout_queuelen" << queuelen; NetworkStreamWorker::debugState(); if (queuelen > kMaxNetworkCache) { + m_lastErrorStr = tr("Network cache overflow"); tryReconnect(); } } @@ -607,9 +607,10 @@ bool EngineBroadcast::writeSingle(const unsigned char* data, size_t len) { setFunctionCode(8); int ret = shout_send_raw(m_pShout, data, len); if (ret < SHOUTERR_SUCCESS && ret != SHOUTERR_BUSY) { - // in case of bussy, frames are queued and queue is checked below - qDebug() << "EngineBroadcast::write() header error:" - << ret << shout_get_error(m_pShout); + // in case of busy, frames are queued and queue is checked later + m_lastErrorStr = shout_get_error(m_pShout); + qDebug() << "EngineBroadcast::writeSingle() error:" + << ret << m_lastErrorStr; NetworkStreamWorker::debugState(); if (++m_iShoutFailures > kMaxShoutFailures) { tryReconnect(); @@ -833,12 +834,16 @@ void EngineBroadcast::run() { setState(NETWORKSTREAMWORKER_STATE_BUSY); if (!processConnect()) { + m_pBroadcastEnabled->set(0); errorDialog(tr("Can't connect to streaming server"), m_lastErrorStr + "\n" + tr("Please check your connection to the Internet and verify that your username and password are correct.")); return; } + // Signal user also that we are connected + infoDialog(tr("Mixxx has successfully connected to the streaming server"), ""); + while(true) { setFunctionCode(1); incRunCount(); @@ -847,8 +852,10 @@ void EngineBroadcast::run() { // broadcast if necessary. if (!m_pBroadcastEnabled->toBool()) { m_threadWaiting = false; - m_pStatusCO->setAndConfirm(STATUSCO_UNCONNECTED); - processDisconnect(); + if (processDisconnect()) { + m_pStatusCO->setAndConfirm(STATUSCO_UNCONNECTED); + infoDialog(tr("Mixxx has successfully disconnected from the streaming server"), ""); + } setFunctionCode(2); return; } @@ -919,18 +926,23 @@ bool EngineBroadcast::waitForRetry() { } ++m_retryCount; + qDebug() << "waitForRetry()" << m_retryCount << "/" << m_maximumRetries; + int delay500 = m_reconnectDelay * 2; while (--delay500 > 0) { if (!m_pBroadcastEnabled->toBool()) { return false; } + qDebug() << "sleep"; QThread::msleep(500); } return true; } void EngineBroadcast::tryReconnect() { + QString originalErrorStr = m_lastErrorStr; m_pStatusCO->setAndConfirm(STATUSCO_FAILURE); + processDisconnect(); while (waitForRetry()) { if (processConnect()) { @@ -939,7 +951,10 @@ void EngineBroadcast::tryReconnect() { } if (m_pStatusCO->get() == STATUSCO_FAILURE) { + m_pBroadcastEnabled->set(0); + m_readSema.release(); errorDialog(tr("Lost connection to streaming server and the attempt to reconnect failed"), + originalErrorStr + "\n" + m_lastErrorStr + "\n" + tr("Please check your connection to the Internet")); } diff --git a/src/engine/sidechain/enginebroadcast.h b/src/engine/sidechain/enginebroadcast.h index f1c4bc11e8ae..a2f3c31c091a 100644 --- a/src/engine/sidechain/enginebroadcast.h +++ b/src/engine/sidechain/enginebroadcast.h @@ -75,7 +75,7 @@ class EngineBroadcast private: bool processConnect(); - void processDisconnect(); + bool processDisconnect(); // Update the libshout struct with info from Mixxx's broadcast preferences. void updateFromPreferences(); From 28a904cca01401472d32b556cda801b5177562c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 27 Oct 2016 22:11:38 +0200 Subject: [PATCH 13/34] fix typos and rename "Limit number of reconnection attempts" --- src/engine/sidechain/enginebroadcast.cpp | 8 +-- src/engine/sidechain/enginebroadcast.h | 2 +- src/preferences/dialog/dlgprefbroadcast.cpp | 16 +++--- src/preferences/dialog/dlgprefbroadcastdlg.ui | 49 +++++++++++++++++-- 4 files changed, 57 insertions(+), 18 deletions(-) diff --git a/src/engine/sidechain/enginebroadcast.cpp b/src/engine/sidechain/enginebroadcast.cpp index bde98ee38cd5..1eed603ba63a 100644 --- a/src/engine/sidechain/enginebroadcast.cpp +++ b/src/engine/sidechain/enginebroadcast.cpp @@ -52,7 +52,7 @@ EngineBroadcast::EngineBroadcast(UserSettingsPointer pConfig) m_retryCount(0), m_reconnectDelay(0), m_maximumRetries(10), - m_useMaximumRetries(true) { + m_limitRreconnects(true) { const bool persist = true; m_pBroadcastEnabled = new ControlPushButton( ConfigKey(BROADCAST_PREF_KEY,"enabled"), persist); @@ -253,8 +253,8 @@ void EngineBroadcast::updateFromPreferences() { ConfigKey(BROADCAST_PREF_KEY, "reconnect_delay")).toInt(); m_maximumRetries = m_pConfig->getValueString( ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), "10").toInt(); - m_useMaximumRetries = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "use_maximum_retries"), "1").toInt(); + m_limitRreconnects = m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "limit_reconnects"), "1").toInt(); int format; @@ -920,7 +920,7 @@ void EngineBroadcast::slotEnableCO(double v) { } bool EngineBroadcast::waitForRetry() { - if (m_useMaximumRetries && + if (m_limitRreconnects && m_retryCount >= m_maximumRetries) { return false; } diff --git a/src/engine/sidechain/enginebroadcast.h b/src/engine/sidechain/enginebroadcast.h index a2f3c31c091a..efe066863bff 100644 --- a/src/engine/sidechain/enginebroadcast.h +++ b/src/engine/sidechain/enginebroadcast.h @@ -145,7 +145,7 @@ class EngineBroadcast int m_reconnectDelay; int m_maximumRetries; - bool m_useMaximumRetries; + bool m_limitRreconnects; }; #endif // ENGINE_SIDECHAIN_ENGINEBROADCAST_H diff --git a/src/preferences/dialog/dlgprefbroadcast.cpp b/src/preferences/dialog/dlgprefbroadcast.cpp index deb7998df2cf..cdcc1bc0a811 100644 --- a/src/preferences/dialog/dlgprefbroadcast.cpp +++ b/src/preferences/dialog/dlgprefbroadcast.cpp @@ -61,12 +61,12 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) ConfigKey(BROADCAST_PREF_KEY, "reconnect_delay")).toInt()); // Maximum Retries - spinBoxMaximumReties->setValue(m_pConfig->getValueString( + spinBoxMaximumRetries->setValue(m_pConfig->getValueString( ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), "10").toInt()); // Use Maximum Retries - checkBoxUseMaximumRetries->setChecked(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "use_maximum_retries"), "1").toInt()); + checkBoxLimitReconnects->setChecked(m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "limit_reconnects"), "1").toInt()); // Stream "public" checkbox @@ -196,8 +196,8 @@ void DlgPrefBroadcast::slotResetToDefaults() { login->setText(""); password->setText(""); spinBoxReconnectDelay->setValue(0); - spinBoxMaximumReties->setValue(10); - checkBoxUseMaximumRetries->setChecked(true); + spinBoxMaximumRetries->setValue(10); + checkBoxLimitReconnects->setChecked(true); stream_name->setText(""); stream_website->setText(MIXXX_WEBSITE_URL); stream_desc->setText(tr("This stream is online for testing purposes!")); @@ -268,9 +268,9 @@ void DlgPrefBroadcast::slotApply() m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "reconnect_delay"), ConfigValue(spinBoxReconnectDelay->value())); m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), - ConfigValue(spinBoxMaximumReties->value())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "use_maximum_retries"), - ConfigValue(checkBoxUseMaximumRetries->isChecked())); + ConfigValue(spinBoxMaximumRetries->value())); + m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "limit_reconnects"), + ConfigValue(checkBoxLimitReconnects->isChecked())); m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "stream_name"), ConfigValue(stream_name->text())); m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "stream_website"), diff --git a/src/preferences/dialog/dlgprefbroadcastdlg.ui b/src/preferences/dialog/dlgprefbroadcastdlg.ui index fd9ad85f7ae2..d07f7afb9ff4 100644 --- a/src/preferences/dialog/dlgprefbroadcastdlg.ui +++ b/src/preferences/dialog/dlgprefbroadcastdlg.ui @@ -167,12 +167,12 @@ - Maximum reties + Maximum retries - + 0 @@ -199,9 +199,9 @@ - + - Use maximum retires + Limit number of reconnection attempts @@ -241,6 +241,19 @@ + + + + Qt::Vertical + + + + 20 + 40 + + + + @@ -265,6 +278,19 @@ + + + + Qt::Vertical + + + + 20 + 40 + + + + @@ -307,6 +333,19 @@ + + + + Qt::Vertical + + + + 20 + 40 + + + + @@ -488,7 +527,7 @@ p, li { white-space: pre-wrap; } - Format + Format From 5385f806b6818078d45a1674f0ff7dca99349db4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 27 Oct 2016 22:55:05 +0200 Subject: [PATCH 14/34] Disable static artist / title and maximum retries according to the enable checkboxes --- src/preferences/dialog/dlgprefbroadcast.cpp | 30 ++++++++++++++++++--- src/preferences/dialog/dlgprefbroadcast.h | 2 ++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/preferences/dialog/dlgprefbroadcast.cpp b/src/preferences/dialog/dlgprefbroadcast.cpp index cdcc1bc0a811..e4cf216d3cd8 100644 --- a/src/preferences/dialog/dlgprefbroadcast.cpp +++ b/src/preferences/dialog/dlgprefbroadcast.cpp @@ -65,8 +65,13 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), "10").toInt()); // Use Maximum Retries - checkBoxLimitReconnects->setChecked(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "limit_reconnects"), "1").toInt()); + bool limitConnects = m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "limit_reconnects"), "1").toInt(); + checkBoxLimitReconnects->setChecked( + limitConnects); + spinBoxMaximumRetries->setEnabled(limitConnects); + connect(checkBoxLimitReconnects, SIGNAL(stateChanged(int)), + this, SLOT(checkBoxLimitReconnectsChanged(int))); // Stream "public" checkbox @@ -167,8 +172,13 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) ConfigKey(BROADCAST_PREF_KEY,"custom_title"))); // "Enable static artist and title" checkbox - enableCustomMetadata->setChecked((bool)m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"enable_metadata")).toInt()); + bool enableMetadata = m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY,"enable_metadata")).toInt(); + enableCustomMetadata->setChecked(enableMetadata); + custom_artist->setEnabled(enableMetadata); + custom_title->setEnabled(enableMetadata); + connect(enableCustomMetadata, SIGNAL(stateChanged(int)), + this, SLOT(enableCustomMetadataChanged(int))); // "Enable UTF-8 metadata" checkbox // TODO(rryan): allow arbitrary codecs in the future? @@ -197,6 +207,7 @@ void DlgPrefBroadcast::slotResetToDefaults() { password->setText(""); spinBoxReconnectDelay->setValue(0); spinBoxMaximumRetries->setValue(10); + spinBoxMaximumRetries->setEnabled(true); checkBoxLimitReconnects->setChecked(true); stream_name->setText(""); stream_website->setText(MIXXX_WEBSITE_URL); @@ -214,6 +225,8 @@ void DlgPrefBroadcast::slotResetToDefaults() { metadata_format->setText(kDefaultMetadataFormat); custom_artist->setText(""); custom_title->setText(""); + custom_artist->setEnabled(false); + custom_title->setEnabled(false); } void DlgPrefBroadcast::slotUpdate() { @@ -312,3 +325,12 @@ void DlgPrefBroadcast::broadcastEnabledChanged(double value) { enableLiveBroadcasting->setChecked(enabled); } + +void DlgPrefBroadcast::checkBoxLimitReconnectsChanged(int value) { + spinBoxMaximumRetries->setEnabled(value); +} + +void DlgPrefBroadcast::enableCustomMetadataChanged(int value) { + custom_artist->setEnabled(value); + custom_title->setEnabled(value); +} diff --git a/src/preferences/dialog/dlgprefbroadcast.h b/src/preferences/dialog/dlgprefbroadcast.h index e44ee2ceb830..d9ed25fd02e0 100644 --- a/src/preferences/dialog/dlgprefbroadcast.h +++ b/src/preferences/dialog/dlgprefbroadcast.h @@ -23,6 +23,8 @@ class DlgPrefBroadcast : public DlgPreferencePage, public Ui::DlgPrefBroadcastDl void slotUpdate(); void slotResetToDefaults(); void broadcastEnabledChanged(double value); + void checkBoxLimitReconnectsChanged(int value); + void enableCustomMetadataChanged(int value); signals: void apply(const QString &); From 79058bd34b55e7dc0c40e3065829148c5af125c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 3 Nov 2016 23:05:21 +0100 Subject: [PATCH 15/34] Added "No delay for the first reconnect attempt" --- src/engine/sidechain/enginebroadcast.cpp | 20 ++++++--- src/engine/sidechain/enginebroadcast.h | 3 +- src/preferences/dialog/dlgprefbroadcast.cpp | 23 ++++++---- src/preferences/dialog/dlgprefbroadcastdlg.ui | 45 +++++++++++-------- 4 files changed, 56 insertions(+), 35 deletions(-) diff --git a/src/engine/sidechain/enginebroadcast.cpp b/src/engine/sidechain/enginebroadcast.cpp index 1eed603ba63a..057698a87233 100644 --- a/src/engine/sidechain/enginebroadcast.cpp +++ b/src/engine/sidechain/enginebroadcast.cpp @@ -50,9 +50,10 @@ EngineBroadcast::EngineBroadcast(UserSettingsPointer pConfig) m_threadWaiting(false), m_pOutputFifo(nullptr), m_retryCount(0), - m_reconnectDelay(0), - m_maximumRetries(10), - m_limitRreconnects(true) { + m_reconnectDelay(15), + m_noDelayFirstReconnect(true), + m_limitRreconnects(true), + m_maximumRetries(10) { const bool persist = true; m_pBroadcastEnabled = new ControlPushButton( ConfigKey(BROADCAST_PREF_KEY,"enabled"), persist); @@ -250,12 +251,13 @@ void EngineBroadcast::updateFromPreferences() { ConfigKey(BROADCAST_PREF_KEY, "metadata_format")); m_reconnectDelay = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "reconnect_delay")).toInt(); - m_maximumRetries = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), "10").toInt(); + ConfigKey(BROADCAST_PREF_KEY, "reconnect_delay"), "15").toInt(); + m_noDelayFirstReconnect = m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "no_delay_first_reconnect"), "1").toInt(); m_limitRreconnects = m_pConfig->getValueString( ConfigKey(BROADCAST_PREF_KEY, "limit_reconnects"), "1").toInt(); - + m_maximumRetries = m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), "10").toInt(); int format; int protocol; @@ -944,6 +946,10 @@ void EngineBroadcast::tryReconnect() { m_pStatusCO->setAndConfirm(STATUSCO_FAILURE); processDisconnect(); + if (m_noDelayFirstReconnect) { + ++m_retryCount; + processConnect(); + } while (waitForRetry()) { if (processConnect()) { break; diff --git a/src/engine/sidechain/enginebroadcast.h b/src/engine/sidechain/enginebroadcast.h index efe066863bff..2e947c404c23 100644 --- a/src/engine/sidechain/enginebroadcast.h +++ b/src/engine/sidechain/enginebroadcast.h @@ -144,8 +144,9 @@ class EngineBroadcast int m_retryCount; int m_reconnectDelay; - int m_maximumRetries; + bool m_noDelayFirstReconnect; bool m_limitRreconnects; + int m_maximumRetries; }; #endif // ENGINE_SIDECHAIN_ENGINEBROADCAST_H diff --git a/src/preferences/dialog/dlgprefbroadcast.cpp b/src/preferences/dialog/dlgprefbroadcast.cpp index e4cf216d3cd8..0889da5d116d 100644 --- a/src/preferences/dialog/dlgprefbroadcast.cpp +++ b/src/preferences/dialog/dlgprefbroadcast.cpp @@ -58,11 +58,11 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) // Retry Delay spinBoxReconnectDelay->setValue(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "reconnect_delay")).toInt()); + ConfigKey(BROADCAST_PREF_KEY, "reconnect_delay"), "15").toInt()); - // Maximum Retries - spinBoxMaximumRetries->setValue(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), "10").toInt()); + // No delay for the first reconnect attempt + checkBoxNoDelayFirstReconnect->setChecked(m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "no_delay_first_reconnect"), "1").toInt()); // Use Maximum Retries bool limitConnects = m_pConfig->getValueString( @@ -73,6 +73,10 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) connect(checkBoxLimitReconnects, SIGNAL(stateChanged(int)), this, SLOT(checkBoxLimitReconnectsChanged(int))); + // Maximum Retries + spinBoxMaximumRetries->setValue(m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), "10").toInt()); + // Stream "public" checkbox stream_public->setChecked((bool)m_pConfig->getValueString( @@ -205,10 +209,11 @@ void DlgPrefBroadcast::slotResetToDefaults() { port->setText(""); login->setText(""); password->setText(""); - spinBoxReconnectDelay->setValue(0); + spinBoxReconnectDelay->setValue(15); + checkBoxNoDelayFirstReconnect->setChecked(true); + checkBoxLimitReconnects->setChecked(true); spinBoxMaximumRetries->setValue(10); spinBoxMaximumRetries->setEnabled(true); - checkBoxLimitReconnects->setChecked(true); stream_name->setText(""); stream_website->setText(MIXXX_WEBSITE_URL); stream_desc->setText(tr("This stream is online for testing purposes!")); @@ -280,10 +285,12 @@ void DlgPrefBroadcast::slotApply() ConfigValue(password->text())); m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "reconnect_delay"), ConfigValue(spinBoxReconnectDelay->value())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), - ConfigValue(spinBoxMaximumRetries->value())); + m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "no_delay_first_reconnect"), + ConfigValue(checkBoxNoDelayFirstReconnect->isChecked())); m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "limit_reconnects"), ConfigValue(checkBoxLimitReconnects->isChecked())); + m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), + ConfigValue(spinBoxMaximumRetries->value())); m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "stream_name"), ConfigValue(stream_name->text())); m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "stream_website"), diff --git a/src/preferences/dialog/dlgprefbroadcastdlg.ui b/src/preferences/dialog/dlgprefbroadcastdlg.ui index d07f7afb9ff4..054a186a0015 100644 --- a/src/preferences/dialog/dlgprefbroadcastdlg.ui +++ b/src/preferences/dialog/dlgprefbroadcastdlg.ui @@ -7,7 +7,7 @@ 0 0 692 - 549 + 552 @@ -164,14 +164,14 @@ - + Maximum retries - + @@ -198,6 +198,13 @@ + + + + No delay for the first reconnect attempt + + + @@ -538,7 +545,7 @@ p, li { white-space: pre-wrap; } - + Static artist @@ -548,14 +555,14 @@ p, li { white-space: pre-wrap; } - + %mainartist - + Static title @@ -565,24 +572,14 @@ p, li { white-space: pre-wrap; } - + %maintitle - - - - Use static artist and title. - - - true - - - - + @@ -598,13 +595,23 @@ p, li { white-space: pre-wrap; } - + Use UTF-8 encoding for metadata. + + + + Use static artist and title. + + + true + + + From 84d6aaca1165f77ef0279398e174d4c044cd22ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sat, 5 Nov 2016 19:01:53 +0100 Subject: [PATCH 16/34] replaced bussy sleep with a QWaitCondition --- src/engine/sidechain/enginebroadcast.cpp | 17 +++++++++++------ src/engine/sidechain/enginebroadcast.h | 5 +++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/engine/sidechain/enginebroadcast.cpp b/src/engine/sidechain/enginebroadcast.cpp index 057698a87233..a04b05bb51a9 100644 --- a/src/engine/sidechain/enginebroadcast.cpp +++ b/src/engine/sidechain/enginebroadcast.cpp @@ -22,7 +22,6 @@ #include "mixer/playerinfo.h" #include "preferences/usersettings.h" #include "track/track.h" -#include "util/sleep.h" static const int kConnectRetries = 30; static const int kMaxNetworkCache = 491520; // 10 s mp3 @ 192 kbit/s @@ -506,7 +505,9 @@ bool EngineBroadcast::processConnect() { // If socket is busy then we wait half second if (m_iShoutStatus == SHOUTERR_BUSY) { - QThread::msleep(500); + m_enabledMutex.lock(); + m_waitEnabled.wait(&m_enabledMutex, 500); + m_enabledMutex.unlock(); } ++ timeout; @@ -915,9 +916,13 @@ void EngineBroadcast::slotEnableCO(double v) { // Wrapping around in WPushbutton does not work // since the status button has 4 states, but this CO is bool m_pBroadcastEnabled->set(0.0); + v = 0.0; } if (v > 0.0) { serverConnect(); + } else { + // return early from Timeouts + m_waitEnabled.wakeAll(); } } @@ -930,13 +935,13 @@ bool EngineBroadcast::waitForRetry() { qDebug() << "waitForRetry()" << m_retryCount << "/" << m_maximumRetries; - int delay500 = m_reconnectDelay * 2; - while (--delay500 > 0) { + if (m_reconnectDelay > 0) { + m_enabledMutex.lock(); + m_waitEnabled.wait(&m_enabledMutex, m_reconnectDelay * 1000); + m_enabledMutex.unlock(); if (!m_pBroadcastEnabled->toBool()) { return false; } - qDebug() << "sleep"; - QThread::msleep(500); } return true; } diff --git a/src/engine/sidechain/enginebroadcast.h b/src/engine/sidechain/enginebroadcast.h index 2e947c404c23..b3f25f3caa83 100644 --- a/src/engine/sidechain/enginebroadcast.h +++ b/src/engine/sidechain/enginebroadcast.h @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -147,6 +148,10 @@ class EngineBroadcast bool m_noDelayFirstReconnect; bool m_limitRreconnects; int m_maximumRetries; + + QMutex m_enabledMutex; + QWaitCondition m_waitEnabled; + }; #endif // ENGINE_SIDECHAIN_ENGINEBROADCAST_H From d3c6d2019063af3b4efd4368ec913b513ae8050e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Fri, 11 Nov 2016 00:08:26 +0100 Subject: [PATCH 17/34] Added explicit enable_reconnect peference option --- src/preferences/dialog/dlgprefbroadcast.cpp | 24 +- src/preferences/dialog/dlgprefbroadcast.h | 1 + src/preferences/dialog/dlgprefbroadcastdlg.ui | 248 +++++++++--------- 3 files changed, 139 insertions(+), 134 deletions(-) diff --git a/src/preferences/dialog/dlgprefbroadcast.cpp b/src/preferences/dialog/dlgprefbroadcast.cpp index 0889da5d116d..2785d9868197 100644 --- a/src/preferences/dialog/dlgprefbroadcast.cpp +++ b/src/preferences/dialog/dlgprefbroadcast.cpp @@ -56,9 +56,18 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) ConfigKey(BROADCAST_PREF_KEY, "password"))); + // Enable automatic reconnect + bool enableReconnect = m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "enable_reconnect"), "1").toInt(); + checkBoxEnableReconnect->setChecked(enableReconnect); + widgetReconnectControls->setEnabled(enableReconnect); + connect(checkBoxEnableReconnect, SIGNAL(stateChanged(int)), + this, SLOT(checkBoxEnableReconnectChanged(int))); + + // Retry Delay spinBoxReconnectDelay->setValue(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "reconnect_delay"), "15").toInt()); + ConfigKey(BROADCAST_PREF_KEY, "reconnect_delay"), "5.0").toDouble()); // No delay for the first reconnect attempt checkBoxNoDelayFirstReconnect->setChecked(m_pConfig->getValueString( @@ -209,7 +218,10 @@ void DlgPrefBroadcast::slotResetToDefaults() { port->setText(""); login->setText(""); password->setText(""); - spinBoxReconnectDelay->setValue(15); + + checkBoxEnableReconnect->setChecked(true); + widgetReconnectControls->setEnabled(true); + spinBoxReconnectDelay->setValue(5.0); checkBoxNoDelayFirstReconnect->setChecked(true); checkBoxLimitReconnects->setChecked(true); spinBoxMaximumRetries->setValue(10); @@ -283,8 +295,10 @@ void DlgPrefBroadcast::slotApply() ConfigValue(login->text())); m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "password"), ConfigValue(password->text())); + m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "enable_reconnect"), + ConfigValue(checkBoxEnableReconnect->isChecked())); m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "reconnect_delay"), - ConfigValue(spinBoxReconnectDelay->value())); + ConfigValue(QString::number(spinBoxReconnectDelay->value()))); m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "no_delay_first_reconnect"), ConfigValue(checkBoxNoDelayFirstReconnect->isChecked())); m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "limit_reconnects"), @@ -333,6 +347,10 @@ void DlgPrefBroadcast::broadcastEnabledChanged(double value) { } +void DlgPrefBroadcast::checkBoxEnableReconnectChanged(int value) { + widgetReconnectControls->setEnabled(value); +} + void DlgPrefBroadcast::checkBoxLimitReconnectsChanged(int value) { spinBoxMaximumRetries->setEnabled(value); } diff --git a/src/preferences/dialog/dlgprefbroadcast.h b/src/preferences/dialog/dlgprefbroadcast.h index d9ed25fd02e0..5e4743d2cd8f 100644 --- a/src/preferences/dialog/dlgprefbroadcast.h +++ b/src/preferences/dialog/dlgprefbroadcast.h @@ -23,6 +23,7 @@ class DlgPrefBroadcast : public DlgPreferencePage, public Ui::DlgPrefBroadcastDl void slotUpdate(); void slotResetToDefaults(); void broadcastEnabledChanged(double value); + void checkBoxEnableReconnectChanged(int value); void checkBoxLimitReconnectsChanged(int value); void enableCustomMetadataChanged(int value); diff --git a/src/preferences/dialog/dlgprefbroadcastdlg.ui b/src/preferences/dialog/dlgprefbroadcastdlg.ui index 054a186a0015..ce7872f3ac0d 100644 --- a/src/preferences/dialog/dlgprefbroadcastdlg.ui +++ b/src/preferences/dialog/dlgprefbroadcastdlg.ui @@ -7,7 +7,7 @@ 0 0 692 - 552 + 581 @@ -156,116 +156,15 @@ - - - - Automatic reconnect - - - - - - - - Maximum retries - - - - - - - - 0 - 0 - - - - - - - - Reconnect delay [s] - - - - - - - - 0 - 0 - - - - - - - - No delay for the first reconnect attempt - - - - - - - Limit number of reconnection attempts - - - - - - - - Encoding - + - - - - - - 0 - 0 - - - - Bitrate - - - - - - - - 0 - 0 - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - + + Format @@ -275,34 +174,20 @@ - - + + - + 0 0 - - - - - - Qt::Vertical - - - - 20 - 40 - + + Bitrate - + - - - - - + QFrame::NoFrame @@ -324,24 +209,44 @@ - + - + 0 0 - 80 + 16777215 16777215 - - + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + Qt::Vertical @@ -617,6 +522,87 @@ p, li { white-space: pre-wrap; } + + + + Automatic reconnect + + + + + + + + Enable automatic reconnect + + + + + + + + 0 + + + + + + + Reconnect delay + + + + + + + seconds + + + 1 + + + + + + + + 0 + 0 + + + + + + + + Maximum retries + + + + + + + No delay for the first reconnect attempt + + + + + + + Limit number of reconnection attempts + + + + + + + + + + + + + From 0a53a0ab03bfb173d17e183608b0c861c77e41fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sat, 12 Nov 2016 22:28:21 +0100 Subject: [PATCH 18/34] Use new enable_reconnect option --- src/engine/sidechain/enginebroadcast.cpp | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/engine/sidechain/enginebroadcast.cpp b/src/engine/sidechain/enginebroadcast.cpp index a04b05bb51a9..16c1ed776003 100644 --- a/src/engine/sidechain/enginebroadcast.cpp +++ b/src/engine/sidechain/enginebroadcast.cpp @@ -249,14 +249,21 @@ void EngineBroadcast::updateFromPreferences() { m_metadataFormat = m_pConfig->getValueString( ConfigKey(BROADCAST_PREF_KEY, "metadata_format")); - m_reconnectDelay = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "reconnect_delay"), "15").toInt(); - m_noDelayFirstReconnect = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "no_delay_first_reconnect"), "1").toInt(); - m_limitRreconnects = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "limit_reconnects"), "1").toInt(); - m_maximumRetries = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), "10").toInt(); + bool enableReconnect = m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "enable_reconnect"), "1").toInt(); + if (enableReconnect) { + m_reconnectDelay = m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "reconnect_delay"), "15").toInt(); + m_noDelayFirstReconnect = m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "no_delay_first_reconnect"), "1").toInt(); + m_limitRreconnects = m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "limit_reconnects"), "1").toInt(); + m_maximumRetries = m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), "10").toInt(); + } else { + m_limitRreconnects = true; + m_maximumRetries = 0; + } int format; int protocol; From 22e24a8697e5696c14d9ef27e22f73ed127de3c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sat, 12 Nov 2016 23:56:36 +0100 Subject: [PATCH 19/34] extra option to set the first delay --- src/engine/sidechain/enginebroadcast.cpp | 27 ++++++---- src/engine/sidechain/enginebroadcast.h | 3 +- src/preferences/dialog/dlgprefbroadcast.cpp | 24 ++++----- src/preferences/dialog/dlgprefbroadcastdlg.ui | 51 +++++++++++++++---- 4 files changed, 72 insertions(+), 33 deletions(-) diff --git a/src/engine/sidechain/enginebroadcast.cpp b/src/engine/sidechain/enginebroadcast.cpp index 16c1ed776003..1a03a5e74684 100644 --- a/src/engine/sidechain/enginebroadcast.cpp +++ b/src/engine/sidechain/enginebroadcast.cpp @@ -49,7 +49,8 @@ EngineBroadcast::EngineBroadcast(UserSettingsPointer pConfig) m_threadWaiting(false), m_pOutputFifo(nullptr), m_retryCount(0), - m_reconnectDelay(15), + m_reconnectFirstDelay(0.0), + m_reconnectPeriod(5.0), m_noDelayFirstReconnect(true), m_limitRreconnects(true), m_maximumRetries(10) { @@ -252,8 +253,10 @@ void EngineBroadcast::updateFromPreferences() { bool enableReconnect = m_pConfig->getValueString( ConfigKey(BROADCAST_PREF_KEY, "enable_reconnect"), "1").toInt(); if (enableReconnect) { - m_reconnectDelay = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "reconnect_delay"), "15").toInt(); + m_reconnectFirstDelay = m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "reconnect_first_delay"), "5").toDouble(); + m_reconnectPeriod = m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "reconnect_period"), "5").toDouble(); m_noDelayFirstReconnect = m_pConfig->getValueString( ConfigKey(BROADCAST_PREF_KEY, "no_delay_first_reconnect"), "1").toInt(); m_limitRreconnects = m_pConfig->getValueString( @@ -942,9 +945,16 @@ bool EngineBroadcast::waitForRetry() { qDebug() << "waitForRetry()" << m_retryCount << "/" << m_maximumRetries; - if (m_reconnectDelay > 0) { + double delay; + if (m_retryCount == 1) { + delay = m_reconnectFirstDelay; + } else { + delay = m_reconnectPeriod; + } + + if (delay > 0) { m_enabledMutex.lock(); - m_waitEnabled.wait(&m_enabledMutex, m_reconnectDelay * 1000); + m_waitEnabled.wait(&m_enabledMutex, delay * 1000); m_enabledMutex.unlock(); if (!m_pBroadcastEnabled->toBool()) { return false; @@ -958,10 +968,6 @@ void EngineBroadcast::tryReconnect() { m_pStatusCO->setAndConfirm(STATUSCO_FAILURE); processDisconnect(); - if (m_noDelayFirstReconnect) { - ++m_retryCount; - processConnect(); - } while (waitForRetry()) { if (processConnect()) { break; @@ -971,7 +977,8 @@ void EngineBroadcast::tryReconnect() { if (m_pStatusCO->get() == STATUSCO_FAILURE) { m_pBroadcastEnabled->set(0); m_readSema.release(); - errorDialog(tr("Lost connection to streaming server and the attempt to reconnect failed"), + errorDialog(tr("Lost connection to streaming server and %1 attempts to reconnect have failed.") + .arg(m_retryCount), originalErrorStr + "\n" + m_lastErrorStr + "\n" + tr("Please check your connection to the Internet")); diff --git a/src/engine/sidechain/enginebroadcast.h b/src/engine/sidechain/enginebroadcast.h index b3f25f3caa83..119e71ebe669 100644 --- a/src/engine/sidechain/enginebroadcast.h +++ b/src/engine/sidechain/enginebroadcast.h @@ -144,7 +144,8 @@ class EngineBroadcast QString m_lastErrorStr; int m_retryCount; - int m_reconnectDelay; + double m_reconnectFirstDelay; + double m_reconnectPeriod; bool m_noDelayFirstReconnect; bool m_limitRreconnects; int m_maximumRetries; diff --git a/src/preferences/dialog/dlgprefbroadcast.cpp b/src/preferences/dialog/dlgprefbroadcast.cpp index 2785d9868197..9dca8b70c98e 100644 --- a/src/preferences/dialog/dlgprefbroadcast.cpp +++ b/src/preferences/dialog/dlgprefbroadcast.cpp @@ -65,13 +65,13 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) this, SLOT(checkBoxEnableReconnectChanged(int))); - // Retry Delay - spinBoxReconnectDelay->setValue(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "reconnect_delay"), "5.0").toDouble()); + // Wait until first attempt + spinBoxFirstDelay->setValue(m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "reconnect_first_delay"), "0").toDouble()); - // No delay for the first reconnect attempt - checkBoxNoDelayFirstReconnect->setChecked(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "no_delay_first_reconnect"), "1").toInt()); + // Retry Delay + spinBoxReconnectPeriod->setValue(m_pConfig->getValueString( + ConfigKey(BROADCAST_PREF_KEY, "reconnect_period"), "5.0").toDouble()); // Use Maximum Retries bool limitConnects = m_pConfig->getValueString( @@ -221,8 +221,8 @@ void DlgPrefBroadcast::slotResetToDefaults() { checkBoxEnableReconnect->setChecked(true); widgetReconnectControls->setEnabled(true); - spinBoxReconnectDelay->setValue(5.0); - checkBoxNoDelayFirstReconnect->setChecked(true); + spinBoxFirstDelay->setValue(0.0); + spinBoxReconnectPeriod->setValue(5.0); checkBoxLimitReconnects->setChecked(true); spinBoxMaximumRetries->setValue(10); spinBoxMaximumRetries->setEnabled(true); @@ -297,10 +297,10 @@ void DlgPrefBroadcast::slotApply() ConfigValue(password->text())); m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "enable_reconnect"), ConfigValue(checkBoxEnableReconnect->isChecked())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "reconnect_delay"), - ConfigValue(QString::number(spinBoxReconnectDelay->value()))); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "no_delay_first_reconnect"), - ConfigValue(checkBoxNoDelayFirstReconnect->isChecked())); + m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "reconnect_first_delay"), + ConfigValue(QString::number(spinBoxFirstDelay->value()))); + m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "reconnect_period"), + ConfigValue(QString::number(spinBoxReconnectPeriod->value()))); m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "limit_reconnects"), ConfigValue(checkBoxLimitReconnects->isChecked())); m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), diff --git a/src/preferences/dialog/dlgprefbroadcastdlg.ui b/src/preferences/dialog/dlgprefbroadcastdlg.ui index ce7872f3ac0d..bd663fc00f37 100644 --- a/src/preferences/dialog/dlgprefbroadcastdlg.ui +++ b/src/preferences/dialog/dlgprefbroadcastdlg.ui @@ -532,6 +532,9 @@ p, li { white-space: pre-wrap; } + + Reconnect if the connection to the streaming server is lost. + Enable automatic reconnect @@ -548,21 +551,27 @@ p, li { white-space: pre-wrap; } - Reconnect delay + Reconnect period - + + + Time to wait between two reconnection attempts. + seconds - 1 + 2 + + + 3600.000000000000000 - + @@ -570,9 +579,15 @@ p, li { white-space: pre-wrap; } 0 + + 1 + + + 100 + - + Maximum retries @@ -580,16 +595,32 @@ p, li { white-space: pre-wrap; } - + + + + - No delay for the first reconnect attempt + Limit number of reconnection attempts - - + + + + Time to wait before the first reconnection attempt is made. + + + seconds + + + 3600.000000000000000 + + + + + - Limit number of reconnection attempts + Wait until first attempt From a4c783e04165188f4a61813d3c673acd09fbedcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 14 Nov 2016 01:52:42 +0100 Subject: [PATCH 20/34] Broadcasting: avoid interfeerences with engine buffer and sync code --- src/engine/sidechain/enginebroadcast.cpp | 2 ++ src/engine/sidechain/enginenetworkstream.cpp | 11 ++++++----- src/engine/sidechain/enginenetworkstream.h | 3 ++- src/soundio/sounddevicenetwork.cpp | 1 + 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/engine/sidechain/enginebroadcast.cpp b/src/engine/sidechain/enginebroadcast.cpp index 1a03a5e74684..9a4e4cc36f7d 100644 --- a/src/engine/sidechain/enginebroadcast.cpp +++ b/src/engine/sidechain/enginebroadcast.cpp @@ -25,6 +25,8 @@ static const int kConnectRetries = 30; static const int kMaxNetworkCache = 491520; // 10 s mp3 @ 192 kbit/s +// Shoutcast default receive buffer 1048576 and autodumpsourcetime 30 s +// http://wiki.shoutcast.com/wiki/SHOUTcast_DNAS_Server_2 static const int kMaxShoutFailures = 3; EngineBroadcast::EngineBroadcast(UserSettingsPointer pConfig) diff --git a/src/engine/sidechain/enginenetworkstream.cpp b/src/engine/sidechain/enginenetworkstream.cpp index 5ee1c17f92b0..4afc76b56c5d 100644 --- a/src/engine/sidechain/enginenetworkstream.cpp +++ b/src/engine/sidechain/enginenetworkstream.cpp @@ -117,7 +117,6 @@ void EngineNetworkStream::write(const CSAMPLE* buffer, int frames) { // stream by writing silence, once the buffer is free. m_streamFramesWritten += copyCount / m_numOutputChannels; } - scheduleWorker(); } void EngineNetworkStream::writeSilence(int frames) { @@ -154,15 +153,17 @@ void EngineNetworkStream::writeSilence(int frames) { // we advance the frame only by the samples we have actually cleared m_streamFramesWritten += clearCount / m_numOutputChannels; } - scheduleWorker(); } -void EngineNetworkStream::scheduleWorker() { +void EngineNetworkStream::writingDone(int interval) { + // Signal worker if any if (m_pWorker.isNull()) { return; } - if (m_pOutputFifo->readAvailable() - >= m_numOutputChannels * kNetworkLatencyFrames) { + // Check for desired kNetworkLatencyFrames + 1/2 interval to + // avoid big jitter due to interferences with sync code + if (m_pOutputFifo->readAvailable() + interval / 2 + >= (m_numOutputChannels * kNetworkLatencyFrames)) { m_pWorker->outputAvailable(); } } diff --git a/src/engine/sidechain/enginenetworkstream.h b/src/engine/sidechain/enginenetworkstream.h index a796d60de197..5d346128adc8 100644 --- a/src/engine/sidechain/enginenetworkstream.h +++ b/src/engine/sidechain/enginenetworkstream.h @@ -21,6 +21,8 @@ class EngineNetworkStream { void read(CSAMPLE* buffer, int frames); void writeSilence(int frames); + void writingDone(int interval); + qint64 getStreamTimeUs(); qint64 getStreamTimeFrames(); @@ -37,7 +39,6 @@ class EngineNetworkStream { void addWorker(QSharedPointer pWorker); private: - void scheduleWorker(); FIFO* m_pOutputFifo; FIFO* m_pInputFifo; diff --git a/src/soundio/sounddevicenetwork.cpp b/src/soundio/sounddevicenetwork.cpp index 2bb50b388036..a1f074058de2 100644 --- a/src/soundio/sounddevicenetwork.cpp +++ b/src/soundio/sounddevicenetwork.cpp @@ -264,5 +264,6 @@ void SoundDeviceNetwork::writeProcess() { size2 / m_iNumOutputChannels); } m_outputFifo->releaseReadRegions(copyCount); + m_pNetworkStream->writingDone(copyCount); } } From db3a8e6244ba7e12b4e4495de8d29bc93d128da1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 14 Nov 2016 02:20:32 +0100 Subject: [PATCH 21/34] Retry shout_send_raw after 10 ms sleep in case of busy --- src/engine/sidechain/enginebroadcast.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/engine/sidechain/enginebroadcast.cpp b/src/engine/sidechain/enginebroadcast.cpp index 9a4e4cc36f7d..f917095d6d3b 100644 --- a/src/engine/sidechain/enginebroadcast.cpp +++ b/src/engine/sidechain/enginebroadcast.cpp @@ -621,8 +621,14 @@ bool EngineBroadcast::writeSingle(const unsigned char* data, size_t len) { // We are already synced by EngineNetworkstream setFunctionCode(8); int ret = shout_send_raw(m_pShout, data, len); - if (ret < SHOUTERR_SUCCESS && ret != SHOUTERR_BUSY) { - // in case of busy, frames are queued and queue is checked later + if (ret == SHOUTERR_BUSY) { + // in case of busy, frames are queued + // try to flush queue after a short sleep + qDebug() << "EngineBroadcast::writeSingle() SHOUTERR_BUSY, trying again"; + QThread::msleep(10); + // if this fails, the queue is transmitted later + (void)shout_send_raw(m_pShout, nullptr, 0); + } else if (ret < SHOUTERR_SUCCESS) { m_lastErrorStr = shout_get_error(m_pShout); qDebug() << "EngineBroadcast::writeSingle() error:" << ret << m_lastErrorStr; From 1931947b81c1501d41256a45361ccaaba0414324 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sun, 18 Dec 2016 23:56:24 +0100 Subject: [PATCH 22/34] Use type save getValue, add specialisation for double --- src/engine/sidechain/enginebroadcast.cpp | 50 +++++++------- src/preferences/configobject.cpp | 73 +++++++++++++++------ src/preferences/configobject.h | 14 +++- src/preferences/dialog/dlgprefbroadcast.cpp | 32 ++++----- 4 files changed, 106 insertions(+), 63 deletions(-) diff --git a/src/engine/sidechain/enginebroadcast.cpp b/src/engine/sidechain/enginebroadcast.cpp index 87dc1117a8f3..95462100a252 100644 --- a/src/engine/sidechain/enginebroadcast.cpp +++ b/src/engine/sidechain/enginebroadcast.cpp @@ -166,7 +166,7 @@ void EngineBroadcast::updateFromPreferences() { // Convert a bunch of QStrings to QByteArrays so we can get regular C char* // strings to pass to libshout. - QString codec = m_pConfig->getValueString( + QString codec = m_pConfig->getValue( ConfigKey(BROADCAST_PREF_KEY, "metadata_charset")); QByteArray baCodec = codec.toLatin1(); m_pTextCodec = QTextCodec::codecForName(baCodec); @@ -178,10 +178,10 @@ void EngineBroadcast::updateFromPreferences() { // Indicates our metadata is in the provided charset. shout_metadata_add(m_pShoutMetaData, "charset", baCodec.constData()); - QString serverType = m_pConfig->getValueString( + QString serverType = m_pConfig->getValue( ConfigKey(BROADCAST_PREF_KEY, "servertype")); - QString host = m_pConfig->getValueString( + QString host = m_pConfig->getValue( ConfigKey(BROADCAST_PREF_KEY, "host")); int start = host.indexOf(QLatin1String("//")); if (start == -1) { @@ -208,7 +208,7 @@ void EngineBroadcast::updateFromPreferences() { serverUrl.setPath(mountPoint); } - QString login = m_pConfig->getValueString( + QString login = m_pConfig->getValue( ConfigKey(BROADCAST_PREF_KEY, "login")); if (!login.isEmpty()) { serverUrl.setUserName(login); @@ -235,36 +235,36 @@ void EngineBroadcast::updateFromPreferences() { ConfigKey(BROADCAST_PREF_KEY, "stream_genre"))); // Whether the stream is public. - bool streamPublic = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "stream_public")).toInt() > 0; + bool streamPublic = m_pConfig->getValue( + ConfigKey(BROADCAST_PREF_KEY, "stream_public"), false); // Dynamic Ogg metadata update - m_ogg_dynamic_update = (bool)m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"ogg_dynamicupdate")).toInt(); + m_ogg_dynamic_update = m_pConfig->getValue( + ConfigKey(BROADCAST_PREF_KEY,"ogg_dynamicupdate"), false); - m_custom_metadata = (bool)m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "enable_metadata")).toInt(); - m_customTitle = m_pConfig->getValueString( + m_custom_metadata = m_pConfig->getValue( + ConfigKey(BROADCAST_PREF_KEY, "enable_metadata"), false); + m_customTitle = m_pConfig->getValue( ConfigKey(BROADCAST_PREF_KEY, "custom_title")); - m_customArtist = m_pConfig->getValueString( + m_customArtist = m_pConfig->getValue( ConfigKey(BROADCAST_PREF_KEY, "custom_artist")); - m_metadataFormat = m_pConfig->getValueString( + m_metadataFormat = m_pConfig->getValue( ConfigKey(BROADCAST_PREF_KEY, "metadata_format")); - bool enableReconnect = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "enable_reconnect"), "1").toInt(); + bool enableReconnect = m_pConfig->getValue( + ConfigKey(BROADCAST_PREF_KEY, "enable_reconnect"), true); if (enableReconnect) { - m_reconnectFirstDelay = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "reconnect_first_delay"), "5").toDouble(); - m_reconnectPeriod = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "reconnect_period"), "5").toDouble(); - m_noDelayFirstReconnect = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "no_delay_first_reconnect"), "1").toInt(); - m_limitRreconnects = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "limit_reconnects"), "1").toInt(); - m_maximumRetries = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), "10").toInt(); + m_reconnectFirstDelay = m_pConfig->getValue( + ConfigKey(BROADCAST_PREF_KEY, "reconnect_first_delay"), 5.0); + m_reconnectPeriod = m_pConfig->getValue( + ConfigKey(BROADCAST_PREF_KEY, "reconnect_period"), 5.0); + m_noDelayFirstReconnect = m_pConfig->getValue( + ConfigKey(BROADCAST_PREF_KEY, "no_delay_first_reconnect"), 1); + m_limitRreconnects = m_pConfig->getValue( + ConfigKey(BROADCAST_PREF_KEY, "limit_reconnects"), true); + m_maximumRetries = m_pConfig->getValue( + ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), 10); } else { m_limitRreconnects = true; m_maximumRetries = 0; diff --git a/src/preferences/configobject.cpp b/src/preferences/configobject.cpp index 0a5bfde9037a..446c6d778cae 100644 --- a/src/preferences/configobject.cpp +++ b/src/preferences/configobject.cpp @@ -176,16 +176,6 @@ QString ConfigObject::getValueString(const ConfigKey& k) const { return v.value; } -template -QString ConfigObject::getValueString(const ConfigKey& k, - const QString& default_string) const { - QString ret = getValueString(k); - if (ret.isEmpty()) { - return default_string; - } - return ret; -} - template bool ConfigObject::parse() { // Open file for reading QFile configfile(m_filename); @@ -295,33 +285,36 @@ template class ConfigObject; template class ConfigObject; template <> template <> -void ConfigObject::setValue(const ConfigKey& key, const QString& value) { +void ConfigObject::setValue( + const ConfigKey& key, const QString& value) { set(key, ConfigValue(value)); } template <> template <> -void ConfigObject::setValue(const ConfigKey& key, const bool& value) { +void ConfigObject::setValue( + const ConfigKey& key, const bool& value) { set(key, value ? ConfigValue("1") : ConfigValue("0")); } template <> template <> -void ConfigObject::setValue(const ConfigKey& key, const int& value) { +void ConfigObject::setValue( + const ConfigKey& key, const int& value) { set(key, ConfigValue(QString::number(value))); } template <> template <> -bool ConfigObject::getValue(const ConfigKey& key, - const bool& default_value) const { +bool ConfigObject::getValue( + const ConfigKey& key, const bool& default_value) const { const ConfigValue value = get(key); if (value.isNull()) { return default_value; } - return static_cast(value.value.toInt()); + return value.value.toInt() > 0; } template <> template <> -int ConfigObject::getValue(const ConfigKey& key, - const int& default_value) const { +int ConfigObject::getValue( + const ConfigKey& key, const int& default_value) const { const ConfigValue value = get(key); if (value.isNull()) { return default_value; @@ -330,11 +323,51 @@ int ConfigObject::getValue(const ConfigKey& key, } template <> template <> -QString ConfigObject::getValue(const ConfigKey& key, - const QString& default_value) const { +double ConfigObject::getValue( + const ConfigKey& key, const double& default_value) const { const ConfigValue value = get(key); if (value.isNull()) { return default_value; } + return value.value.toDouble(); +} + +template <> +QString ConfigObject::getValue( + const ConfigKey& key, const char* default_value) const { + const ConfigValue value = get(key); + if (value.isNull()) { + return QString(default_value); + } + return value.value; +} + +template <> +QString ConfigObject::getValue( + const ConfigKey& key, const char* default_value) const { + const ConfigValueKbd value = get(key); + if (value.isNull()) { + return QString(default_value); + } + return value.value; +} + +template <> template <> +QString ConfigObject::getValue( + const ConfigKey& key, const QString& default_value) const { + const ConfigValue value = get(key); + if (value.isNull()) { + return default_value; + } + return value.value; +} + +template <> template <> +QString ConfigObject::getValue( + const ConfigKey& key, const QString& default_value) const { + const ConfigValueKbd value = get(key); + if (value.isNull()) { + return default_value; + } return value.value; } diff --git a/src/preferences/configobject.h b/src/preferences/configobject.h index 47e3cb9b8522..18f977ff392d 100644 --- a/src/preferences/configobject.h +++ b/src/preferences/configobject.h @@ -108,8 +108,6 @@ template class ConfigObject { void set(const ConfigKey& k, const ValueType& v); ValueType get(const ConfigKey& k) const; bool exists(const ConfigKey& key) const; - QString getValueString(const ConfigKey& k) const; - QString getValueString(const ConfigKey& k, const QString& default_string) const; template void setValue(const ConfigKey& key, const ResultType& value); @@ -118,9 +116,21 @@ template class ConfigObject { ResultType getValue(const ConfigKey& key) const { return getValue(key, ResultType()); } + QString getValue(const ConfigKey& key) const { + return getValueString(key); + } template ResultType getValue(const ConfigKey& key, const ResultType& default_value) const; + QString getValue(const ConfigKey& key, const char* default_value) const; + + QString getValueString(const ConfigKey& key) const; + QString getValueString(const ConfigKey& key, const QString& default_value) const{ + return getValue(key, default_value); + } + QString getValueString(const ConfigKey& key, const char* default_value) const { + return getValue(key, default_value); + } QMultiHash transpose() const; diff --git a/src/preferences/dialog/dlgprefbroadcast.cpp b/src/preferences/dialog/dlgprefbroadcast.cpp index 9dca8b70c98e..3ce4bdcc76eb 100644 --- a/src/preferences/dialog/dlgprefbroadcast.cpp +++ b/src/preferences/dialog/dlgprefbroadcast.cpp @@ -57,8 +57,8 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) // Enable automatic reconnect - bool enableReconnect = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "enable_reconnect"), "1").toInt(); + bool enableReconnect = m_pConfig->getValue( + ConfigKey(BROADCAST_PREF_KEY, "enable_reconnect"), true); checkBoxEnableReconnect->setChecked(enableReconnect); widgetReconnectControls->setEnabled(enableReconnect); connect(checkBoxEnableReconnect, SIGNAL(stateChanged(int)), @@ -66,16 +66,16 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) // Wait until first attempt - spinBoxFirstDelay->setValue(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "reconnect_first_delay"), "0").toDouble()); + spinBoxFirstDelay->setValue(m_pConfig->getValue( + ConfigKey(BROADCAST_PREF_KEY, "reconnect_first_delay"), 0.0)); // Retry Delay - spinBoxReconnectPeriod->setValue(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "reconnect_period"), "5.0").toDouble()); + spinBoxReconnectPeriod->setValue(m_pConfig->getValue( + ConfigKey(BROADCAST_PREF_KEY, "reconnect_period"), 5.0)); // Use Maximum Retries - bool limitConnects = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "limit_reconnects"), "1").toInt(); + bool limitConnects = m_pConfig->getValue( + ConfigKey(BROADCAST_PREF_KEY, "limit_reconnects"), true); checkBoxLimitReconnects->setChecked( limitConnects); spinBoxMaximumRetries->setEnabled(limitConnects); @@ -83,13 +83,13 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) this, SLOT(checkBoxLimitReconnectsChanged(int))); // Maximum Retries - spinBoxMaximumRetries->setValue(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), "10").toInt()); + spinBoxMaximumRetries->setValue(m_pConfig->getValue( + ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), 10)); // Stream "public" checkbox - stream_public->setChecked((bool)m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "stream_public")).toInt()); + stream_public->setChecked(m_pConfig->getValue( + ConfigKey(BROADCAST_PREF_KEY, "stream_public"), false)); // Stream name stream_name->setText(m_pConfig->getValueString( @@ -185,8 +185,8 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) ConfigKey(BROADCAST_PREF_KEY,"custom_title"))); // "Enable static artist and title" checkbox - bool enableMetadata = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"enable_metadata")).toInt(); + bool enableMetadata = m_pConfig->getValue( + ConfigKey(BROADCAST_PREF_KEY,"enable_metadata"), false); enableCustomMetadata->setChecked(enableMetadata); custom_artist->setEnabled(enableMetadata); custom_title->setEnabled(enableMetadata); @@ -200,8 +200,8 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) enableUtf8Metadata->setChecked(charset == "UTF-8"); // OGG "dynamicupdate" checkbox - ogg_dynamicupdate->setChecked((bool)m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"ogg_dynamicupdate")).toInt()); + ogg_dynamicupdate->setChecked(m_pConfig->getValue( + ConfigKey(BROADCAST_PREF_KEY,"ogg_dynamicupdate"), false)); slotApply(); } From d401ee20eae2ae3a199dae54158f809ae39007f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sun, 18 Dec 2016 23:59:18 +0100 Subject: [PATCH 23/34] fix typo --- src/engine/sidechain/enginebroadcast.cpp | 8 ++++---- src/engine/sidechain/enginebroadcast.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/engine/sidechain/enginebroadcast.cpp b/src/engine/sidechain/enginebroadcast.cpp index 95462100a252..74e54fa0735b 100644 --- a/src/engine/sidechain/enginebroadcast.cpp +++ b/src/engine/sidechain/enginebroadcast.cpp @@ -54,7 +54,7 @@ EngineBroadcast::EngineBroadcast(UserSettingsPointer pConfig) m_reconnectFirstDelay(0.0), m_reconnectPeriod(5.0), m_noDelayFirstReconnect(true), - m_limitRreconnects(true), + m_limitReconnects(true), m_maximumRetries(10) { const bool persist = true; m_pBroadcastEnabled = new ControlPushButton( @@ -261,12 +261,12 @@ void EngineBroadcast::updateFromPreferences() { ConfigKey(BROADCAST_PREF_KEY, "reconnect_period"), 5.0); m_noDelayFirstReconnect = m_pConfig->getValue( ConfigKey(BROADCAST_PREF_KEY, "no_delay_first_reconnect"), 1); - m_limitRreconnects = m_pConfig->getValue( + m_limitReconnects = m_pConfig->getValue( ConfigKey(BROADCAST_PREF_KEY, "limit_reconnects"), true); m_maximumRetries = m_pConfig->getValue( ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), 10); } else { - m_limitRreconnects = true; + m_limitReconnects = true; m_maximumRetries = 0; } @@ -945,7 +945,7 @@ void EngineBroadcast::slotEnableCO(double v) { } bool EngineBroadcast::waitForRetry() { - if (m_limitRreconnects && + if (m_limitReconnects && m_retryCount >= m_maximumRetries) { return false; } diff --git a/src/engine/sidechain/enginebroadcast.h b/src/engine/sidechain/enginebroadcast.h index 119e71ebe669..72e493a7e8e2 100644 --- a/src/engine/sidechain/enginebroadcast.h +++ b/src/engine/sidechain/enginebroadcast.h @@ -147,7 +147,7 @@ class EngineBroadcast double m_reconnectFirstDelay; double m_reconnectPeriod; bool m_noDelayFirstReconnect; - bool m_limitRreconnects; + bool m_limitReconnects; int m_maximumRetries; QMutex m_enabledMutex; From 4ccc433e45abfc003ecc02fccab068e6af0647b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 19 Dec 2016 00:08:40 +0100 Subject: [PATCH 24/34] Remove redundant setProtocol SHOUT_PROTOCOL_HTTP call --- src/engine/sidechain/enginebroadcast.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/engine/sidechain/enginebroadcast.cpp b/src/engine/sidechain/enginebroadcast.cpp index 74e54fa0735b..8a3aa4bdb139 100644 --- a/src/engine/sidechain/enginebroadcast.cpp +++ b/src/engine/sidechain/enginebroadcast.cpp @@ -279,12 +279,6 @@ void EngineBroadcast::updateFromPreferences() { return; } - // WTF? Why SHOUT_PROTOCOL_HTTP and not.. the chosen protocol? - if (shout_set_protocol(m_pShout, SHOUT_PROTOCOL_HTTP) != SHOUTERR_SUCCESS) { - errorDialog(tr("Error setting protocol!"), shout_get_error(m_pShout)); - return; - } - if (shout_set_port(m_pShout, static_cast(serverUrl.port(BROADCAST_DEFAULT_PORT))) != SHOUTERR_SUCCESS) { From 34101a7ef57992be2f5404aa9730bd780b78a29b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 19 Dec 2016 00:17:57 +0100 Subject: [PATCH 25/34] Comment the sleep after IS_BUSY --- src/engine/sidechain/enginebroadcast.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/sidechain/enginebroadcast.cpp b/src/engine/sidechain/enginebroadcast.cpp index 8a3aa4bdb139..ed3f427cb91b 100644 --- a/src/engine/sidechain/enginebroadcast.cpp +++ b/src/engine/sidechain/enginebroadcast.cpp @@ -619,7 +619,7 @@ bool EngineBroadcast::writeSingle(const unsigned char* data, size_t len) { // in case of busy, frames are queued // try to flush queue after a short sleep qDebug() << "EngineBroadcast::writeSingle() SHOUTERR_BUSY, trying again"; - QThread::msleep(10); + QThread::msleep(10); // wait 10 ms until "busy" is over. TODO() tweak for an optimum. // if this fails, the queue is transmitted later (void)shout_send_raw(m_pShout, nullptr, 0); } else if (ret < SHOUTERR_SUCCESS) { From c74c7310db0095bff2cdc8f9906b4c9e266b0bf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 29 Dec 2016 12:17:21 +0100 Subject: [PATCH 26/34] moved broadcast settings to own class --- build/depends.py | 1 + src/engine/sidechain/enginebroadcast.cpp | 95 ++--- src/engine/sidechain/enginebroadcast.h | 4 +- src/preferences/broadcastsettings.cpp | 417 ++++++++++++++++++++ src/preferences/broadcastsettings.h | 97 +++++ src/preferences/configobject.cpp | 6 + src/preferences/dialog/dlgprefbroadcast.cpp | 230 ++++------- src/preferences/dialog/dlgprefbroadcast.h | 3 +- src/preferences/replaygainsettings.cpp | 7 - 9 files changed, 642 insertions(+), 218 deletions(-) create mode 100644 src/preferences/broadcastsettings.cpp create mode 100644 src/preferences/broadcastsettings.h diff --git a/build/depends.py b/build/depends.py index a0539700921a..8c57f0f83fad 100644 --- a/build/depends.py +++ b/build/depends.py @@ -647,6 +647,7 @@ def sources(self, build): "preferences/dialog/dlgprefwaveform.cpp", "preferences/settingsmanager.cpp", "preferences/replaygainsettings.cpp", + "preferences/broadcastsettings.cpp", "preferences/upgrade.cpp", "preferences/dlgpreferencepage.cpp", diff --git a/src/engine/sidechain/enginebroadcast.cpp b/src/engine/sidechain/enginebroadcast.cpp index ed3f427cb91b..26047e0fef90 100644 --- a/src/engine/sidechain/enginebroadcast.cpp +++ b/src/engine/sidechain/enginebroadcast.cpp @@ -37,7 +37,7 @@ EngineBroadcast::EngineBroadcast(UserSettingsPointer pConfig) m_iMetaDataLife(0), m_iShoutStatus(0), m_iShoutFailures(0), - m_pConfig(pConfig), + m_settings(pConfig), m_encoder(nullptr), m_pMasterSamplerate(new ControlProxy("[Master]", "samplerate")), m_custom_metadata(false), @@ -166,8 +166,7 @@ void EngineBroadcast::updateFromPreferences() { // Convert a bunch of QStrings to QByteArrays so we can get regular C char* // strings to pass to libshout. - QString codec = m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY, "metadata_charset")); + QString codec = m_settings.getMetadataCharset(); QByteArray baCodec = codec.toLatin1(); m_pTextCodec = QTextCodec::codecForName(baCodec); if (!m_pTextCodec) { @@ -178,11 +177,9 @@ void EngineBroadcast::updateFromPreferences() { // Indicates our metadata is in the provided charset. shout_metadata_add(m_pShoutMetaData, "charset", baCodec.constData()); - QString serverType = m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY, "servertype")); + QString serverType = m_settings.getServertype(); - QString host = m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY, "host")); + QString host = m_settings.getHost(); int start = host.indexOf(QLatin1String("//")); if (start == -1) { // the host part requires preceding //. @@ -192,15 +189,10 @@ void EngineBroadcast::updateFromPreferences() { } QUrl serverUrl = host; - bool ok = false; - unsigned int port = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "port")).toUInt(&ok); - if (ok) { - serverUrl.setPort(port); - } + int port = m_settings.getPort(); + serverUrl.setPort(port); - QString mountPoint = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "mountpoint")).toLatin1(); + QString mountPoint = m_settings.getMountpoint(); if (!mountPoint.isEmpty()) { if (!mountPoint.startsWith('/')) { mountPoint.prepend('/'); @@ -208,63 +200,43 @@ void EngineBroadcast::updateFromPreferences() { serverUrl.setPath(mountPoint); } - QString login = m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY, "login")); + QString login = m_settings.getLogin(); if (!login.isEmpty()) { serverUrl.setUserName(login); } qDebug() << "Using server URL:" << serverUrl; - QByteArray baPassword = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "password")).toLatin1(); - QByteArray baFormat = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "format")).toLatin1(); - QByteArray baBitrate = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "bitrate")).toLatin1(); + QByteArray baPassword = m_settings.getPassword().toLatin1(); + QByteArray baFormat = m_settings.getFormat().toLatin1(); + int iBitrate = m_settings.getBitrate(); // Encode metadata like stream name, website, desc, genre, title/author with // the chosen TextCodec. - QByteArray baStreamName = encodeString(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "stream_name"))); - QByteArray baStreamWebsite = encodeString(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "stream_website"))); - QByteArray baStreamDesc = encodeString(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "stream_desc"))); - QByteArray baStreamGenre = encodeString(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "stream_genre"))); + QByteArray baStreamName = encodeString(m_settings.getStreamName()); + QByteArray baStreamWebsite = encodeString(m_settings.getStreamWebsite()); + QByteArray baStreamDesc = encodeString(m_settings.getStreamDesc()); + QByteArray baStreamGenre = encodeString(m_settings.getStreamGenre()); // Whether the stream is public. - bool streamPublic = m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY, "stream_public"), false); + bool streamPublic = m_settings.getStreamPublic(); // Dynamic Ogg metadata update - m_ogg_dynamic_update = m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY,"ogg_dynamicupdate"), false); + m_ogg_dynamic_update = m_settings.getOggDynamicUpdate(); - m_custom_metadata = m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY, "enable_metadata"), false); - m_customTitle = m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY, "custom_title")); - m_customArtist = m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY, "custom_artist")); + m_custom_metadata = m_settings.getEnableMetadata(); + m_customTitle = m_settings.getCustomTitle(); + m_customArtist = m_settings.getCustomArtist(); - m_metadataFormat = m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY, "metadata_format")); + m_metadataFormat = m_settings.getMetadataFormat(); - bool enableReconnect = m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY, "enable_reconnect"), true); + bool enableReconnect = m_settings.getEnableReconnect(); if (enableReconnect) { - m_reconnectFirstDelay = m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY, "reconnect_first_delay"), 5.0); - m_reconnectPeriod = m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY, "reconnect_period"), 5.0); - m_noDelayFirstReconnect = m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY, "no_delay_first_reconnect"), 1); - m_limitReconnects = m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY, "limit_reconnects"), true); - m_maximumRetries = m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), 10); + m_reconnectFirstDelay = m_settings.getReconnectFirstDelay(); + m_reconnectPeriod = m_settings.getReconnectPeriod(); + m_noDelayFirstReconnect = m_settings.getNoDelayFirstReconnect(); + m_limitReconnects = m_settings.getLimitReconnects(); + m_maximumRetries = m_settings.getMaximumRetries(); } else { m_limitReconnects = true; m_maximumRetries = 0; @@ -345,11 +317,8 @@ void EngineBroadcast::updateFromPreferences() { return; } - bool bitrate_is_int = false; - int iBitrate = baBitrate.toInt(&bitrate_is_int); - - if (!bitrate_is_int) { - qWarning() << "Error: unknown bitrate:" << baBitrate.constData(); + if (iBitrate < 0) { + qWarning() << "Error: unknown bit rate:" << iBitrate; } int iMasterSamplerate = m_pMasterSamplerate->get(); @@ -362,7 +331,9 @@ void EngineBroadcast::updateFromPreferences() { return; } - if (shout_set_audio_info(m_pShout, SHOUT_AI_BITRATE, baBitrate.constData()) != SHOUTERR_SUCCESS) { + if (shout_set_audio_info( + m_pShout, SHOUT_AI_BITRATE, + QByteArray::number(iBitrate).constData()) != SHOUTERR_SUCCESS) { errorDialog(tr("Error setting bitrate"), shout_get_error(m_pShout)); return; } @@ -620,7 +591,7 @@ bool EngineBroadcast::writeSingle(const unsigned char* data, size_t len) { // try to flush queue after a short sleep qDebug() << "EngineBroadcast::writeSingle() SHOUTERR_BUSY, trying again"; QThread::msleep(10); // wait 10 ms until "busy" is over. TODO() tweak for an optimum. - // if this fails, the queue is transmitted later + // if this fails, the queue is transmitted after the next regular shout_send_raw() (void)shout_send_raw(m_pShout, nullptr, 0); } else if (ret < SHOUTERR_SUCCESS) { m_lastErrorStr = shout_get_error(m_pShout); diff --git a/src/engine/sidechain/enginebroadcast.h b/src/engine/sidechain/enginebroadcast.h index 72e493a7e8e2..2929eac5ebbd 100644 --- a/src/engine/sidechain/enginebroadcast.h +++ b/src/engine/sidechain/enginebroadcast.h @@ -18,6 +18,7 @@ #include "preferences/usersettings.h" #include "track/track.h" #include "util/fifo.h" +#include "preferences/broadcastsettings.h" class Encoder; class ControlPushButton; @@ -116,7 +117,7 @@ class EngineBroadcast int m_iMetaDataLife; long m_iShoutStatus; long m_iShoutFailures; - UserSettingsPointer m_pConfig; + BroadcastSettings m_settings; Encoder* m_encoder; ControlPushButton* m_pBroadcastEnabled; ControlProxy* m_pMasterSamplerate; @@ -152,7 +153,6 @@ class EngineBroadcast QMutex m_enabledMutex; QWaitCondition m_waitEnabled; - }; #endif // ENGINE_SIDECHAIN_ENGINEBROADCAST_H diff --git a/src/preferences/broadcastsettings.cpp b/src/preferences/broadcastsettings.cpp new file mode 100644 index 000000000000..b80a471b59a3 --- /dev/null +++ b/src/preferences/broadcastsettings.cpp @@ -0,0 +1,417 @@ +#include "preferences/broadcastsettings.h" +#include "defs_urls.h" + +namespace { +const char* kConfigKey = "[Shoutcast]"; + +const char* kBitrate = "bitrate"; +const char* kChannels = "channels"; +const char* kCustomArtist = "custom_artist"; +const char* kCustomTitle = "custom_title"; +const char* kEnableMetadata = "enable_metadata"; +const char* kEnableReconnect = "enable_reconnect"; +const char* kEnabled = "enabled"; +const char* kFormat = "format"; +const char* kHost = "host"; +const char* kLimitReconnects = "limit_reconnects"; +const char* kLogin = "login"; +const char* kMaximumRetries = "maximum_retries"; +const char* kMetadataCharset = "metadata_charset"; +const char* kMetadataFormat = "metadata_format"; +const char* kMountPoint = "mountpoint"; +const char* kNoDelayFirstReconnect = "no_delay_first_reconnect"; +const char* kOggDynamicUpdate = "ogg_dynamicupdate"; +const char* kPassword = "password"; +const char* kPort = "port"; +const char* kReconnectFirstDelay = "reconnect_first_delay"; +const char* kReconnectPeriod = "reconnect_period"; +const char* kServertype = "servertype"; +const char* kStreamDesc = "stream_desc"; +const char* kStreamGenre = "stream_genre"; +const char* kStreamName = "stream_name"; +const char* kStreamPublic = "stream_public"; +const char* kStreamWebsite = "stream_website"; + +const double kDefaultBitrate = 128; +const int kDefaultChannels = 2; +const bool kDefaultEnableMetadata = false; +const bool kDefaultEnableReconnect = true; +const bool kDefaultLimitReconnects = true; +const int kDefaultMaximumRetries = 10; +// No tr() here, see https://bugs.launchpad.net/mixxx/+bug/1419500 +const QString kDefaultMetadataFormat("$artist - $title"); +const bool kDefaultNoDelayFirstReconnect = true; +const bool kDefaultOggDynamicupdate = false; +double kDefaultReconnectFirstDelay = 0.0; +double kDefaultReconnectPeriod = 5.0; +const QString kDefaultStreamDesc = QObject::tr("This stream is online for testing purposes!"); +const QString kDefaultStreamGenre = QObject::tr("Live Mix"); +const bool kDefaultStreamPublic = false; +} // anonymous namespace + +BroadcastSettings::BroadcastSettings(UserSettingsPointer pConfig) + : m_pConfig(pConfig) { +} + +int BroadcastSettings::getBitrate() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kBitrate), getDefaultBitrate()); +} + +void BroadcastSettings::setBitrate(int value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kBitrate), value); +} + +int BroadcastSettings::getDefaultBitrate() const { + return kDefaultBitrate; +} + +int BroadcastSettings::getChannels() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kChannels), getDefaultChannels()); +} + +void BroadcastSettings::setChannels(int value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kChannels), value); +} + +int BroadcastSettings::getDefaultChannels() const { + return kDefaultChannels; +} + +QString BroadcastSettings::getCustomArtist() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kCustomArtist), getDefaultCustomArtist()); + +} + +void BroadcastSettings::setCustomArtist(const QString& value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kCustomArtist), value); +} + +QString BroadcastSettings::getDefaultCustomArtist() const { + return QString(); +} + +QString BroadcastSettings::getCustomTitle() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kCustomTitle), getDefaultCustomTitle()); +} + +void BroadcastSettings::setCustomTitle(const QString& value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kCustomTitle), value); +} + +QString BroadcastSettings::getDefaultCustomTitle() const { + return QString(); +} + +bool BroadcastSettings::getEnableMetadata() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kEnableMetadata), getDefaultEnableMetadata()); +} + +void BroadcastSettings::setEnableMetadata(bool value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kEnableMetadata), value); +} + +bool BroadcastSettings::getDefaultEnableMetadata() const { + return kDefaultEnableMetadata; +} + +bool BroadcastSettings::getEnableReconnect() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kEnableReconnect), getDefaultEnableReconnect()); +} + +void BroadcastSettings::setEnableReconnect(bool value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kEnableReconnect), value); +} + +bool BroadcastSettings::getDefaultEnableReconnect() const { + return kDefaultEnableReconnect; +} + +// Unused, but we keep this to reserve the name +bool BroadcastSettings::getEnabled() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kEnabled), true); +} + +void BroadcastSettings::setEnabled(bool value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kEnabled), value); +} + +QString BroadcastSettings::getFormat() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kFormat), getDefaultFormat()); +} + +void BroadcastSettings::setFormat(const QString& value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kFormat), value); +} + +QString BroadcastSettings::getDefaultFormat() const { + return QString(); +} + +QString BroadcastSettings::getHost() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kHost), getDefaultHost()); +} + +void BroadcastSettings::setHost(const QString& value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kHost), value); +} + +QString BroadcastSettings::getDefaultHost() const { + return QString(); +} + +bool BroadcastSettings::getLimitReconnects() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kLimitReconnects), getDefaultLimitReconnects()); +} + +void BroadcastSettings::setLimitReconnects(bool value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kLimitReconnects), value); +} + +bool BroadcastSettings::getDefaultLimitReconnects() const { + return kDefaultLimitReconnects; +} + +QString BroadcastSettings::getLogin() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kLogin), getDefaultLogin()); +} + +void BroadcastSettings::setLogin(const QString& value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kLogin), value); +} + +QString BroadcastSettings::getDefaultLogin() const { + return QString(); +} + +int BroadcastSettings::getMaximumRetries() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kMaximumRetries), getDefaultMaximumRetries()); +} + +void BroadcastSettings::setMaximumRetries(int value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kMaximumRetries), value); +} + +int BroadcastSettings::getDefaultMaximumRetries() const { + return kDefaultMaximumRetries; +} + +QString BroadcastSettings::getMetadataCharset() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kMetadataCharset)); +} + +void BroadcastSettings::setMetadataCharset(const QString& value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kMetadataCharset), value); +} + +QString BroadcastSettings::getDefaultMetadataCharset() const { + return QString(); +} + +QString BroadcastSettings::getMetadataFormat() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kMetadataFormat), + // No tr() here, see https://bugs.launchpad.net/mixxx/+bug/1419500 + getDefaultMetadataFormat()); +} + +void BroadcastSettings::setMetadataFormat(const QString& value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kMetadataFormat), value); +} + +QString BroadcastSettings::getDefaultMetadataFormat() const { + return kDefaultMetadataFormat; +} + +QString BroadcastSettings::getMountpoint() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kMountPoint)); +} + +void BroadcastSettings::setMountPoint(const QString& value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kMountPoint), value); +} + +QString BroadcastSettings::getDefaultMountpoint() const { + return QString(); +} + +bool BroadcastSettings::getNoDelayFirstReconnect() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kNoDelayFirstReconnect), + getDefaultNoDelayFirstReconnect()); +} + +void BroadcastSettings::setNoDelayFirstReconnect(bool value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kNoDelayFirstReconnect), value); +} + +bool BroadcastSettings::getDefaultNoDelayFirstReconnect() const { + return kDefaultNoDelayFirstReconnect; +} + +bool BroadcastSettings::getOggDynamicUpdate() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kOggDynamicUpdate), false); +} + +void BroadcastSettings::setOggDynamicUpdate(bool value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kOggDynamicUpdate), value); +} + +bool BroadcastSettings::getDefaultOggDynamicUpdate() const { + return kDefaultOggDynamicupdate; +} + +QString BroadcastSettings::getPassword() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kPassword), getDefaultPassword()); +} + +void BroadcastSettings::setPassword(const QString& value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kPassword), value); +} + +QString BroadcastSettings::getDefaultPassword() const { + return QString(); +} + +int BroadcastSettings::getPort() const { + // Valid port numbers are 0 .. 65535 (16 bit unsigned) + int port = m_pConfig->getValue( + ConfigKey(kConfigKey, kPort), getDefaultPort()); + if (port < 0 || port > 0xFFFF) { + return -1; + } + return port; +} + +void BroadcastSettings::setPort(int value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kPort), value); +} + +int BroadcastSettings::getDefaultPort() const { + return -1; +} + +double BroadcastSettings::getReconnectFirstDelay() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kReconnectFirstDelay), + getDefaultReconnectFirstDelay()); +} + +void BroadcastSettings::setReconnectFirstDelay(double value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kReconnectFirstDelay), value); +} + +double BroadcastSettings::getDefaultReconnectFirstDelay() const { + return kDefaultReconnectFirstDelay; +} + +double BroadcastSettings::getReconnectPeriod() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kReconnectPeriod), + getDefaultReconnectPeriod()); +} + +void BroadcastSettings::setReconnectPeriod(double value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kReconnectPeriod), value); +} + +double BroadcastSettings::getDefaultReconnectPeriod() const { + return kDefaultReconnectPeriod; +} + +QString BroadcastSettings::getServertype() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kServertype), getDefaultServertype()); +} + +void BroadcastSettings::setServertype(const QString& value) { + m_pConfig->set(ConfigKey(kConfigKey, kServertype), + ConfigValue(value)); +} + +QString BroadcastSettings::getDefaultServertype() const { + return QString(); +} + +QString BroadcastSettings::getStreamDesc() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kStreamDesc), + getDefaultStreamDesc()); +} + +void BroadcastSettings::setStreamDesc(const QString& value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kStreamDesc), value); +} + +QString BroadcastSettings::getDefaultStreamDesc() const { + return kDefaultStreamDesc; +} + +QString BroadcastSettings::getStreamGenre() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kStreamGenre), + getDefaultStreamGenre()); +} + +void BroadcastSettings::setStreamGenre(const QString& value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kStreamGenre), value); +} + +QString BroadcastSettings::getDefaultStreamGenre() const { + return kDefaultStreamGenre; +} + +QString BroadcastSettings::getStreamName() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kStreamName), + getDefaultStreamName()); +} + +void BroadcastSettings::setStreamName(const QString& value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kStreamName), value); +} + +QString BroadcastSettings::getDefaultStreamName() const { + return QString(); +} + +bool BroadcastSettings::getStreamPublic() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kStreamPublic), false); +} + +void BroadcastSettings::setStreamPublic(bool value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kStreamPublic), value); +} + +bool BroadcastSettings::getDefaultStreamPublic() const { + return kDefaultStreamPublic; +} + +QString BroadcastSettings::getStreamWebsite() const { + return m_pConfig->getValue( + ConfigKey(kConfigKey, kStreamWebsite), getDefaultStreamWebsite()); +} + +void BroadcastSettings::setStreamWebsite(const QString& value) { + m_pConfig->setValue(ConfigKey(kConfigKey, kStreamWebsite), value); +} + +QString BroadcastSettings::getDefaultStreamWebsite() const { + return MIXXX_WEBSITE_URL; +} diff --git a/src/preferences/broadcastsettings.h b/src/preferences/broadcastsettings.h new file mode 100644 index 000000000000..9c759bed5b3a --- /dev/null +++ b/src/preferences/broadcastsettings.h @@ -0,0 +1,97 @@ +#ifndef PREFERENCES_BROADCASTSETTINGS_H +#define PREFERENCES_BROADCASTSETTINGS_H + +#include "preferences/usersettings.h" +#include "track/track.h" + +class BroadcastSettings { + public: + BroadcastSettings(UserSettingsPointer pConfig); + + int getBitrate() const; + void setBitrate(int value); + int getDefaultBitrate() const; + int getChannels() const; + void setChannels(int value); + int getDefaultChannels() const; + QString getCustomArtist() const; + void setCustomArtist(const QString& value); + QString getDefaultCustomArtist() const; + QString getCustomTitle() const; + void setCustomTitle(const QString& value); + QString getDefaultCustomTitle() const; + bool getEnableMetadata() const; + void setEnableMetadata(bool value); + bool getDefaultEnableMetadata() const; + bool getEnableReconnect() const; + void setEnableReconnect(bool value); + bool getDefaultEnableReconnect() const; + bool getEnabled() const; + void setEnabled(bool value); + QString getFormat() const; + void setFormat(const QString& value); + QString getDefaultFormat() const; + QString getHost() const; + void setHost(const QString& value); + QString getDefaultHost() const; + bool getLimitReconnects() const; + void setLimitReconnects(bool value); + bool getDefaultLimitReconnects() const; + QString getLogin() const; + void setLogin(const QString& value); + QString getDefaultLogin() const; + int getMaximumRetries() const; + void setMaximumRetries(int value); + int getDefaultMaximumRetries() const; + QString getMetadataCharset() const; + void setMetadataCharset(const QString& value); + QString getDefaultMetadataCharset() const; + QString getMetadataFormat() const; + void setMetadataFormat(const QString& value); + QString getDefaultMetadataFormat() const; + QString getMountpoint() const; + void setMountPoint(const QString& value); + QString getDefaultMountpoint() const; + bool getNoDelayFirstReconnect() const; + void setNoDelayFirstReconnect(bool value); + bool getDefaultNoDelayFirstReconnect() const; + bool getOggDynamicUpdate() const; + void setOggDynamicUpdate(bool value); + bool getDefaultOggDynamicUpdate() const; + QString getPassword() const; + void setPassword(const QString& value); + QString getDefaultPassword() const; + int getPort() const; + void setPort(int value); + int getDefaultPort() const; + double getReconnectFirstDelay() const; + void setReconnectFirstDelay(double value); + double getDefaultReconnectFirstDelay() const; + double getReconnectPeriod() const; + void setReconnectPeriod(double value); + double getDefaultReconnectPeriod() const; + QString getServertype() const; + void setServertype(const QString& value); + QString getDefaultServertype() const; + QString getStreamDesc() const; + void setStreamDesc(const QString& value); + QString getDefaultStreamDesc() const; + QString getStreamGenre() const; + void setStreamGenre(const QString& value); + QString getDefaultStreamGenre() const; + QString getStreamName() const; + void setStreamName(const QString& value); + QString getDefaultStreamName() const; + bool getStreamPublic() const; + void setStreamPublic(bool value); + bool getDefaultStreamPublic() const; + QString getStreamWebsite() const; + void setStreamWebsite(const QString& value); + QString getDefaultStreamWebsite() const; + + private: + // Pointer to config object + UserSettingsPointer m_pConfig; +}; + +#endif /* PREFERENCES_BROADCASTSETTINGS_H */ diff --git a/src/preferences/configobject.cpp b/src/preferences/configobject.cpp index 446c6d778cae..fc0c5a4ddd68 100644 --- a/src/preferences/configobject.cpp +++ b/src/preferences/configobject.cpp @@ -302,6 +302,12 @@ void ConfigObject::setValue( set(key, ConfigValue(QString::number(value))); } +template <> template <> +void ConfigObject::setValue( + const ConfigKey& key, const double& value) { + set(key, ConfigValue(QString::number(value))); +} + template <> template <> bool ConfigObject::getValue( const ConfigKey& key, const bool& default_value) const { diff --git a/src/preferences/dialog/dlgprefbroadcast.cpp b/src/preferences/dialog/dlgprefbroadcast.cpp index 3ce4bdcc76eb..5cba6f33eed3 100644 --- a/src/preferences/dialog/dlgprefbroadcast.cpp +++ b/src/preferences/dialog/dlgprefbroadcast.cpp @@ -5,11 +5,9 @@ #include "defs_urls.h" #include "preferences/dialog/dlgprefbroadcast.h" -static const char* kDefaultMetadataFormat = "$artist - $title"; - DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) : DlgPreferencePage(parent), - m_pConfig(_config) { + m_settings(_config) { setupUi(this); m_pBroadcastEnabled = new ControlProxy( @@ -27,38 +25,31 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) comboBoxServerType->addItem(tr("Shoutcast 1"), BROADCAST_SERVER_SHOUTCAST); comboBoxServerType->addItem(tr("Icecast 1"), BROADCAST_SERVER_ICECAST1); - int tmp_index = comboBoxServerType->findData(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "servertype"))); - if (tmp_index < 0) { //Set default if invalid. + int tmp_index = comboBoxServerType->findData(m_settings.getServertype()); + if (tmp_index < 0) { // Set default if invalid. tmp_index = 0; } comboBoxServerType->setCurrentIndex(tmp_index); // Mountpoint - mountpoint->setText(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "mountpoint"))); + mountpoint->setText(m_settings.getMountpoint()); // Host - host->setText(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "host"))); + host->setText(m_settings.getHost()); // Port - QString tmp_string = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "port")); - port->setText(tmp_string); + QString portString = QString::number(m_settings.getPort()); + port->setText(portString); // Login - login->setText(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "login"))); + login->setText(m_settings.getLogin()); // Password - password->setText(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "password"))); + password->setText(m_settings.getPassword()); // Enable automatic reconnect - bool enableReconnect = m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY, "enable_reconnect"), true); + bool enableReconnect = m_settings.getEnableReconnect(); checkBoxEnableReconnect->setChecked(enableReconnect); widgetReconnectControls->setEnabled(enableReconnect); connect(checkBoxEnableReconnect, SIGNAL(stateChanged(int)), @@ -66,16 +57,13 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) // Wait until first attempt - spinBoxFirstDelay->setValue(m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY, "reconnect_first_delay"), 0.0)); + spinBoxFirstDelay->setValue(m_settings.getReconnectFirstDelay()); // Retry Delay - spinBoxReconnectPeriod->setValue(m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY, "reconnect_period"), 5.0)); + spinBoxReconnectPeriod->setValue(m_settings.getReconnectPeriod()); // Use Maximum Retries - bool limitConnects = m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY, "limit_reconnects"), true); + bool limitConnects = m_settings.getLimitReconnects(); checkBoxLimitReconnects->setChecked( limitConnects); spinBoxMaximumRetries->setEnabled(limitConnects); @@ -83,42 +71,23 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) this, SLOT(checkBoxLimitReconnectsChanged(int))); // Maximum Retries - spinBoxMaximumRetries->setValue(m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), 10)); + spinBoxMaximumRetries->setValue(m_settings.getMaximumRetries()); // Stream "public" checkbox - stream_public->setChecked(m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY, "stream_public"), false)); + stream_public->setChecked(m_settings.getStreamPublic()); // Stream name - stream_name->setText(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "stream_name"))); + stream_name->setText(m_settings.getStreamName()); // Stream website - tmp_string = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"stream_website")); - if (tmp_string.isEmpty()) { - tmp_string = MIXXX_WEBSITE_URL; - } - stream_website->setText(tmp_string); + stream_website->setText(m_settings.getStreamWebsite()); // Stream description - tmp_string = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"stream_desc")); - if (tmp_string.isEmpty()) { - tmp_string = tr("This stream is online for testing purposes!"); - } - stream_desc->setText(tmp_string); + stream_desc->setText(m_settings.getStreamDesc()); // Stream genre - tmp_string = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"stream_genre")); - if (tmp_string.isEmpty()) { - tmp_string = tr("Live Mix"); - } - stream_genre->setText(tmp_string); - + stream_genre->setText(m_settings.getStreamGenre()); // Encoding bitrate combobox QString kbps_pattern = QString("%1 kbps"); @@ -140,8 +109,7 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) kbps_pattern.arg(QString::number(kbps)), kbps); } - tmp_index = comboBoxEncodingBitrate->findData(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "bitrate")).toInt()); + tmp_index = comboBoxEncodingBitrate->findData(m_settings.getBitrate()); if (tmp_index < 0) { tmp_index = comboBoxEncodingBitrate->findData(BROADCAST_BITRATE_128KBPS); } @@ -150,8 +118,7 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) // Encoding format combobox comboBoxEncodingFormat->addItem(tr("MP3"), BROADCAST_FORMAT_MP3); comboBoxEncodingFormat->addItem(tr("Ogg Vorbis"), BROADCAST_FORMAT_OV); - tmp_index = comboBoxEncodingFormat->findData(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "format"))); + tmp_index = comboBoxEncodingFormat->findData(m_settings.getFormat()); if (tmp_index < 0) { // Set default of MP3 if invalid. tmp_index = 0; @@ -160,33 +127,23 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) // Encoding channels combobox comboBoxEncodingChannels->addItem(tr("Stereo"), BROADCAST_CHANNELS_STEREO); - tmp_index = comboBoxEncodingChannels->findData(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "channels"))); - if (tmp_index < 0) { //Set default to stereo if invalid. + tmp_index = comboBoxEncodingChannels->findData(m_settings.getChannels()); + if (tmp_index < 0) { // Set default to stereo if invalid. tmp_index = 0; } comboBoxEncodingChannels->setCurrentIndex(tmp_index); // Metadata format - tmp_string = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"metadata_format")); - if (tmp_string.isEmpty()) { - // No tr() here, see https://bugs.launchpad.net/mixxx/+bug/1419500 - tmp_string = kDefaultMetadataFormat; - } - metadata_format->setText(tmp_string); + metadata_format->setText(m_settings.getMetadataFormat()); // Static artist - custom_artist->setText(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"custom_artist"))); + custom_artist->setText(m_settings.getCustomArtist()); // Static title - custom_title->setText(m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY,"custom_title"))); + custom_title->setText(m_settings.getCustomTitle()); // "Enable static artist and title" checkbox - bool enableMetadata = m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY,"enable_metadata"), false); + bool enableMetadata = m_settings.getEnableMetadata(); enableCustomMetadata->setChecked(enableMetadata); custom_artist->setEnabled(enableMetadata); custom_title->setEnabled(enableMetadata); @@ -195,13 +152,11 @@ DlgPrefBroadcast::DlgPrefBroadcast(QWidget *parent, UserSettingsPointer _config) // "Enable UTF-8 metadata" checkbox // TODO(rryan): allow arbitrary codecs in the future? - QString charset = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "metadata_charset")); + QString charset = m_settings.getMetadataCharset(); enableUtf8Metadata->setChecked(charset == "UTF-8"); // OGG "dynamicupdate" checkbox - ogg_dynamicupdate->setChecked(m_pConfig->getValue( - ConfigKey(BROADCAST_PREF_KEY,"ogg_dynamicupdate"), false)); + ogg_dynamicupdate->setChecked(m_settings.getOggDynamicUpdate()); slotApply(); } @@ -213,35 +168,39 @@ void DlgPrefBroadcast::slotResetToDefaults() { // Make sure to keep these values in sync with the constructor. enableLiveBroadcasting->setChecked(false); comboBoxServerType->setCurrentIndex(0); - mountpoint->setText(""); - host->setText(""); - port->setText(""); - login->setText(""); - password->setText(""); + mountpoint->setText(m_settings.getDefaultMountpoint()); + host->setText(m_settings.getDefaultHost()); + int iPort = m_settings.getDefaultPort(); + if (iPort != 0 && iPort <= 0xffff) { + port->setText(QString::number(m_settings.getDefaultPort())); + } else { + port->setText(QString()); + } + login->setText(m_settings.getDefaultLogin()); + password->setText(m_settings.getDefaultPassword()); - checkBoxEnableReconnect->setChecked(true); + checkBoxEnableReconnect->setChecked(m_settings.getDefaultEnableReconnect()); widgetReconnectControls->setEnabled(true); - spinBoxFirstDelay->setValue(0.0); - spinBoxReconnectPeriod->setValue(5.0); - checkBoxLimitReconnects->setChecked(true); - spinBoxMaximumRetries->setValue(10); + spinBoxFirstDelay->setValue(m_settings.getDefaultReconnectFirstDelay()); + spinBoxReconnectPeriod->setValue(m_settings.getDefaultReconnectPeriod()); + checkBoxLimitReconnects->setChecked(m_settings.getDefaultLimitReconnects()); + spinBoxMaximumRetries->setValue(m_settings.getDefaultMaximumRetries()); spinBoxMaximumRetries->setEnabled(true); - stream_name->setText(""); - stream_website->setText(MIXXX_WEBSITE_URL); - stream_desc->setText(tr("This stream is online for testing purposes!")); - stream_genre->setText(tr("Live Mix")); - stream_public->setChecked(false); - ogg_dynamicupdate->setChecked(false); + stream_name->setText(m_settings.getDefaultStreamName()); + stream_website->setText(m_settings.getDefaultStreamName()); + stream_desc->setText(m_settings.getDefaultStreamDesc()); + stream_genre->setText(m_settings.getDefaultStreamGenre()); + stream_public->setChecked(m_settings.getDefaultStreamPublic()); + ogg_dynamicupdate->setChecked(m_settings.getDefaultOggDynamicUpdate()); comboBoxEncodingBitrate->setCurrentIndex(comboBoxEncodingBitrate->findData( - BROADCAST_BITRATE_128KBPS)); + m_settings.getDefaultBitrate())); comboBoxEncodingFormat->setCurrentIndex(0); comboBoxEncodingChannels->setCurrentIndex(0); enableUtf8Metadata->setChecked(false); enableCustomMetadata->setChecked(false); - // No tr() here, see https://bugs.launchpad.net/mixxx/+bug/1419500 - metadata_format->setText(kDefaultMetadataFormat); - custom_artist->setText(""); - custom_title->setText(""); + metadata_format->setText(m_settings.getDefaultMetadataFormat()); + custom_artist->setText(m_settings.getDefaultCustomArtist()); + custom_title->setText(m_settings.getDefaultCustomTitle()); custom_artist->setEnabled(false); custom_title->setEnabled(false); } @@ -271,72 +230,51 @@ void DlgPrefBroadcast::slotApply() } // Combo boxes, make sure to load their data not their display strings. - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "servertype"), - ConfigValue(comboBoxServerType->itemData( - comboBoxServerType->currentIndex()).toString())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "bitrate"), - ConfigValue(comboBoxEncodingBitrate->itemData( - comboBoxEncodingBitrate->currentIndex()).toString())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "format"), - ConfigValue(comboBoxEncodingFormat->itemData( - comboBoxEncodingFormat->currentIndex()).toString())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "channels"), - ConfigValue(comboBoxEncodingChannels->itemData( - comboBoxEncodingChannels->currentIndex()).toString())); + m_settings.setServertype(comboBoxServerType->itemData( + comboBoxServerType->currentIndex()).toString()); + m_settings.setBitrate(comboBoxEncodingBitrate->itemData( + comboBoxEncodingBitrate->currentIndex()).toInt()); + m_settings.setFormat(comboBoxEncodingFormat->itemData( + comboBoxEncodingFormat->currentIndex()).toString()); + m_settings.setChannels(comboBoxEncodingChannels->itemData( + comboBoxEncodingChannels->currentIndex()).toInt()); mountpoint->setText(mountpoint->text().trimmed()); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "mountpoint"), - ConfigValue(mountpoint->text())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "host"), - ConfigValue(host->text())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "port"), - ConfigValue(port->text())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "login"), - ConfigValue(login->text())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "password"), - ConfigValue(password->text())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "enable_reconnect"), - ConfigValue(checkBoxEnableReconnect->isChecked())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "reconnect_first_delay"), - ConfigValue(QString::number(spinBoxFirstDelay->value()))); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "reconnect_period"), - ConfigValue(QString::number(spinBoxReconnectPeriod->value()))); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "limit_reconnects"), - ConfigValue(checkBoxLimitReconnects->isChecked())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "maximum_retries"), - ConfigValue(spinBoxMaximumRetries->value())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "stream_name"), - ConfigValue(stream_name->text())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "stream_website"), - ConfigValue(stream_website->text())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "stream_desc"), - ConfigValue(stream_desc->toPlainText())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "stream_genre"), - ConfigValue(stream_genre->text())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "stream_public"), - ConfigValue(stream_public->isChecked())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "ogg_dynamicupdate"), - ConfigValue(ogg_dynamicupdate->isChecked())); + m_settings.setMountPoint(mountpoint->text()); + m_settings.setHost(host->text()); + m_settings.setPort(port->text().toInt()); + m_settings.setLogin(login->text()); + m_settings.setPassword(password->text()); + m_settings.setEnableReconnect(checkBoxEnableReconnect->isChecked()); + m_settings.setReconnectFirstDelay(spinBoxFirstDelay->value()); + m_settings.setReconnectPeriod(spinBoxReconnectPeriod->value()); + m_settings.setLimitReconnects(checkBoxLimitReconnects->isChecked()); + m_settings.setMaximumRetries(spinBoxMaximumRetries->value()); + m_settings.setStreamName(stream_name->text()); + m_settings.setStreamWebsite(stream_website->text()); + m_settings.setStreamDesc(stream_desc->toPlainText()); + m_settings.setStreamGenre(stream_genre->text()); + m_settings.setStreamPublic(stream_public->isChecked()); + m_settings.setOggDynamicUpdate(ogg_dynamicupdate->isChecked()); QString charset = ""; if (enableUtf8Metadata->isChecked()) { charset = "UTF-8"; } - QString current_charset = m_pConfig->getValueString( - ConfigKey(BROADCAST_PREF_KEY, "metadata_charset")); + QString current_charset = m_settings.getMetadataCharset(); // Only allow setting the config value if the current value is either empty // or "UTF-8". This way users can customize the charset to something else by // setting the value in their mixxx.cfg. Not sure if this will be useful but // it's good to leave the option open. if (current_charset.length() == 0 || current_charset == "UTF-8") { - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "metadata_charset"), ConfigValue(charset)); + m_settings.setMetadataCharset(charset); } - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "enable_metadata"),ConfigValue(enableCustomMetadata->isChecked())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "custom_artist"), ConfigValue(custom_artist->text())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "custom_title"), ConfigValue(custom_title->text())); - m_pConfig->set(ConfigKey(BROADCAST_PREF_KEY, "metadata_format"), ConfigValue(metadata_format->text())); + m_settings.setEnableMetadata(enableCustomMetadata->isChecked()); + m_settings.setCustomArtist(custom_artist->text()); + m_settings.setCustomTitle(custom_title->text()); + m_settings.setMetadataFormat(metadata_format->text()); } void DlgPrefBroadcast::broadcastEnabledChanged(double value) { diff --git a/src/preferences/dialog/dlgprefbroadcast.h b/src/preferences/dialog/dlgprefbroadcast.h index 5e4743d2cd8f..2f1fc4d24208 100644 --- a/src/preferences/dialog/dlgprefbroadcast.h +++ b/src/preferences/dialog/dlgprefbroadcast.h @@ -8,6 +8,7 @@ #include "preferences/usersettings.h" #include "broadcast/defs_broadcast.h" #include "preferences/dlgpreferencepage.h" +#include "preferences/broadcastsettings.h" class ControlProxy; @@ -31,7 +32,7 @@ class DlgPrefBroadcast : public DlgPreferencePage, public Ui::DlgPrefBroadcastDl void apply(const QString &); private: - UserSettingsPointer m_pConfig; + BroadcastSettings m_settings; ControlProxy* m_pBroadcastEnabled; }; diff --git a/src/preferences/replaygainsettings.cpp b/src/preferences/replaygainsettings.cpp index 13a5e3123cf9..e72f8dd7ccec 100644 --- a/src/preferences/replaygainsettings.cpp +++ b/src/preferences/replaygainsettings.cpp @@ -1,10 +1,3 @@ -/* - * replaygainsettings.cpp - * - * Created on: 09.03.2016 - * Author: daniel - */ - #include "preferences/replaygainsettings.h" namespace { From 37eaf667fcaa65eba241fc0a739f7352d9fc86f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 29 Dec 2016 12:45:11 +0100 Subject: [PATCH 27/34] Remove flush calls to avoid recursive calls --- src/engine/sidechain/enginebroadcast.cpp | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/engine/sidechain/enginebroadcast.cpp b/src/engine/sidechain/enginebroadcast.cpp index 26047e0fef90..adf7e79e457a 100644 --- a/src/engine/sidechain/enginebroadcast.cpp +++ b/src/engine/sidechain/enginebroadcast.cpp @@ -512,16 +512,12 @@ bool EngineBroadcast::processConnect() { qDebug() << "EngineBroadcast::processConnect() error:" << m_iShoutStatus << m_lastErrorStr; } - } else { - // no connection - } + + // no connection, clean up shout_close(m_pShout); - if (m_encoder) { - m_encoder->flush(); - delete m_encoder; - m_encoder = nullptr; - } + delete m_encoder; + m_encoder = nullptr; if (m_pBroadcastEnabled->toBool()) { m_pStatusCO->setAndConfirm(STATUSCO_FAILURE); } else { @@ -542,12 +538,8 @@ bool EngineBroadcast::processDisconnect() { emit(broadcastDisconnected()); disconnected = true; } - - if (m_encoder) { - m_encoder->flush(); - delete m_encoder; - m_encoder = nullptr; - } + delete m_encoder; + m_encoder = nullptr; return disconnected; } From c86a578a7fef74512d7528a697102e62eed9d196 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 29 Dec 2016 14:49:17 +0100 Subject: [PATCH 28/34] clarify what happens if the encoder calls flush() --- src/engine/sidechain/enginebroadcast.cpp | 55 +++++++++++++----------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/src/engine/sidechain/enginebroadcast.cpp b/src/engine/sidechain/enginebroadcast.cpp index adf7e79e457a..5e0244c29874 100644 --- a/src/engine/sidechain/enginebroadcast.cpp +++ b/src/engine/sidechain/enginebroadcast.cpp @@ -148,13 +148,12 @@ void EngineBroadcast::updateFromPreferences() { setState(NETWORKSTREAMWORKER_STATE_BUSY); - if (m_encoder) { - qDebug() << "delete m_encoder"; - // delete m_encoder if it has been initialized (with maybe) different - // bitrate - delete m_encoder; - m_encoder = nullptr; - } + // delete m_encoder if it has been initialized (with maybe) different + // bitrate + // delete m_encoder calls write() check if it will be exit early + DEBUG_ASSERT(m_iShoutStatus != SHOUTERR_CONNECTED); + delete m_encoder; + m_encoder = nullptr; m_format_is_mp3 = false; m_format_is_ov = false; @@ -381,6 +380,8 @@ void EngineBroadcast::updateFromPreferences() { // e.g., if lame is not found // init m_encoder itself will display a message box qDebug() << "**** Encoder init failed"; + // delete m_encoder calls write() make sure it will be exit early + DEBUG_ASSERT(m_iShoutStatus != SHOUTERR_CONNECTED); delete m_encoder; m_encoder = nullptr; setState(NETWORKSTREAMWORKER_STATE_ERROR); @@ -516,6 +517,8 @@ bool EngineBroadcast::processConnect() { // no connection, clean up shout_close(m_pShout); + // delete m_encoder calls write() check if it will be exit early + DEBUG_ASSERT(m_iShoutStatus != SHOUTERR_CONNECTED); delete m_encoder; m_encoder = nullptr; if (m_pBroadcastEnabled->toBool()) { @@ -538,6 +541,8 @@ bool EngineBroadcast::processDisconnect() { emit(broadcastDisconnected()); disconnected = true; } + // delete m_encoder calls write() check if it will be exit early + DEBUG_ASSERT(m_iShoutStatus != SHOUTERR_CONNECTED); delete m_encoder; m_encoder = nullptr; return disconnected; @@ -546,30 +551,30 @@ bool EngineBroadcast::processDisconnect() { void EngineBroadcast::write(unsigned char *header, unsigned char *body, int headerLen, int bodyLen) { setFunctionCode(7); - if (!m_pShout) { + if (!m_pShout || m_iShoutStatus != SHOUTERR_CONNECTED) { + // This happens when the decoder calls flush() and the connection is + // already down return; } - if (m_iShoutStatus == SHOUTERR_CONNECTED) { - // Send header if there is one - if (headerLen > 0) { - if(!writeSingle(header, headerLen)) { - return; - } - } - - if(!writeSingle(body, bodyLen)) { + // Send header if there is one + if (headerLen > 0) { + if(!writeSingle(header, headerLen)) { return; } + } - ssize_t queuelen = shout_queuelen(m_pShout); - if (queuelen > 0) { - qDebug() << "shout_queuelen" << queuelen; - NetworkStreamWorker::debugState(); - if (queuelen > kMaxNetworkCache) { - m_lastErrorStr = tr("Network cache overflow"); - tryReconnect(); - } + if(!writeSingle(body, bodyLen)) { + return; + } + + ssize_t queuelen = shout_queuelen(m_pShout); + if (queuelen > 0) { + qDebug() << "shout_queuelen" << queuelen; + NetworkStreamWorker::debugState(); + if (queuelen > kMaxNetworkCache) { + m_lastErrorStr = tr("Network cache overflow"); + tryReconnect(); } } } From 1624c25b9b3f2c68bd638459b66f1e85267daa93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 29 Dec 2016 15:13:04 +0100 Subject: [PATCH 29/34] Make handling of preferences geomety more save against faulty preferences --- src/preferences/dialog/dlgpreferences.cpp | 31 ++++++++++------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/src/preferences/dialog/dlgpreferences.cpp b/src/preferences/dialog/dlgpreferences.cpp index 106a62c9a769..f6cf20dbd4ec 100644 --- a/src/preferences/dialog/dlgpreferences.cpp +++ b/src/preferences/dialog/dlgpreferences.cpp @@ -144,8 +144,10 @@ DlgPreferences::DlgPreferences(MixxxMainWindow * mixxx, SkinLoader* pSkinLoader, DlgPreferences::~DlgPreferences() { // store last geometry in mixxx.cfg - m_pConfig->set(ConfigKey("[Preferences]","geometry"), - m_geometry.join(",")); + if (m_geometry.size() == 4) { + m_pConfig->set(ConfigKey("[Preferences]","geometry"), + m_geometry.join(",")); + } // Need to explicitly delete rather than relying on child auto-deletion // because otherwise the QStackedWidget will delete the controller @@ -351,24 +353,19 @@ void DlgPreferences::onHide() { } void DlgPreferences::onShow() { - // - // Read last geometry (size and position) of preferences panel - // Bug#1299949 - // // init m_geometry if (m_geometry.length() < 4) { // load default values (optimum size) - QRect defaultGeometry = getDefaultGeometry(); - QString defaultGeometryStr = QString("%1,%2,%3,%4") - .arg(defaultGeometry.left()) - .arg(defaultGeometry.top()) - .arg(defaultGeometry.width()) - .arg(defaultGeometry.height()); - - // get last geometry OR use default values from - m_geometry = m_pConfig->getValueString( - ConfigKey("[Preferences]", "geometry"), - defaultGeometryStr).split(","); + m_geometry = m_pConfig->getValue( + ConfigKey("[Preferences]", "geometry")).split(","); + if (m_geometry.length() < 4) { + QRect defaultGeometry = getDefaultGeometry(); + m_geometry.clear(); + m_geometry.append(QString::number(defaultGeometry.left())); + m_geometry.append(QString::number(defaultGeometry.top())); + m_geometry.append(QString::number(defaultGeometry.width())); + m_geometry.append(QString::number(defaultGeometry.height())); + } } // Update geometry with last values From bf13f1e42d6ea21d517a97305cfe9eabc4bdf148 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 29 Dec 2016 15:14:10 +0100 Subject: [PATCH 30/34] Improve error messages when there are noe retries configured --- src/engine/sidechain/enginebroadcast.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/engine/sidechain/enginebroadcast.cpp b/src/engine/sidechain/enginebroadcast.cpp index 5e0244c29874..acf47b9a9a63 100644 --- a/src/engine/sidechain/enginebroadcast.cpp +++ b/src/engine/sidechain/enginebroadcast.cpp @@ -947,10 +947,16 @@ void EngineBroadcast::tryReconnect() { if (m_pStatusCO->get() == STATUSCO_FAILURE) { m_pBroadcastEnabled->set(0); m_readSema.release(); - errorDialog(tr("Lost connection to streaming server and %1 attempts to reconnect have failed.") - .arg(m_retryCount), + QString errorText; + if (m_retryCount > 0) { + errorText = tr("Lost connection to streaming server and %1 attempts to reconnect have failed.") + .arg(m_retryCount); + } else { + errorText = tr("Lost connection to streaming server."); + } + errorDialog(errorText, originalErrorStr + "\n" + m_lastErrorStr + "\n" + - tr("Please check your connection to the Internet")); + tr("Please check your connection to the Internet.")); } } From ff6fe9f714c379aca579a83790a42e8f346fa27b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sun, 1 Jan 2017 14:57:10 +0100 Subject: [PATCH 31/34] remove inline getValueString to fix Mac build --- src/analyzer/analyzerkey.cpp | 4 +- src/engine/cuecontrol.cpp | 4 +- src/engine/enginemaster.cpp | 4 +- src/engine/enginetalkoverducking.cpp | 6 +- src/library/baseplaylistfeature.cpp | 2 +- src/library/cratefeature.cpp | 2 +- src/library/dao/autodjcratesdao.cpp | 12 +-- src/library/export/trackexportwizard.cpp | 2 +- src/library/library.cpp | 13 ++- src/library/libraryfeature.cpp | 2 +- src/mixer/basetrackplayer.cpp | 8 +- src/mixxx.cpp | 3 +- src/preferences/configobject.h | 6 -- src/preferences/dialog/dlgprefautodj.cpp | 100 +++++++++--------- src/preferences/dialog/dlgprefcontrols.cpp | 12 +-- src/preferences/dialog/dlgprefcrossfader.cpp | 4 +- src/preferences/dialog/dlgprefeq.cpp | 18 ++-- src/preferences/dialog/dlgpreflibrary.cpp | 34 +++---- src/preferences/dialog/dlgprefsound.cpp | 4 +- src/preferences/dialog/dlgprefvinyl.cpp | 20 ++-- src/preferences/dialog/dlgprefwaveform.cpp | 4 +- src/preferences/replaygainsettings.cpp | 22 ++-- src/preferences/upgrade.cpp | 4 +- src/skin/legacyskinparser.cpp | 2 +- src/vinylcontrol/vinylcontrolmanager.cpp | 13 ++- src/waveform/waveformwidgetfactory.cpp | 9 +- src/widget/wmainmenubar.cpp | 102 +++++++++---------- 27 files changed, 205 insertions(+), 211 deletions(-) diff --git a/src/analyzer/analyzerkey.cpp b/src/analyzer/analyzerkey.cpp index 3b0c7624f9eb..ddd41519acfc 100644 --- a/src/analyzer/analyzerkey.cpp +++ b/src/analyzer/analyzerkey.cpp @@ -40,11 +40,11 @@ bool AnalyzerKey::initialize(TrackPointer tio, int sampleRate, int totalSamples) m_bPreferencesFastAnalysisEnabled = static_cast( m_pConfig->getValueString( ConfigKey(KEY_CONFIG_KEY, KEY_FAST_ANALYSIS)).toInt()); - QString library = m_pConfig->getValueString( + QString library = m_pConfig->getValue( ConfigKey(VAMP_CONFIG_KEY, VAMP_ANALYZER_KEY_LIBRARY), // TODO(rryan) this default really doesn't belong here. "libmixxxminimal"); - QString pluginID = m_pConfig->getValueString( + QString pluginID = m_pConfig->getValue( ConfigKey(VAMP_CONFIG_KEY, VAMP_ANALYZER_KEY_PLUGIN_ID), // TODO(rryan) this default really doesn't belong here. VAMP_ANALYZER_KEY_DEFAULT_PLUGIN_ID); diff --git a/src/engine/cuecontrol.cpp b/src/engine/cuecontrol.cpp index 4c36125a1a9c..b64fae00c25a 100644 --- a/src/engine/cuecontrol.cpp +++ b/src/engine/cuecontrol.cpp @@ -259,8 +259,8 @@ void CueControl::trackLoaded(TrackPointer pNewTrack, TrackPointer pOldTrack) { double loadCuePoint = 0.0; // If cue recall is ON in the prefs, then we're supposed to seek to the cue // point on song load. Note that [Controls],cueRecall == 0 corresponds to "ON", not OFF. - bool cueRecall = (getConfig()->getValueString( - ConfigKey("[Controls]","CueRecall"), "0").toInt() == 0); + bool cueRecall = (getConfig()->getValue( + ConfigKey("[Controls]","CueRecall"), 0) == 0); if (loadCue != NULL) { m_pCuePoint->set(loadCue->getPosition()); if (cueRecall) { diff --git a/src/engine/enginemaster.cpp b/src/engine/enginemaster.cpp index b1acdf9445ad..d4cbe1726434 100644 --- a/src/engine/enginemaster.cpp +++ b/src/engine/enginemaster.cpp @@ -74,8 +74,8 @@ EngineMaster::EngineMaster(UserSettingsPointer pConfig, m_pMasterSync = new EngineSync(pConfig); // The last-used bpm value is saved in the destructor of EngineSync. - double default_bpm = pConfig->getValueString(ConfigKey("[InternalClock]", "bpm"), - "124.0").toDouble(); + double default_bpm = pConfig->getValue( + ConfigKey("[InternalClock]", "bpm"), 124.0); ControlObject::getControl(ConfigKey("[InternalClock]","bpm"))->set(default_bpm); // Crossfader diff --git a/src/engine/enginetalkoverducking.cpp b/src/engine/enginetalkoverducking.cpp index a5017a747afc..290db999fd0d 100644 --- a/src/engine/enginetalkoverducking.cpp +++ b/src/engine/enginetalkoverducking.cpp @@ -14,7 +14,7 @@ EngineTalkoverDucking::EngineTalkoverDucking( m_pDuckStrength = new ControlPotmeter(ConfigKey(m_group, "duckStrength"), 0.0, 1.0); m_pDuckStrength->set( - m_pConfig->getValueString(ConfigKey(m_group, "duckStrength"), "90").toDouble() / 100); + m_pConfig->getValue(ConfigKey(m_group, "duckStrength"), 90) / 100); connect(m_pDuckStrength, SIGNAL(valueChanged(double)), this, SLOT(slotDuckStrengthChanged(double)), Qt::DirectConnection); @@ -32,8 +32,8 @@ EngineTalkoverDucking::EngineTalkoverDucking( m_pTalkoverDucking->setButtonMode(ControlPushButton::TOGGLE); m_pTalkoverDucking->setStates(3); m_pTalkoverDucking->set( - m_pConfig->getValueString( - ConfigKey(m_group, "duckMode"), QString::number(AUTO)).toDouble()); + m_pConfig->getValue( + ConfigKey(m_group, "duckMode"), AUTO)); connect(m_pTalkoverDucking, SIGNAL(valueChanged(double)), this, SLOT(slotDuckModeChanged(double)), Qt::DirectConnection); diff --git a/src/library/baseplaylistfeature.cpp b/src/library/baseplaylistfeature.cpp index 3a40d0bf4880..537a58a8f869 100644 --- a/src/library/baseplaylistfeature.cpp +++ b/src/library/baseplaylistfeature.cpp @@ -451,7 +451,7 @@ void BasePlaylistFeature::slotExportPlaylist() { QString playlistName = m_playlistDao.getPlaylistName(playlistId); qDebug() << "Export playlist" << playlistName; - QString lastPlaylistDirectory = m_pConfig->getValueString( + QString lastPlaylistDirectory = m_pConfig->getValue( ConfigKey("[Library]", "LastImportExportPlaylistDirectory"), QDesktopServices::storageLocation(QDesktopServices::MusicLocation)); diff --git a/src/library/cratefeature.cpp b/src/library/cratefeature.cpp index 49c4560b8edb..4940b1694fc1 100644 --- a/src/library/cratefeature.cpp +++ b/src/library/cratefeature.cpp @@ -687,7 +687,7 @@ void CrateFeature::slotExportPlaylist() { QString crateName = m_crateDao.crateName(crateId); qDebug() << "Export crate" << crateId << crateName; - QString lastCrateDirectory = m_pConfig->getValueString( + QString lastCrateDirectory = m_pConfig->getValue( ConfigKey("[Library]", "LastImportExportCrateDirectory"), QDesktopServices::storageLocation(QDesktopServices::MusicLocation)); diff --git a/src/library/dao/autodjcratesdao.cpp b/src/library/dao/autodjcratesdao.cpp index ecfc97ed1d6e..62d12a30e37e 100644 --- a/src/library/dao/autodjcratesdao.cpp +++ b/src/library/dao/autodjcratesdao.cpp @@ -43,8 +43,8 @@ void AutoDJCratesDAO::initialize() { void AutoDJCratesDAO::createAutoDjCratesDatabase() { // If the use of tracks that haven't been played in a while has changed, // then the active-tracks view must be recreated. - bool bUseIgnoreTime = (bool) m_pConfig->getValueString( - ConfigKey("[Auto DJ]", "UseIgnoreTime"), "0").toInt(); + bool bUseIgnoreTime = m_pConfig->getValue( + ConfigKey("[Auto DJ]", "UseIgnoreTime"), false); if (m_bAutoDjCratesDbCreated) { if (m_bUseIgnoreTime != bUseIgnoreTime) { // Do all this in a single transaction. @@ -444,8 +444,8 @@ int AutoDJCratesDAO::getRandomTrackId(void) { } // Get the active percentage (default 20%). - int iMinimumAvailable = m_pConfig->getValueString (ConfigKey("[Auto DJ]", - "MinimumAvailable"), "20").toInt(); + int iMinimumAvailable = m_pConfig->getValue( + ConfigKey("[Auto DJ]", "MinimumAvailable"), 20); // Calculate the number of active-tracks. This is either the number of // auto-DJ-crate tracks that have never been played, or the active @@ -464,8 +464,8 @@ int AutoDJCratesDAO::getRandomTrackId(void) { QDateTime timCurrent = QDateTime::currentDateTime().toUTC(); // Subtract the replay age. - QTime timIgnoreTime = (QTime::fromString(m_pConfig->getValueString - (ConfigKey("[Auto DJ]", "IgnoreTime"), "23:59"), "hh:mm")); + QTime timIgnoreTime = (QTime::fromString(m_pConfig->getValue( + ConfigKey("[Auto DJ]", "IgnoreTime"), "23:59"), "hh:mm")); timCurrent = timCurrent.addSecs(-(timIgnoreTime.hour() * 3600 + timIgnoreTime.minute() * 60)); diff --git a/src/library/export/trackexportwizard.cpp b/src/library/export/trackexportwizard.cpp index 9f6deb752f55..c0714f876432 100644 --- a/src/library/export/trackexportwizard.cpp +++ b/src/library/export/trackexportwizard.cpp @@ -16,7 +16,7 @@ void TrackExportWizard::exportTracks() { } bool TrackExportWizard::selectDestinationDirectory() { - QString lastExportDirectory = m_pConfig->getValueString( + QString lastExportDirectory = m_pConfig->getValue( ConfigKey("[Library]", "LastTrackCopyDirectory"), QDesktopServices::storageLocation(QDesktopServices::MusicLocation)); diff --git a/src/library/library.cpp b/src/library/library.cpp index ecd047146331..8d8d3548cf20 100644 --- a/src/library/library.cpp +++ b/src/library/library.cpp @@ -95,21 +95,21 @@ Library::Library(QObject* parent, UserSettingsPointer pConfig, //messagebox popup when you select them. (This forces you to reach for your //mouse or keyboard if you're using MIDI control and you scroll through them...) if (RhythmboxFeature::isSupported() && - pConfig->getValueString(ConfigKey("[Library]","ShowRhythmboxLibrary"),"1").toInt()) { + pConfig->getValue(ConfigKey("[Library]","ShowRhythmboxLibrary"), true)) { addFeature(new RhythmboxFeature(this, m_pTrackCollection)); } - if (pConfig->getValueString(ConfigKey("[Library]","ShowBansheeLibrary"),"1").toInt()) { + if (pConfig->getValue(ConfigKey("[Library]","ShowBansheeLibrary"), true)) { BansheeFeature::prepareDbPath(pConfig); if (BansheeFeature::isSupported()) { addFeature(new BansheeFeature(this, m_pTrackCollection, pConfig)); } } if (ITunesFeature::isSupported() && - pConfig->getValueString(ConfigKey("[Library]","ShowITunesLibrary"),"1").toInt()) { + pConfig->getValue(ConfigKey("[Library]","ShowITunesLibrary"), true)) { addFeature(new ITunesFeature(this, m_pTrackCollection)); } if (TraktorFeature::isSupported() && - pConfig->getValueString(ConfigKey("[Library]","ShowTraktorLibrary"),"1").toInt()) { + pConfig->getValue(ConfigKey("[Library]","ShowTraktorLibrary"), true)) { addFeature(new TraktorFeature(this, m_pTrackCollection)); } @@ -125,9 +125,8 @@ Library::Library(QObject* parent, UserSettingsPointer pConfig, qDebug() << "Checking for access to" << directoryPath << ":" << hasAccess; } - m_iTrackTableRowHeight = m_pConfig->getValueString( - ConfigKey("[Library]", "RowHeight"), - QString::number(kDefaultRowHeightPx)).toInt(); + m_iTrackTableRowHeight = m_pConfig->getValue( + ConfigKey("[Library]", "RowHeight"), kDefaultRowHeightPx); QString fontStr = m_pConfig->getValueString(ConfigKey("[Library]", "Font")); if (!fontStr.isEmpty()) { m_trackTableFont.fromString(fontStr); diff --git a/src/library/libraryfeature.cpp b/src/library/libraryfeature.cpp index 19575cf46235..737f5f400cf4 100644 --- a/src/library/libraryfeature.cpp +++ b/src/library/libraryfeature.cpp @@ -21,7 +21,7 @@ LibraryFeature::~LibraryFeature() { } QStringList LibraryFeature::getPlaylistFiles(QFileDialog::FileMode mode) { - QString lastPlaylistDirectory = m_pConfig->getValueString( + QString lastPlaylistDirectory = m_pConfig->getValue( ConfigKey("[Library]", "LastImportExportPlaylistDirectory"), QDesktopServices::storageLocation(QDesktopServices::MusicLocation)); diff --git a/src/mixer/basetrackplayer.cpp b/src/mixer/basetrackplayer.cpp index d478fb3fb660..165e816bbd13 100644 --- a/src/mixer/basetrackplayer.cpp +++ b/src/mixer/basetrackplayer.cpp @@ -267,7 +267,8 @@ void BaseTrackPlayerImpl::slotTrackLoaded(TrackPointer pNewTrack, } } } - if(m_pConfig->getValueString(ConfigKey("[Mixer Profile]", "EqAutoReset"), 0).toInt()) { + if(m_pConfig->getValue( + ConfigKey("[Mixer Profile]", "EqAutoReset"), false)) { if (m_pLowFilter != NULL) { m_pLowFilter->set(1.0); } @@ -288,9 +289,8 @@ void BaseTrackPlayerImpl::slotTrackLoaded(TrackPointer pNewTrack, } m_pPreGain->set(1.0); } - int reset = m_pConfig->getValueString(ConfigKey( - "[Controls]", "SpeedAutoReset"), - QString("%1").arg(RESET_PITCH)).toInt(); + int reset = m_pConfig->getValue( + ConfigKey("[Controls]", "SpeedAutoReset"), RESET_PITCH); if (reset == RESET_SPEED || reset == RESET_PITCH_AND_SPEED) { // Avoid reseting speed if master sync is enabled and other decks with sync enabled // are playing, as this would change the speed of already playing decks. diff --git a/src/mixxx.cpp b/src/mixxx.cpp index fa52c9a95a35..24d1e6df284e 100644 --- a/src/mixxx.cpp +++ b/src/mixxx.cpp @@ -175,7 +175,8 @@ void MixxxMainWindow::initialize(QApplication* pApp, const CmdlineArgs& args) { // Set the visibility of tooltips, default "1" = ON m_toolTipsCfg = static_cast( - pConfig->getValueString(ConfigKey("[Controls]", "Tooltips"), "1").toInt()); + pConfig->getValue(ConfigKey("[Controls]", "Tooltips"), + static_cast(mixxx::TooltipsPreference::TOOLTIPS_ON))); setAttribute(Qt::WA_AcceptTouchEvents); m_pTouchShift = new ControlPushButton(ConfigKey("[Controls]", "touch_shift")); diff --git a/src/preferences/configobject.h b/src/preferences/configobject.h index 18f977ff392d..42da05723b6a 100644 --- a/src/preferences/configobject.h +++ b/src/preferences/configobject.h @@ -125,12 +125,6 @@ template class ConfigObject { QString getValue(const ConfigKey& key, const char* default_value) const; QString getValueString(const ConfigKey& key) const; - QString getValueString(const ConfigKey& key, const QString& default_value) const{ - return getValue(key, default_value); - } - QString getValueString(const ConfigKey& key, const char* default_value) const { - return getValue(key, default_value); - } QMultiHash transpose() const; diff --git a/src/preferences/dialog/dlgprefautodj.cpp b/src/preferences/dialog/dlgprefautodj.cpp index 4b97f265c521..863fc96fa9b2 100644 --- a/src/preferences/dialog/dlgprefautodj.cpp +++ b/src/preferences/dialog/dlgprefautodj.cpp @@ -15,20 +15,20 @@ DlgPrefAutoDJ::DlgPrefAutoDJ(QWidget* pParent, // The minimum available for randomly-selected tracks autoDjMinimumAvailableSpinBox->setValue( - m_pConfig->getValueString( - ConfigKey("[Auto DJ]", "MinimumAvailable"), "20").toInt()); + m_pConfig->getValue( + ConfigKey("[Auto DJ]", "MinimumAvailable"), 20)); connect(autoDjMinimumAvailableSpinBox, SIGNAL(valueChanged(int)), this, SLOT(slotSetAutoDjMinimumAvailable(int))); // The auto-DJ replay-age for randomly-selected tracks autoDjIgnoreTimeCheckBox->setChecked( - (bool) m_pConfig->getValueString( - ConfigKey("[Auto DJ]", "UseIgnoreTime"), "0").toInt()); + (bool) m_pConfig->getValue( + ConfigKey("[Auto DJ]", "UseIgnoreTime"), 0)); connect(autoDjIgnoreTimeCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotSetAutoDjUseIgnoreTime(int))); autoDjIgnoreTimeEdit->setTime( QTime::fromString( - m_pConfig->getValueString( + m_pConfig->getValue( ConfigKey("[Auto DJ]", "IgnoreTime"), "23:59"), autoDjIgnoreTimeEdit->displayFormat())); autoDjIgnoreTimeEdit->setEnabled( @@ -40,17 +40,17 @@ DlgPrefAutoDJ::DlgPrefAutoDJ(QWidget* pParent, ComboBoxAutoDjRandomQueue->addItem(tr("Off")); ComboBoxAutoDjRandomQueue->addItem(tr("On")); ComboBoxAutoDjRandomQueue->setCurrentIndex( - m_pConfig->getValueString( - ConfigKey("[Auto DJ]", "EnableRandomQueue"),"0").toInt()); + m_pConfig->getValue( + ConfigKey("[Auto DJ]", "EnableRandomQueue"), 0)); // 5-arbitrary autoDJRandomQueueMinimumSpinBox->setValue( - m_pConfig->getValueString( - ConfigKey("[Auto DJ]", "RandomQueueMinimumAllowed"),"5").toInt()); + m_pConfig->getValue( + ConfigKey("[Auto DJ]", "RandomQueueMinimumAllowed"), 5)); slotEnableAutoDJRandomQueueComboBox( m_pConfig->getValueString(ConfigKey("[Auto DJ]", "Requeue")).toInt()); slotEnableAutoDJRandomQueue( - m_pConfig->getValueString( - ConfigKey("[Auto DJ]", "EnableRandomQueue")).toInt()); + m_pConfig->getValue( + ConfigKey("[Auto DJ]", "EnableRandomQueue"))); // Be ready to enable disable the random enque as reque is modified connect(ComboBoxAutoDjRequeue, SIGNAL(activated(int)), this, SLOT(slotEnableAutoDJRandomQueueComboBox(int))); @@ -69,65 +69,65 @@ void DlgPrefAutoDJ::slotUpdate() { void DlgPrefAutoDJ::slotApply() { //Copy from Buffer to actual values - m_pConfig->set(ConfigKey("[Auto DJ]", "Requeue"), - m_pConfig->getValueString(ConfigKey("[Auto DJ]", "RequeueBuff"),"0")); - m_pConfig->set(ConfigKey("[Auto DJ]","MinimumAvailable"), - m_pConfig->getValueString( - ConfigKey("[Auto DJ]", "MinimumAvailableBuff"), "20")); - - m_pConfig->set(ConfigKey("[Auto DJ]", "IgnoreTime"), - m_pConfig->getValueString( + m_pConfig->setValue(ConfigKey("[Auto DJ]", "Requeue"), + m_pConfig->getValue(ConfigKey("[Auto DJ]", "RequeueBuff"), 0)); + m_pConfig->setValue(ConfigKey("[Auto DJ]","MinimumAvailable"), + m_pConfig->getValue( + ConfigKey("[Auto DJ]", "MinimumAvailableBuff"), 20)); + + m_pConfig->setValue(ConfigKey("[Auto DJ]", "IgnoreTime"), + m_pConfig->getValue( ConfigKey("[Auto DJ]", "IgnoreTimeBuff"), "23:59")); - m_pConfig->set(ConfigKey("[Auto DJ]", "UseIgnoreTime"), - m_pConfig->getValueString( + m_pConfig->setValue(ConfigKey("[Auto DJ]", "UseIgnoreTime"), + m_pConfig->getValue( ConfigKey("[Auto DJ]", "UseIgnoreTimeBuff"), "0")); - m_pConfig->set(ConfigKey("[Auto DJ]", "RandomQueueMinimumAllowed"), - m_pConfig->getValueString( - ConfigKey("[Auto DJ]", "RandomQueueMinimumAllowedBuff"),"5")); - m_pConfig->set(ConfigKey("[Auto DJ]", "EnableRandomQueue"), - m_pConfig->getValueString( - ConfigKey("[Auto DJ]", "EnableRandomQueueBuff"),"0")); + m_pConfig->setValue(ConfigKey("[Auto DJ]", "RandomQueueMinimumAllowed"), + m_pConfig->getValue( + ConfigKey("[Auto DJ]", "RandomQueueMinimumAllowedBuff"), 5)); + m_pConfig->setValue(ConfigKey("[Auto DJ]", "EnableRandomQueue"), + m_pConfig->getValue( + ConfigKey("[Auto DJ]", "EnableRandomQueueBuff"), 0)); } void DlgPrefAutoDJ::slotCancel() { // Load actual values and reset Buffer Values where ever needed ComboBoxAutoDjRequeue->setCurrentIndex( - m_pConfig->getValueString(ConfigKey("[Auto DJ]", "Requeue"),"0").toInt()); - m_pConfig->set(ConfigKey("[Auto DJ]", "RequeueBuff"), - m_pConfig->getValueString(ConfigKey("[Auto DJ]", "Requeue"),"0")); + m_pConfig->getValue(ConfigKey("[Auto DJ]", "Requeue"), 0)); + m_pConfig->setValue(ConfigKey("[Auto DJ]", "RequeueBuff"), + m_pConfig->getValue(ConfigKey("[Auto DJ]", "Requeue"), 0)); autoDjMinimumAvailableSpinBox->setValue( - m_pConfig->getValueString( - ConfigKey("[Auto DJ]", "MinimumAvailable"), "20").toInt()); + m_pConfig->getValue( + ConfigKey("[Auto DJ]", "MinimumAvailable"), 20)); autoDjIgnoreTimeEdit->setTime( QTime::fromString( - m_pConfig->getValueString( + m_pConfig->getValue( ConfigKey("[Auto DJ]", "IgnoreTime"), "23:59"), autoDjIgnoreTimeEdit->displayFormat())); autoDjIgnoreTimeCheckBox->setChecked( - (bool) m_pConfig->getValueString( - ConfigKey("[Auto DJ]", "UseIgnoreTime"), "0").toInt()); + m_pConfig->getValue( + ConfigKey("[Auto DJ]", "UseIgnoreTime"), false)); autoDjIgnoreTimeEdit->setEnabled( autoDjIgnoreTimeCheckBox->checkState() == Qt::Checked); - m_pConfig->set(ConfigKey("[Auto DJ]", "UseIgnoreTimeBuff"), - m_pConfig->getValueString( - ConfigKey("[Auto DJ]", "UseIgnoreTime"), "0")); + m_pConfig->setValue(ConfigKey("[Auto DJ]", "UseIgnoreTimeBuff"), + m_pConfig->getValue( + ConfigKey("[Auto DJ]", "UseIgnoreTime"), 0)); autoDJRandomQueueMinimumSpinBox->setValue( - m_pConfig->getValueString( - ConfigKey("[Auto DJ]", "RandomQueueMinimumAllowed"),"5").toInt()); + m_pConfig->getValue( + ConfigKey("[Auto DJ]", "RandomQueueMinimumAllowed"), 5)); ComboBoxAutoDjRandomQueue->setCurrentIndex( - m_pConfig->getValueString( - ConfigKey("[Auto DJ]", "EnableRandomQueue"),"0").toInt()); - m_pConfig->set(ConfigKey("[Auto DJ]", "EnableRandomQueueBuff"), - m_pConfig->getValueString( - ConfigKey("[Auto DJ]", "EnableRandomQueue"), "0")); + m_pConfig->getValue( + ConfigKey("[Auto DJ]", "EnableRandomQueue"), 0)); + m_pConfig->setValue(ConfigKey("[Auto DJ]", "EnableRandomQueueBuff"), + m_pConfig->getValue( + ConfigKey("[Auto DJ]", "EnableRandomQueue"), 0)); slotEnableAutoDJRandomQueue( - m_pConfig->getValueString( - ConfigKey("[Auto DJ]", "EnableRandomQueue")).toInt()); + m_pConfig->getValue( + ConfigKey("[Auto DJ]", "EnableRandomQueue"), 0)); slotEnableAutoDJRandomQueueComboBox( - m_pConfig->getValueString(ConfigKey("[Auto DJ]", "Requeue")).toInt()); + m_pConfig->getValue(ConfigKey("[Auto DJ]", "Requeue"))); } void DlgPrefAutoDJ::slotResetToDefaults() { @@ -190,8 +190,8 @@ void DlgPrefAutoDJ::slotEnableAutoDJRandomQueueComboBox(int a_iValue) { } else { ComboBoxAutoDjRandomQueue->setEnabled(true); autoDJRandomQueueMinimumSpinBox->setEnabled( - m_pConfig->getValueString( - ConfigKey("[Auto DJ]", "EnableRandomQueueBuff"),"0").toInt()); + m_pConfig->getValue( + ConfigKey("[Auto DJ]", "EnableRandomQueueBuff"), false)); } } diff --git a/src/preferences/dialog/dlgprefcontrols.cpp b/src/preferences/dialog/dlgprefcontrols.cpp index 0b7ee074d2f5..c92237b98cb6 100644 --- a/src/preferences/dialog/dlgprefcontrols.cpp +++ b/src/preferences/dialog/dlgprefcontrols.cpp @@ -125,8 +125,8 @@ DlgPrefControls::DlgPrefControls(QWidget * parent, MixxxMainWindow * mixxx, connect(buttonGroupKeyLockMode, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(slotKeyLockMode(QAbstractButton *))); - m_keylockMode = m_pConfig->getValueString( - ConfigKey("[Controls]", "keylockMode"), "0").toInt(); + m_keylockMode = m_pConfig->getValue( + ConfigKey("[Controls]", "keylockMode"), 0); foreach (ControlProxy* pControl, m_keylockModeControls) { pControl->set(m_keylockMode); } @@ -231,8 +231,8 @@ DlgPrefControls::DlgPrefControls(QWidget * parent, MixxxMainWindow * mixxx, // Set default value in config file and control objects, if not present // Default is "0" = Mixxx Mode - QString cueDefault = m_pConfig->getValueString(ConfigKey("[Controls]", "CueDefault"), "0"); - int cueDefaultValue = cueDefault.toInt(); + int cueDefaultValue = m_pConfig->getValue( + ConfigKey("[Controls]", "CueDefault"), 0); // Update combo box // The itemData values are out of order to avoid breaking configurations @@ -350,9 +350,9 @@ DlgPrefControls::DlgPrefControls(QWidget * parent, MixxxMainWindow * mixxx, // Update "reset speed" and "reset pitch" check boxes // TODO: All defaults should only be set in slotResetToDefaults. - int configSPAutoReset = m_pConfig->getValueString( + int configSPAutoReset = m_pConfig->getValue( ConfigKey("[Controls]", "SpeedAutoReset"), - QString("%1").arg(BaseTrackPlayer::RESET_PITCH)).toInt(); + BaseTrackPlayer::RESET_PITCH); m_speedAutoReset = (configSPAutoReset==BaseTrackPlayer::RESET_SPEED || configSPAutoReset==BaseTrackPlayer::RESET_PITCH_AND_SPEED); diff --git a/src/preferences/dialog/dlgprefcrossfader.cpp b/src/preferences/dialog/dlgprefcrossfader.cpp index 8113d94f8f8d..13a6937f3ed4 100644 --- a/src/preferences/dialog/dlgprefcrossfader.cpp +++ b/src/preferences/dialog/dlgprefcrossfader.cpp @@ -52,9 +52,9 @@ DlgPrefCrossfader::~DlgPrefCrossfader() { // Loads the config keys and sets the widgets in the dialog to match void DlgPrefCrossfader::loadSettings() { // Range xFaderCurve EngineXfader::kTransformMin .. EngineXfader::kTransformMax - m_transform = m_config->getValueString( + m_transform = m_config->getValue( ConfigKey(EngineXfader::kXfaderConfigKey, "xFaderCurve"), - QString::number(EngineXfader::kTransformDefault)).toDouble(); + EngineXfader::kTransformDefault); // Range SliderXFader 0 .. 100 double sliderVal = RescalerUtils::oneByXToLinear( diff --git a/src/preferences/dialog/dlgprefeq.cpp b/src/preferences/dialog/dlgprefeq.cpp index 0456b4572ccb..0992d2042506 100644 --- a/src/preferences/dialog/dlgprefeq.cpp +++ b/src/preferences/dialog/dlgprefeq.cpp @@ -144,7 +144,7 @@ void DlgPrefEQ::slotNumDecksChanged(double numDecks) { // Set the configured effect for box and simpleBox or Bessel8 LV-Mix EQ // if none is configured QString group = PlayerManager::groupForDeck(i); - QString configuredEffect = m_pConfig->getValueString(ConfigKey(kConfigKey, + QString configuredEffect = m_pConfig->getValue(ConfigKey(kConfigKey, "EffectForGroup_" + group), kDefaultEqId); int selectedEffectIndex = m_deckEqEffectSelectors[i]->findData(configuredEffect); if (selectedEffectIndex < 0) { @@ -157,7 +157,7 @@ void DlgPrefEQ::slotNumDecksChanged(double numDecks) { m_filterWaveformEffectLoaded[i] && !CheckBoxBypass->checkState()); - QString configuredQuickEffect = m_pConfig->getValueString(ConfigKey(kConfigKey, + QString configuredQuickEffect = m_pConfig->getValue(ConfigKey(kConfigKey, "QuickEffectForGroup_" + group), kDefaultQuickEffectId); int selectedQuickEffectIndex = m_deckQuickEffectSelectors[i]->findData(configuredQuickEffect); @@ -297,11 +297,11 @@ void DlgPrefEQ::loadSettings() { m_bEqAutoReset = static_cast(m_pConfig->getValueString( ConfigKey(kConfigKey, "EqAutoReset")).toInt()); CheckBoxEqAutoReset->setChecked(m_bEqAutoReset); - CheckBoxBypass->setChecked(m_pConfig->getValueString( - ConfigKey(kConfigKey, kEnableEqs), QString("yes")) == QString("no")); - CheckBoxEqOnly->setChecked(m_pConfig->getValueString( + CheckBoxBypass->setChecked(m_pConfig->getValue( + ConfigKey(kConfigKey, kEnableEqs), QString("yes")) == "no"); + CheckBoxEqOnly->setChecked(m_pConfig->getValue( ConfigKey(kConfigKey, kEqsOnly), "yes") == "yes"); - CheckBoxSingleEqEffect->setChecked(m_pConfig->getValueString( + CheckBoxSingleEqEffect->setChecked(m_pConfig->getValue( ConfigKey(kConfigKey, kSingleEq), "yes") == "yes"); slotSingleEqChecked(CheckBoxSingleEqEffect->isChecked()); @@ -329,8 +329,8 @@ void DlgPrefEQ::loadSettings() { SliderLoEQ->minimum(), SliderLoEQ->maximum())); - if (m_pConfig->getValueString( - ConfigKey(kConfigKey, kEnableEqs), "yes") == QString("yes")) { + if (m_pConfig->getValue( + ConfigKey(kConfigKey, kEnableEqs), "yes") == "yes") { CheckBoxBypass->setChecked(false); } } @@ -621,7 +621,7 @@ void DlgPrefEQ::setUpMasterEQ() { connect(comboBoxMasterEq, SIGNAL(currentIndexChanged(int)), this, SLOT(slotMasterEqEffectChanged(int))); - QString configuredEffect = m_pConfig->getValueString(ConfigKey(kConfigKey, + QString configuredEffect = m_pConfig->getValue(ConfigKey(kConfigKey, "EffectForGroup_[Master]"), kDefaultMasterEqId); QList > availableMasterEQEffectNames; diff --git a/src/preferences/dialog/dlgpreflibrary.cpp b/src/preferences/dialog/dlgpreflibrary.cpp index b6da7e7ab4b9..7c91f84eb676 100644 --- a/src/preferences/dialog/dlgpreflibrary.cpp +++ b/src/preferences/dialog/dlgpreflibrary.cpp @@ -163,23 +163,23 @@ void DlgPrefLibrary::slotResetToDefaults() { void DlgPrefLibrary::slotUpdate() { initializeDirList(); - checkBox_library_scan->setChecked((bool)m_pconfig->getValueString( - ConfigKey("[Library]","RescanOnStartup")).toInt()); - checkbox_ID3_sync->setChecked((bool)m_pconfig->getValueString( - ConfigKey("[Library]","WriteAudioTags")).toInt()); - checkBox_use_relative_path->setChecked((bool)m_pconfig->getValueString( - ConfigKey("[Library]","UseRelativePathOnExport")).toInt()); - checkBox_show_rhythmbox->setChecked((bool)m_pconfig->getValueString( - ConfigKey("[Library]","ShowRhythmboxLibrary"),"1").toInt()); - checkBox_show_banshee->setChecked((bool)m_pconfig->getValueString( - ConfigKey("[Library]","ShowBansheeLibrary"),"1").toInt()); - checkBox_show_itunes->setChecked((bool)m_pconfig->getValueString( - ConfigKey("[Library]","ShowITunesLibrary"),"1").toInt()); - checkBox_show_traktor->setChecked((bool)m_pconfig->getValueString( - ConfigKey("[Library]","ShowTraktorLibrary"),"1").toInt()); - - switch (m_pconfig->getValueString(ConfigKey("[Library]","TrackLoadAction"), - QString::number(LOAD_TRACK_DECK)).toInt()) { + checkBox_library_scan->setChecked(m_pconfig->getValue( + ConfigKey("[Library]","RescanOnStartup"), false)); + checkbox_ID3_sync->setChecked(m_pconfig->getValue( + ConfigKey("[Library]","WriteAudioTags"), false)); + checkBox_use_relative_path->setChecked(m_pconfig->getValue( + ConfigKey("[Library]","UseRelativePathOnExport"), false)); + checkBox_show_rhythmbox->setChecked(m_pconfig->getValue( + ConfigKey("[Library]","ShowRhythmboxLibrary"), true)); + checkBox_show_banshee->setChecked(m_pconfig->getValue( + ConfigKey("[Library]","ShowBansheeLibrary"), true)); + checkBox_show_itunes->setChecked(m_pconfig->getValue( + ConfigKey("[Library]","ShowITunesLibrary"), true)); + checkBox_show_traktor->setChecked(m_pconfig->getValue( + ConfigKey("[Library]","ShowTraktorLibrary"), true)); + + switch (m_pconfig->getValue( + ConfigKey("[Library]","TrackLoadAction"), LOAD_TRACK_DECK)) { case ADD_TRACK_BOTTOM: radioButton_dbclick_bottom->setChecked(true); break; diff --git a/src/preferences/dialog/dlgprefsound.cpp b/src/preferences/dialog/dlgprefsound.cpp index de5f3266d9da..00c03cdf42c1 100644 --- a/src/preferences/dialog/dlgprefsound.cpp +++ b/src/preferences/dialog/dlgprefsound.cpp @@ -371,8 +371,8 @@ void DlgPrefSound::loadSettings(const SoundManagerConfig &config) { } // Default keylock is Rubberband. - int keylock_engine = m_pConfig->getValueString( - ConfigKey("[Master]", "keylock_engine"), "1").toInt(); + int keylock_engine = m_pConfig->getValue( + ConfigKey("[Master]", "keylock_engine"), 1); keylockComboBox->setCurrentIndex(keylock_engine); m_loading = false; diff --git a/src/preferences/dialog/dlgprefvinyl.cpp b/src/preferences/dialog/dlgprefvinyl.cpp index 19f528634db9..6d5bb539e576 100644 --- a/src/preferences/dialog/dlgprefvinyl.cpp +++ b/src/preferences/dialog/dlgprefvinyl.cpp @@ -247,20 +247,20 @@ void DlgPrefVinyl::slotUpdate() { ComboBoxVinylSpeed4->setCurrentIndex(combo_index); // set lead-in time - LeadinTime1->setText(config->getValueString(ConfigKey("[Channel1]", - "vinylcontrol_lead_in_time"), "0")); - LeadinTime2->setText(config->getValueString(ConfigKey("[Channel2]", - "vinylcontrol_lead_in_time"), "0")); - LeadinTime3->setText(config->getValueString(ConfigKey("[Channel3]", - "vinylcontrol_lead_in_time"), "0")); - LeadinTime4->setText(config->getValueString(ConfigKey("[Channel4]", - "vinylcontrol_lead_in_time"), "0")); + LeadinTime1->setText(config->getValue( + ConfigKey("[Channel1]", "vinylcontrol_lead_in_time"), "0")); + LeadinTime2->setText(config->getValue( + ConfigKey("[Channel2]", "vinylcontrol_lead_in_time"), "0")); + LeadinTime3->setText(config->getValue( + ConfigKey("[Channel3]", "vinylcontrol_lead_in_time"), "0")); + LeadinTime4->setText(config->getValue( + ConfigKey("[Channel4]", "vinylcontrol_lead_in_time"), "0")); SignalQualityEnable->setChecked( - (bool)config->getValueString(ConfigKey(VINYL_PREF_KEY, "show_signal_quality")).toInt()); + (bool)config->getValue(ConfigKey(VINYL_PREF_KEY, "show_signal_quality"))); // set vinyl control gain - const double ratioGain = config->getValueString(ConfigKey(VINYL_PREF_KEY, "gain")).toDouble(); + const double ratioGain = config->getValue(ConfigKey(VINYL_PREF_KEY, "gain")); const double dbGain = ratio2db(ratioGain); VinylGain->setValue(static_cast(dbGain + 0.5)); slotUpdateVinylGain(); diff --git a/src/preferences/dialog/dlgprefwaveform.cpp b/src/preferences/dialog/dlgprefwaveform.cpp index bf85e0f7f1d5..b48272872ed0 100644 --- a/src/preferences/dialog/dlgprefwaveform.cpp +++ b/src/preferences/dialog/dlgprefwaveform.cpp @@ -104,8 +104,8 @@ void DlgPrefWaveform::slotUpdate() { defaultZoomComboBox->setCurrentIndex(factory->getDefaultZoom() - 1); // By default we set filtered woverview = "0" - int overviewType = m_pConfig->getValueString( - ConfigKey("[Waveform]","WaveformOverviewType"), "0").toInt(); + int overviewType = m_pConfig->getValue( + ConfigKey("[Waveform]","WaveformOverviewType"), 0); if (overviewType != waveformOverviewComboBox->currentIndex()) { waveformOverviewComboBox->setCurrentIndex(overviewType); } diff --git a/src/preferences/replaygainsettings.cpp b/src/preferences/replaygainsettings.cpp index e72f8dd7ccec..ec8c9792b531 100644 --- a/src/preferences/replaygainsettings.cpp +++ b/src/preferences/replaygainsettings.cpp @@ -13,7 +13,7 @@ const char* kReplayGainReanalyze = "ReplayGainReanalyze"; const char* kReplayGainEnabled = "ReplayGainEnabled"; -const char* kInitialDefaultBoostDefault = "-6"; +const int kInitialDefaultBoostDefault = -6; } // anonymous namespace ReplayGainSettings::ReplayGainSettings(UserSettingsPointer pConfig) @@ -21,8 +21,8 @@ ReplayGainSettings::ReplayGainSettings(UserSettingsPointer pConfig) } int ReplayGainSettings::getInitialReplayGainBoost() const { - return m_pConfig->getValueString( - ConfigKey(kConfigKey, kInitialReplayGainBoost), "0").toInt(); + return m_pConfig->getValue( + ConfigKey(kConfigKey, kInitialReplayGainBoost), 0); } void ReplayGainSettings::setInitialReplayGainBoost(int value) { @@ -31,8 +31,8 @@ void ReplayGainSettings::setInitialReplayGainBoost(int value) { } int ReplayGainSettings::getInitialDefaultBoost() const { - return m_pConfig->getValueString(ConfigKey(kConfigKey, kInitialDefaultBoost), - kInitialDefaultBoostDefault).toInt(); + return m_pConfig->getValue(ConfigKey(kConfigKey, kInitialDefaultBoost), + kInitialDefaultBoostDefault); } void ReplayGainSettings::setInitialDefaultBoost(int value) { @@ -41,8 +41,8 @@ void ReplayGainSettings::setInitialDefaultBoost(int value) { } bool ReplayGainSettings::getReplayGainEnabled() const { - return m_pConfig->getValueString( - ConfigKey(kConfigKey, kReplayGainEnabled), "1").toInt() == 1; + return m_pConfig->getValue( + ConfigKey(kConfigKey, kReplayGainEnabled), true); } void ReplayGainSettings::setReplayGainEnabled(bool value) { @@ -54,8 +54,8 @@ void ReplayGainSettings::setReplayGainEnabled(bool value) { } bool ReplayGainSettings::getReplayGainAnalyzerEnabled() const { - return m_pConfig->getValueString( - ConfigKey(kConfigKey, kReplayGainAnalyzerEnabled), "1").toInt(); + return m_pConfig->getValue( + ConfigKey(kConfigKey, kReplayGainAnalyzerEnabled), true); } void ReplayGainSettings::setReplayGainAnalyzerEnabled(bool value) { @@ -64,8 +64,8 @@ void ReplayGainSettings::setReplayGainAnalyzerEnabled(bool value) { } int ReplayGainSettings::getReplayGainAnalyzerVersion() const { - return m_pConfig->getValueString( - ConfigKey(kConfigKey, kReplayGainAnalyzerVersion), "2").toInt(); + return m_pConfig->getValue( + ConfigKey(kConfigKey, kReplayGainAnalyzerVersion), 2); } void ReplayGainSettings::setReplayGainAnalyzerVersion(int value) { diff --git a/src/preferences/upgrade.cpp b/src/preferences/upgrade.cpp index 7f0715d31a65..b5ff333a5caf 100644 --- a/src/preferences/upgrade.cpp +++ b/src/preferences/upgrade.cpp @@ -383,8 +383,8 @@ UserSettingsPointer Upgrade::versionUpgrade(const QString& settingsPath) { // default of 6. We've now removed all of the hacks, so subtracting // 6 from everyone's replay gain should keep things consistent for // all users. - int oldReplayGain = config->getValueString( - ConfigKey("[ReplayGain]", "InitialReplayGainBoost"), "6").toInt(); + int oldReplayGain = config->getValue( + ConfigKey("[ReplayGain]", "InitialReplayGainBoost"), 6); int newReplayGain = math_max(-6, oldReplayGain - 6); config->set(ConfigKey("[ReplayGain]", "InitialReplayGainBoost"), ConfigValue(newReplayGain)); diff --git a/src/skin/legacyskinparser.cpp b/src/skin/legacyskinparser.cpp index dd9005c379f5..69d449327dab 100644 --- a/src/skin/legacyskinparser.cpp +++ b/src/skin/legacyskinparser.cpp @@ -892,7 +892,7 @@ QWidget* LegacySkinParser::parseOverview(const QDomElement& node) { WOverview* overviewWidget = NULL; // "RGB" = "2", "HSV" = "1" or "Filtered" = "0" (LMH) waveform overview type - int type = m_pConfig->getValueString(ConfigKey("[Waveform]","WaveformOverviewType"), "0").toInt(); + int type = m_pConfig->getValue(ConfigKey("[Waveform]","WaveformOverviewType"), 0); if (type == 0) { overviewWidget = new WOverviewLMH(pSafeChannelStr, m_pConfig, m_pParent); } else if (type == 1) { diff --git a/src/vinylcontrol/vinylcontrolmanager.cpp b/src/vinylcontrol/vinylcontrolmanager.cpp index c3587b8f34b3..b902e21a46ae 100644 --- a/src/vinylcontrol/vinylcontrolmanager.cpp +++ b/src/vinylcontrol/vinylcontrolmanager.cpp @@ -93,15 +93,14 @@ void VinylControlManager::slotNumDecksChanged(double dNumDecks) { // Default cueing should be off. ControlObject::set(ConfigKey(group, "vinylcontrol_cueing"), - m_pConfig->getValueString(ConfigKey( - VINYL_PREF_KEY, - QString("cueing_ch%1").arg(i + 1)), "0").toDouble()); + m_pConfig->getValue( + ConfigKey(VINYL_PREF_KEY, QString("cueing_ch%1").arg(i + 1)), + 0.0)); // Default mode should be relative. - const QString kDefaultMode = QString::number(MIXXX_VCMODE_RELATIVE); ControlObject::set(ConfigKey(group, "vinylcontrol_mode"), - m_pConfig->getValueString(ConfigKey( - VINYL_PREF_KEY, - QString("mode_ch%1").arg(i + 1)), kDefaultMode).toDouble()); + m_pConfig->getValue( + ConfigKey(VINYL_PREF_KEY, QString("mode_ch%1").arg(i + 1)), + MIXXX_VCMODE_RELATIVE)); } m_iNumConfiguredDecks = num_decks; } diff --git a/src/waveform/waveformwidgetfactory.cpp b/src/waveform/waveformwidgetfactory.cpp index d56aef981f2d..b2a557a8a6b9 100644 --- a/src/waveform/waveformwidgetfactory.cpp +++ b/src/waveform/waveformwidgetfactory.cpp @@ -201,10 +201,11 @@ bool WaveformWidgetFactory::setConfig(UserSettingsPointer config) { if (ok) { setEndOfTrackWarningTime(endTime); } else { - m_config->set(ConfigKey("[Waveform]","EndOfTrackWarningTime"), ConfigValue(m_endOfTrackWarningTime)); + m_config->set(ConfigKey("[Waveform]","EndOfTrackWarningTime"), + ConfigValue(m_endOfTrackWarningTime)); } - int vsync = m_config->getValueString(ConfigKey("[Waveform]","VSync"),"0").toInt(); + int vsync = m_config->getValue(ConfigKey("[Waveform]","VSync"), 0); setVSyncType(vsync); int defaultZoom = m_config->getValueString(ConfigKey("[Waveform]","DefaultZoom")).toInt(&ok); @@ -222,14 +223,14 @@ bool WaveformWidgetFactory::setConfig(UserSettingsPointer config) { } WaveformWidgetType::Type type = static_cast( - m_config->getValueString(ConfigKey("[Waveform]","WaveformType")).toInt(&ok)); + m_config->getValueString(ConfigKey("[Waveform]","WaveformType")).toInt(&ok)); if (!ok || !setWidgetType(type)) { setWidgetType(autoChooseWidgetType()); } for (int i = 0; i < FilterCount; i++) { double visualGain = m_config->getValueString( - ConfigKey("[Waveform]","VisualGain_" + QString::number(i))).toDouble(&ok); + ConfigKey("[Waveform]","VisualGain_" + QString::number(i))).toDouble(&ok); if (ok) { setVisualGain(FilterIndex(i), visualGain); diff --git a/src/widget/wmainmenubar.cpp b/src/widget/wmainmenubar.cpp index 61221c6ab7d4..89ba894fcf18 100644 --- a/src/widget/wmainmenubar.cpp +++ b/src/widget/wmainmenubar.cpp @@ -84,7 +84,7 @@ void WMainMenuBar::initialize() { QAction* pFileLoadSongToPlayer = new QAction( loadTrackText.arg(QString::number(deck + 1)), this); - QString binding = m_pKbdConfig->getValueString( + QString binding = m_pKbdConfig->getValue( ConfigKey("[KeyboardShortcuts]", QString("FileMenu_LoadDeck%1").arg(deck + 1)), loadToDeckDefaultKeyBinding(deck)); if (!binding.isEmpty()) { @@ -110,7 +110,7 @@ void WMainMenuBar::initialize() { QString quitText = tr("Quits Mixxx"); auto pFileQuit = new QAction(quitTitle, this); pFileQuit->setShortcut( - QKeySequence(m_pKbdConfig->getValueString(ConfigKey("[KeyboardShortcuts]", "FileMenu_Quit"), + QKeySequence(m_pKbdConfig->getValue(ConfigKey("[KeyboardShortcuts]", "FileMenu_Quit"), tr("Ctrl+q")))); pFileQuit->setShortcutContext(Qt::ApplicationShortcut); pFileQuit->setStatusTip(quitText); @@ -143,9 +143,9 @@ void WMainMenuBar::initialize() { QString createPlaylistText = tr("Create a new playlist"); auto pLibraryCreatePlaylist = new QAction(createPlaylistTitle, this); pLibraryCreatePlaylist->setShortcut( - QKeySequence(m_pKbdConfig->getValueString(ConfigKey("[KeyboardShortcuts]", - "LibraryMenu_NewPlaylist"), - tr("Ctrl+n")))); + QKeySequence(m_pKbdConfig->getValue( + ConfigKey("[KeyboardShortcuts]", "LibraryMenu_NewPlaylist"), + tr("Ctrl+n")))); pLibraryCreatePlaylist->setShortcutContext(Qt::ApplicationShortcut); pLibraryCreatePlaylist->setStatusTip(createPlaylistText); pLibraryCreatePlaylist->setWhatsThis(buildWhatsThis(createPlaylistTitle, createPlaylistText)); @@ -157,7 +157,7 @@ void WMainMenuBar::initialize() { QString createCrateText = tr("Create a new crate"); auto pLibraryCreateCrate = new QAction(createCrateTitle, this); pLibraryCreateCrate->setShortcut( - QKeySequence(m_pKbdConfig->getValueString(ConfigKey("[KeyboardShortcuts]", + QKeySequence(m_pKbdConfig->getValue(ConfigKey("[KeyboardShortcuts]", "LibraryMenu_NewCrate"), tr("Ctrl+Shift+N")))); pLibraryCreateCrate->setShortcutContext(Qt::ApplicationShortcut); @@ -179,7 +179,7 @@ void WMainMenuBar::initialize() { auto pViewShowSamplers = new QAction(showSamplersTitle, this); pViewShowSamplers->setCheckable(true); pViewShowSamplers->setShortcut( - QKeySequence(m_pKbdConfig->getValueString(ConfigKey("[KeyboardShortcuts]", + QKeySequence(m_pKbdConfig->getValue(ConfigKey("[KeyboardShortcuts]", "ViewMenu_ShowSamplers"), tr("Ctrl+1", "Menubar|View|Show Samplers")))); pViewShowSamplers->setStatusTip(showSamplersText); @@ -193,7 +193,7 @@ void WMainMenuBar::initialize() { auto pViewShowMicrophone = new QAction(showMicrophoneTitle, this); pViewShowMicrophone->setCheckable(true); pViewShowMicrophone->setShortcut( - QKeySequence(m_pKbdConfig->getValueString( + QKeySequence(m_pKbdConfig->getValue( ConfigKey("[KeyboardShortcuts]", "ViewMenu_ShowMicrophone"), tr("Ctrl+2", "Menubar|View|Show Microphone Section")))); pViewShowMicrophone->setStatusTip(showMicrophoneText); @@ -208,7 +208,7 @@ void WMainMenuBar::initialize() { auto pViewVinylControl = new QAction(showVinylControlTitle, this); pViewVinylControl->setCheckable(true); pViewVinylControl->setShortcut( - QKeySequence(m_pKbdConfig->getValueString( + QKeySequence(m_pKbdConfig->getValue( ConfigKey("[KeyboardShortcuts]", "ViewMenu_ShowVinylControl"), tr("Ctrl+3", "Menubar|View|Show Vinyl Control Section")))); pViewVinylControl->setStatusTip(showVinylControlText); @@ -223,9 +223,9 @@ void WMainMenuBar::initialize() { auto pViewShowPreviewDeck = new QAction(showPreviewDeckTitle, this); pViewShowPreviewDeck->setCheckable(true); pViewShowPreviewDeck->setShortcut( - QKeySequence(m_pKbdConfig->getValueString(ConfigKey("[KeyboardShortcuts]", - "ViewMenu_ShowPreviewDeck"), - tr("Ctrl+4", "Menubar|View|Show Preview Deck")))); + QKeySequence(m_pKbdConfig->getValue( + ConfigKey("[KeyboardShortcuts]", "ViewMenu_ShowPreviewDeck"), + tr("Ctrl+4", "Menubar|View|Show Preview Deck")))); pViewShowPreviewDeck->setStatusTip(showPreviewDeckText); pViewShowPreviewDeck->setWhatsThis(buildWhatsThis(showPreviewDeckTitle, showPreviewDeckText)); createVisibilityControl(pViewShowPreviewDeck, ConfigKey("[PreviewDeck]", "show_previewdeck")); @@ -237,9 +237,9 @@ void WMainMenuBar::initialize() { auto pViewShowEffects = new QAction(showEffectsTitle, this); pViewShowEffects->setCheckable(true); pViewShowEffects->setShortcut( - QKeySequence(m_pKbdConfig->getValueString(ConfigKey("[KeyboardShortcuts]", - "ViewMenu_ShowEffects"), - tr("Ctrl+5", "Menubar|View|Show Effect Rack")))); + QKeySequence(m_pKbdConfig->getValue( + ConfigKey("[KeyboardShortcuts]", "ViewMenu_ShowEffects"), + tr("Ctrl+5", "Menubar|View|Show Effect Rack")))); pViewShowEffects->setStatusTip(showEffectsText); pViewShowEffects->setWhatsThis(buildWhatsThis(showEffectsTitle, showEffectsText)); createVisibilityControl(pViewShowEffects, ConfigKey("[EffectRack1]", "show")); @@ -252,9 +252,9 @@ void WMainMenuBar::initialize() { auto pViewShowCoverArt = new QAction(showCoverArtTitle, this); pViewShowCoverArt->setCheckable(true); pViewShowCoverArt->setShortcut( - QKeySequence(m_pKbdConfig->getValueString(ConfigKey("[KeyboardShortcuts]", - "ViewMenu_ShowCoverArt"), - tr("Ctrl+6", "Menubar|View|Show Cover Art")))); + QKeySequence(m_pKbdConfig->getValue( + ConfigKey("[KeyboardShortcuts]", "ViewMenu_ShowCoverArt"), + tr("Ctrl+6", "Menubar|View|Show Cover Art")))); pViewShowCoverArt->setStatusTip(showCoverArtText); pViewShowCoverArt->setWhatsThis(buildWhatsThis(showCoverArtTitle, showCoverArtText)); createVisibilityControl(pViewShowCoverArt, ConfigKey("[Library]", "show_coverart")); @@ -267,9 +267,9 @@ void WMainMenuBar::initialize() { auto pViewMaximizeLibrary = new QAction(maximizeLibraryTitle, this); pViewMaximizeLibrary->setCheckable(true); pViewMaximizeLibrary->setShortcut( - QKeySequence(m_pKbdConfig->getValueString(ConfigKey("[KeyboardShortcuts]", - "ViewMenu_MaximizeLibrary"), - tr("Space", "Menubar|View|Maximize Library")))); + QKeySequence(m_pKbdConfig->getValue( + ConfigKey("[KeyboardShortcuts]", "ViewMenu_MaximizeLibrary"), + tr("Space", "Menubar|View|Maximize Library")))); pViewMaximizeLibrary->setStatusTip(maximizeLibraryText); pViewMaximizeLibrary->setWhatsThis(buildWhatsThis(maximizeLibraryTitle, maximizeLibraryText)); createVisibilityControl(pViewMaximizeLibrary, ConfigKey("[Master]", "maximize_library")); @@ -283,9 +283,9 @@ void WMainMenuBar::initialize() { QString fullScreenText = tr("Display Mixxx using the full screen"); auto pViewFullScreen = new QAction(fullScreenTitle, this); pViewFullScreen->setShortcut( - QKeySequence(m_pKbdConfig->getValueString(ConfigKey("[KeyboardShortcuts]", - "ViewMenu_Fullscreen"), - fullScreenDefaultKeyBinding()))); + QKeySequence(m_pKbdConfig->getValue( + ConfigKey("[KeyboardShortcuts]", "ViewMenu_Fullscreen"), + fullScreenDefaultKeyBinding()))); pViewFullScreen->setShortcutContext(Qt::ApplicationShortcut); pViewFullScreen->setCheckable(true); pViewFullScreen->setChecked(false); @@ -312,9 +312,9 @@ void WMainMenuBar::initialize() { auto vc_checkbox = new QAction(vinylControlTitle, this); m_vinylControlEnabledActions.push_back(vc_checkbox); - QString binding = m_pKbdConfig->getValueString( + QString binding = m_pKbdConfig->getValue( ConfigKey("[KeyboardShortcuts]", - QString("OptionsMenu_EnableVinyl%1").arg(i + 1)), + QString("OptionsMenu_EnableVinyl%1").arg(i + 1)), vinylControlDefaultKeyBinding(i)); if (!binding.isEmpty()) { vc_checkbox->setShortcut(QKeySequence(binding)); @@ -345,9 +345,9 @@ void WMainMenuBar::initialize() { QString recordText = tr("Record your mix to a file"); auto pOptionsRecord = new QAction(recordTitle, this); pOptionsRecord->setShortcut( - QKeySequence(m_pKbdConfig->getValueString(ConfigKey("[KeyboardShortcuts]", - "OptionsMenu_RecordMix"), - tr("Ctrl+R")))); + QKeySequence(m_pKbdConfig->getValue( + ConfigKey("[KeyboardShortcuts]", "OptionsMenu_RecordMix"), + tr("Ctrl+R")))); pOptionsRecord->setShortcutContext(Qt::ApplicationShortcut); pOptionsRecord->setCheckable(true); pOptionsRecord->setStatusTip(recordText); @@ -363,7 +363,7 @@ void WMainMenuBar::initialize() { QString broadcastingText = tr("Stream your mixes to a shoutcast or icecast server"); auto pOptionsBroadcasting = new QAction(broadcastingTitle, this); pOptionsBroadcasting->setShortcut( - QKeySequence(m_pKbdConfig->getValueString( + QKeySequence(m_pKbdConfig->getValue( ConfigKey("[KeyboardShortcuts]", "OptionsMenu_EnableLiveBroadcasting"), tr("Ctrl+L")))); @@ -387,9 +387,9 @@ void WMainMenuBar::initialize() { ConfigKey("[Keyboard]", "Enabled")) == "1"; auto pOptionsKeyboard = new QAction(keyboardShortcutTitle, this); pOptionsKeyboard->setShortcut( - QKeySequence(m_pKbdConfig->getValueString(ConfigKey("[KeyboardShortcuts]", - "OptionsMenu_EnableShortcuts"), - tr("Ctrl+`")))); + QKeySequence(m_pKbdConfig->getValue( + ConfigKey("[KeyboardShortcuts]", "OptionsMenu_EnableShortcuts"), + tr("Ctrl+`")))); pOptionsKeyboard->setShortcutContext(Qt::ApplicationShortcut); pOptionsKeyboard->setCheckable(true); pOptionsKeyboard->setChecked(keyboardShortcutsEnabled); @@ -406,9 +406,9 @@ void WMainMenuBar::initialize() { QString preferencesText = tr("Change Mixxx settings (e.g. playback, MIDI, controls)"); auto pOptionsPreferences = new QAction(preferencesTitle, this); pOptionsPreferences->setShortcut( - QKeySequence(m_pKbdConfig->getValueString(ConfigKey("[KeyboardShortcuts]", - "OptionsMenu_Preferences"), - showPreferencesKeyBinding()))); + QKeySequence(m_pKbdConfig->getValue( + ConfigKey("[KeyboardShortcuts]", "OptionsMenu_Preferences"), + showPreferencesKeyBinding()))); pOptionsPreferences->setShortcutContext(Qt::ApplicationShortcut); pOptionsPreferences->setStatusTip(preferencesText); pOptionsPreferences->setWhatsThis(buildWhatsThis(preferencesTitle, preferencesText)); @@ -427,9 +427,9 @@ void WMainMenuBar::initialize() { QString reloadSkinText = tr("Reload the skin"); auto pDeveloperReloadSkin = new QAction(reloadSkinTitle, this); pDeveloperReloadSkin->setShortcut( - QKeySequence(m_pKbdConfig->getValueString(ConfigKey("[KeyboardShortcuts]", - "OptionsMenu_ReloadSkin"), - tr("Ctrl+Shift+R")))); + QKeySequence(m_pKbdConfig->getValue( + ConfigKey("[KeyboardShortcuts]", "OptionsMenu_ReloadSkin"), + tr("Ctrl+Shift+R")))); pDeveloperReloadSkin->setShortcutContext(Qt::ApplicationShortcut); pDeveloperReloadSkin->setStatusTip(reloadSkinText); pDeveloperReloadSkin->setWhatsThis(buildWhatsThis(reloadSkinTitle, reloadSkinText)); @@ -441,9 +441,9 @@ void WMainMenuBar::initialize() { QString developerToolsText = tr("Opens the developer tools dialog"); auto pDeveloperTools = new QAction(developerToolsTitle, this); pDeveloperTools->setShortcut( - QKeySequence(m_pKbdConfig->getValueString(ConfigKey("[KeyboardShortcuts]", - "OptionsMenu_DeveloperTools"), - tr("Ctrl+Shift+T")))); + QKeySequence(m_pKbdConfig->getValue( + ConfigKey("[KeyboardShortcuts]", "OptionsMenu_DeveloperTools"), + tr("Ctrl+Shift+T")))); pDeveloperTools->setShortcutContext(Qt::ApplicationShortcut); pDeveloperTools->setCheckable(true); pDeveloperTools->setChecked(false); @@ -460,9 +460,9 @@ void WMainMenuBar::initialize() { "Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket."); auto pDeveloperStatsExperiment = new QAction(enableExperimentTitle, this); pDeveloperStatsExperiment->setShortcut( - QKeySequence(m_pKbdConfig->getValueString(ConfigKey("[KeyboardShortcuts]", - "OptionsMenu_DeveloperStatsExperiment"), - tr("Ctrl+Shift+E")))); + QKeySequence(m_pKbdConfig->getValue( + ConfigKey("[KeyboardShortcuts]", "OptionsMenu_DeveloperStatsExperiment"), + tr("Ctrl+Shift+E")))); pDeveloperStatsExperiment->setShortcutContext(Qt::ApplicationShortcut); pDeveloperStatsExperiment->setStatusTip(enableExperimentToolsText); pDeveloperStatsExperiment->setWhatsThis(buildWhatsThis( @@ -478,9 +478,9 @@ void WMainMenuBar::initialize() { "Enables base mode. Collects stats in the BASE tracking bucket."); auto pDeveloperStatsBase = new QAction(enableBaseTitle, this); pDeveloperStatsBase->setShortcut( - QKeySequence(m_pKbdConfig->getValueString(ConfigKey("[KeyboardShortcuts]", - "OptionsMenu_DeveloperStatsBase"), - tr("Ctrl+Shift+B")))); + QKeySequence(m_pKbdConfig->getValue( + ConfigKey("[KeyboardShortcuts]", "OptionsMenu_DeveloperStatsBase"), + tr("Ctrl+Shift+B")))); pDeveloperStatsBase->setShortcutContext(Qt::ApplicationShortcut); pDeveloperStatsBase->setStatusTip(enableBaseToolsText); pDeveloperStatsBase->setWhatsThis(buildWhatsThis( @@ -498,9 +498,9 @@ void WMainMenuBar::initialize() { ConfigKey("[ScriptDebugger]", "Enabled")) == "1"; auto pDeveloperDebugger = new QAction(scriptDebuggerTitle, this); pDeveloperDebugger->setShortcut( - QKeySequence(m_pKbdConfig->getValueString(ConfigKey("[KeyboardShortcuts]", - "DeveloperMenu_EnableDebugger"), - tr("Ctrl+Shift+D")))); + QKeySequence(m_pKbdConfig->getValue( + ConfigKey("[KeyboardShortcuts]", "DeveloperMenu_EnableDebugger"), + tr("Ctrl+Shift+D")))); pDeveloperDebugger->setShortcutContext(Qt::ApplicationShortcut); pDeveloperDebugger->setWhatsThis(buildWhatsThis(keyboardShortcutTitle, keyboardShortcutText)); pDeveloperDebugger->setCheckable(true); From d63cd56bd68878c70363f5f19d9a2ccd5c1bef0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 5 Jan 2017 22:34:11 +0100 Subject: [PATCH 32/34] change some more m_pConfig->getValue() --- src/analyzer/analyzerbeats.cpp | 37 ++++++-------- src/analyzer/analyzerkey.cpp | 31 ++++++------ src/library/autodj/autodjprocessor.cpp | 6 +-- src/library/baseplaylistfeature.cpp | 4 +- src/library/cratefeature.cpp | 5 +- src/mixxx.cpp | 12 ++--- src/preferences/dialog/dlgprefbeats.cpp | 2 +- src/preferences/dialog/dlgprefmodplug.cpp | 60 +++++++++++------------ src/preferences/dialog/dlgprefrecord.cpp | 4 +- src/widget/wtracktableview.cpp | 4 +- 10 files changed, 78 insertions(+), 87 deletions(-) diff --git a/src/analyzer/analyzerbeats.cpp b/src/analyzer/analyzerbeats.cpp index 39e6bc0710d1..e627105bcedf 100644 --- a/src/analyzer/analyzerbeats.cpp +++ b/src/analyzer/analyzerbeats.cpp @@ -38,9 +38,8 @@ bool AnalyzerBeats::initialize(TrackPointer tio, int sampleRate, int totalSample return false; } - bool bPreferencesBeatDetectionEnabled = static_cast( - m_pConfig->getValueString( - ConfigKey(BPM_CONFIG_KEY, BPM_DETECTION_ENABLED)).toInt()); + bool bPreferencesBeatDetectionEnabled = m_pConfig->getValue( + ConfigKey(BPM_CONFIG_KEY, BPM_DETECTION_ENABLED)); if (!bPreferencesBeatDetectionEnabled) { qDebug() << "Beat calculation is deactivated"; return false; @@ -52,8 +51,8 @@ bool AnalyzerBeats::initialize(TrackPointer tio, int sampleRate, int totalSample return false; } - bool allow_above = static_cast(m_pConfig->getValueString( - ConfigKey(BPM_CONFIG_KEY, BPM_ABOVE_RANGE_ENABLED)).toInt()); + bool allow_above = m_pConfig->getValue( + ConfigKey(BPM_CONFIG_KEY, BPM_ABOVE_RANGE_ENABLED)); if (allow_above) { m_iMinBpm = 0; m_iMaxBpm = 9999; @@ -62,23 +61,19 @@ bool AnalyzerBeats::initialize(TrackPointer tio, int sampleRate, int totalSample m_iMaxBpm = m_pConfig->getValueString(ConfigKey(BPM_CONFIG_KEY, BPM_RANGE_END)).toInt(); } - m_bPreferencesFixedTempo = static_cast( - m_pConfig->getValueString( - ConfigKey(BPM_CONFIG_KEY, BPM_FIXED_TEMPO_ASSUMPTION)).toInt()); - m_bPreferencesOffsetCorrection = static_cast( - m_pConfig->getValueString( - ConfigKey(BPM_CONFIG_KEY, BPM_FIXED_TEMPO_OFFSET_CORRECTION)).toInt()); - m_bPreferencesReanalyzeOldBpm = static_cast( - m_pConfig->getValueString( - ConfigKey(BPM_CONFIG_KEY, BPM_REANALYZE_WHEN_SETTINGS_CHANGE)).toInt()); - m_bPreferencesFastAnalysis = static_cast( - m_pConfig->getValueString( - ConfigKey(BPM_CONFIG_KEY, BPM_FAST_ANALYSIS_ENABLED)).toInt()); + m_bPreferencesFixedTempo = m_pConfig->getValue( + ConfigKey(BPM_CONFIG_KEY, BPM_FIXED_TEMPO_ASSUMPTION)); + m_bPreferencesOffsetCorrection = m_pConfig->getValue( + ConfigKey(BPM_CONFIG_KEY, BPM_FIXED_TEMPO_OFFSET_CORRECTION)); + m_bPreferencesReanalyzeOldBpm = m_pConfig->getValue( + ConfigKey(BPM_CONFIG_KEY, BPM_REANALYZE_WHEN_SETTINGS_CHANGE)); + m_bPreferencesFastAnalysis = m_pConfig->getValue( + ConfigKey(BPM_CONFIG_KEY, BPM_FAST_ANALYSIS_ENABLED)); QString library = m_pConfig->getValueString( - ConfigKey(VAMP_CONFIG_KEY, VAMP_ANALYZER_BEAT_LIBRARY)); + ConfigKey(VAMP_CONFIG_KEY, VAMP_ANALYZER_BEAT_LIBRARY)); QString pluginID = m_pConfig->getValueString( - ConfigKey(VAMP_CONFIG_KEY, VAMP_ANALYZER_BEAT_PLUGIN_ID)); + ConfigKey(VAMP_CONFIG_KEY, VAMP_ANALYZER_BEAT_PLUGIN_ID)); m_pluginId = pluginID; m_iSampleRate = sampleRate; @@ -110,8 +105,8 @@ bool AnalyzerBeats::isDisabledOrLoadStoredSuccess(TrackPointer tio) const { int iMinBpm; int iMaxBpm; - bool allow_above = static_cast(m_pConfig->getValueString( - ConfigKey(BPM_CONFIG_KEY, BPM_ABOVE_RANGE_ENABLED)).toInt()); + bool allow_above = m_pConfig->getValue( + ConfigKey(BPM_CONFIG_KEY, BPM_ABOVE_RANGE_ENABLED)); if (allow_above) { iMinBpm = 0; iMaxBpm = 9999; diff --git a/src/analyzer/analyzerkey.cpp b/src/analyzer/analyzerkey.cpp index ddd41519acfc..f576508992d1 100644 --- a/src/analyzer/analyzerkey.cpp +++ b/src/analyzer/analyzerkey.cpp @@ -29,25 +29,23 @@ bool AnalyzerKey::initialize(TrackPointer tio, int sampleRate, int totalSamples) return false; } - m_bPreferencesKeyDetectionEnabled = static_cast( - m_pConfig->getValueString( - ConfigKey(KEY_CONFIG_KEY, KEY_DETECTION_ENABLED)).toInt()); + m_bPreferencesKeyDetectionEnabled = m_pConfig->getValue( + ConfigKey(KEY_CONFIG_KEY, KEY_DETECTION_ENABLED)); if (!m_bPreferencesKeyDetectionEnabled) { qDebug() << "Key detection is deactivated"; return false; } - m_bPreferencesFastAnalysisEnabled = static_cast( - m_pConfig->getValueString( - ConfigKey(KEY_CONFIG_KEY, KEY_FAST_ANALYSIS)).toInt()); + m_bPreferencesFastAnalysisEnabled = m_pConfig->getValue( + ConfigKey(KEY_CONFIG_KEY, KEY_FAST_ANALYSIS)); QString library = m_pConfig->getValue( - ConfigKey(VAMP_CONFIG_KEY, VAMP_ANALYZER_KEY_LIBRARY), - // TODO(rryan) this default really doesn't belong here. - "libmixxxminimal"); + ConfigKey(VAMP_CONFIG_KEY, VAMP_ANALYZER_KEY_LIBRARY), + // TODO(rryan) this default really doesn't belong here. + "libmixxxminimal"); QString pluginID = m_pConfig->getValue( - ConfigKey(VAMP_CONFIG_KEY, VAMP_ANALYZER_KEY_PLUGIN_ID), - // TODO(rryan) this default really doesn't belong here. - VAMP_ANALYZER_KEY_DEFAULT_PLUGIN_ID); + ConfigKey(VAMP_CONFIG_KEY, VAMP_ANALYZER_KEY_PLUGIN_ID), + // TODO(rryan) this default really doesn't belong here. + VAMP_ANALYZER_KEY_DEFAULT_PLUGIN_ID); m_pluginId = pluginID; m_iSampleRate = sampleRate; @@ -77,14 +75,13 @@ bool AnalyzerKey::initialize(TrackPointer tio, int sampleRate, int totalSamples) } bool AnalyzerKey::isDisabledOrLoadStoredSuccess(TrackPointer tio) const { - bool bPreferencesFastAnalysisEnabled = static_cast( - m_pConfig->getValueString( - ConfigKey(KEY_CONFIG_KEY, KEY_FAST_ANALYSIS)).toInt()); + bool bPreferencesFastAnalysisEnabled = m_pConfig->getValue( + ConfigKey(KEY_CONFIG_KEY, KEY_FAST_ANALYSIS)); QString library = m_pConfig->getValueString( - ConfigKey(VAMP_CONFIG_KEY, VAMP_ANALYZER_KEY_LIBRARY)); + ConfigKey(VAMP_CONFIG_KEY, VAMP_ANALYZER_KEY_LIBRARY)); QString pluginID = m_pConfig->getValueString( - ConfigKey(VAMP_CONFIG_KEY, VAMP_ANALYZER_KEY_PLUGIN_ID)); + ConfigKey(VAMP_CONFIG_KEY, VAMP_ANALYZER_KEY_PLUGIN_ID)); // TODO(rryan): This belongs elsewhere. if (library.isEmpty() || library.isNull()) diff --git a/src/library/autodj/autodjprocessor.cpp b/src/library/autodj/autodjprocessor.cpp index ef4c06bdf740..8932e6d17933 100644 --- a/src/library/autodj/autodjprocessor.cpp +++ b/src/library/autodj/autodjprocessor.cpp @@ -583,10 +583,10 @@ void AutoDJProcessor::playerPositionChanged(DeckAttributes* pAttributes, TrackPointer AutoDJProcessor::getNextTrackFromQueue() { // Get the track at the top of the playlist. - bool randomQueueEnabled = (((m_pConfig->getValueString( - ConfigKey("[Auto DJ]", "EnableRandomQueue")).toInt())) == 1); + bool randomQueueEnabled = m_pConfig->getValue( + ConfigKey("[Auto DJ]", "EnableRandomQueue")); int minAutoDJCrateTracks = m_pConfig->getValueString( - ConfigKey(kConfigKey, "RandomQueueMinimumAllowed")).toInt(); + ConfigKey(kConfigKey, "RandomQueueMinimumAllowed")).toInt(); int tracksToAdd = minAutoDJCrateTracks - m_pAutoDJTableModel->rowCount(); // In case we start off with < minimum tracks if (randomQueueEnabled && (tracksToAdd > 0)) { diff --git a/src/library/baseplaylistfeature.cpp b/src/library/baseplaylistfeature.cpp index 537a58a8f869..16d255211999 100644 --- a/src/library/baseplaylistfeature.cpp +++ b/src/library/baseplaylistfeature.cpp @@ -500,8 +500,8 @@ void BasePlaylistFeature::slotExportPlaylist() { pPlaylistTableModel->select(); // check config if relative paths are desired - bool useRelativePath = static_cast(m_pConfig->getValueString( - ConfigKey("[Library]", "UseRelativePathOnExport")).toInt()); + bool useRelativePath = m_pConfig->getValue( + ConfigKey("[Library]", "UseRelativePathOnExport")); if (file_location.endsWith(".csv", Qt::CaseInsensitive)) { ParserCsv::writeCSVFile(file_location, pPlaylistTableModel.data(), useRelativePath); diff --git a/src/library/cratefeature.cpp b/src/library/cratefeature.cpp index 4940b1694fc1..d04b6cf633ff 100644 --- a/src/library/cratefeature.cpp +++ b/src/library/cratefeature.cpp @@ -712,9 +712,8 @@ void CrateFeature::slotExportPlaylist() { // register a security bookmark. // check config if relative paths are desired - bool useRelativePath = static_cast( - m_pConfig->getValueString( - ConfigKey("[Library]", "UseRelativePathOnExport")).toInt()); + bool useRelativePath = m_pConfig->getValue( + ConfigKey("[Library]", "UseRelativePathOnExport")); // Create list of files of the crate QList playlist_items; diff --git a/src/mixxx.cpp b/src/mixxx.cpp index 24d1e6df284e..6492d5533bea 100644 --- a/src/mixxx.cpp +++ b/src/mixxx.cpp @@ -366,8 +366,8 @@ void MixxxMainWindow::initialize(QApplication* pApp, const CmdlineArgs& args) { // If we were told to start in fullscreen mode on the command-line or if // user chose always starts in fullscreen mode, then turn on fullscreen // mode. - bool fullscreenPref = pConfig->getValueString( - ConfigKey("[Config]", "StartInFullscreen")).toInt()==1; + bool fullscreenPref = pConfig->getValue( + ConfigKey("[Config]", "StartInFullscreen")); if (args.getStartInFullscreen() || fullscreenPref) { slotViewFullScreen(true); } @@ -378,8 +378,8 @@ void MixxxMainWindow::initialize(QApplication* pApp, const CmdlineArgs& args) { m_pControllerManager->setUpDevices(); // Scan the library for new files and directories - bool rescan = pConfig->getValueString( - ConfigKey("[Library]","RescanOnStartup")).toInt(); + bool rescan = pConfig->getValue( + ConfigKey("[Library]","RescanOnStartup")); // rescan the library if we get a new plugin QSet prev_plugins = QSet::fromList( pConfig->getValueString( @@ -676,8 +676,8 @@ void MixxxMainWindow::initializeKeyboard() { // TODO(XXX) leak pKbdConfig, KeyboardEventFilter owns it? Maybe roll all keyboard // initialization into KeyboardEventFilter // Workaround for today: KeyboardEventFilter calls delete - bool keyboardShortcutsEnabled = pConfig->getValueString( - ConfigKey("[Keyboard]", "Enabled")) == "1"; + bool keyboardShortcutsEnabled = pConfig->getValue( + ConfigKey("[Keyboard]", "Enabled")); m_pKeyboard = new KeyboardEventFilter(keyboardShortcutsEnabled ? m_pKbdConfig : m_pKbdConfigEmpty); } diff --git a/src/preferences/dialog/dlgprefbeats.cpp b/src/preferences/dialog/dlgprefbeats.cpp index 01380e2de1fb..39bde518e676 100644 --- a/src/preferences/dialog/dlgprefbeats.cpp +++ b/src/preferences/dialog/dlgprefbeats.cpp @@ -58,7 +58,7 @@ DlgPrefBeats::~DlgPrefBeats() { void DlgPrefBeats::loadSettings() { if(m_pconfig->getValueString( - ConfigKey(VAMP_CONFIG_KEY, VAMP_ANALYZER_BEAT_PLUGIN_ID))==QString("")) { + ConfigKey(VAMP_CONFIG_KEY, VAMP_ANALYZER_BEAT_PLUGIN_ID)).isEmpty()) { slotResetToDefaults(); slotApply(); // Write to config file so AnalyzerBeats can get the data return; diff --git a/src/preferences/dialog/dlgprefmodplug.cpp b/src/preferences/dialog/dlgprefmodplug.cpp index 9b5b23d6c99e..981c627c0e65 100644 --- a/src/preferences/dialog/dlgprefmodplug.cpp +++ b/src/preferences/dialog/dlgprefmodplug.cpp @@ -50,36 +50,36 @@ void DlgPrefModplug::slotResetToDefaults() { } void DlgPrefModplug::loadSettings() { - m_pUi->memoryLimit->setValue(m_pConfig->getValueString( - ConfigKey(kConfigKey,"PerTrackMemoryLimitMB"),"256").toInt()); - m_pUi->oversampling->setChecked(m_pConfig->getValueString( - ConfigKey(kConfigKey,"OversamplingEnabled"),"1") == QString("1")); - m_pUi->noiseReduction->setChecked(m_pConfig->getValueString( - ConfigKey(kConfigKey,"NoiseReductionEnabled"),"0") == QString("1")); - m_pUi->stereoSeparation->setValue(m_pConfig->getValueString( - ConfigKey(kConfigKey,"StereoSeparation"),"1").toInt()); - m_pUi->maxMixChannels->setValue(m_pConfig->getValueString( - ConfigKey(kConfigKey,"MaxMixChannels"),"128").toInt()); - m_pUi->resampleMode->setCurrentIndex(m_pConfig->getValueString( - ConfigKey(kConfigKey,"ResamplingMode"),"1").toInt()); - m_pUi->reverb->setChecked(m_pConfig->getValueString( - ConfigKey(kConfigKey,"ReverbEnabled"),"0") == QString("1")); - m_pUi->reverbDepth->setValue(m_pConfig->getValueString( - ConfigKey(kConfigKey,"ReverbLevel"),"50").toInt()); - m_pUi->reverbDelay->setValue(m_pConfig->getValueString( - ConfigKey(kConfigKey,"ReverbDelay"),"50").toInt()); - m_pUi->megabass->setChecked(m_pConfig->getValueString( - ConfigKey(kConfigKey,"MegabassEnabled"),"0") == QString("1")); - m_pUi->bassDepth->setValue(m_pConfig->getValueString( - ConfigKey(kConfigKey,"MegabassLevel"),"50").toInt()); - m_pUi->bassCutoff->setValue(m_pConfig->getValueString( - ConfigKey(kConfigKey,"MegabassCutoff"),"50").toInt()); - m_pUi->surround->setChecked(m_pConfig->getValueString( - ConfigKey(kConfigKey,"SurroundEnabled"),"0") == QString("1")); - m_pUi->surroundDepth->setValue(m_pConfig->getValueString( - ConfigKey(kConfigKey,"SurroundLevel"),"50").toInt()); - m_pUi->surroundDelay->setValue(m_pConfig->getValueString( - ConfigKey(kConfigKey,"SurroundDelay"),"50").toInt()); + m_pUi->memoryLimit->setValue(m_pConfig->getValue( + ConfigKey(kConfigKey,"PerTrackMemoryLimitMB"), 256)); + m_pUi->oversampling->setChecked(m_pConfig->getValue( + ConfigKey(kConfigKey,"OversamplingEnabled"), true)); + m_pUi->noiseReduction->setChecked(m_pConfig->getValue( + ConfigKey(kConfigKey,"NoiseReductionEnabled"), false)); + m_pUi->stereoSeparation->setValue(m_pConfig->getValue( + ConfigKey(kConfigKey,"StereoSeparation"), 1)); + m_pUi->maxMixChannels->setValue(m_pConfig->getValue( + ConfigKey(kConfigKey,"MaxMixChannels"), 128)); + m_pUi->resampleMode->setCurrentIndex(m_pConfig->getValue( + ConfigKey(kConfigKey,"ResamplingMode"), 1)); + m_pUi->reverb->setChecked(m_pConfig->getValue( + ConfigKey(kConfigKey,"ReverbEnabled"), false)); + m_pUi->reverbDepth->setValue(m_pConfig->getValue( + ConfigKey(kConfigKey,"ReverbLevel"), 50)); + m_pUi->reverbDelay->setValue(m_pConfig->getValue( + ConfigKey(kConfigKey,"ReverbDelay"), 50)); + m_pUi->megabass->setChecked(m_pConfig->getValue( + ConfigKey(kConfigKey,"MegabassEnabled"), false)); + m_pUi->bassDepth->setValue(m_pConfig->getValue( + ConfigKey(kConfigKey,"MegabassLevel"), 50)); + m_pUi->bassCutoff->setValue(m_pConfig->getValue( + ConfigKey(kConfigKey,"MegabassCutoff"), 50)); + m_pUi->surround->setChecked(m_pConfig->getValue( + ConfigKey(kConfigKey,"SurroundEnabled"), false)); + m_pUi->surroundDepth->setValue(m_pConfig->getValue( + ConfigKey(kConfigKey,"SurroundLevel"), 50)); + m_pUi->surroundDelay->setValue(m_pConfig->getValue( + ConfigKey(kConfigKey,"SurroundDelay"), 50)); } void DlgPrefModplug::saveSettings() { diff --git a/src/preferences/dialog/dlgprefrecord.cpp b/src/preferences/dialog/dlgprefrecord.cpp index c2992bc923a9..6cf7a4cf0a05 100644 --- a/src/preferences/dialog/dlgprefrecord.cpp +++ b/src/preferences/dialog/dlgprefrecord.cpp @@ -257,8 +257,8 @@ void DlgPrefRecord::slotUpdate() { void DlgPrefRecord::slotBrowseRecordingsDir() { QString fd = QFileDialog::getExistingDirectory( this, tr("Choose recordings directory"), - m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, - "Directory"))); + m_pConfig->getValueString( + ConfigKey(RECORDING_PREF_KEY,"Directory"))); if (fd != "") { // The user has picked a new directory via a file dialog. This means the diff --git a/src/widget/wtracktableview.cpp b/src/widget/wtracktableview.cpp index a5e753e3e872..6bd2a7f19af6 100644 --- a/src/widget/wtracktableview.cpp +++ b/src/widget/wtracktableview.cpp @@ -729,8 +729,8 @@ void WTrackTableView::contextMenuEvent(QContextMenuEvent* event) { QString deckGroup = PlayerManager::groupForDeck(i - 1); bool deckPlaying = ControlObject::get( ConfigKey(deckGroup, "play")) > 0.0; - bool loadTrackIntoPlayingDeck = m_pConfig->getValueString( - ConfigKey("[Controls]", "AllowTrackLoadToPlayingDeck")).toInt(); + bool loadTrackIntoPlayingDeck = m_pConfig->getValue( + ConfigKey("[Controls]", "AllowTrackLoadToPlayingDeck")); bool deckEnabled = (!deckPlaying || loadTrackIntoPlayingDeck) && oneSongSelected; QAction* pAction = new QAction(tr("Load to Deck %1").arg(i), m_pMenu); pAction->setEnabled(deckEnabled); From c355d8f959054c3eb9776231ffc7ff5dc5b2c3ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 5 Jan 2017 23:56:39 +0100 Subject: [PATCH 33/34] Fix some bugs found in review. --- src/preferences/broadcastsettings.cpp | 14 +++++++------- src/preferences/dialog/dlgprefbroadcast.cpp | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/preferences/broadcastsettings.cpp b/src/preferences/broadcastsettings.cpp index b80a471b59a3..8f2185596d39 100644 --- a/src/preferences/broadcastsettings.cpp +++ b/src/preferences/broadcastsettings.cpp @@ -1,4 +1,5 @@ #include "preferences/broadcastsettings.h" +#include "broadcast/defs_broadcast.h" #include "defs_urls.h" namespace { @@ -222,9 +223,7 @@ QString BroadcastSettings::getDefaultMetadataCharset() const { QString BroadcastSettings::getMetadataFormat() const { return m_pConfig->getValue( - ConfigKey(kConfigKey, kMetadataFormat), - // No tr() here, see https://bugs.launchpad.net/mixxx/+bug/1419500 - getDefaultMetadataFormat()); + ConfigKey(kConfigKey, kMetadataFormat), getDefaultMetadataFormat()); } void BroadcastSettings::setMetadataFormat(const QString& value) { @@ -264,7 +263,8 @@ bool BroadcastSettings::getDefaultNoDelayFirstReconnect() const { bool BroadcastSettings::getOggDynamicUpdate() const { return m_pConfig->getValue( - ConfigKey(kConfigKey, kOggDynamicUpdate), false); + ConfigKey(kConfigKey, kOggDynamicUpdate), + getDefaultOggDynamicUpdate()); } void BroadcastSettings::setOggDynamicUpdate(bool value) { @@ -293,7 +293,7 @@ int BroadcastSettings::getPort() const { int port = m_pConfig->getValue( ConfigKey(kConfigKey, kPort), getDefaultPort()); if (port < 0 || port > 0xFFFF) { - return -1; + return getDefaultPort(); } return port; } @@ -303,7 +303,7 @@ void BroadcastSettings::setPort(int value) { } int BroadcastSettings::getDefaultPort() const { - return -1; + return BROADCAST_DEFAULT_PORT; } double BroadcastSettings::getReconnectFirstDelay() const { @@ -392,7 +392,7 @@ QString BroadcastSettings::getDefaultStreamName() const { bool BroadcastSettings::getStreamPublic() const { return m_pConfig->getValue( - ConfigKey(kConfigKey, kStreamPublic), false); + ConfigKey(kConfigKey, kStreamPublic), getDefaultStreamPublic()); } void BroadcastSettings::setStreamPublic(bool value) { diff --git a/src/preferences/dialog/dlgprefbroadcast.cpp b/src/preferences/dialog/dlgprefbroadcast.cpp index 5cba6f33eed3..632827ff8deb 100644 --- a/src/preferences/dialog/dlgprefbroadcast.cpp +++ b/src/preferences/dialog/dlgprefbroadcast.cpp @@ -171,10 +171,10 @@ void DlgPrefBroadcast::slotResetToDefaults() { mountpoint->setText(m_settings.getDefaultMountpoint()); host->setText(m_settings.getDefaultHost()); int iPort = m_settings.getDefaultPort(); - if (iPort != 0 && iPort <= 0xffff) { - port->setText(QString::number(m_settings.getDefaultPort())); - } else { + DEBUG_ASSERT_AND_HANDLE(iPort != 0 && iPort <= 0xffff) { port->setText(QString()); + } else { + port->setText(QString::number(iPort)); } login->setText(m_settings.getDefaultLogin()); password->setText(m_settings.getDefaultPassword()); @@ -187,7 +187,7 @@ void DlgPrefBroadcast::slotResetToDefaults() { spinBoxMaximumRetries->setValue(m_settings.getDefaultMaximumRetries()); spinBoxMaximumRetries->setEnabled(true); stream_name->setText(m_settings.getDefaultStreamName()); - stream_website->setText(m_settings.getDefaultStreamName()); + stream_website->setText(m_settings.getDefaultStreamWebsite()); stream_desc->setText(m_settings.getDefaultStreamDesc()); stream_genre->setText(m_settings.getDefaultStreamGenre()); stream_public->setChecked(m_settings.getDefaultStreamPublic()); From f0542625da75ed3e006f7dffcc87f74b720ef201 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 23 Jan 2017 23:55:10 +0100 Subject: [PATCH 34/34] Check the results of string convert when reading double values --- src/preferences/configobject.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/preferences/configobject.cpp b/src/preferences/configobject.cpp index 17c1851d1ce7..5b4fa6570df4 100644 --- a/src/preferences/configobject.cpp +++ b/src/preferences/configobject.cpp @@ -345,9 +345,12 @@ double ConfigObject::getValue( if (value.isNull()) { return default_value; } - return value.value.toDouble(); + bool ok; + auto result = value.value.toDouble(&ok); + return ok ? result : default_value; } +// For string literal default template <> QString ConfigObject::getValue( const ConfigKey& key, const char* default_value) const {