diff options
Diffstat (limited to 'src/plugins/avfoundation')
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]; } } |