qtmobility/plugins/multimedia/qt7/qt7playersession.mm
changeset 4 90517678cc4f
parent 1 2b40d63a9c3d
child 5 453da2cfceef
equal deleted inserted replaced
1:2b40d63a9c3d 4:90517678cc4f
    65 }
    65 }
    66 
    66 
    67 - (QTMovieObserver *) initWithPlayerSession:(QT7PlayerSession*)session;
    67 - (QTMovieObserver *) initWithPlayerSession:(QT7PlayerSession*)session;
    68 - (void) setMovie:(QTMovie *)movie;
    68 - (void) setMovie:(QTMovie *)movie;
    69 - (void) processEOS:(NSNotification *)notification;
    69 - (void) processEOS:(NSNotification *)notification;
       
    70 - (void) processStateChange:(NSNotification *)notification;
    70 @end
    71 @end
    71 
    72 
    72 @implementation QTMovieObserver
    73 @implementation QTMovieObserver
    73 
    74 
    74 - (QTMovieObserver *) initWithPlayerSession:(QT7PlayerSession*)session
    75 - (QTMovieObserver *) initWithPlayerSession:(QT7PlayerSession*)session
    94 
    95 
    95     if (movie) {
    96     if (movie) {
    96         [[NSNotificationCenter defaultCenter] addObserver: self selector:
    97         [[NSNotificationCenter defaultCenter] addObserver: self selector:
    97             @selector(processEOS:) name: QTMovieDidEndNotification object: m_movie];
    98             @selector(processEOS:) name: QTMovieDidEndNotification object: m_movie];
    98 
    99 
       
   100         [[NSNotificationCenter defaultCenter] addObserver: self selector:
       
   101             @selector(processStateChange:) name: QTMovieLoadStateDidChangeNotification object: m_movie];
       
   102 
       
   103         [[NSNotificationCenter defaultCenter] addObserver: self selector:
       
   104             @selector(processVolumeChange:) name: QTMovieVolumeDidChangeNotification object: m_movie];
       
   105 
    99         [movie retain];
   106         [movie retain];
   100     }
   107     }
   101 }
   108 }
   102 
   109 
   103 - (void) processEOS:(NSNotification *)notification
   110 - (void) processEOS:(NSNotification *)notification
   104 {
   111 {
   105     Q_UNUSED(notification);
   112     Q_UNUSED(notification);
   106     m_session->processEOS();
   113     m_session->processEOS();
   107 }
   114 }
       
   115 
       
   116 - (void) processStateChange:(NSNotification *)notification
       
   117 {
       
   118     Q_UNUSED(notification);
       
   119     m_session->processStateChange();
       
   120 }
       
   121 
       
   122 - (void) processVolumeChange:(NSNotification *)notification
       
   123 {
       
   124     Q_UNUSED(notification);
       
   125     m_session->processVolumeChange();
       
   126 }
       
   127 
   108 
   128 
   109 @end
   129 @end
   110 
   130 
   111 static CFStringRef qString2CFStringRef(const QString &string)
   131 static CFStringRef qString2CFStringRef(const QString &string)
   112 {
   132 {
   248     [(QTMovie*)m_QTMovie setCurrentTime:newQTTime];
   268     [(QTMovie*)m_QTMovie setCurrentTime:newQTTime];
   249 }
   269 }
   250 
   270 
   251 void QT7PlayerSession::play()
   271 void QT7PlayerSession::play()
   252 {
   272 {
   253     m_state = QMediaPlayer::PlayingState;
       
   254 
       
   255     float preferredRate = [[(QTMovie*)m_QTMovie attributeForKey:@"QTMoviePreferredRateAttribute"] floatValue];
   273     float preferredRate = [[(QTMovie*)m_QTMovie attributeForKey:@"QTMoviePreferredRateAttribute"] floatValue];
   256     [(QTMovie*)m_QTMovie setRate:preferredRate*m_rate];
   274     [(QTMovie*)m_QTMovie setRate:preferredRate*m_rate];
   257 
   275 
   258     emit stateChanged(m_state);
   276     if (m_state != QMediaPlayer::PlayingState)
       
   277         emit stateChanged(m_state = QMediaPlayer::PlayingState);
   259 }
   278 }
   260 
   279 
   261 void QT7PlayerSession::pause()
   280 void QT7PlayerSession::pause()
   262 {
   281 {
   263     m_state = QMediaPlayer::PausedState;
   282     m_state = QMediaPlayer::PausedState;
   324         m_QTMovie = 0;
   343         m_QTMovie = 0;
   325     }
   344     }
   326 
   345 
   327     m_resources = content;
   346     m_resources = content;
   328     m_mediaStream = stream;
   347     m_mediaStream = stream;
       
   348     m_mediaStatus = QMediaPlayer::NoMedia;
   329 
   349 
   330     QUrl url;
   350     QUrl url;
   331 
   351 
   332     if (!content.isNull())
   352     if (!content.isNull())
   333         url = content.canonicalUrl();
   353         url = content.canonicalUrl();
   359     if (err) {
   379     if (err) {
   360         [(QTMovie*)m_QTMovie release];
   380         [(QTMovie*)m_QTMovie release];
   361         m_QTMovie = 0;
   381         m_QTMovie = 0;
   362         QString description = QString::fromUtf8([[err localizedDescription] UTF8String]);
   382         QString description = QString::fromUtf8([[err localizedDescription] UTF8String]);
   363 
   383 
   364         qDebug() << "QT7PlayerSession::setMedia error" << description;
   384         qWarning() << "QT7PlayerSession::setMedia error" << description;
   365         emit error(QMediaPlayer::FormatError, description );
   385         emit error(QMediaPlayer::FormatError, description );
   366     } else {
   386     } else {
   367         [(QTMovieObserver*)m_movieObserver setMovie:(QTMovie*)m_QTMovie];
   387         [(QTMovieObserver*)m_movieObserver setMovie:(QTMovie*)m_QTMovie];
   368 
   388 
   369         if (m_videoOutput) {
   389         if (m_videoOutput) {            
       
   390             m_videoOutput->setMovie(m_QTMovie);
   370             m_videoOutput->setEnabled(true);
   391             m_videoOutput->setEnabled(true);
   371             m_videoOutput->setMovie(m_QTMovie);
       
   372         }
   392         }
   373 
   393         processStateChange();
   374         emit durationChanged(duration());
       
   375         emit audioAvailableChanged(isAudioAvailable());
       
   376         emit videoAvailableChanged(isVideoAvailable());
       
   377 
   394 
   378         [(QTMovie*)m_QTMovie setMuted:m_muted];
   395         [(QTMovie*)m_QTMovie setMuted:m_muted];
   379         setVolume(m_volume);
   396         setVolume(m_volume);
   380     }
   397     }
   381 }
   398 }
   403     m_mediaStatus = QMediaPlayer::EndOfMedia;
   420     m_mediaStatus = QMediaPlayer::EndOfMedia;
   404     emit stateChanged(m_state = QMediaPlayer::StoppedState);
   421     emit stateChanged(m_state = QMediaPlayer::StoppedState);
   405     emit mediaStatusChanged(m_mediaStatus);
   422     emit mediaStatusChanged(m_mediaStatus);
   406 }
   423 }
   407 
   424 
       
   425 void QT7PlayerSession::processStateChange()
       
   426 {
       
   427     signed long state = [[(QTMovie*)m_QTMovie attributeForKey:QTMovieLoadStateAttribute]
       
   428                          longValue];
       
   429     //qDebug() << "new State:" << state;
       
   430 
       
   431 #ifndef QUICKTIME_C_API_AVAILABLE
       
   432     enum {
       
   433       kMovieLoadStateError          = -1L,
       
   434       kMovieLoadStateLoading        = 1000,
       
   435       kMovieLoadStateLoaded         = 2000,
       
   436       kMovieLoadStatePlayable       = 10000,
       
   437       kMovieLoadStatePlaythroughOK  = 20000,
       
   438       kMovieLoadStateComplete       = 100000
       
   439     };
       
   440 #endif
       
   441 
       
   442     QMediaPlayer::MediaStatus newStatus = QMediaPlayer::NoMedia;
       
   443     bool isPlaying = (m_state != QMediaPlayer::StoppedState);
       
   444 
       
   445     if (state >= kMovieLoadStateComplete) {
       
   446         newStatus = isPlaying ? QMediaPlayer::BufferedMedia : QMediaPlayer::LoadedMedia;
       
   447     } else if (state >= kMovieLoadStatePlayable)
       
   448         newStatus = isPlaying ? QMediaPlayer::BufferingMedia : QMediaPlayer::LoadingMedia;
       
   449     else if (state >= kMovieLoadStateLoading)
       
   450         newStatus = isPlaying ? QMediaPlayer::StalledMedia : QMediaPlayer::LoadingMedia;
       
   451 
       
   452     if (state == kMovieLoadStateError) {
       
   453         newStatus = QMediaPlayer::InvalidMedia;
       
   454         emit error(QMediaPlayer::FormatError, tr("Playback failed"));
       
   455     }
       
   456 
       
   457     if (newStatus != m_mediaStatus) {
       
   458         switch (newStatus) {
       
   459         case QMediaPlayer::BufferedMedia:
       
   460         case QMediaPlayer::BufferingMedia:
       
   461             //delayed playback start is necessary for network sources
       
   462             if (m_state == QMediaPlayer::PlayingState) {
       
   463                 QMetaObject::invokeMethod(this, "play", Qt::QueuedConnection);
       
   464             }
       
   465             //fall
       
   466         case QMediaPlayer::LoadedMedia:
       
   467         case QMediaPlayer::LoadingMedia:
       
   468             emit durationChanged(duration());
       
   469             emit audioAvailableChanged(isAudioAvailable());
       
   470             emit videoAvailableChanged(isVideoAvailable());
       
   471             break;
       
   472         case QMediaPlayer::InvalidMedia:
       
   473             emit stateChanged(m_state = QMediaPlayer::StoppedState);
       
   474         default:
       
   475             break;
       
   476         }
       
   477 
       
   478         emit mediaStatusChanged(m_mediaStatus = newStatus);
       
   479     }
       
   480 }
       
   481 
       
   482 void QT7PlayerSession::processVolumeChange()
       
   483 {
       
   484     if (!m_QTMovie)
       
   485         return;
       
   486 
       
   487     int newVolume = qRound(100.0f*[((QTMovie*)m_QTMovie) volume]);
       
   488 
       
   489     if (newVolume != m_volume) {
       
   490         emit volumeChanged(m_volume = newVolume);
       
   491     }
       
   492 }
       
   493 
   408 #include "moc_qt7playersession.cpp"
   494 #include "moc_qt7playersession.cpp"