Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Shoutcast live sending not to break stream #665

Merged
merged 81 commits into from
Oct 28, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
e2bde9a
Make Shoutcast side engine to cache content before it is send to server.
illuusio Aug 1, 2015
daa4ae9
Merge remote-tracking branch 'upstream/1.12' into 1.12-shoutcast-fixes
daschuer Aug 21, 2015
cccfde5
Some code style clean ups
daschuer Aug 21, 2015
ec2efce
Added EnginenetWorkStream SoundDeviceNetwork, to treat network stream…
daschuer Aug 23, 2015
54cd59b
Added Sidechain stream to SoundMamager
daschuer Aug 23, 2015
064e7ef
Hide Sidechanin from Hardware preferences
daschuer Aug 23, 2015
7a03a67
Statically connect the network device to the sidechain stream and mak…
daschuer Aug 26, 2015
afcf020
Merge remote-tracking branch 'upstream/1.12' into 1.12-shoutcast-fixes
illuusio Aug 27, 2015
3dc4480
Merge pull request #1 from daschuer/1.12-shoutcast-fixes
illuusio Aug 27, 2015
4ab8dbd
Moving instantiation of EngineNetworkStream to SoundManager
daschuer Aug 27, 2015
98cfe5b
Register EngineShoutcast at the EngineNetworkStream
daschuer Aug 27, 2015
3779b56
Merge pull request #2 from daschuer/1.12-shoutcast-fixes
illuusio Aug 28, 2015
6b14490
Make measurement us exact
daschuer Aug 28, 2015
76e26e8
move addWorker to cpp file
daschuer Aug 29, 2015
15a4701
Added signaling iterface
daschuer Aug 29, 2015
aa441ce
Refactored the shoutcast thread to fit to EngineNetworkStream
daschuer Aug 29, 2015
5309349
Merge pull request #3 from daschuer/1.12-shoutcast-fixes
illuusio Aug 31, 2015
07af248
Fill buffer only if the thead is waiting
daschuer Sep 3, 2015
df5b7a4
use writeSilence only if shoutcast thread is availabe
daschuer Sep 3, 2015
a9b552e
Advance frame even if the shoutcast thread is off.
daschuer Sep 3, 2015
6d80d07
Improve behaviour in case of buffer full in EngineNetworkStream
daschuer Sep 5, 2015
dca5947
Merge pull request #4 from daschuer/1.12-shoutcast-fixes
illuusio Sep 6, 2015
a35d357
Changes that are needed to make Shoutcast engine to start again
illuusio Sep 6, 2015
9b75a6d
Fix build on linux gcc
daschuer Sep 6, 2015
ae6a79b
Ensure that m_pOutputBuffer is set before shoutcast thread starts
daschuer Sep 6, 2015
e5d0e05
Turn m_pShoutcast into a shared pointer
daschuer Sep 6, 2015
f396241
Code style
daschuer Sep 6, 2015
84228ce
Move most libshout calls to shout thread
daschuer Sep 6, 2015
1d96a48
Merge pull request #5 from daschuer/1.12-shoutcast-fixes
illuusio Sep 10, 2015
7023e52
Added more verbose state handling to sidechaingworker's. First user f…
illuusio Sep 13, 2015
9ca0154
Fixing compile error 'warning: no return statement in function return…
illuusio Sep 13, 2015
eb6ec21
Added basic State handling to engineshoutcast
illuusio Sep 13, 2015
aad42ac
Removed old Shoutcast status messages to favor new status messages
illuusio Sep 13, 2015
377845d
Added some more state changes to make sure we are on 'SIDECHAINWORKER…
illuusio Sep 13, 2015
146dc25
Remove unneeded qDebug()
illuusio Sep 13, 2015
fd8bd1c
Signal user about we have connected to server
illuusio Sep 13, 2015
633c6d4
Renamed 'SIDECHAINWORKER_STATE_UNKNOWN' as 'SIDECHAINWORKER_STATE_NEW…
illuusio Sep 15, 2015
545ef5c
Removed Error Messages. It was bad idea anyway
illuusio Sep 15, 2015
fb17022
Fix compile on WIN, use GetSystemTimePreciseAsFileTime() on Windows 8
daschuer Sep 22, 2015
1d8503b
Check GetSystemTimePreciseAsFileTime at runtime
daschuer Sep 22, 2015
71aa071
Improve getNetworkTimeUs for small buffer sizes and systems < Win 8
daschuer Sep 25, 2015
6b324b0
Fix typo
daschuer Sep 25, 2015
67b8fe7
use DEBUG_ASSERT_AND_HANDLE
daschuer Sep 25, 2015
74558ae
Use correct pointer
daschuer Sep 25, 2015
a5db63c
made m_bThreadQuit volatile
daschuer Sep 25, 2015
29a4814
split engineshoutcast from sidechainworker
daschuer Sep 25, 2015
4b4953b
turn [Shoutcast],"enable" into a ControlObject
daschuer Sep 26, 2015
eb6563d
switched to util/performancetimer.h to be frequency independent
daschuer Sep 27, 2015
2ea06af
Merge pull request #6 from daschuer/1.12-shoutcast-fixes
illuusio Sep 28, 2015
59bd2b0
Add missing file
daschuer Sep 28, 2015
b7b23f9
use shout_send_raw to bypass the syncing code
daschuer Sep 28, 2015
6e5d7f6
Improve reconnecting on errors
daschuer Sep 28, 2015
1b5104f
Merge pull request #7 from daschuer/1.12-shoutcast-fixes
illuusio Sep 29, 2015
ba4e07a
Improve errorhandling and make sending work again
daschuer Sep 29, 2015
cd2df70
Ignore Sigpipe per thread
daschuer Sep 29, 2015
e03d876
Improved error handling
daschuer Sep 29, 2015
70f7ae5
Improved the three state statusCO
daschuer Sep 30, 2015
dbc5cce
Shade: Added broadcast status light
daschuer Sep 30, 2015
6d45922
remove redundant check for m_pShout
daschuer Sep 30, 2015
1eec4b9
Allow reconnecting after fixing shoutcast settings
daschuer Sep 30, 2015
82a2e6a
Re-added connecting state to be compatible
daschuer Oct 1, 2015
a0a632e
Improve status CO and remove redundant thread quit flag
daschuer Oct 1, 2015
8bd600f
Allow to control shoutcast by the status CO, and bind to status butto…
daschuer Oct 1, 2015
6412e84
Merge pull request #8 from daschuer/1.12-shoutcast-fixes
illuusio Oct 2, 2015
4089104
change start() to start(QThread::HighPriority)
illuusio Oct 2, 2015
7bab320
Now changes to edit shoutcast disables when we are sending to net
illuusio Oct 14, 2015
aae2e68
Make sure we don't change anything while we are middle of shoutcast s…
illuusio Oct 14, 2015
66dbc10
Moved enabling code to own method so we can call it more easily from …
illuusio Oct 14, 2015
ed2edbf
Graying Shoutcast-dialog whiches when 'Apply' is pushed
illuusio Oct 14, 2015
337b73c
remove "update_from_prefs" CO
daschuer Oct 15, 2015
98705e0
connect shoutcast preferences to enabled signal
daschuer Oct 15, 2015
683045c
remove Hint about reconnecting in shoutcast preferences
daschuer Oct 15, 2015
8cc4bb3
Merge pull request #9 from daschuer/1.12-shoutcast-fixes
illuusio Oct 19, 2015
70198c5
Fix Apple time base
daschuer Oct 19, 2015
cef330c
Merge pull request #10 from daschuer/1.12-shoutcast-fixes
illuusio Oct 20, 2015
55c2439
changed 'm_pShoutcastEnabled->toBool() == true' to shoter '\!m_pShout…
illuusio Oct 22, 2015
ed7f61b
Removed setDialogEnabled to favor more generic this->setEnabled method
illuusio Oct 22, 2015
9e66a65
Signal user in log is FIFO for shoutcast is not available
illuusio Oct 22, 2015
47a0dda
Someone like for other like while. It's the same at the end but readable
illuusio Oct 22, 2015
b54776c
Make sure that 'read-only control' is signaled that way that user und…
illuusio Oct 22, 2015
f09cbda
Added two signals 'shoutcastConnected' and 'shoutcastDisconnected' so…
illuusio Oct 22, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions build/depends.py
Original file line number Diff line number Diff line change
Expand Up @@ -892,6 +892,8 @@ def sources(self, build):
"playermanager.cpp",
"samplerbank.cpp",
"sounddevice.cpp",
"sounddevicenetwork.cpp",
"engine/sidechain/enginenetworkstream.cpp",
"soundmanager.cpp",
"soundmanagerconfig.cpp",
"soundmanagerutil.cpp",
Expand Down
Binary file added res/skins/Shade/btn_broadcast_connected.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added res/skins/Shade/btn_broadcast_connecting.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added res/skins/Shade/btn_broadcast_failure.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added res/skins/Shade/btn_broadcast_unconnected.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
35 changes: 33 additions & 2 deletions res/skins/Shade/mixer_panel.xml
Original file line number Diff line number Diff line change
Expand Up @@ -612,8 +612,39 @@
<ConfigKey>[Master],audio_latency_usage</ConfigKey>
</Connection>
</VuMeter>



