aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2017-01-15 19:36:50 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2017-01-15 19:36:50 +0000
commit726fd5077f211d047b6bfb906276f5de2b3dcf0b (patch)
tree82658fe826d79b177905f7a2291ff96a6b67f0e9
parentce4ebc27744e529c6b790c4fe790ce85c9349da3 (diff)
downloadqmmp-726fd5077f211d047b6bfb906276f5de2b3dcf0b.tar.gz
qmmp-726fd5077f211d047b6bfb906276f5de2b3dcf0b.tar.bz2
qmmp-726fd5077f211d047b6bfb906276f5de2b3dcf0b.zip
added function Visual::clearQueue();
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@6982 90c681e8-e032-0410-971d-27865f9a5e38
-rw-r--r--src/qmmp/outputwriter.cpp2
-rw-r--r--src/qmmp/visual.cpp11
-rw-r--r--src/qmmp/visual.h1
-rw-r--r--src/qmmp/visualbuffer.cpp17
-rw-r--r--src/qmmp/visualbuffer_p.h1
5 files changed, 28 insertions, 4 deletions
diff --git a/src/qmmp/outputwriter.cpp b/src/qmmp/outputwriter.cpp
index 523462511..c5a9c92f5 100644
--- a/src/qmmp/outputwriter.cpp
+++ b/src/qmmp/outputwriter.cpp
@@ -201,6 +201,7 @@ void OutputWriter::dispatchVisual (Buffer *buffer)
void OutputWriter::clearVisuals()
{
+ Visual::clearQueue();
foreach (Visual *visual, *Visual::visuals())
{
visual->mutex()->lock ();
@@ -287,6 +288,7 @@ void OutputWriter::run()
{
if(m_pause)
{
+ Visual::clearQueue();
m_output->suspend();
mutex()->unlock();
m_prev_pause = m_pause;
diff --git a/src/qmmp/visual.cpp b/src/qmmp/visual.cpp
index 17c54f8e2..a45f0a267 100644
--- a/src/qmmp/visual.cpp
+++ b/src/qmmp/visual.cpp
@@ -75,8 +75,8 @@ void Visual::takeData(float *left, float *right)
{
m_buffer.mutex()->lock();
VisualNode *node = m_buffer.take();
- memcpy(left, node->data[0], 512);
- memcpy(right, node->data[1], 512);
+ memcpy(left, node->data[0], 512 * sizeof(float));
+ memcpy(right, node->data[1], 512 * sizeof(float));
m_buffer.mutex()->unlock();
}
@@ -217,6 +217,13 @@ void Visual::addData(float *pcm, int samples, int channels, qint64 ts, qint64 de
m_buffer.mutex()->unlock();
}
+void Visual::clearQueue()
+{
+ m_buffer.mutex()->lock();
+ m_buffer.clear();
+ m_buffer.mutex()->unlock();
+}
+
void Visual::checkFactories()
{
if (!m_factories)
diff --git a/src/qmmp/visual.h b/src/qmmp/visual.h
index 9f3b99b07..a9e03efa7 100644
--- a/src/qmmp/visual.h
+++ b/src/qmmp/visual.h
@@ -114,6 +114,7 @@ public:
static void addData(float *pcm, int samples, int channels, qint64 ts, qint64 delay);
+ static void clearQueue();
signals:
/*!
diff --git a/src/qmmp/visualbuffer.cpp b/src/qmmp/visualbuffer.cpp
index 6feb266d2..91403ff47 100644
--- a/src/qmmp/visualbuffer.cpp
+++ b/src/qmmp/visualbuffer.cpp
@@ -68,8 +68,8 @@ void VisualBuffer::add(float *pcm, int samples, int channels, qint64 ts, qint64
VisualNode *VisualBuffer::take()
{
int steps = 0;
- int t = m_elapsed + m_time.elapsed();
- while(!m_buffer[consumer_pos].ts || ((m_buffer[consumer_pos].ts < t) && (steps++ < VISUAL_BUFFER_SIZE)))
+ int t = m_elapsed/* + m_time.elapsed()*/;
+ while((m_buffer[consumer_pos].ts < t) && (steps++ < VISUAL_BUFFER_SIZE))
{
consumer_pos++;
if(consumer_pos == VISUAL_BUFFER_SIZE)
@@ -80,6 +80,19 @@ VisualNode *VisualBuffer::take()
return &m_buffer[consumer_pos];
}
+void VisualBuffer::clear()
+{
+ consumer_pos = 0;
+ insertion_pos = 0;
+ for(int i = 0; i < VISUAL_BUFFER_SIZE; ++i)
+ {
+ m_buffer[i].ts = 0;
+ m_buffer[i].used = false;
+ memset(m_buffer[i].data[0], 0, 512 * sizeof(float));
+ memset(m_buffer[i].data[1], 0, 512 * sizeof(float));
+ }
+}
+
QMutex *VisualBuffer::mutex()
{
return &m_mutex;
diff --git a/src/qmmp/visualbuffer_p.h b/src/qmmp/visualbuffer_p.h
index 73eb66ba9..3f9a87269 100644
--- a/src/qmmp/visualbuffer_p.h
+++ b/src/qmmp/visualbuffer_p.h
@@ -48,6 +48,7 @@ public:
void add(float *pcm, int samples, int channels, qint64 ts, qint64 delay);
VisualNode *take();
+ void clear();
QMutex *mutex();
private: