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

XML config files for Live Broadcasting preferences #1283

Closed
wants to merge 40 commits into from
Closed
Show file tree
Hide file tree
Changes from 30 commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
b75dc85
preferences: add WIP class for broadcasting profiles
Jun 2, 2017
eb7a29d
xml profile schema: refactor tag names to SnakeCase
Jun 2, 2017
abc8b81
Fix errors in BroadcastProfile and make sure it builds
Jun 2, 2017
6449956
(WIP) BroadcastSettings and BroadcastProfile refactor
Jun 9, 2017
afff79f
BroadcastSettings: fix behaviour of filename gen. method
Jun 9, 2017
744cb93
BroadcastProfile: fix XML load/save code
Jun 9, 2017
c1296be
BroadcastSettings: enhance default profile creation
Jun 9, 2017
52f8d7e
BroadcastSettings: add qDebug statements
Jun 9, 2017
84dd954
BroadcastProfile: remove extra qualifications in header file
Jun 9, 2017
607bab5
Merge branch 'master' of https://github.com/mixxxdj/mixxx into broadc…
Jun 9, 2017
b2d089d
BroadcastProfile: fix XML file load code
Jun 9, 2017
29e2205
BroadcastSettings: make sure only one instance exists
Jun 15, 2017
0ee0095
Code style fix in EncoderBroadcastSettings
Jun 15, 2017
6196f40
SettingsManager: remove shared pointer type
Jun 15, 2017
48fd2f2
Add auto migration from legacy broadcasting settings
Jun 15, 2017
9114789
Broadcasting settings: don't remove previous settings when migrating
Jun 16, 2017
cb2ed7b
Move BroadcastProfile::loadLegacySettings to BroadcastSettings
Jun 16, 2017
679b61d
Unindent anonymous namespace of BroadcastProfile class
Jun 16, 2017
0c8392c
BroadcastProfile: remove non-existent method declaration
Jun 16, 2017
39cc28a
Add unit tests for BroadcastProfile class
Jun 16, 2017
ab14026
Fix and rename method BroadcastProfile::checkNameCompliance
Jun 16, 2017
c6e0af9
BroadcastProfile: fix DefaultValues unit test
Jun 16, 2017
38c9b1d
BroadcastProfile: fix typo in forbidden characters regex
Jun 16, 2017
1f2452d
BroadcastProfile: fix forbidden chars regex syntax
Jun 17, 2017
e590364
Several minor fixes in BroadcastProfile class
Jun 20, 2017
0b85dea
Use a QSharedPointer smart pointer for instances of BroadcastProfile
Jun 20, 2017
5057479
Several changes in BroadcastSettings class
Jun 20, 2017
6d4e369
Minor fixes in DlgPrefBroadcast
Jun 20, 2017
7ddba28
BroadcastProfile: replace use of QSharedPointer with std::unique_ptr
Jun 20, 2017
799dc4e
BroadcastSettings: hashmap for fast lookup of profiles by name
Jun 20, 2017
337b260
BroadcastProfile: loadFromFile returns a smart pointer
Jun 20, 2017
0676416
Remove uses of C++14 std::make_unique
Jun 21, 2017
b9806f6
Revert removal of std::make_unique and use it properly
Jun 21, 2017
7d4fdd6
Use QSharedPointers instead of std::unique_ptr and add missing connec…
Jun 21, 2017
4c55ae6
Refactor BroadcastProfile ForbiddenChars unit test
Jun 21, 2017
43468cd
BroadcastProfile tests: remove deprecated asserts
Jun 22, 2017
50e542b
BroadcastProfile: add clarifying comment
Jun 22, 2017
f4d10b7
BroadcastSettings: implement model and remove get/setCurrentProfile
Jun 23, 2017
113108d
BroadcastProfile unit testing: use regular tests
Jun 23, 2017
57e9047
BroadcastProfile tests: remove useless fixture
Jun 23, 2017
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 @@ -680,6 +680,8 @@ def sources(self, build):
"preferences/settingsmanager.cpp",
"preferences/replaygainsettings.cpp",
"preferences/broadcastsettings.cpp",
"preferences/broadcastsettings_legacy.cpp",
"preferences/broadcastprofile.cpp",
"preferences/upgrade.cpp",
"preferences/dlgpreferencepage.cpp",

Expand Down
7 changes: 4 additions & 3 deletions src/broadcast/broadcastmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,15 @@
#include "engine/sidechain/enginesidechain.h"
#include "soundio/soundmanager.h"

BroadcastManager::BroadcastManager(UserSettingsPointer pConfig,
BroadcastManager::BroadcastManager(SettingsManager* pSettingsManager,
SoundManager* pSoundManager)
: m_pConfig(pConfig) {
: m_pConfig(pSettingsManager->settings()) {
QSharedPointer<EngineNetworkStream> pNetworkStream =
pSoundManager->getNetworkStream();
if (!pNetworkStream.isNull()) {
m_pBroadcast = QSharedPointer<EngineBroadcast>(
new EngineBroadcast(pConfig));
new EngineBroadcast(m_pConfig,
pSettingsManager->broadcastSettings()));
pNetworkStream->addWorker(m_pBroadcast);
}
m_pBroadcastEnabled = new ControlProxy(
Expand Down
3 changes: 2 additions & 1 deletion src/broadcast/broadcastmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@
#include <QObject>

#include "engine/sidechain/enginebroadcast.h"
#include "preferences/settingsmanager.h"
#include "preferences/usersettings.h"

class SoundManager;

class BroadcastManager : public QObject {
Q_OBJECT
public:
BroadcastManager(UserSettingsPointer pConfig,
BroadcastManager(SettingsManager* pSettingsManager,
SoundManager* pSoundManager);
virtual ~BroadcastManager();

Expand Down
50 changes: 26 additions & 24 deletions src/encoder/encoderbroadcastsettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@

#define DEFAULT_BITRATE 128

EncoderBroadcastSettings::EncoderBroadcastSettings(BroadcastSettings settings) :
m_settings(settings)
{
EncoderBroadcastSettings::EncoderBroadcastSettings(
BroadcastSettingsPointer settings)
: m_settings(settings) {
m_qualList.append(32);
m_qualList.append(48);
m_qualList.append(64);
Expand All @@ -26,41 +26,40 @@ m_settings(settings)
m_qualList.append(256);
m_qualList.append(320);
}
EncoderBroadcastSettings::~EncoderBroadcastSettings()
{

EncoderBroadcastSettings::~EncoderBroadcastSettings() {
}


QList<int> EncoderBroadcastSettings::getQualityValues() const
{
QList<int> EncoderBroadcastSettings::getQualityValues() const {
return m_qualList;
}

// Sets the value
void EncoderBroadcastSettings::setQualityByValue(int qualityValue)
{
void EncoderBroadcastSettings::setQualityByValue(int qualityValue) {
const BroadcastProfilePtr& profile = m_settings->getCurrentProfile();

if (m_qualList.contains(qualityValue)) {
m_settings.setBitrate(qualityValue);
profile->setBitrate(qualityValue);
} else {
qWarning() << "Invalid qualityValue given to EncoderBroadcastSettings: "
<< qualityValue << ". Ignoring it";
}
}

void EncoderBroadcastSettings::setQualityByIndex(int qualityIndex)
{
void EncoderBroadcastSettings::setQualityByIndex(int qualityIndex) {
const BroadcastProfilePtr& profile = m_settings->getCurrentProfile();

if (qualityIndex >= 0 && qualityIndex < m_qualList.size()) {
m_settings.setBitrate(m_qualList.at(qualityIndex));
profile->setBitrate(m_qualList.at(qualityIndex));
} else {
qWarning() << "Invalid qualityIndex given to EncoderBroadcastSettings: "
<< qualityIndex << ". Ignoring it";
}
}

int EncoderBroadcastSettings::getQuality() const
{
int bitrate = m_settings.getBitrate();
int EncoderBroadcastSettings::getQuality() const {
const BroadcastProfilePtr& profile = m_settings->getCurrentProfile();

int bitrate = profile->getBitrate();
if (m_qualList.contains(bitrate)) {
return bitrate;
}
Expand All @@ -70,18 +69,21 @@ int EncoderBroadcastSettings::getQuality() const
}
return DEFAULT_BITRATE;
}
int EncoderBroadcastSettings::getQualityIndex() const
{

int EncoderBroadcastSettings::getQualityIndex() const {
return m_qualList.indexOf(getQuality());
}

void EncoderBroadcastSettings::setChannelMode(EncoderSettings::ChannelMode mode)
{
m_settings.setChannels(static_cast<int>(mode));
const BroadcastProfilePtr& profile = m_settings->getCurrentProfile();
profile->setChannels(static_cast<int>(mode));
}
EncoderSettings::ChannelMode EncoderBroadcastSettings::getChannelMode() const
{
switch(m_settings.getChannels()) {

EncoderSettings::ChannelMode EncoderBroadcastSettings::getChannelMode() const {
const BroadcastProfilePtr& profile = m_settings->getCurrentProfile();

switch(profile->getChannels()) {
case 1: return EncoderSettings::ChannelMode::MONO;
case 2: return EncoderSettings::ChannelMode::STEREO;
case 0: // fallthrough
Expand Down
4 changes: 2 additions & 2 deletions src/encoder/encoderbroadcastsettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

class EncoderBroadcastSettings : public EncoderSettings {
public:
EncoderBroadcastSettings(BroadcastSettings settings);
EncoderBroadcastSettings(BroadcastSettingsPointer settings);
virtual ~EncoderBroadcastSettings();

// Indicates that it uses the quality slider section of the preferences
Expand All @@ -39,7 +39,7 @@ class EncoderBroadcastSettings : public EncoderSettings {

private:
QList<int> m_qualList;
BroadcastSettings m_settings;
BroadcastSettingsPointer m_settings;
};


Expand Down
57 changes: 30 additions & 27 deletions src/engine/sidechain/enginebroadcast.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,16 @@ static const int kMaxNetworkCache = 491520; // 10 s mp3 @ 192 kbit/s
// http://wiki.shoutcast.com/wiki/SHOUTcast_DNAS_Server_2
static const int kMaxShoutFailures = 3;

EngineBroadcast::EngineBroadcast(UserSettingsPointer pConfig)
EngineBroadcast::EngineBroadcast(UserSettingsPointer pConfig,
BroadcastSettingsPointer pBroadcastSettings)
: m_pTextCodec(nullptr),
m_pMetaData(),
m_pShout(nullptr),
m_pShoutMetaData(nullptr),
m_iMetaDataLife(0),
m_iShoutStatus(0),
m_iShoutFailures(0),
m_settings(pConfig),
m_settings(pBroadcastSettings),
m_pConfig(pConfig),
m_encoder(nullptr),
m_pMasterSamplerate(new ControlProxy("[Master]", "samplerate")),
Expand Down Expand Up @@ -135,6 +136,8 @@ QByteArray EngineBroadcast::encodeString(const QString& string) {
}

void EngineBroadcast::updateFromPreferences() {
const BroadcastProfilePtr& profile = m_settings->getCurrentProfile();

qDebug() << "EngineBroadcast: updating from preferences";
NetworkStreamWorker::debugState();

Expand Down Expand Up @@ -164,7 +167,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_settings.getMetadataCharset();
QString codec = profile->getMetadataCharset();
QByteArray baCodec = codec.toLatin1();
m_pTextCodec = QTextCodec::codecForName(baCodec);
if (!m_pTextCodec) {
Expand All @@ -175,9 +178,9 @@ void EngineBroadcast::updateFromPreferences() {
// Indicates our metadata is in the provided charset.
shout_metadata_add(m_pShoutMetaData, "charset", baCodec.constData());

QString serverType = m_settings.getServertype();
QString serverType = profile->getServertype();

QString host = m_settings.getHost();
QString host = profile->getHost();
int start = host.indexOf(QLatin1String("//"));
if (start == -1) {
// the host part requires preceding //.
Expand All @@ -187,54 +190,54 @@ void EngineBroadcast::updateFromPreferences() {
}
QUrl serverUrl = host;

int port = m_settings.getPort();
int port = profile->getPort();
serverUrl.setPort(port);

QString mountPoint = m_settings.getMountpoint();
QString mountPoint = profile->getMountpoint();
if (!mountPoint.isEmpty()) {
if (!mountPoint.startsWith('/')) {
mountPoint.prepend('/');
}
serverUrl.setPath(mountPoint);
}

QString login = m_settings.getLogin();
QString login = profile->getLogin();
if (!login.isEmpty()) {
serverUrl.setUserName(login);
}

qDebug() << "Using server URL:" << serverUrl;

QByteArray baPassword = m_settings.getPassword().toLatin1();
QByteArray baFormat = m_settings.getFormat().toLatin1();
int iBitrate = m_settings.getBitrate();
QByteArray baPassword = profile->getPassword().toLatin1();
QByteArray baFormat = profile->getFormat().toLatin1();
int iBitrate = profile->getBitrate();

// Encode metadata like stream name, website, desc, genre, title/author with
// the chosen TextCodec.
QByteArray baStreamName = encodeString(m_settings.getStreamName());
QByteArray baStreamWebsite = encodeString(m_settings.getStreamWebsite());
QByteArray baStreamDesc = encodeString(m_settings.getStreamDesc());
QByteArray baStreamGenre = encodeString(m_settings.getStreamGenre());
QByteArray baStreamName = encodeString(profile->getStreamName());
QByteArray baStreamWebsite = encodeString(profile->getStreamWebsite());
QByteArray baStreamDesc = encodeString(profile->getStreamDesc());
QByteArray baStreamGenre = encodeString(profile->getStreamGenre());

// Whether the stream is public.
bool streamPublic = m_settings.getStreamPublic();
bool streamPublic = profile->getStreamPublic();

// Dynamic Ogg metadata update
m_ogg_dynamic_update = m_settings.getOggDynamicUpdate();
m_ogg_dynamic_update = profile->getOggDynamicUpdate();

m_custom_metadata = m_settings.getEnableMetadata();
m_customTitle = m_settings.getCustomTitle();
m_customArtist = m_settings.getCustomArtist();
m_custom_metadata = profile->getEnableMetadata();
m_customTitle = profile->getCustomTitle();
m_customArtist = profile->getCustomArtist();

m_metadataFormat = m_settings.getMetadataFormat();
m_metadataFormat = profile->getMetadataFormat();

bool enableReconnect = m_settings.getEnableReconnect();
bool enableReconnect = profile->getEnableReconnect();
if (enableReconnect) {
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();
m_reconnectFirstDelay = profile->getReconnectFirstDelay();
m_reconnectPeriod = profile->getReconnectPeriod();
m_noDelayFirstReconnect = profile->getNoDelayFirstReconnect();
m_limitReconnects = profile->getLimitReconnects();
m_maximumRetries = profile->getMaximumRetries();
} else {
m_limitReconnects = true;
m_maximumRetries = 0;
Expand Down
5 changes: 3 additions & 2 deletions src/engine/sidechain/enginebroadcast.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ class EngineBroadcast
STATUSCO_FAILURE = 3 // Happens when disconnected by an error
};

EngineBroadcast(UserSettingsPointer pConfig);
EngineBroadcast(UserSettingsPointer pConfig,
BroadcastSettingsPointer pBroadcastSettings);
virtual ~EngineBroadcast();

// This is called by the Engine implementation for each sample. Encode and
Expand Down Expand Up @@ -123,7 +124,7 @@ class EngineBroadcast
int m_iMetaDataLife;
long m_iShoutStatus;
long m_iShoutFailures;
BroadcastSettings m_settings;
BroadcastSettingsPointer m_settings;
UserSettingsPointer m_pConfig;
EncoderPointer m_encoder;
ControlPushButton* m_pBroadcastEnabled;
Expand Down
6 changes: 3 additions & 3 deletions src/mixxx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,8 @@ void MixxxMainWindow::initialize(QApplication* pApp, const CmdlineArgs& args) {


#ifdef __BROADCAST__
m_pBroadcastManager = new BroadcastManager(pConfig, m_pSoundManager);
m_pBroadcastManager = new BroadcastManager(m_pSettingsManager,
m_pSoundManager);
#endif

launchProgress(11);
Expand Down Expand Up @@ -320,7 +321,7 @@ void MixxxMainWindow::initialize(QApplication* pApp, const CmdlineArgs& args) {
// Initialize preference dialog
m_pPrefDlg = new DlgPreferences(this, m_pSkinLoader, m_pSoundManager, m_pPlayerManager,
m_pControllerManager, m_pVCManager, m_pEffectsManager,
pConfig, m_pLibrary);
m_pSettingsManager, m_pLibrary);
m_pPrefDlg->setWindowIcon(QIcon(":/images/ic_mixxx_window.png"));
m_pPrefDlg->setHidden(true);

Expand Down Expand Up @@ -619,7 +620,6 @@ void MixxxMainWindow::finalize() {
Sandbox::shutdown();

qDebug() << t.elapsed(false).debugMillisWithUnit() << "deleting SettingsManager";
delete m_pSettingsManager;

delete m_pKeyboard;
delete m_pKbdConfig;
Expand Down
3 changes: 3 additions & 0 deletions src/mixxx.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#define MIXXX_H

#include <QMainWindow>
#include <QSharedPointer>
#include <QString>

#include "preferences/configobject.h"
Expand Down Expand Up @@ -48,6 +49,8 @@ class SoundManager;
class VinylControlManager;
class WMainMenuBar;

typedef QSharedPointer<SettingsManager> SettingsManagerPointer;

// This Class is the base class for Mixxx. It sets up the main
// window and providing a menubar.
// For the main view, an instance of class MixxxView is
Expand Down
Loading