diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2017-10-22 13:05:01 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2017-10-22 13:05:01 +0000 |
| commit | 065387600c5d8e3b045802d82c5d4ab12b208e2a (patch) | |
| tree | 9e074d87ad91d269445488225f3a977593a47266 /src | |
| parent | 49284bb0d33a2598f96645182984bc3fa671b932 (diff) | |
| download | qmmp-065387600c5d8e3b045802d82c5d4ab12b208e2a.tar.gz qmmp-065387600c5d8e3b045802d82c5d4ab12b208e2a.tar.bz2 qmmp-065387600c5d8e3b045802d82c5d4ab12b208e2a.zip | |
changed SoundCore API, fixed displaying bits per sample (#926)
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@7613 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
| -rw-r--r-- | src/plugins/Engines/mplayer/mplayerengine.cpp | 8 | ||||
| -rw-r--r-- | src/plugins/General/mpris/mpris1/playerobject.cpp | 4 | ||||
| -rw-r--r-- | src/plugins/Ui/qsui/mainwindow.cpp | 7 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/display.cpp | 15 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/display.h | 5 | ||||
| -rw-r--r-- | src/qmmp/audioparameters.cpp | 38 | ||||
| -rw-r--r-- | src/qmmp/audioparameters.h | 10 | ||||
| -rw-r--r-- | src/qmmp/outputwriter.cpp | 18 | ||||
| -rw-r--r-- | src/qmmp/outputwriter_p.h | 7 | ||||
| -rw-r--r-- | src/qmmp/soundcore.cpp | 18 | ||||
| -rw-r--r-- | src/qmmp/soundcore.h | 33 | ||||
| -rw-r--r-- | src/qmmp/statehandler.cpp | 49 | ||||
| -rw-r--r-- | src/qmmp/statehandler.h | 45 |
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; }; |