<PushButton>
<Style></Style>
<NumberStates>4</NumberStates>
<State>
<Number>0</Number>
<Pressed>btn_broadcast_unconnected.png</Pressed>
<Unpressed>btn_broadcast_unconnected.png</Unpressed>
</State>
<State>
<Number>1</Number>
<Pressed>btn_broadcast_connecting.png</Pressed>
<Unpressed>btn_broadcast_connecting.png</Unpressed>
</State>
<State>
<Number>2</Number>
<Pressed>btn_broadcast_connected.png</Pressed>
<Unpressed>btn_broadcast_connected.png</Unpressed>
</State>
<State>
<Number>3</Number>
<Pressed>btn_broadcast_failure.png</Pressed>
<Unpressed>btn_broadcast_failure.png</Unpressed>
</State>
<Pos>113,30</Pos>
<Connection>
<ConfigKey>[Shoutcast],enabled</ConfigKey>
<ButtonState>LeftButton</ButtonState>
</Connection>
<Connection>
<ConfigKey>[Shoutcast],status</ConfigKey>
</Connection>
</PushButton>

<!--
**********************************************
Expand Down
95 changes: 68 additions & 27 deletions src/dlgprefshoutcast.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
#include "defs_urls.h"
#include "dlgprefshoutcast.h"
#include "shoutcast/defs_shoutcast.h"
#include "controlobjectthread.h"
#include "controlobjectslave.h"

