aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2017-01-16 20:04:21 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2017-01-16 20:04:21 +0000
commit240d991e41a3bb874d5289456215e67d23856361 (patch)
treeb2fc84b24f066e4fc71c35fbea30916fbab0ae3d /src
parenta1f1349e58a8f8d3ebc220f188b9d26c49585e4a (diff)
downloadqmmp-240d991e41a3bb874d5289456215e67d23856361.tar.gz
qmmp-240d991e41a3bb874d5289456215e67d23856361.tar.bz2
qmmp-240d991e41a3bb874d5289456215e67d23856361.zip
added virtual slots Visual::start() and Visual::stop()
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@6985 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
-rw-r--r--src/plugins/Ui/qsui/mainwindow.cpp4
-rw-r--r--src/plugins/Ui/qsui/qsuianalyzer.cpp56
-rw-r--r--src/plugins/Ui/qsui/qsuianalyzer.h14
-rw-r--r--src/qmmp/outputwriter.cpp31
-rw-r--r--src/qmmp/outputwriter_p.h2
-rw-r--r--src/qmmp/visual.cpp14
-rw-r--r--src/qmmp/visual.h16
-rw-r--r--src/qmmp/visualbuffer.cpp3
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];
}