summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLev Zelenskiy <lev.zelenskiy@nokia.com>2012-02-24 10:55:17 +1000
committerQt by Nokia <qt-info@nokia.com>2012-02-24 06:00:38 +0100
commit0b8c6115cdb1ed7174b558daa00a19841a2d5a78 (patch)
tree2f7920d6591948841a1c10c86886cf9f893c75e6 /src
parentea1037a7d0d7326796f62b2b624d19126a02b072 (diff)
Changes to QAudioBuffer and QAudioDecoder (position and duration).
QAudioBuffer: - Allow to specify startTime in the constructor. QAudioDecoder: - Removed WaitingState. - New signals: finished(), positionChanged(), durationChanged(). - New methods: position(), duration(). - A parameter removed from read() method. Change-Id: Ifb71502d0756aa306abd0a6bf7873934029952c4 Reviewed-by: Dmytro Poplavskiy <dmytro.poplavskiy@nokia.com> Reviewed-by: Michael Goddard <michael.goddard@nokia.com>
Diffstat (limited to 'src')
-rw-r--r--src/multimedia/audio/qaudiobuffer.cpp19
-rw-r--r--src/multimedia/audio/qaudiobuffer.h4
-rw-r--r--src/multimedia/audio/qaudiodecoder_p.cpp64
-rw-r--r--src/multimedia/audio/qaudiodecoder_p.h14
-rw-r--r--src/multimedia/controls/qaudiodecodercontrol_p.cpp40
-rw-r--r--src/multimedia/controls/qaudiodecodercontrol_p.h9
6 files changed, 131 insertions, 19 deletions
diff --git a/src/multimedia/audio/qaudiobuffer.cpp b/src/multimedia/audio/qaudiobuffer.cpp
index fffa66c4a..b8287f235 100644
--- a/src/multimedia/audio/qaudiobuffer.cpp
+++ b/src/multimedia/audio/qaudiobuffer.cpp
@@ -242,12 +242,16 @@ QAudioBuffer::QAudioBuffer(const QAudioBuffer &other)
calculated sample size, the excess data will not be used.
This audio buffer will copy the contents of \a data.
+
+ \a startTime (in microseconds) indicates when this buffer
+ starts in the stream.
+ If this buffer is not part of a stream, set it to -1.
*/
-QAudioBuffer::QAudioBuffer(const QByteArray &data, const QAudioFormat &format)
+QAudioBuffer::QAudioBuffer(const QByteArray &data, const QAudioFormat &format, qint64 startTime)
{
if (format.isValid()) {
int sampleCount = (data.size() * 8) / format.sampleSize(); // truncate
- d = new QAudioBufferPrivate(new QMemoryAudioBufferProvider(data.constData(), sampleCount, format, -1));
+ d = new QAudioBufferPrivate(new QMemoryAudioBufferProvider(data.constData(), sampleCount, format, startTime));
} else
d = 0;
}
@@ -256,10 +260,17 @@ QAudioBuffer::QAudioBuffer(const QByteArray &data, const QAudioFormat &format)
Creates a new audio buffer with space for \a numSamples samples of
the given \a format. The samples will be initialized to the default
for the format.
+
+ \a startTime (in microseconds) indicates when this buffer
+ starts in the stream.
+ If this buffer is not part of a stream, set it to -1.
*/
-QAudioBuffer::QAudioBuffer(int numSamples, const QAudioFormat &format)
- : d(new QAudioBufferPrivate(new QMemoryAudioBufferProvider(0, numSamples, format, -1)))
+QAudioBuffer::QAudioBuffer(int numSamples, const QAudioFormat &format, qint64 startTime)
{
+ if (format.isValid())
+ d = new QAudioBufferPrivate(new QMemoryAudioBufferProvider(0, numSamples, format, startTime));
+ else
+ d = 0;
}
/*!
diff --git a/src/multimedia/audio/qaudiobuffer.h b/src/multimedia/audio/qaudiobuffer.h
index bd95f9d08..14718cb38 100644
--- a/src/multimedia/audio/qaudiobuffer.h
+++ b/src/multimedia/audio/qaudiobuffer.h
@@ -64,8 +64,8 @@ public:
QAudioBuffer();
QAudioBuffer(QAbstractAudioBuffer *provider);
QAudioBuffer(const QAudioBuffer &other);
- QAudioBuffer(const QByteArray &data, const QAudioFormat &format);
- QAudioBuffer(int numSamples, const QAudioFormat &format); // Initialized to empty
+ QAudioBuffer(const QByteArray &data, const QAudioFormat &format, qint64 startTime = -1);
+ QAudioBuffer(int numSamples, const QAudioFormat &format, qint64 startTime = -1); // Initialized to empty
QAudioBuffer& operator=(const QAudioBuffer &other);
diff --git a/src/multimedia/audio/qaudiodecoder_p.cpp b/src/multimedia/audio/qaudiodecoder_p.cpp
index ac0450227..8776215ca 100644
--- a/src/multimedia/audio/qaudiodecoder_p.cpp
+++ b/src/multimedia/audio/qaudiodecoder_p.cpp
@@ -152,6 +152,9 @@ QAudioDecoder::QAudioDecoder(QObject *parent)
connect(d->control, SIGNAL(sourceChanged()), SIGNAL(sourceChanged()));
connect(d->control, SIGNAL(bufferReady()), this, SIGNAL(bufferReady()));
connect(d->control ,SIGNAL(bufferAvailableChanged(bool)), this, SIGNAL(bufferAvailableChanged(bool)));
+ connect(d->control ,SIGNAL(finished()), this, SIGNAL(finished()));
+ connect(d->control ,SIGNAL(positionChanged(qint64)), this, SIGNAL(positionChanged(qint64)));
+ connect(d->control ,SIGNAL(durationChanged(qint64)), this, SIGNAL(durationChanged(qint64)));
}
}
}
@@ -377,17 +380,42 @@ bool QAudioDecoder::bufferAvailable() const
}
/*!
- Read a buffer from the decoder, with the success or failure stored in \a ok.
+ Returns position (in milliseconds) of the last buffer read from
+ the decoder or -1 if no buffers have been read.
*/
-QAudioBuffer QAudioDecoder::read(bool *ok) const
+
+qint64 QAudioDecoder::position() const
+{
+ Q_D(const QAudioDecoder);
+ if (d->control)
+ return d->control->position();
+ return -1;
+}
+
+/*!
+ Returns total duration (in milliseconds) of the audio stream or -1
+ if not available.
+*/
+
+qint64 QAudioDecoder::duration() const
+{
+ Q_D(const QAudioDecoder);
+ if (d->control)
+ return d->control->duration();
+ return -1;
+}
+
+/*!
+ Read a buffer from the decoder. Returns invalid buffer on failure.
+*/
+
+QAudioBuffer QAudioDecoder::read() const
{
Q_D(const QAudioDecoder);
if (d->control) {
- return d->control->read(ok);
+ return d->control->read();
} else {
- if (ok)
- *ok = false;
return QAudioBuffer();
}
}
@@ -401,8 +429,6 @@ QAudioBuffer QAudioDecoder::read(bool *ok) const
\value DecodingState The audio player is currently decoding media.
\value StoppedState The decoder is not decoding. Decoding will
start at the start of the media.
- \value WaitingState The decoder is either waiting for more data
- to decode, or has filled the required number of buffers.
*/
/*!
@@ -466,6 +492,30 @@ QAudioBuffer QAudioDecoder::read(bool *ok) const
\sa bufferAvailable(), bufferReady()
*/
+/*!
+ \fn void QAudioDecoder::finished()
+
+ Signals that the decoding has finished successfully.
+ If decoding fails, error signal is emitted instead.
+
+ \sa start(), stop(), error
+*/
+
+/*!
+ \fn void QAudioDecoder::positionChanged(qint64 position)
+
+ Signals that the current \a position of the decoder has changed.
+
+ \sa durationChanged
+*/
+
+/*!
+ \fn void QAudioDecoder::durationChanged(qint64 duration)
+
+ Signals that the estimated \a duration of the decoded data has changed.
+
+ \sa positionChanged
+*/
// Properties
diff --git a/src/multimedia/audio/qaudiodecoder_p.h b/src/multimedia/audio/qaudiodecoder_p.h
index 3a4072d3a..a671f19df 100644
--- a/src/multimedia/audio/qaudiodecoder_p.h
+++ b/src/multimedia/audio/qaudiodecoder_p.h
@@ -69,8 +69,7 @@ public:
enum State
{
StoppedState,
- DecodingState,
- WaitingState
+ DecodingState
};
enum Error
@@ -101,11 +100,12 @@ public:
Error error() const;
QString errorString() const;
- // Do we need position or duration?
-
- QAudioBuffer read(bool *ok = 0) const;
+ QAudioBuffer read() const;
bool bufferAvailable() const;
+ qint64 position() const;
+ qint64 duration() const;
+
public Q_SLOTS:
void start();
void stop();
@@ -113,6 +113,7 @@ public Q_SLOTS:
Q_SIGNALS:
void bufferAvailableChanged(bool);
void bufferReady();
+ void finished();
void stateChanged(QAudioDecoder::State newState);
void formatChanged(const QAudioFormat &format);
@@ -121,6 +122,9 @@ Q_SIGNALS:
void sourceChanged();
+ void positionChanged(qint64 position);
+ void durationChanged(qint64 duration);
+
public:
virtual bool bind(QObject *);
virtual void unbind(QObject *);
diff --git a/src/multimedia/controls/qaudiodecodercontrol_p.cpp b/src/multimedia/controls/qaudiodecodercontrol_p.cpp
index 3569e022d..760d7060d 100644
--- a/src/multimedia/controls/qaudiodecodercontrol_p.cpp
+++ b/src/multimedia/controls/qaudiodecodercontrol_p.cpp
@@ -189,7 +189,30 @@ QAudioDecoderControl::QAudioDecoderControl(QObject *parent):
\sa audioFormat(), setAudioFormat
*/
+/*!
+ \fn void QAudioDecoderControl::finished()
+
+ Signals that the decoding has finished successfully.
+ If decoding fails, error signal is emitted instead.
+
+ \sa start(), stop(), error
+*/
+
+/*!
+ \fn void QAudioDecoderControl::positionChanged(qint64 position)
+
+ Signals that the current \a position of the decoder has changed.
+
+ \sa durationChanged
+*/
+
+/*!
+ \fn void QAudioDecoderControl::durationChanged(qint64 duration)
+ Signals that the estimated \a duration of the decoded data has changed.
+
+ \sa positionChanged
+*/
/*!
\fn QAudioDecoderControl::audioFormat()
@@ -215,6 +238,23 @@ QAudioDecoderControl::QAudioDecoderControl(QObject *parent):
audio file, you can specify an invalid \a format.
*/
+/*!
+ \fn QAudioDecoderControl::read()
+ Read a buffer from the decoder. Returns invalid buffer on failure.
+*/
+
+/*!
+ \fn QAudioDecoderControl::position()
+ Returns position (in milliseconds) of the last buffer read from
+ the decoder or -1 if no buffers have been read.
+*/
+
+/*!
+ \fn QAudioDecoderControl::duration()
+ Returns total duration (in milliseconds) of the audio stream
+ or -1 if not available.
+*/
+
#include "moc_qaudiodecodercontrol_p.cpp"
QT_END_NAMESPACE
diff --git a/src/multimedia/controls/qaudiodecodercontrol_p.h b/src/multimedia/controls/qaudiodecodercontrol_p.h
index ed5b321f7..0c3bf26ff 100644
--- a/src/multimedia/controls/qaudiodecodercontrol_p.h
+++ b/src/multimedia/controls/qaudiodecodercontrol_p.h
@@ -77,9 +77,12 @@ public:
virtual QAudioFormat audioFormat() const = 0;
virtual void setAudioFormat(const QAudioFormat &format) = 0;
- virtual QAudioBuffer read(bool *ok) = 0;
+ virtual QAudioBuffer read() = 0;
virtual bool bufferAvailable() const = 0;
+ virtual qint64 position() const = 0;
+ virtual qint64 duration() const = 0;
+
Q_SIGNALS:
void stateChanged(QAudioDecoder::State newState);
void formatChanged(const QAudioFormat &format);
@@ -89,6 +92,10 @@ Q_SIGNALS:
void bufferReady();
void bufferAvailableChanged(bool available);
+ void finished();
+
+ void positionChanged(qint64 position);
+ void durationChanged(qint64 duration);
protected:
QAudioDecoderControl(QObject* parent = 0);