const char* kDefaultMetadataFormat = "$artist - $title";

Expand All @@ -31,12 +31,15 @@ DlgPrefShoutcast::DlgPrefShoutcast(QWidget *parent, ConfigObject<ConfigValue> *_
m_pConfig(_config) {
setupUi(this);

m_pUpdateShoutcastFromPrefs = new ControlObjectThread(
SHOUTCAST_PREF_KEY, "update_from_prefs");
m_pShoutcastEnabled = new ControlObjectSlave(
SHOUTCAST_PREF_KEY, "enabled", this);
m_pShoutcastEnabled->connectValueChanged(
SLOT(shoutcastEnabledChanged(double)));


// Enable live broadcasting checkbox
enableLiveBroadcasting->setChecked((bool)m_pConfig->getValueString(
ConfigKey(SHOUTCAST_PREF_KEY,"enabled")).toInt());
enableLiveBroadcasting->setChecked(
m_pShoutcastEnabled->toBool());

//Server type combobox
comboBoxServerType->addItem(tr("Icecast 2"), SHOUTCAST_SERVER_ICECAST2);
Expand Down Expand Up @@ -181,7 +184,6 @@ DlgPrefShoutcast::DlgPrefShoutcast(QWidget *parent, ConfigObject<ConfigValue> *_
}

DlgPrefShoutcast::~DlgPrefShoutcast() {
delete m_pUpdateShoutcastFromPrefs;
}

void DlgPrefShoutcast::slotResetToDefaults() {
Expand Down Expand Up @@ -212,31 +214,65 @@ void DlgPrefShoutcast::slotResetToDefaults() {
}

void DlgPrefShoutcast::slotUpdate() {
enableLiveBroadcasting->setChecked((bool)m_pConfig->getValueString(
ConfigKey(SHOUTCAST_PREF_KEY,"enabled")).toInt());
enableLiveBroadcasting->setChecked(m_pShoutcastEnabled->toBool());

// Don't let user modify information if
// sending is enabled.
if(m_pShoutcastEnabled->toBool()) {
this->setEnabled(false);
} else {
this->setEnabled(true);
}
}

void DlgPrefShoutcast::slotApply()
{
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "enabled"), ConfigValue(enableLiveBroadcasting->isChecked()));
m_pShoutcastEnabled->set(enableLiveBroadcasting->isChecked());

// Don't let user modify information if
// sending is enabled.
if(m_pShoutcastEnabled->toBool()) {
this->setEnabled(false);
} else {
this->setEnabled(true);
}

// Combo boxes, make sure to load their data not their display strings.
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "servertype"), ConfigValue(comboBoxServerType->itemData(comboBoxServerType->currentIndex()).toString()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "bitrate"), ConfigValue(comboBoxEncodingBitrate->itemData(comboBoxEncodingBitrate->currentIndex()).toString()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "format"), ConfigValue(comboBoxEncodingFormat->itemData(comboBoxEncodingFormat->currentIndex()).toString()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "channels"), ConfigValue(comboBoxEncodingChannels->itemData(comboBoxEncodingChannels->currentIndex()).toString()));

