aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/Engines/mplayer/mplayerengine.cpp8
-rw-r--r--src/plugins/General/mpris/mpris1/playerobject.cpp4
-rw-r--r--src/plugins/Ui/qsui/mainwindow.cpp7
-rw-r--r--src/plugins/Ui/skinned/display.cpp15
-rw-r--r--src/plugins/Ui/skinned/display.h5
-rw-r--r--src/qmmp/audioparameters.cpp38
-rw-r--r--src/qmmp/audioparameters.h10
-rw-r--r--src/qmmp/outputwriter.cpp18
-rw-r--r--src/qmmp/outputwriter_p.h7
-rw-r--r--src/qmmp/soundcore.cpp18
-rw-r--r--src/qmmp/soundcore.h33
-rw-r--r--src/qmmp/statehandler.cpp49
-rw-r--r--src/qmmp/statehandler.h45
13 files changed, 114 insertions, 143 deletions
diff --git a/src/plugins/Engines/mplayer/mplayerengine.cpp b/src/plugins/Engines/mplayer/mplayerengine.cpp
index ad7ee07d7..08196b05e 100644
--- a/src/plugins/Engines/mplayer/mplayerengine.cpp
+++ b/src/plugins/Engines/mplayer/mplayerengine.cpp
@@ -202,11 +202,7 @@ void MplayerEngine::readStdOut()
{
StateHandler::instance()->dispatch(Qmmp::Playing);
m_currentTime = (qint64) rx_av.cap(1).toDouble();
- StateHandler::instance()->dispatch(m_currentTime * 1000,
- m_bitrate,
- m_samplerate,
- m_bitsPerSample,
- m_channels);
+ StateHandler::instance()->dispatch(m_currentTime * 1000, m_bitrate);
}
else if (rx_pause.indexIn(line) > -1)
{
@@ -244,6 +240,8 @@ void MplayerEngine::readStdOut()
m_channels = rx_audio.cap(2).toInt();
m_bitsPerSample = rx_audio.cap(3).toDouble();
m_bitrate = rx_audio.cap(4).toDouble();
+ AudioParameters ap(m_samplerate, ChannelMap(m_channels), AudioParameters::findAudioFormat(m_bitsPerSample));
+ StateHandler::instance()->dispatch(ap);
}
#ifdef MPLAYER_DEBUG
else
diff --git a/src/plugins/General/mpris/mpris1/playerobject.cpp b/src/plugins/General/mpris/mpris1/playerobject.cpp
index 3605c51a0..866a9858b 100644
--- a/src/plugins/General/mpris/mpris1/playerobject.cpp
+++ b/src/plugins/General/mpris/mpris1/playerobject.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2008-2013 by Ilya Kotov *
+ * Copyright (C) 2008-2017 by Ilya Kotov *
* forkotov02@ya.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -143,7 +143,7 @@ QVariantMap PlayerObject::GetMetadata()
map.insert("genre", m_core->metaData(Qmmp::GENRE));
map.insert("comment", m_core->metaData(Qmmp::COMMENT));
map.insert("audio-bitrate", (quint32)m_core->bitrate());
- map.insert("audio-samplerate", (quint32)m_core->frequency());
+ map.insert("audio-samplerate", (quint32)m_core->audioParameters().sampleRate());
map.insert("year", m_core->metaData(Qmmp::YEAR).toUInt());
return map;
}
diff --git a/src/plugins/Ui/qsui/mainwindow.cpp b/src/plugins/Ui/qsui/mainwindow.cpp
index e92ed21a3..56f5622ca 100644
--- a/src/plugins/Ui/qsui/mainwindow.cpp
+++ b/src/plugins/Ui/qsui/mainwindow.cpp
@@ -369,11 +369,12 @@ void MainWindow::updateStatus()
if(m_core->state() == Qmmp::Playing || m_core->state() == Qmmp::Paused)
{
+ AudioParameters ap = m_core->audioParameters();
m_statusLabel->setText(tr("<b>%1</b>|%2 bit|%3 ch|%4 Hz|tracks: %5|total time: %6|%7 kbps|")
.arg(m_core->state() == Qmmp::Playing ? tr("Playing") : tr("Paused"))
- .arg(m_core->sampleSize())
- .arg(m_core->channels())
- .arg(m_core->frequency())
+ .arg(ap.validBitsPerSample())
+ .arg(ap.channels())
+ .arg(ap.sampleRate())
.arg(tracks)
.arg(MetaDataFormatter::formatLength(length, false))
.arg(m_core->bitrate()));
diff --git a/src/plugins/Ui/skinned/display.cpp b/src/plugins/Ui/skinned/display.cpp
index 9c98b50cb..d4fd519a4 100644
--- a/src/plugins/Ui/skinned/display.cpp
+++ b/src/plugins/Ui/skinned/display.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2006-2016 by Ilya Kotov *
+ * Copyright (C) 2006-2017 by Ilya Kotov *
* forkotov02@ya.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -122,8 +122,7 @@ MainDisplay::MainDisplay (MainWindow *parent)
m_core = SoundCore::instance();
connect(m_core, SIGNAL(elapsedChanged(qint64)), SLOT(setTime(qint64)));
connect(m_core, SIGNAL(bitrateChanged(int)), m_kbps, SLOT(display(int)));
- connect(m_core, SIGNAL(frequencyChanged(quint32)), SLOT(setSampleRate(quint32)));
- connect(m_core, SIGNAL(channelsChanged(int)), m_monoster, SLOT(setChannels(int)));
+ connect(m_core, SIGNAL(audioParametersChanged(AudioParameters)), SLOT(onAudioPatametersChanged(AudioParameters)));
connect(m_core, SIGNAL(stateChanged(Qmmp::State)), SLOT(setState(Qmmp::State)));
connect(m_core, SIGNAL(volumeChanged(int)), m_volumeBar, SLOT(setValue(int)));
connect(m_core, SIGNAL(balanceChanged(int)), m_balanceBar, SLOT(setValue(int)));
@@ -205,6 +204,12 @@ void MainDisplay::setState(Qmmp::State state)
}
}
+void MainDisplay::onAudioPatametersChanged(const AudioParameters &p)
+{
+ m_monoster->setChannels(p.channels());
+ m_freq->display(int(p.sampleRate()) / 1000);
+}
+
void MainDisplay::updateSkin()
{
setPixmap (m_skin->getMain());
@@ -240,10 +245,6 @@ void MainDisplay::setActive(bool b)
m_titlebar->setActive(b);
}
-void MainDisplay::setSampleRate(quint32 rate)
-{
- m_freq->display((int) rate/1000);
-}
//TODO optimize this connections
void MainDisplay::setEQ (QWidget* w)
{
diff --git a/src/plugins/Ui/skinned/display.h b/src/plugins/Ui/skinned/display.h
index b11374b7b..95781eb94 100644
--- a/src/plugins/Ui/skinned/display.h
+++ b/src/plugins/Ui/skinned/display.h
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2006-2013 by Ilya Kotov *
+ * Copyright (C) 2006-2017 by Ilya Kotov *
* forkotov02@ya.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -22,6 +22,7 @@
#include <QPixmap>
#include <qmmp/statehandler.h>
+#include <qmmp/audioparameters.h>
#include "pixmapwidget.h"
class TimeIndicator;
@@ -81,9 +82,9 @@ private slots:
void displayVolume();
void showPosition();
void updatePosition();
- void setSampleRate(quint32 rate);
void setTime(qint64);
void setState(Qmmp::State state);
+ void onAudioPatametersChanged(const AudioParameters &p);
private:
void updatePositions();
diff --git a/src/qmmp/audioparameters.cpp b/src/qmmp/audioparameters.cpp
index 8f5e948ac..16d5b19e1 100644
--- a/src/qmmp/audioparameters.cpp
+++ b/src/qmmp/audioparameters.cpp
@@ -108,6 +108,19 @@ int AudioParameters::validBitsPerSample() const
return m_precision;
}
+AudioParameters::ByteOrder AudioParameters::byteOrder() const
+{
+ switch(m_format)
+ {
+ case Qmmp::PCM_S16BE:
+ case Qmmp::PCM_S24BE:
+ case Qmmp::PCM_S32BE:
+ return BigEndian;
+ default:
+ return LittleEndian;
+ }
+}
+
const QString AudioParameters::toString() const
{
static const struct
@@ -156,7 +169,6 @@ int AudioParameters::sampleSize(Qmmp::AudioFormat format)
case Qmmp::PCM_S8:
case Qmmp::PCM_U8:
return 1;
- case Qmmp::PCM_UNKNOWM:
case Qmmp::PCM_S16LE:
case Qmmp::PCM_S16BE:
case Qmmp::PCM_U16LE:
@@ -172,8 +184,9 @@ int AudioParameters::sampleSize(Qmmp::AudioFormat format)
case Qmmp::PCM_U32BE:
case Qmmp::PCM_FLOAT:
return 4;
+ default:
+ return 0;
}
- return 2;
}
int AudioParameters::bitsPerSample(Qmmp::AudioFormat format)
@@ -188,7 +201,6 @@ int AudioParameters::validBitsPerSample(Qmmp::AudioFormat format)
case Qmmp::PCM_S8:
case Qmmp::PCM_U8:
return 8;
- case Qmmp::PCM_UNKNOWM:
case Qmmp::PCM_S16LE:
case Qmmp::PCM_S16BE:
case Qmmp::PCM_U16LE:
@@ -205,6 +217,24 @@ int AudioParameters::validBitsPerSample(Qmmp::AudioFormat format)
case Qmmp::PCM_U32BE:
case Qmmp::PCM_FLOAT:
return 32;
+ default:
+ return 0;
+ }
+}
+
+Qmmp::AudioFormat AudioParameters::findAudioFormat(int bits, ByteOrder byteOrder)
+{
+ switch (bits)
+ {
+ case 8:
+ return Qmmp::PCM_U8;
+ case 16:
+ return (byteOrder == LittleEndian) ? Qmmp::PCM_U16LE : Qmmp::PCM_U16BE;
+ case 24:
+ return (byteOrder == LittleEndian) ? Qmmp::PCM_U24LE : Qmmp::PCM_U24BE;
+ case 32:
+ return (byteOrder == LittleEndian) ? Qmmp::PCM_U32LE : Qmmp::PCM_U32BE;
+ default:
+ return Qmmp::PCM_UNKNOWM;
}
- return 16;
}
diff --git a/src/qmmp/audioparameters.h b/src/qmmp/audioparameters.h
index 7c624dfb1..54d96bd41 100644
--- a/src/qmmp/audioparameters.h
+++ b/src/qmmp/audioparameters.h
@@ -31,6 +31,12 @@
class AudioParameters
{
public:
+
+ enum ByteOrder
+ {
+ LittleEndian = 0,
+ BigEndian
+ };
/*!
* Constructor.
*/
@@ -92,6 +98,8 @@ public:
* less or equal to the value returned by \b bitsPerSample().
*/
int validBitsPerSample() const;
+
+ ByteOrder byteOrder() const;
/*!
* Returns string represention of the audio parameters.
* May be useful for debug purposes.
@@ -111,6 +119,8 @@ public:
*/
static int validBitsPerSample(Qmmp::AudioFormat format);
+ static Qmmp::AudioFormat findAudioFormat(int bits, ByteOrder byteOrder = LittleEndian);
+
private:
quint32 m_srate;
ChannelMap m_chan_map;
diff --git a/src/qmmp/outputwriter.cpp b/src/qmmp/outputwriter.cpp
index 48c120a59..5dd2a4dce 100644
--- a/src/qmmp/outputwriter.cpp
+++ b/src/qmmp/outputwriter.cpp
@@ -244,14 +244,10 @@ void OutputWriter::stopVisualization()
}
}
-void OutputWriter::dispatch(qint64 elapsed,
- int bitrate,
- int frequency,
- int precision,
- int channels)
+void OutputWriter::dispatch(qint64 elapsed, int bitrate)
{
if (m_handler)
- m_handler->dispatch(elapsed, bitrate, frequency, precision, channels);
+ m_handler->dispatch(elapsed, bitrate);
}
void OutputWriter::dispatch(const Qmmp::State &state)
@@ -260,6 +256,12 @@ void OutputWriter::dispatch(const Qmmp::State &state)
m_handler->dispatch(state);
}
+void OutputWriter::dispatch(const AudioParameters &p)
+{
+ if (m_handler)
+ m_handler->dispatch(p);
+}
+
void OutputWriter::run()
{
mutex()->lock ();
@@ -279,6 +281,7 @@ void OutputWriter::run()
unsigned char *tmp = 0;
dispatch(Qmmp::Playing);
+ dispatch(m_output->audioParameters());
startVisualization();
while (!done)
@@ -420,8 +423,7 @@ void OutputWriter::status()
if (ct > m_currentMilliseconds)
{
m_currentMilliseconds = ct;
- dispatch(m_currentMilliseconds, m_kbps,
- m_frequency, AudioParameters::sampleSize(m_format)*8, m_channels);
+ dispatch(m_currentMilliseconds, m_kbps);
}
}
diff --git a/src/qmmp/outputwriter_p.h b/src/qmmp/outputwriter_p.h
index 5e1425f85..d0963a11b 100644
--- a/src/qmmp/outputwriter_p.h
+++ b/src/qmmp/outputwriter_p.h
@@ -110,12 +110,9 @@ public:
private:
void run(); //thread run function
void status();
- void dispatch(qint64 elapsed,
- int bitrate,
- int frequency,
- int bits,
- int channels);
+ void dispatch(qint64 elapsed, int bitrate);
void dispatch(const Qmmp::State &state);
+ void dispatch(const AudioParameters &p);
void dispatchVisual(Buffer *buffer);
bool prepareConverters();
void startVisualization();
diff --git a/src/qmmp/soundcore.cpp b/src/qmmp/soundcore.cpp
index 6dc6356b7..0b9813c55 100644
--- a/src/qmmp/soundcore.cpp
+++ b/src/qmmp/soundcore.cpp
@@ -51,9 +51,7 @@ SoundCore::SoundCore(QObject *parent)
m_volumeControl = new VolumeControl(this);
connect(m_handler, SIGNAL(elapsedChanged(qint64)), SIGNAL(elapsedChanged(qint64)));
connect(m_handler, SIGNAL(bitrateChanged(int)), SIGNAL(bitrateChanged(int)));
- connect(m_handler, SIGNAL(frequencyChanged(quint32)), SIGNAL(frequencyChanged(quint32)));
- connect(m_handler, SIGNAL(sampleSizeChanged(int)), SIGNAL(sampleSizeChanged(int)));
- connect(m_handler, SIGNAL(channelsChanged(int)), SIGNAL(channelsChanged(int)));
+ connect(m_handler, SIGNAL(audioParametersChanged(AudioParameters)), SIGNAL(audioParametersChanged(AudioParameters)));
connect(m_handler, SIGNAL(bufferingProgress(int)), SIGNAL(bufferingProgress(int)));
connect(QmmpSettings::instance(), SIGNAL(eqSettingsChanged()), SIGNAL(eqSettingsChanged()));
connect(QmmpSettings::instance(), SIGNAL(audioSettingsChanged()), m_volumeControl, SLOT(reload()));
@@ -232,19 +230,9 @@ int SoundCore::bitrate() const
return m_handler->bitrate();
}
-quint32 SoundCore::frequency() const
+AudioParameters SoundCore::audioParameters() const
{
- return m_handler->frequency();
-}
-
-int SoundCore::sampleSize() const
-{
- return m_handler->sampleSize();
-}
-
-int SoundCore::channels() const
-{
- return m_handler->channels();
+ return m_handler->audioParameters();
}
Qmmp::State SoundCore::state() const
diff --git a/src/qmmp/soundcore.h b/src/qmmp/soundcore.h
index e7fa17c19..819d93313 100644
--- a/src/qmmp/soundcore.h
+++ b/src/qmmp/soundcore.h
@@ -29,6 +29,7 @@
#include "visual.h"
#include "qmmp.h"
#include "qmmpsettings.h"
+#include "audioparameters.h"
#include "eqsettings.h"
class VolumeControl;
@@ -92,18 +93,9 @@ public:
* Returns current bitrate (in kbps)
*/
int bitrate() const;
- /*!
- * Returns current sample rate (in Hz).
- */
- quint32 frequency() const;
- /*!
- * Returns sample size (in bits).
- */
- int sampleSize() const;
- /*!
- * Returns channels number.
- */
- int channels() const;
+
+ AudioParameters audioParameters() const;
+
/*!
* Returns the current state.
*/
@@ -203,21 +195,8 @@ signals:
* @param bitrate New bitrate (in kbps)
*/
void bitrateChanged(int bitrate);
- /*!
- * Emitted when samplerate has changed.
- * @param frequency New sample rate (in Hz)
- */
- void frequencyChanged(quint32 frequency);
- /*!
- * Emitted when sample size has changed.
- * @param size New sample size (in bits)
- */
- void sampleSizeChanged(int size);
- /*!
- * Emitted when channels number has changed.
- * @param channels New channels number.
- */
- void channelsChanged(int channels);
+
+ void audioParametersChanged(const AudioParameters &p);
/*!
* Emitted when new metadata is available.
*/
diff --git a/src/qmmp/statehandler.cpp b/src/qmmp/statehandler.cpp
index be9fda893..4ff6dddae 100644
--- a/src/qmmp/statehandler.cpp
+++ b/src/qmmp/statehandler.cpp
@@ -21,6 +21,7 @@
#include <QStringList>
#include <QApplication>
#include <QMutexLocker>
+#include <QMetaType>
#include "soundcore.h"
#include "qmmpevents_p.h"
#include "statehandler.h"
@@ -35,13 +36,11 @@ StateHandler::StateHandler(QObject *parent)
{
if(m_instance)
qFatal("StateHandler: only one instance is allowed");
+ qRegisterMetaType<AudioParameters>("AudioParameters");
m_instance = this;
m_elapsed = -1;
m_length = 0;
m_bitrate = 0;
- m_frequency = 0;
- m_precision = 0;
- m_channels = 0;
m_sendAboutToFinish = true;
m_state = Qmmp::Stopped;
}
@@ -51,7 +50,7 @@ StateHandler::~StateHandler()
m_instance = 0;
}
-void StateHandler::dispatch(qint64 elapsed, int bitrate, quint32 frequency, int precision, int channels)
+void StateHandler::dispatch(qint64 elapsed, int bitrate)
{
m_mutex.lock();
if (qAbs(m_elapsed - elapsed) > TICK_INTERVAL)
@@ -72,20 +71,16 @@ void StateHandler::dispatch(qint64 elapsed, int bitrate, quint32 frequency, int
qApp->postEvent(parent(), new QEvent(EVENT_NEXT_TRACK_REQUEST));
}
}
- if (m_frequency != frequency)
- {
- m_frequency = frequency;
- emit frequencyChanged(frequency);
- }
- if (m_precision != precision)
- {
- m_precision = precision;
- emit sampleSizeChanged(precision);
- }
- if (m_channels != channels)
+ m_mutex.unlock();
+}
+
+void StateHandler::dispatch(const AudioParameters &p)
+{
+ m_mutex.lock();
+ if(m_audioParameters != p)
{
- m_channels = channels;
- emit channelsChanged(channels);
+ m_audioParameters = p;
+ emit audioParametersChanged(p);
}
m_mutex.unlock();
}
@@ -157,11 +152,9 @@ void StateHandler::dispatch(Qmmp::State state)
{
m_elapsed = -1;
m_bitrate = 0;
- m_frequency = 0;
- m_precision = 0;
- m_channels = 0;
m_metaData.clear();
m_streamInfo.clear();
+ m_audioParameters = AudioParameters();
m_sendAboutToFinish = true;
}
if (m_state != state)
@@ -197,22 +190,14 @@ qint64 StateHandler::totalTime() const
int StateHandler::bitrate() const
{
+ QMutexLocker locker(&m_mutex);
return m_bitrate;
}
-int StateHandler::frequency() const
-{
- return m_frequency;
-}
-
-int StateHandler::sampleSize() const
+AudioParameters StateHandler::audioParameters() const
{
- return m_precision;
-}
-
-int StateHandler::channels() const
-{
- return m_channels;
+ QMutexLocker locker(&m_mutex);
+ return m_audioParameters;
}
Qmmp::State StateHandler::state() const
diff --git a/src/qmmp/statehandler.h b/src/qmmp/statehandler.h
index 451e9ae84..ba3de2f9f 100644
--- a/src/qmmp/statehandler.h
+++ b/src/qmmp/statehandler.h
@@ -25,6 +25,7 @@
#include <QHash>
#include <QMutex>
#include "abstractengine.h"
+#include "audioparameters.h"
#include "qmmp.h"
/*! @brief The StateHandler class allows one to track information about playback progress.
@@ -47,11 +48,11 @@ public:
* Sends information about playback progress.
* @param elapsed Current time (in milliseconds).
* @param bitrate Current bitrate (in kbps).
- * @param frequency Current samplerate (in Hz).
- * @param precision Sample size (in bits).
- * @param channels Number of channels.
*/
- void dispatch(qint64 elapsed, int bitrate, quint32 frequency, int precision, int channels);
+ void dispatch(qint64 elapsed, int bitrate);
+
+ void dispatch(const AudioParameters &p);
+
/*!
* Sends information about song length
* @param length song length in milliseconds
@@ -86,18 +87,8 @@ public:
* Returns current bitrate (in kbps)
*/
int bitrate() const;
- /*!
- * Returns current sample rate (in Hz).
- */
- int frequency() const;
- /*!
- * Returns sample size (in bits).
- */
- int sampleSize() const;
- /*!
- * Returns channels number.
- */
- int channels() const;
+
+ AudioParameters audioParameters() const;
/*!
* Returns the current state.
*/
@@ -126,21 +117,9 @@ signals:
* @param bitrate New bitrate (in kbps)
*/
void bitrateChanged(int bitrate);
- /*!
- * Emitted when samplerate has changed.
- * @param frequency New sample rate (in Hz)
- */
- void frequencyChanged(quint32 frequency);
- /*!
- * Emitted when sample size has changed.
- * @param size New sample size (in bits)
- */
- void sampleSizeChanged(int size);
- /*!
- * Emitted when channels number has changed.
- * @param channels New channels number.
- */
- void channelsChanged(int channels);
+
+ void audioParametersChanged(const AudioParameters &p);
+
/*!
* This signal is emitted when the stream reader fills it's buffer.
* The argument \b progress indicates the current percentage of buffering completed.
@@ -151,13 +130,13 @@ signals:
private:
qint64 m_elapsed;
qint64 m_length;
- quint32 m_frequency;
bool m_sendAboutToFinish;
- int m_bitrate, m_precision, m_channels;
+ int m_bitrate;
static StateHandler* m_instance;
QMap <Qmmp::MetaData, QString> m_metaData;
QHash <QString, QString> m_streamInfo;
Qmmp::State m_state;
+ AudioParameters m_audioParameters;
mutable QMutex m_mutex;
};