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; |
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" |