diff options
| -rw-r--r-- | src/plugins/Ui/qsui/mainwindow.cpp | 4 | ||||
| -rw-r--r-- | src/plugins/Ui/qsui/qsuianalyzer.cpp | 56 | ||||
| -rw-r--r-- | src/plugins/Ui/qsui/qsuianalyzer.h | 14 | ||||
| -rw-r--r-- | src/qmmp/outputwriter.cpp | 31 | ||||
| -rw-r--r-- | src/qmmp/outputwriter_p.h | 2 | ||||
| -rw-r--r-- | src/qmmp/visual.cpp | 14 | ||||
| -rw-r--r-- | src/qmmp/visual.h | 16 | ||||
| -rw-r--r-- | src/qmmp/visualbuffer.cpp | 3 |
8 files changed, 70 insertions, 70 deletions
diff --git a/src/plugins/Ui/qsui/mainwindow.cpp b/src/plugins/Ui/qsui/mainwindow.cpp index 436501300..aff4bcb78 100644 --- a/src/plugins/Ui/qsui/mainwindow.cpp +++ b/src/plugins/Ui/qsui/mainwindow.cpp @@ -209,7 +209,7 @@ void MainWindow::showState(Qmmp::State state) case Qmmp::Playing: { updateStatus(); - m_analyzer->start(); + //m_analyzer->start(); m_analyzer->setCover(MetaDataManager::instance()->getCover(m_core->url())); CoverWidget *cw = qobject_cast<CoverWidget *>(m_ui.coverDockWidget->widget()); cw->setCover(MetaDataManager::instance()->getCover(m_core->url())); @@ -220,7 +220,7 @@ void MainWindow::showState(Qmmp::State state) break; case Qmmp::Stopped: updateStatus(); - m_analyzer->stop(); + //m_analyzer->stop(); m_timeLabel->clear(); m_positionSlider->setValue(0); m_analyzer->clearCover(); diff --git a/src/plugins/Ui/qsui/qsuianalyzer.cpp b/src/plugins/Ui/qsui/qsuianalyzer.cpp index 4b5f6f8d9..9146882ca 100644 --- a/src/plugins/Ui/qsui/qsuianalyzer.cpp +++ b/src/plugins/Ui/qsui/qsuianalyzer.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2012-2015 by Ilya Kotov * + * Copyright (C) 2012-2017 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -31,15 +31,11 @@ #include "inlines.h" #include "qsuianalyzer.h" -#define VISUAL_NODE_SIZE 512 //samples -#define VISUAL_BUFFER_SIZE (5*VISUAL_NODE_SIZE) - QSUiAnalyzer::QSUiAnalyzer (QWidget *parent) : Visual (parent) { m_intern_vis_data = 0; m_peaks = 0; m_x_scale = 0; - m_buffer_at = 0; m_rows = 0; m_cols = 0; m_offset = 0; @@ -51,8 +47,8 @@ QSUiAnalyzer::QSUiAnalyzer (QWidget *parent) : Visual (parent) m_timer = new QTimer (this); connect(m_timer, SIGNAL (timeout()), this, SLOT (timeout())); - m_left_buffer = new float[VISUAL_BUFFER_SIZE]; - m_right_buffer = new float[VISUAL_BUFFER_SIZE]; + m_left_buffer = new float[QMMP_VISUAL_NODE_SIZE]; + m_right_buffer = new float[QMMP_VISUAL_NODE_SIZE]; readSettings(); clear(); @@ -73,7 +69,6 @@ QSUiAnalyzer::~QSUiAnalyzer() void QSUiAnalyzer::clear() { - m_buffer_at = 0; m_rows = 0; m_cols = 0; update(); @@ -91,28 +86,6 @@ QSize QSUiAnalyzer::sizeHint() const return QSize(200, 100); } -void QSUiAnalyzer::add (float *data, size_t samples, int chan) -{ - if (!m_timer->isActive ()) - return; - - if(VISUAL_BUFFER_SIZE == m_buffer_at) - { - m_buffer_at -= VISUAL_NODE_SIZE; - memmove(m_left_buffer, m_left_buffer + VISUAL_NODE_SIZE, m_buffer_at * sizeof(float)); - memmove(m_right_buffer, m_right_buffer + VISUAL_NODE_SIZE, m_buffer_at * sizeof(float)); - return; - } - - int frames = qMin(int(samples/chan), VISUAL_BUFFER_SIZE - m_buffer_at); - - stereo_from_multichannel(m_left_buffer + m_buffer_at, - m_right_buffer + m_buffer_at, data, frames, chan); - - - m_buffer_at += frames; -} - void QSUiAnalyzer::setCover(const QPixmap &pixmap) { m_cover = pixmap; @@ -121,21 +94,11 @@ void QSUiAnalyzer::setCover(const QPixmap &pixmap) void QSUiAnalyzer::timeout() { - /*mutex()->lock(); - if(m_buffer_at < VISUAL_NODE_SIZE) + if(takeData(m_left_buffer, m_right_buffer)) { - mutex()->unlock (); - return; + process(); + update(); } - - process (m_left_buffer, m_right_buffer); - m_buffer_at -= VISUAL_NODE_SIZE; - memmove(m_left_buffer, m_left_buffer + VISUAL_NODE_SIZE, m_buffer_at * sizeof(float)); - memmove(m_right_buffer, m_right_buffer + VISUAL_NODE_SIZE, m_buffer_at * sizeof(float)); - mutex()->unlock ();*/ - takeData(m_left_buffer, m_right_buffer); - process (m_left_buffer, m_right_buffer); - update(); } void QSUiAnalyzer::paintEvent (QPaintEvent * e) @@ -161,7 +124,7 @@ void QSUiAnalyzer::resizeEvent(QResizeEvent *) updateCover(); } -void QSUiAnalyzer::process (float *left, float *right) +void QSUiAnalyzer::process() { int rows = qMax((height() - 2) / m_cell_size.height(),2); int cols = qMax((width() - m_offset - 2) / m_cell_size.width(),1); @@ -193,9 +156,9 @@ void QSUiAnalyzer::process (float *left, float *right) int k, magnitude; float data[512]; - for(int i = 0; i < VISUAL_NODE_SIZE; ++i) + for(int i = 0; i < QMMP_VISUAL_NODE_SIZE; ++i) { - data[i] = left[i] / 2 + right[i] / 2; + data[i] = m_left_buffer[i] / 2 + m_right_buffer[i] / 2; data[i] = qBound(-1.0f, data[i], 1.0f); } calc_freq (dest, data); @@ -412,4 +375,5 @@ void QSUiAnalyzer::stop() { m_running = false; m_timer->stop(); + clear(); } diff --git a/src/plugins/Ui/qsui/qsuianalyzer.h b/src/plugins/Ui/qsui/qsuianalyzer.h index 9dae2f9f1..14af24f4f 100644 --- a/src/plugins/Ui/qsui/qsuianalyzer.h +++ b/src/plugins/Ui/qsui/qsuianalyzer.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2012-2015 by Ilya Kotov * + * Copyright (C) 2012-2017 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -34,18 +34,19 @@ class QSUiAnalyzer : public Visual { Q_OBJECT public: - QSUiAnalyzer( QWidget *parent = 0); + QSUiAnalyzer(QWidget *parent = 0); virtual ~QSUiAnalyzer(); - void add(float *data, size_t samples, int chan); void setCover(const QPixmap &pixmap); void clear(); void clearCover(); QSize sizeHint() const; - void start(); - void stop(); + //void start(); + //void stop(); public slots: + void start(); + void stop(); void readSettings(); private slots: @@ -58,7 +59,7 @@ private: void hideEvent(QHideEvent *); void showEvent(QShowEvent *); void resizeEvent(QResizeEvent *); - void process(float *l, float *r); + void process(); void draw(QPainter *p); void createMenu(); void updateCover(); @@ -75,7 +76,6 @@ private: bool m_show_cover; float *m_left_buffer; float *m_right_buffer; - int m_buffer_at; int m_cols, m_rows; int m_offset; bool m_update; diff --git a/src/qmmp/outputwriter.cpp b/src/qmmp/outputwriter.cpp index c5a9c92f5..aa76ab140 100644 --- a/src/qmmp/outputwriter.cpp +++ b/src/qmmp/outputwriter.cpp @@ -190,7 +190,7 @@ void OutputWriter::dispatchVisual (Buffer *buffer) if(!buffer) return; - Visual::addData(buffer->data, buffer->samples, m_channels, m_totalWritten / m_bytesPerMillisecond, m_output->latency()); + Visual::addAudio(buffer->data, buffer->samples, m_channels, m_totalWritten / m_bytesPerMillisecond, m_output->latency()); foreach (Visual *visual, *Visual::visuals()) { visual->mutex()->lock (); @@ -201,13 +201,15 @@ void OutputWriter::dispatchVisual (Buffer *buffer) void OutputWriter::clearVisuals() { - Visual::clearQueue(); + /* + Visual::clearBuffer(); foreach (Visual *visual, *Visual::visuals()) { visual->mutex()->lock (); visual->clear(); visual->mutex()->unlock(); } + */ } bool OutputWriter::prepareConverters() @@ -243,6 +245,23 @@ bool OutputWriter::prepareConverters() return true; } +void OutputWriter::startVisualization() +{ + foreach (Visual *visual, *Visual::visuals()) + { + QMetaObject::invokeMethod(visual, "start", Qt::QueuedConnection); + } +} + +void OutputWriter::stopVisualization() +{ + Visual::clearBuffer(); + foreach (Visual *visual, *Visual::visuals()) + { + QMetaObject::invokeMethod(visual, "stop", Qt::QueuedConnection); + } +} + void OutputWriter::dispatch(qint64 elapsed, int bitrate, int frequency, @@ -257,8 +276,8 @@ void OutputWriter::dispatch(const Qmmp::State &state) { if (m_handler) m_handler->dispatch(state); - if (state == Qmmp::Stopped) - clearVisuals(); + //if (state == Qmmp::Stopped) + // clearVisuals(); } void OutputWriter::run() @@ -280,6 +299,7 @@ void OutputWriter::run() unsigned char *tmp = 0; dispatch(Qmmp::Playing); + startVisualization(); while (!done) { @@ -288,7 +308,7 @@ void OutputWriter::run() { if(m_pause) { - Visual::clearQueue(); + Visual::clearBuffer(); m_output->suspend(); mutex()->unlock(); m_prev_pause = m_pause; @@ -405,6 +425,7 @@ void OutputWriter::run() #endif } dispatch(Qmmp::Stopped); + stopVisualization(); mutex()->unlock(); } diff --git a/src/qmmp/outputwriter_p.h b/src/qmmp/outputwriter_p.h index f2c8ad523..5cebfd91a 100644 --- a/src/qmmp/outputwriter_p.h +++ b/src/qmmp/outputwriter_p.h @@ -119,6 +119,8 @@ private: void dispatchVisual(Buffer *buffer); void clearVisuals(); bool prepareConverters(); + void startVisualization(); + void stopVisualization(); bool m_skip; QMutex m_mutex; diff --git a/src/qmmp/visual.cpp b/src/qmmp/visual.cpp index a45f0a267..ecb16a162 100644 --- a/src/qmmp/visual.cpp +++ b/src/qmmp/visual.cpp @@ -71,13 +71,17 @@ void Visual::closeEvent (QCloseEvent *event) QWidget::closeEvent(event); } -void Visual::takeData(float *left, float *right) +bool Visual::takeData(float *left, float *right) { m_buffer.mutex()->lock(); VisualNode *node = m_buffer.take(); - memcpy(left, node->data[0], 512 * sizeof(float)); - memcpy(right, node->data[1], 512 * sizeof(float)); + if(node) + { + memcpy(left, node->data[0], 512 * sizeof(float)); + memcpy(right, node->data[1], 512 * sizeof(float)); + } m_buffer.mutex()->unlock(); + return node != 0; } //static members @@ -210,14 +214,14 @@ void Visual::showSettings(VisualFactory *factory, QWidget *parent) dialog->deleteLater(); } -void Visual::addData(float *pcm, int samples, int channels, qint64 ts, qint64 delay) +void Visual::addAudio(float *pcm, int samples, int channels, qint64 ts, qint64 delay) { m_buffer.mutex()->lock(); m_buffer.add(pcm, samples, channels, ts, delay); m_buffer.mutex()->unlock(); } -void Visual::clearQueue() +void Visual::clearBuffer() { m_buffer.mutex()->lock(); m_buffer.clear(); diff --git a/src/qmmp/visual.h b/src/qmmp/visual.h index a9e03efa7..0ec244c25 100644 --- a/src/qmmp/visual.h +++ b/src/qmmp/visual.h @@ -26,6 +26,8 @@ #include <QHash> #include <stddef.h> +#define QMMP_VISUAL_NODE_SIZE 512 //samples + class Buffer; class Decoder; class Output; @@ -56,12 +58,12 @@ public: * @param samples Number of samples. * @param chan Number of channels. */ - virtual void add(float *data, size_t samples, int chan) = 0; + virtual void add(float *data, size_t samples, int chan){} /*! * Resets visual plugin buffers and widgets. * Subclass should reimplement this function. */ - virtual void clear() = 0; + //virtual void clear() = 0; /*! * Returns mutex pointer. */ @@ -113,8 +115,12 @@ public: static void showSettings(VisualFactory *factory, QWidget *parent); - static void addData(float *pcm, int samples, int channels, qint64 ts, qint64 delay); - static void clearQueue(); + static void addAudio(float *pcm, int samples, int channels, qint64 ts, qint64 delay); + static void clearBuffer(); + +public slots: + virtual void start(){} //= 0; + virtual void stop(){}// = 0; signals: /*! @@ -129,7 +135,7 @@ protected: */ virtual void closeEvent (QCloseEvent *event); - virtual void takeData(float *left, float *right); + virtual bool takeData(float *left, float *right); private: Decoder *m_decoder; diff --git a/src/qmmp/visualbuffer.cpp b/src/qmmp/visualbuffer.cpp index 4904c92f6..bf7140ab6 100644 --- a/src/qmmp/visualbuffer.cpp +++ b/src/qmmp/visualbuffer.cpp @@ -79,6 +79,9 @@ VisualNode *VisualBuffer::take() m_take_index = 0; } } + if(m_buffer[m_take_index].ts < t) //unable to find node + return 0; + return &m_buffer[m_take_index]; } |
