void MediaPlayerPrivateAVFoundation::dispatchNotification() { ASSERT(isMainThread()); Notification notification = Notification(); { MutexLocker lock(m_queueMutex); if (m_queuedNotifications.isEmpty()) return; if (!m_delayCallbacks) { // Only dispatch one notification callback per invocation because they can cause recursion. notification = m_queuedNotifications.first(); m_queuedNotifications.remove(0); } if (!m_queuedNotifications.isEmpty() && !m_mainThreadCallPending) callOnMainThread(mainThreadCallback, this); if (!notification.isValid()) return; } if (notification.type() != Notification::FunctionType) LOG(Media, "MediaPlayerPrivateAVFoundation::dispatchNotification(%p) - dispatching %s", this, notificationName(notification)); switch (notification.type()) { case Notification::ItemDidPlayToEndTime: didEnd(); break; case Notification::ItemTracksChanged: tracksChanged(); updateStates(); break; case Notification::ItemStatusChanged: updateStates(); break; case Notification::ItemSeekableTimeRangesChanged: seekableTimeRangesChanged(); updateStates(); break; case Notification::ItemLoadedTimeRangesChanged: loadedTimeRangesChanged(); updateStates(); break; case Notification::ItemPresentationSizeChanged: sizeChanged(); updateStates(); break; case Notification::ItemIsPlaybackLikelyToKeepUpChanged: updateStates(); break; case Notification::ItemIsPlaybackBufferEmptyChanged: updateStates(); break; case Notification::ItemIsPlaybackBufferFullChanged: updateStates(); break; case Notification::PlayerRateChanged: updateStates(); rateChanged(); break; case Notification::PlayerTimeChanged: timeChanged(notification.time()); break; case Notification::SeekCompleted: seekCompleted(notification.finished()); break; case Notification::AssetMetadataLoaded: metadataLoaded(); updateStates(); break; case Notification::AssetPlayabilityKnown: updateStates(); playabilityKnown(); break; case Notification::DurationChanged: invalidateCachedDuration(); break; case Notification::ContentsNeedsDisplay: contentsNeedsDisplay(); break; case Notification::InbandTracksNeedConfiguration: m_inbandTrackConfigurationPending = false; configureInbandTracks(); break; case Notification::FunctionType: notification.function()(); break; case Notification::TargetIsWirelessChanged: #if ENABLE(WIRELESS_PLAYBACK_TARGET) playbackTargetIsWirelessChanged(); #endif break; case Notification::None: ASSERT_NOT_REACHED(); break; } }
void MediaPlayerPrivateAVFoundation::dispatchNotification() { ASSERT(isMainThread()); Notification notification = Notification(); { MutexLocker lock(m_queueMutex); if (m_queuedNotifications.isEmpty()) return; if (!m_delayCallbacks) { // Only dispatch one notification callback per invocation because they can cause recursion. notification = m_queuedNotifications.first(); m_queuedNotifications.remove(0); } if (!m_queuedNotifications.isEmpty() && !m_mainThreadCallPending) callOnMainThread(mainThreadCallback, this); if (!notification.isValid()) return; } LOG(Media, "MediaPlayerPrivateAVFoundation::dispatchNotification(%p) - dispatching %d", this, static_cast<int>(notification.type())); switch (notification.type()) { case Notification::ItemDidPlayToEndTime: didEnd(); break; case Notification::ItemTracksChanged: tracksChanged(); updateStates(); break; case Notification::ItemStatusChanged: updateStates(); break; case Notification::ItemSeekableTimeRangesChanged: seekableTimeRangesChanged(); updateStates(); break; case Notification::ItemLoadedTimeRangesChanged: loadedTimeRangesChanged(); updateStates(); break; case Notification::ItemPresentationSizeChanged: sizeChanged(); updateStates(); break; case Notification::ItemIsPlaybackLikelyToKeepUpChanged: updateStates(); break; case Notification::ItemIsPlaybackBufferEmptyChanged: updateStates(); break; case Notification::ItemIsPlaybackBufferFullChanged: updateStates(); break; case Notification::PlayerRateChanged: updateStates(); rateChanged(); break; case Notification::PlayerTimeChanged: timeChanged(notification.time()); break; case Notification::SeekCompleted: seekCompleted(notification.finished()); break; case Notification::AssetMetadataLoaded: metadataLoaded(); updateStates(); break; case Notification::AssetPlayabilityKnown: updateStates(); playabilityKnown(); break; case Notification::DurationChanged: invalidateCachedDuration(); break; case Notification::None: ASSERT_NOT_REACHED(); break; } }