From e728a61eb68c44ef1746804cb379e46be64580e5 Mon Sep 17 00:00:00 2001
From: Andy Nichols <nezticle@gmail.com>
Date: Fri, 12 Apr 2013 14:10:26 +0200
Subject: [PATCH] AVFoundation: Emit error when media fails to load

This also makes sure that if you attempt to load an invalid media file
while another file is playing that the old session is stopped.

Task-number: QTBUG-30411

Change-Id: Ied4dbaffeac50465112c1e94e7c69d1600a6de51
Reviewed-by: Christian Stromme <christian.stromme@digia.com>
Reviewed-by: Dan Winkler <dantwinkler@gmail.com>
---
 .../mediaplayer/avfmediaplayersession.h          |  1 +
 .../mediaplayer/avfmediaplayersession.mm         | 16 ++++++++--------
 2 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h
index 8c0db289a..58a2d84c9 100644
--- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h
+++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h
@@ -103,6 +103,7 @@ public Q_SLOTS:
     void processEOS();
     void processLoadStateChange();
     void processPositionChange();
+    void processMediaLoadError();
 
     void processCurrentItemChanged();
 
diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm
index 83042ce96..7af6f4394 100644
--- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm
+++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm
@@ -283,7 +283,7 @@ static void *AVFMediaPlayerSessionObserverCurrentItemObservationContext = &AVFMe
 -(void) assetFailedToPrepareForPlayback:(NSError *)error
 {
     Q_UNUSED(error)
-    //TODO: Let the session know that the assest failed to prepare for playback
+    QMetaObject::invokeMethod(m_session, "processMediaLoadError", Qt::AutoConnection);
 #ifdef QT_DEBUG_AVF
     qDebug() << Q_FUNC_INFO;
     qDebug() << [[error localizedDescription] UTF8String];
@@ -799,13 +799,6 @@ void AVFMediaPlayerSession::processLoadStateChange()
             [[(AVFMediaPlayerSessionObserver*)m_observer player] setRate:m_rate];
             [[(AVFMediaPlayerSessionObserver*)m_observer player] play];
         }
-
-    } else {
-        Q_EMIT error(QMediaPlayer::FormatError, tr("Failed to load media"));
-        Q_EMIT mediaStatusChanged(m_mediaStatus = QMediaPlayer::InvalidMedia);
-        Q_EMIT stateChanged(m_state = QMediaPlayer::StoppedState);
-
-        return;
     }
 
     if (newStatus != m_mediaStatus)
@@ -817,6 +810,13 @@ void AVFMediaPlayerSession::processPositionChange()
     Q_EMIT positionChanged(position());
 }
 
+void AVFMediaPlayerSession::processMediaLoadError()
+{
+    Q_EMIT error(QMediaPlayer::FormatError, tr("Failed to load media"));
+    Q_EMIT mediaStatusChanged(m_mediaStatus = QMediaPlayer::InvalidMedia);
+    Q_EMIT stateChanged(m_state = QMediaPlayer::StoppedState);
+}
+
 void AVFMediaPlayerSession::processCurrentItemChanged()
 {
 #ifdef QT_DEBUG_AVF
-- 
GitLab