m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "mountpoint"), ConfigValue(mountpoint->text()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "host"), ConfigValue(host->text()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "port"), ConfigValue(port->text()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "login"), ConfigValue(login->text()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "password"), ConfigValue(password->text()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "stream_name"), ConfigValue(stream_name->text()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "stream_website"),ConfigValue(stream_website->text()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "stream_desc"), ConfigValue(stream_desc->toPlainText()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "stream_genre"), ConfigValue(stream_genre->text()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "stream_public"), ConfigValue(stream_public->isChecked()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "ogg_dynamicupdate"), ConfigValue(ogg_dynamicupdate->isChecked()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "servertype"),
ConfigValue(comboBoxServerType->itemData(
comboBoxServerType->currentIndex()).toString()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "bitrate"),
ConfigValue(comboBoxEncodingBitrate->itemData(
comboBoxEncodingBitrate->currentIndex()).toString()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "format"),
ConfigValue(comboBoxEncodingFormat->itemData(
comboBoxEncodingFormat->currentIndex()).toString()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "channels"),
ConfigValue(comboBoxEncodingChannels->itemData(
comboBoxEncodingChannels->currentIndex()).toString()));

m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "mountpoint"),
ConfigValue(mountpoint->text()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "host"),
ConfigValue(host->text()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "port"),
ConfigValue(port->text()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "login"),
ConfigValue(login->text()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "password"),
ConfigValue(password->text()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "stream_name"),
ConfigValue(stream_name->text()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "stream_website"),
ConfigValue(stream_website->text()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "stream_desc"),
ConfigValue(stream_desc->toPlainText()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "stream_genre"),
ConfigValue(stream_genre->text()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "stream_public"),
ConfigValue(stream_public->isChecked()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "ogg_dynamicupdate"),
ConfigValue(ogg_dynamicupdate->isChecked()));

QString charset = "";
if (enableUtf8Metadata->isChecked()) {
Expand All @@ -257,7 +293,12 @@ void DlgPrefShoutcast::slotApply()
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "custom_artist"), ConfigValue(custom_artist->text()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "custom_title"), ConfigValue(custom_title->text()));
m_pConfig->set(ConfigKey(SHOUTCAST_PREF_KEY, "metadata_format"), ConfigValue(metadata_format->text()));
}

