summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYoann Lopes <yoann.lopes@theqtcompany.com>2015-09-03 15:48:37 +0200
committerYoann Lopes <yoann.lopes@theqtcompany.com>2015-09-15 09:09:11 +0000
commit95fa47f7472ac9bcb99df98bcd02c9a1907b6f3a (patch)
treeeece721215dd6e82fd6acf12cc1d4bbabba63a92
parent29ce8886b3bbc306a2ad52a4bc4ea89b3401658a (diff)
AVFoundation: fix playback rate.
Calling play on the AVPlayer internally resets the playback rate, which means any playback rate set before calling play was ignored. We now always call setRate to start playback to avoid resetting the rate with play. Aslo fixed the playbackRateChanged() signal that was never emitted. Task-number: QTBUG-45570 Change-Id: I3a77e1db31c57f1e3491287bdf977731b9d73509 Reviewed-by: Christian Stromme <christian.stromme@theqtcompany.com>
-rw-r--r--src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.mm2
-rw-r--r--src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h1
-rw-r--r--src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm18
3 files changed, 13 insertions, 8 deletions
diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.mm
index 1a4defac5..ca11ef297 100644
--- a/src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.mm
+++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.mm
@@ -63,6 +63,8 @@ void AVFMediaPlayerControl::setSession(AVFMediaPlayerSession *session)
connect(m_session, SIGNAL(audioAvailableChanged(bool)), this, SIGNAL(audioAvailableChanged(bool)));
connect(m_session, SIGNAL(videoAvailableChanged(bool)), this, SIGNAL(videoAvailableChanged(bool)));
connect(m_session, SIGNAL(error(int,QString)), this, SIGNAL(error(int,QString)));
+ connect(m_session, &AVFMediaPlayerSession::playbackRateChanged,
+ this, &AVFMediaPlayerControl::playbackRateChanged);
}
QMediaPlayer::State AVFMediaPlayerControl::state() const
diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h
index 5e224bb50..decab1b37 100644
--- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h
+++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h
@@ -106,6 +106,7 @@ Q_SIGNALS:
void mutedChanged(bool muted);
void audioAvailableChanged(bool audioAvailable);
void videoAvailableChanged(bool videoAvailable);
+ void playbackRateChanged(qreal rate);
void error(int error, const QString &errorString);
private:
diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm
index 5ef1f9baf..c0e813219 100644
--- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm
+++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm
@@ -602,10 +602,10 @@ void AVFMediaPlayerSession::setPlaybackRate(qreal rate)
m_rate = rate;
AVPlayer *player = [(AVFMediaPlayerSessionObserver*)m_observer player];
-
- if (player != 0 && m_state == QMediaPlayer::PlayingState) {
+ if (player && m_state == QMediaPlayer::PlayingState)
[player setRate:m_rate];
- }
+
+ Q_EMIT playbackRateChanged(m_rate);
}
void AVFMediaPlayerSession::setPosition(qint64 pos)
@@ -655,8 +655,10 @@ void AVFMediaPlayerSession::play()
processLoadStateChange();
}
- if (m_mediaStatus == QMediaPlayer::LoadedMedia || m_mediaStatus == QMediaPlayer::BufferedMedia)
- [[(AVFMediaPlayerSessionObserver*)m_observer player] play];
+ if (m_mediaStatus == QMediaPlayer::LoadedMedia || m_mediaStatus == QMediaPlayer::BufferedMedia) {
+ // Setting the rate starts playback
+ [[(AVFMediaPlayerSessionObserver*)m_observer player] setRate:m_rate];
+ }
//processLoadStateChange();
Q_EMIT stateChanged(m_state);
@@ -697,8 +699,8 @@ void AVFMediaPlayerSession::stop()
return;
m_state = QMediaPlayer::StoppedState;
- m_rate = 0.0f;
- [[(AVFMediaPlayerSessionObserver*)m_observer player] setRate:m_rate];
+ // AVPlayer doesn't have stop(), only pause() and play().
+ [[(AVFMediaPlayerSessionObserver*)m_observer player] pause];
setPosition(0);
if (m_videoOutput) {
@@ -821,8 +823,8 @@ void AVFMediaPlayerSession::processLoadStateChange()
newStatus = isPlaying ? QMediaPlayer::BufferedMedia : QMediaPlayer::LoadedMedia;
if (m_state == QMediaPlayer::PlayingState && [(AVFMediaPlayerSessionObserver*)m_observer player]) {
+ // Setting the rate is enough to start playback, no need to call play()
[[(AVFMediaPlayerSessionObserver*)m_observer player] setRate:m_rate];
- [[(AVFMediaPlayerSessionObserver*)m_observer player] play];
}
}