QT_BEGIN_NAMESPACE
+class StateChangeNotifier
+{
+public:
+ StateChangeNotifier(QAndroidMediaPlayerControl *mp)
+ : mControl(mp)
+ , mPreviousState(mp->state())
+ , mPreviousMediaStatus(mp->mediaStatus())
+ {
+ ++mControl->mActiveStateChangeNotifiers;
+ }
+
+ ~StateChangeNotifier()
+ {
+ if (--mControl->mActiveStateChangeNotifiers)
+ return;
+
+ if (mPreviousState != mControl->state())
+ Q_EMIT mControl->stateChanged(mControl->state());
+
+ if (mPreviousMediaStatus != mControl->mediaStatus())
+ Q_EMIT mControl->mediaStatusChanged(mControl->mediaStatus());
+ }
+
+private:
+ QAndroidMediaPlayerControl *mControl;
+ QMediaPlayer::State mPreviousState;
+ QMediaPlayer::MediaStatus mPreviousMediaStatus;
+};
+
+
QAndroidMediaPlayerControl::QAndroidMediaPlayerControl(QObject *parent)
: QMediaPlayerControl(parent),
mMediaPlayer(new AndroidMediaPlayer),
mPendingPosition(-1),
mPendingSetMedia(false),
mPendingVolume(-1),
- mPendingMute(-1)
+ mPendingMute(-1),
+ mActiveStateChangeNotifiers(0)
{
connect(mMediaPlayer,SIGNAL(bufferingChanged(qint32)),
this,SLOT(onBufferingChanged(qint32)));
return;
}
+ StateChangeNotifier notifier(this);
+
if (mCurrentMediaStatus == QMediaPlayer::EndOfMedia)
setMediaStatus(QMediaPlayer::LoadedMedia);
void QAndroidMediaPlayerControl::setMedia(const QMediaContent &mediaContent,
QIODevice *stream)
{
+ StateChangeNotifier notifier(this);
+
const bool reloading = (mMediaContent == mediaContent);
if (!reloading) {
void QAndroidMediaPlayerControl::play()
{
+ StateChangeNotifier notifier(this);
+
// We need to prepare the mediaplayer again.
if ((mState & AndroidMediaPlayer::Stopped) && !mMediaContent.isNull()) {
setMedia(mMediaContent, mMediaStream);
void QAndroidMediaPlayerControl::pause()
{
+ StateChangeNotifier notifier(this);
+
setState(QMediaPlayer::PausedState);
if ((mState & (AndroidMediaPlayer::Started
void QAndroidMediaPlayerControl::stop()
{
+ StateChangeNotifier notifier(this);
+
setState(QMediaPlayer::StoppedState);
if ((mState & (AndroidMediaPlayer::Prepared
void QAndroidMediaPlayerControl::onInfo(qint32 what, qint32 extra)
{
+ StateChangeNotifier notifier(this);
+
Q_UNUSED(extra);
switch (what) {
case AndroidMediaPlayer::MEDIA_INFO_UNKNOWN:
void QAndroidMediaPlayerControl::onError(qint32 what, qint32 extra)
{
+ StateChangeNotifier notifier(this);
+
QString errorString;
QMediaPlayer::Error error = QMediaPlayer::ResourceError;
void QAndroidMediaPlayerControl::onBufferingChanged(qint32 percent)
{
+ StateChangeNotifier notifier(this);
+
mBuffering = percent != 100;
mBufferPercent = percent;
return;
}
+ StateChangeNotifier notifier(this);
+
mState = state;
switch (mState) {
case AndroidMediaPlayer::Idle:
return;
mCurrentState = state;
- Q_EMIT stateChanged(mCurrentState);
}
void QAndroidMediaPlayerControl::setMediaStatus(QMediaPlayer::MediaStatus status)
Q_EMIT durationChanged(duration());
mCurrentMediaStatus = status;
- Q_EMIT mediaStatusChanged(mCurrentMediaStatus);
updateBufferStatus();
}