void DlgPrefShoutcast::shoutcastEnabledChanged(double value) {
qDebug() << "DlgPrefShoutcast::shoutcastEnabledChanged()" << value;
bool enabled = value == 1.0; // 0 and 2 are disabled
this->setEnabled(!enabled);
enableLiveBroadcasting->setChecked(enabled);

//Tell the EngineShoutcast object to update with these values by toggling this control object.
m_pUpdateShoutcastFromPrefs->slotSet(1.0);
}
6 changes: 3 additions & 3 deletions src/dlgprefshoutcast.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
*@author John Sully
*/

class ControlObjectThread;
class ControlObjectSlave;

class DlgPrefShoutcast : public DlgPreferencePage, public Ui::DlgPrefShoutcastDlg {
Q_OBJECT
Expand All @@ -45,14 +45,14 @@ class DlgPrefShoutcast : public DlgPreferencePage, public Ui::DlgPrefShoutcastDl
void slotApply();
void slotUpdate();
void slotResetToDefaults();
void shoutcastEnabledChanged(double value);

signals:
void apply(const QString &);

private:
ConfigObject<ConfigValue>* m_pConfig;
// If set to 1, EngineShoutcast will update it's settings.
ControlObjectThread* m_pUpdateShoutcastFromPrefs;
ControlObjectSlave* m_pShoutcastEnabled;
};

#endif
83 changes: 32 additions & 51 deletions src/dlgprefshoutcastdlg.ui
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,25 @@
<string>Live Broadcasting Preferences</string>
</property>
<layout class="QGridLayout">
<item row="3" column="1">
<widget class="QGroupBox" name="verticalGroupBox">
<property name="title">
<string>Shoutcast metadata format</string>
</property>
<property name="flat">
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLineEdit" name="metadata_format">
<property name="text">
<string notr="true">$artist - $title</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="2" column="0" rowspan="3">
<widget class="QGroupBox" name="groupBox_3">
<property name="minimumSize">
Expand Down Expand Up @@ -185,8 +204,8 @@
<string notr="true">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot;-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';&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Ubuntu'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot;-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;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
Expand Down Expand Up @@ -314,36 +333,7 @@ p, li { white-space: pre-wrap; }
</layout>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="QGroupBox" name="Hints">
<property name="title">
<string>Hints</string>
</property>
<layout class="QGridLayout" name="gridLayout_6">
<item row="4" column="0">
<widget class="QLabel" name="label_26">
<property name="text">
<string>Please note that for technical reasons changing any of these settings will cause an established connection to disconnect and reconnect. </string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QCheckBox" name="enableLiveBroadcasting">
<property name="text">
<string>Enable Live Broadcasting</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="6" column="0">
<item row="5" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
Expand All @@ -356,6 +346,16 @@ p, li { white-space: pre-wrap; }
</property>
</spacer>
</item>
<item row="0" column="0" colspan="2">
<widget class="QCheckBox" name="enableLiveBroadcasting">
<property name="text">
<string>Enable Live Broadcasting</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QGroupBox" name="groupBox_4">
<property name="title">
Expand Down Expand Up @@ -522,25 +522,6 @@ p, li { white-space: pre-wrap; }
</layout>
</widget>
</item>
<item row="3" column="1">
<widget class="QGroupBox" name="verticalGroupBox">
<property name="title">
<string>Shoutcast metadata format</string>
</property>
<property name="flat">
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLineEdit" name="metadata_format">
<property name="text">
<string notr="true">$artist - $title</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
Expand Down
4 changes: 3 additions & 1 deletion src/dlgprefsound.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,9 @@ void DlgPrefSound::slotApply() {
*/
void DlgPrefSound::initializePaths() {
foreach (AudioOutput out, m_pSoundManager->registeredOutputs()) {
addPath(out);
if (!out.isHidden()) {
addPath(out);
}
}
foreach (AudioInput in, m_pSoundManager->registeredInputs()) {
addPath(in);
Expand Down
Loading