summaryrefslogtreecommitdiffstats
path: root/src/multimedia/effects/qsoundeffect_pulse_p.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/multimedia/effects/qsoundeffect_pulse_p.cpp')
-rw-r--r--src/multimedia/effects/qsoundeffect_pulse_p.cpp177
1 files changed, 71 insertions, 106 deletions
diff --git a/src/multimedia/effects/qsoundeffect_pulse_p.cpp b/src/multimedia/effects/qsoundeffect_pulse_p.cpp
index d99bf4b..c322722 100644
--- a/src/multimedia/effects/qsoundeffect_pulse_p.cpp
+++ b/src/multimedia/effects/qsoundeffect_pulse_p.cpp
@@ -55,10 +55,6 @@
#include <QtNetwork>
#include <QTime>
-#include "qmediacontent.h"
-#include "qmediaplayer.h"
-#include "qsoundeffect_p.h"
-
#include "wavedecoder_p.h"
#include "qsoundeffect_pulse_p.h"
@@ -240,11 +236,12 @@ QSoundEffectPrivate::QSoundEffectPrivate(QObject* parent):
QObject(parent),
m_muted(false),
m_playQueued(false),
- m_vol(100),
+ m_sampleLoaded(false),
+ m_volume(100),
m_duration(0),
m_dataUploaded(0),
- m_state(QMediaPlayer::StoppedState),
- m_status(QMediaPlayer::NoMedia),
+ m_loopCount(1),
+ m_runningCount(0),
m_reply(0),
m_stream(0),
m_networkAccessManager(0)
@@ -257,76 +254,53 @@ QSoundEffectPrivate::~QSoundEffectPrivate()
unloadSample();
}
-qint64 QSoundEffectPrivate::duration() const
+QUrl QSoundEffectPrivate::source() const
{
- return m_duration;
+ return m_source;
}
-int QSoundEffectPrivate::volume() const
+void QSoundEffectPrivate::setSource(const QUrl &url)
{
- return m_vol;
-}
+ if (url.isEmpty()) {
+ m_source = QUrl();
+ unloadSample();
+ return;
+ }
-bool QSoundEffectPrivate::isMuted() const
-{
- return m_muted;
-}
+ m_source = url;
-QMediaContent QSoundEffectPrivate::media() const
-{
- return m_media;
+ if (m_networkAccessManager == 0)
+ m_networkAccessManager = new QNetworkAccessManager(this);
+
+ m_stream = m_networkAccessManager->get(QNetworkRequest(m_source));
+
+ unloadSample();
+ loadSample();
}
-QMediaPlayer::State QSoundEffectPrivate::state() const
+int QSoundEffectPrivate::loopCount() const
{
- return m_state;
+ return m_loopCount;
}
-QMediaPlayer::MediaStatus QSoundEffectPrivate::mediaStatus() const
+void QSoundEffectPrivate::setLoopCount(int loopCount)
{
- return m_status;
+ m_loopCount = loopCount;
}
-void QSoundEffectPrivate::play()
+int QSoundEffectPrivate::volume() const
{
- if (m_status == QMediaPlayer::LoadingMedia) {
- m_playQueued = true;
- return;
- }
-
- if (m_status != QMediaPlayer::BufferedMedia ||
- m_state == QMediaPlayer::PlayingState)
- return;
-
- pa_volume_t m_vol = PA_VOLUME_NORM;
-
- daemon()->lock();
-#if defined(Q_WS_MAEMO_5)
- m_vol = PA_VOLUME_NORM/100*((daemon()->volume()+m_vol)/2);
-#endif
- pa_operation_unref(
- pa_context_play_sample(daemon()->context(),
- m_name.constData(),
- 0,
- m_vol,
- play_callback,
- this)
- );
- daemon()->unlock();
-
- m_playbackTime.start();
-
- emit stateChanged(m_state = QMediaPlayer::PlayingState);
+ return m_volume;
}
-void QSoundEffectPrivate::stop()
+void QSoundEffectPrivate::setVolume(int volume)
{
- emit stateChanged(m_state = QMediaPlayer::StoppedState);
+ m_volume = volume;
}
-void QSoundEffectPrivate::setVolume(int volume)
+bool QSoundEffectPrivate::isMuted() const
{
- m_vol = volume;
+ return m_muted;
}
void QSoundEffectPrivate::setMuted(bool muted)
@@ -334,34 +308,23 @@ void QSoundEffectPrivate::setMuted(bool muted)
m_muted = muted;
}
-void QSoundEffectPrivate::setMedia(const QMediaContent &media)
+void QSoundEffectPrivate::play()
{
- if (media.isNull()) {
- m_media = QMediaContent();
- unloadSample();
+ if (!m_sampleLoaded) {
+ m_playQueued = true;
return;
}
- if (m_media == media)
- return;
- m_media = media;
-
- if (m_networkAccessManager == 0)
- m_networkAccessManager = new QNetworkAccessManager(this);
- m_stream = m_networkAccessManager->get(QNetworkRequest(m_media.canonicalUrl()));
+ m_runningCount += m_loopCount;
- unloadSample();
- loadSample();
-
- emit mediaChanged(m_media);
+ playSample();
}
void QSoundEffectPrivate::decoderReady()
{
if (m_waveDecoder->size() >= PA_SCACHE_ENTRY_SIZE_MAX) {
- m_status = QMediaPlayer::InvalidMedia;
- emit mediaStatusChanged(m_status);
- qWarning("QtPulseAudio: attempting to load to large a sample");
+ m_waveDecoder->deleteLater();
+ qWarning("QSoundEffect(pulseaudio): Attempting to load to large a sample");
return;
}
@@ -380,52 +343,65 @@ void QSoundEffectPrivate::decoderReady()
void QSoundEffectPrivate::decoderError()
{
- emit mediaStatusChanged(m_status = QMediaPlayer::InvalidMedia);
+ qWarning("QSoundEffect(pulseaudio): Error decoding source");
}
void QSoundEffectPrivate::checkPlayTime()
{
int elapsed = m_playbackTime.elapsed();
- if (elapsed >= m_duration) {
- m_state = QMediaPlayer::StoppedState;
- emit stateChanged(m_state);
- }
- else
+ if (elapsed < m_duration)
startTimer(m_duration - elapsed);
}
void QSoundEffectPrivate::loadSample()
{
+ m_sampleLoaded = false;
+ m_dataUploaded = 0;
m_waveDecoder = new WaveDecoder(m_stream);
connect(m_waveDecoder, SIGNAL(formatKnown()), SLOT(decoderReady()));
connect(m_waveDecoder, SIGNAL(invalidFormat()), SLOT(decoderError()));
-
- m_status = QMediaPlayer::LoadingMedia;
- emit mediaStatusChanged(m_status);
}
void QSoundEffectPrivate::unloadSample()
{
- if (m_status != QMediaPlayer::BufferedMedia)
+ if (!m_sampleLoaded)
return;
- m_status = QMediaPlayer::NoMedia;
-
daemon()->lock();
pa_context_remove_sample(daemon()->context(), m_name.constData(), NULL, NULL);
daemon()->unlock();
m_duration = 0;
m_dataUploaded = 0;
+ m_sampleLoaded = false;
+}
+
+void QSoundEffectPrivate::playSample()
+{
+ pa_volume_t volume = PA_VOLUME_NORM;
+
+ daemon()->lock();
+#ifdef Q_WS_MAEMO_5
+ volume = PA_VOLUME_NORM / 100 * ((daemon()->volume() + m_volume) / 2);
+#endif
+ pa_operation_unref(
+ pa_context_play_sample(daemon()->context(),
+ m_name.constData(),
+ 0,
+ volume,
+ play_callback,
+ this)
+ );
+ daemon()->unlock();
+
+ m_playbackTime.start();
}
void QSoundEffectPrivate::timerEvent(QTimerEvent *event)
{
- if (m_state == QMediaPlayer::PlayingState) {
- m_state = QMediaPlayer::StoppedState;
- emit stateChanged(m_state);
- }
+ if (m_runningCount > 0)
+ playSample();
killTimer(event->timerId());
}
@@ -456,15 +432,11 @@ void QSoundEffectPrivate::stream_write_callback(pa_stream *s, size_t length, voi
pa_stream_finish_upload(s);
self->m_duration = self->m_waveDecoder->duration();
- emit self->durationChanged(self->m_duration);
-
- self->m_status = QMediaPlayer::BufferedMedia;
- emit self->mediaStatusChanged(self->m_status);
self->m_waveDecoder->deleteLater();
- if (!self->m_media.isNull())
- self->m_stream->deleteLater();
+ self->m_stream->deleteLater();
+ self->m_sampleLoaded = true;
if (self->m_playQueued) {
self->m_playQueued = false;
QMetaObject::invokeMethod(self, "play");
@@ -474,8 +446,6 @@ void QSoundEffectPrivate::stream_write_callback(pa_stream *s, size_t length, voi
void QSoundEffectPrivate::stream_state_callback(pa_stream *s, void *userdata)
{
- QSoundEffectPrivate *self = reinterpret_cast<QSoundEffectPrivate*>(userdata);
-
switch (pa_stream_get_state(s)) {
case PA_STREAM_CREATING:
case PA_STREAM_READY:
@@ -484,8 +454,7 @@ void QSoundEffectPrivate::stream_state_callback(pa_stream *s, void *userdata)
case PA_STREAM_FAILED:
default:
- self->m_status = QMediaPlayer::InvalidMedia;
- emit self->mediaStatusChanged(self->m_status);
+ qWarning("QSoundEffect(pulseaudio): Error in pulse audio stream");
break;
}
}
@@ -496,14 +465,10 @@ void QSoundEffectPrivate::play_callback(pa_context *c, int success, void *userda
QSoundEffectPrivate *self = reinterpret_cast<QSoundEffectPrivate*>(userdata);
- if (success == 1)
+ if (success == 1) {
+ self->m_runningCount--;
QMetaObject::invokeMethod(self, "checkPlayTime", Qt::QueuedConnection);
- else {
- self->m_state = QMediaPlayer::StoppedState;
- emit self->stateChanged(self->m_state);
}
}
QT_END_NAMESPACE
-
-