Changeset 186636 in webkit
- Timestamp:
- Jul 9, 2015 2:59:33 PM (9 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r186608 r186636 1 2015-07-09 Eric Carlson <eric.carlson@apple.com> 2 3 [Mac] AirPlay to password protected AppleTV fails 4 https://bugs.webkit.org/show_bug.cgi?id=146812 5 6 Reviewed by Dean Jackson. 7 8 * Modules/mediasession/WebMediaSessionManager.cpp: 9 (WebCore::WebMediaSessionManager::showPlaybackTargetPicker): Initialize previouslyRequestedPicker. 10 (WebCore::WebMediaSessionManager::clientStateDidChange): Cleanup the logic and add a comment 11 to make it slightly easier to follow. Don't begin playing to a device unless playback 12 has just started (don't switch in mid-play). 13 (WebCore::WebMediaSessionManager::configurePlaybackTargetClients): Use the last client to 14 request the device picker as a fallback in case no other client is a canditate. Add more 15 logging to make it possible to debug the selection logic. 16 (WebCore::WebMediaSessionManager::scheduleDelayedTask): Fiddle with the logging. 17 1 18 2015-07-09 Matthew Daiter <mdaiter@apple.com> 2 19 -
trunk/Source/WebCore/Modules/mediasession/WebMediaSessionManager.cpp
r186519 r186636 55 55 WebCore::MediaProducer::MediaStateFlags flags { WebCore::MediaProducer::IsNotPlaying }; 56 56 bool requestedPicker { false }; 57 bool previouslyRequestedPicker { false }; 57 58 bool configurationRequired { true }; 58 59 bool playedToEnd { false }; … … 149 150 150 151 auto& clientRequestingPicker = m_clientState[index]; 151 for (auto& state : m_clientState) 152 for (auto& state : m_clientState) { 152 153 state->requestedPicker = state == clientRequestingPicker; 154 state->previouslyRequestedPicker = state == clientRequestingPicker; 155 } 153 156 154 157 bool hasActiveRoute = flagsAreSet(m_clientState[index]->flags, MediaProducer::IsPlayingToExternalDevice); … … 182 185 } 183 186 184 if (!m_playbackTarget || !m_playbackTarget->hasActiveRoute()) 185 return; 186 187 if (!flagsAreSet(newFlags, MediaProducer::ExternalDeviceAutoPlayCandidate) || !flagsAreSet(newFlags, MediaProducer::IsPlayingVideo)) 187 if (!m_playbackTarget || !m_playbackTarget->hasActiveRoute() || !flagsAreSet(newFlags, MediaProducer::ExternalDeviceAutoPlayCandidate)) 188 188 return; 189 189 190 190 // Do not interrupt another element already playing to a device. 191 bool anotherClientHasActiveTarget = false;192 191 for (auto& state : m_clientState) { 193 192 if (state == changedClientState) 194 193 continue; 195 194 196 if (flagsAreSet(state->flags, MediaProducer::IsPlayingToExternalDevice)) { 197 if (flagsAreSet(state->flags, MediaProducer::IsPlayingVideo)) 198 return; 199 anotherClientHasActiveTarget = true; 200 } 201 } 202 203 if (anotherClientHasActiveTarget || !flagsAreSet(newFlags, MediaProducer::IsPlayingVideo)) 195 if (flagsAreSet(state->flags, MediaProducer::IsPlayingToExternalDevice) && flagsAreSet(state->flags, MediaProducer::IsPlayingVideo)) 196 return; 197 } 198 199 // Do not take begin playing to the device unless playback has just started. 200 if (!flagsAreSet(newFlags, MediaProducer::IsPlayingVideo) || flagsAreSet(oldFlags, MediaProducer::IsPlayingVideo)) 204 201 return; 205 202 … … 250 247 { 251 248 size_t indexOfClientThatRequestedPicker = notFound; 252 size_t indexOf AutoPlayCandidate= notFound;249 size_t indexOfLastClientToRequestPicker = notFound; 253 250 size_t indexOfClientWillPlayToTarget = notFound; 254 251 bool haveActiveRoute = m_playbackTarget && m_playbackTarget->hasActiveRoute(); … … 257 254 auto& state = m_clientState[i]; 258 255 256 LOG(Media, "WebMediaSessionManager::configurePlaybackTargetClients %zu - client (%p + %llu) requestedPicker = %i, flags = %s", i, &state->client, state->contextId, state->requestedPicker, mediaProducerStateString(state->flags).utf8().data()); 257 259 258 if (m_targetChanged && state->requestedPicker) 260 259 indexOfClientThatRequestedPicker = i; … … 262 261 if (indexOfClientWillPlayToTarget == notFound && flagsAreSet(state->flags, MediaProducer::IsPlayingToExternalDevice)) 263 262 indexOfClientWillPlayToTarget = i; 263 264 if (indexOfClientWillPlayToTarget == notFound && haveActiveRoute && state->previouslyRequestedPicker) 265 indexOfLastClientToRequestPicker = i; 264 266 } 265 267 266 268 if (indexOfClientThatRequestedPicker != notFound) 267 269 indexOfClientWillPlayToTarget = indexOfClientThatRequestedPicker; 268 if (indexOfClientWillPlayToTarget == notFound && haveActiveRoute && indexOfAutoPlayCandidate != notFound) 269 indexOfClientWillPlayToTarget = indexOfAutoPlayCandidate; 270 if (indexOfClientWillPlayToTarget == notFound && indexOfLastClientToRequestPicker != notFound) 271 indexOfClientWillPlayToTarget = indexOfLastClientToRequestPicker; 272 273 LOG(Media, "WebMediaSessionManager::configurePlaybackTargetClients - indexOfClientWillPlayToTarget = %zu", indexOfClientWillPlayToTarget); 270 274 271 275 for (size_t i = 0; i < m_clientState.size(); ++i) { … … 285 289 if (haveActiveRoute && indexOfClientWillPlayToTarget != notFound) { 286 290 auto& state = m_clientState[indexOfClientWillPlayToTarget]; 291 287 292 if (!flagsAreSet(state->flags, MediaProducer::IsPlayingToExternalDevice)) 288 293 state->client.setShouldPlayToPlaybackTarget(state->contextId, true); … … 334 339 void WebMediaSessionManager::scheduleDelayedTask(ConfigurationTasks tasks) 335 340 { 336 LOG(Media, "WebMediaSessionManager::scheduleDelayedTask - tasks =%s", toString(tasks).utf8().data());341 LOG(Media, "WebMediaSessionManager::scheduleDelayedTask - %s", toString(tasks).utf8().data()); 337 342 338 343 m_taskFlags |= tasks;
Note: See TracChangeset
for help on using the changeset viewer.