Changeset 167767 in webkit
- Timestamp:
- Apr 24, 2014, 12:04:01 PM (12 years ago)
- Location:
- trunk/Source
- Files:
-
- 14 edited
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/WebCore.exp.in (modified) (1 diff)
-
WebCore/html/HTMLMediaSession.cpp (modified) (2 diffs)
-
WebCore/page/Settings.cpp (modified) (1 diff)
-
WebCore/page/Settings.h (modified) (2 diffs)
-
WebCore/platform/audio/ios/AudioDestinationIOS.cpp (modified) (5 diffs)
-
WebCore/platform/audio/ios/AudioDestinationIOS.h (modified) (4 diffs)
-
WebCore/platform/audio/ios/AudioSessionIOS.mm (modified) (5 diffs)
-
WebCore/platform/audio/ios/MediaSessionManagerIOS.mm (modified) (2 diffs)
-
WebCore/platform/audio/mac/MediaSessionManagerMac.cpp (modified) (2 diffs)
-
WebKit/mac/ChangeLog (modified) (1 diff)
-
WebKit/mac/WebView/WebView.mm (modified) (1 diff)
-
WebKit2/ChangeLog (modified) (1 diff)
-
WebKit2/WebProcess/WebPage/WebPage.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r167764 r167767 1 2014-04-24 Eric Carlson <eric.carlson@apple.com> 2 3 [iOS] Manage AudioSession category according to media type 4 https://bugs.webkit.org/show_bug.cgi?id=132096 5 6 Reviewed by Jer Noble. 7 8 * WebCore.exp.in: Export setting. 9 10 * html/HTMLMediaSession.cpp: 11 (WebCore::HTMLMediaSession::HTMLMediaSession): 12 (WebCore::initializeAudioSession): Deleted. 13 14 * page/Settings.cpp: 15 * page/Settings.h: 16 (WebCore::Settings::setShouldManageAudioSession): New. 17 (WebCore::Settings::shouldManageAudioSession): Ditto. 18 19 * platform/audio/ios/AudioDestinationIOS.cpp: 20 (WebCore::AudioDestinationIOS::AudioDestinationIOS): Use a MediaSession instead of inheriting 21 from AudioListener and calling the AudioSession directly. 22 (WebCore::AudioDestinationIOS::~AudioDestinationIOS): Ditto. 23 (WebCore::AudioDestinationIOS::start): Notify session. 24 (WebCore::AudioDestinationIOS::stop): Ditto. 25 (WebCore::AudioDestinationIOS::beganAudioInterruption): Deleted. 26 (WebCore::AudioDestinationIOS::endedAudioInterruption): Deleted. 27 * platform/audio/ios/AudioDestinationIOS.h: 28 (WebCore::AudioDestinationIOS::mediaType): 29 (WebCore::AudioDestinationIOS::canReceiveRemoteControlCommands): 30 (WebCore::AudioDestinationIOS::didReceiveRemoteControlCommand): 31 (WebCore::AudioDestinationIOS::isPlaying): Deleted. 32 33 * platform/audio/ios/AudioSessionIOS.mm: 34 (WebCore::categoryName): Debug-only logging function. 35 (WebCore::AudioSession::setCategory): Don't stick with "media" once it is set. 36 37 * platform/audio/ios/MediaSessionManagerIOS.mm: 38 (WebCore::MediaSessionManageriOS::resetRestrictions): Set up restrictions for WebAudio. 39 (WebCore::MediaSessionManageriOS::updateNowPlayingInfo): Don't set invalid start time. 40 41 * platform/audio/mac/MediaSessionManagerMac.cpp: 42 (MediaSessionManager::updateSessionState): Manage AudioSession.active when WebAudio clients 43 come and go. Manage AudioSession.category according to the number of WebAudio and 44 HTMLMediaElement clients. 45 1 46 2014-04-24 David Hyatt <hyatt@apple.com> 2 47 -
trunk/Source/WebCore/WebCore.exp.in
r167735 r167767 2648 2648 __ZN7WebCore8Settings13gAVKitEnabledE 2649 2649 __ZN7WebCore8Settings23setNetworkInterfaceNameERKN3WTF6StringE 2650 __ZN7WebCore8Settings19gManageAudioSessionE 2650 2651 __ZN7WebCore8Settings31setAudioSessionCategoryOverrideEj 2651 2652 __ZN7WebCore8Settings34setNetworkDataUsageTrackingEnabledEb -
trunk/Source/WebCore/html/HTMLMediaSession.cpp
r166384 r167767 70 70 #endif 71 71 72 static void initializeAudioSession()73 {74 #if PLATFORM(IOS)75 static bool wasAudioSessionInitialized;76 if (wasAudioSessionInitialized)77 return;78 79 wasAudioSessionInitialized = true;80 if (!WebCore::applicationIsMobileSafari())81 return;82 83 AudioSession::sharedSession().setCategory(AudioSession::MediaPlayback);84 #endif85 }86 87 72 std::unique_ptr<HTMLMediaSession> HTMLMediaSession::create(MediaSessionClient& client) 88 73 { … … 94 79 , m_restrictions(NoRestrictions) 95 80 { 96 initializeAudioSession();97 81 } 98 82 -
trunk/Source/WebCore/page/Settings.cpp
r167522 r167767 101 101 bool Settings::gAVKitEnabled = false; 102 102 bool Settings::gShouldOptOutOfNetworkStateObservation = false; 103 bool Settings::gManageAudioSession = false; 103 104 #endif 104 105 -
trunk/Source/WebCore/page/Settings.h
r166661 r167767 271 271 static void setShouldOptOutOfNetworkStateObservation(bool flag) { gShouldOptOutOfNetworkStateObservation = flag; } 272 272 static bool shouldOptOutOfNetworkStateObservation() { return gShouldOptOutOfNetworkStateObservation; } 273 274 static void setShouldManageAudioSession(bool flag) { gManageAudioSession = flag; } 275 static bool shouldManageAudioSession() { return gManageAudioSession; } 273 276 #endif 274 277 … … 352 355 static bool gAVKitEnabled; 353 356 static bool gShouldOptOutOfNetworkStateObservation; 357 static bool gManageAudioSession; 354 358 #endif 355 359 -
trunk/Source/WebCore/platform/audio/ios/AudioDestinationIOS.cpp
r165676 r167767 1 1 /* 2 2 * Copyright (C) 2010 Google Inc. All rights reserved. 3 * Copyright (C) 2011 Apple Inc. All rights reserved.3 * Copyright (C) 2011, 2014 Apple Inc. All rights reserved. 4 4 * 5 5 * Redistribution and use in source and binary forms, with or without … … 101 101 , m_callback(callback) 102 102 , m_renderBus(AudioBus::create(2, kRenderBufferSize, false)) 103 , m_mediaSession(MediaSession::create(*this)) 103 104 , m_sampleRate(sampleRate) 104 105 , m_isPlaying(false) 105 , m_interruptedOnPlayback(false) 106 { 107 AudioSession& session = AudioSession::sharedSession(); 108 session.addListener(this); 109 session.setCategory(AudioSession::AmbientSound); 110 106 { 111 107 audioDestinations().add(this); 112 if (audioDestinations().size() == 1)113 session.setActive(1);114 108 115 109 // Open and initialize DefaultOutputUnit … … 149 143 AudioDestinationIOS::~AudioDestinationIOS() 150 144 { 151 AudioSession::sharedSession().removeListener(this);152 145 audioDestinations().remove(this); 153 if (!audioDestinations().size())154 AudioSession::sharedSession().setActive(0);155 146 156 147 if (m_outputUnit) … … 193 184 void AudioDestinationIOS::start() 194 185 { 186 LOG(Media, "AudioDestinationIOS::start"); 187 if (!m_mediaSession->clientWillBeginPlayback()) { 188 LOG(Media, " returning because of interruption"); 189 return; 190 } 191 195 192 OSStatus result = AudioOutputUnitStart(m_outputUnit); 196 197 193 if (!result) 198 194 m_isPlaying = true; … … 201 197 void AudioDestinationIOS::stop() 202 198 { 199 LOG(Media, "AudioDestinationIOS::stop"); 200 if (!m_mediaSession->clientWillPausePlayback()) { 201 LOG(Media, " returning because of interruption"); 202 return; 203 } 204 203 205 OSStatus result = AudioOutputUnitStop(m_outputUnit); 204 205 206 if (!result) 206 207 m_isPlaying = false; 207 }208 209 void AudioDestinationIOS::beganAudioInterruption()210 {211 if (!m_isPlaying)212 return;213 214 stop();215 m_interruptedOnPlayback = true;216 }217 218 void AudioDestinationIOS::endedAudioInterruption()219 {220 if (!m_interruptedOnPlayback)221 return;222 223 m_interruptedOnPlayback = false;224 start();225 208 } 226 209 -
trunk/Source/WebCore/platform/audio/ios/AudioDestinationIOS.h
r165676 r167767 1 1 /* 2 2 * Copyright (C) 2010 Google Inc. All rights reserved. 3 * Copyright (C) 2011 Apple Inc. All rights reserved.3 * Copyright (C) 2011, 2014 Apple Inc. All rights reserved. 4 4 * 5 5 * Redistribution and use in source and binary forms, with or without … … 34 34 #include "AudioDestination.h" 35 35 #include "AudioSessionListener.h" 36 #include "MediaSession.h" 36 37 #include <AudioUnit/AudioUnit.h> 37 38 #include <wtf/RefPtr.h> … … 41 42 // An AudioDestination using CoreAudio's default output AudioUnit 42 43 43 class AudioDestinationIOS : public AudioDestination, public AudioSessionListener{44 class AudioDestinationIOS final : public AudioDestination, private MediaSessionClient { 44 45 public: 45 46 AudioDestinationIOS(AudioIOCallback&, double sampleRate); 46 47 virtual ~AudioDestinationIOS(); 47 48 48 virtual void start();49 virtual void stop();50 bool isPlaying() { return m_isPlaying; }51 52 float sampleRate() const { return m_sampleRate; }53 54 49 private: 55 50 void configure(); 56 virtual void beganAudioInterruption() override; 57 virtual void endedAudioInterruption() override; 51 52 // AudioDestination 53 virtual void start() override; 54 virtual void stop() override; 55 virtual bool isPlaying() override { return m_isPlaying; } 56 virtual float sampleRate() const override { return m_sampleRate; } 57 58 // MediaSessionClient 59 virtual MediaSession::MediaType mediaType() const { return MediaSession::WebAudio; } 60 virtual bool canReceiveRemoteControlCommands() const { return false; } 61 virtual void didReceiveRemoteControlCommand(MediaSession::RemoteControlCommandType) { } 62 virtual void pausePlayback() override { stop(); } 63 virtual void resumePlayback() override { start(); } 58 64 59 65 // DefaultOutputUnit callback … … 68 74 AudioIOCallback& m_callback; 69 75 RefPtr<AudioBus> m_renderBus; 76 std::unique_ptr<MediaSession> m_mediaSession; 70 77 71 78 double m_sampleRate; 72 79 bool m_isPlaying; 73 bool m_interruptedOnPlayback;74 80 }; 75 81 -
trunk/Source/WebCore/platform/audio/ios/AudioSessionIOS.mm
r162368 r167767 1 1 /* 2 * Copyright (C) 2013 Apple Inc. All rights reserved.2 * Copyright (C) 2013-2014 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 29 29 #if USE(AUDIO_SESSION) && PLATFORM(IOS) 30 30 31 #import "Logging.h" 31 32 #import "SoftLinking.h" 32 33 #import <AVFoundation/AVAudioSession.h> … … 105 106 namespace WebCore { 106 107 108 109 #if !LOG_DISABLED 110 static const char* categoryName(AudioSession::CategoryType category) 111 { 112 #define CASE(category) case AudioSession::category: return #category 113 switch (category) { 114 CASE(None); 115 CASE(AmbientSound); 116 CASE(SoloAmbientSound); 117 CASE(MediaPlayback); 118 CASE(RecordAudio); 119 CASE(PlayAndRecord); 120 CASE(AudioProcessing); 121 } 122 123 ASSERT_NOT_REACHED(); 124 return ""; 125 } 126 #endif 127 107 128 class AudioSessionPrivate { 108 129 public: … … 129 150 void AudioSession::setCategory(CategoryType newCategory) 130 151 { 131 if (categoryOverride() && categoryOverride() != newCategory) 152 LOG(Media, "AudioSession::setCategory() - category = %s", categoryName(newCategory)); 153 154 if (categoryOverride() && categoryOverride() != newCategory) { 155 LOG(Media, "AudioSession::setCategory() - override set, NOT changing"); 132 156 return; 133 134 if (!categoryOverride()) {135 // If a page plays only WebAudio we set the audio category to "ambient" so it is muted by the ringer switch.136 // However, audio from an HTML5 media element or from a plug-in should always play as "media" so don't change the137 // category once it has already been set to media.138 if (newCategory == AudioSession::AmbientSound && category() == AudioSession::MediaPlayback)139 return;140 157 } 141 158 142 NSString *categoryString;159 NSString *categoryString; 143 160 switch (newCategory) { 144 161 case AmbientSound: … … 172 189 AudioSession::CategoryType AudioSession::category() const 173 190 { 174 NSString *categoryString = [[AVAudioSession sharedInstance] category];191 NSString *categoryString = [[AVAudioSession sharedInstance] category]; 175 192 if ([categoryString isEqual:AVAudioSessionCategoryAmbient]) 176 193 return AmbientSound; -
trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm
r166384 r167767 137 137 addRestriction(MediaSession::Video, BackgroundPlaybackNotPermitted); 138 138 139 removeRestriction(MediaSession::Audio, ConcurrentPlaybackNotPermitted); 140 removeRestriction(MediaSession::Audio, BackgroundPlaybackNotPermitted); 141 142 removeRestriction(MediaSession::WebAudio, ConcurrentPlaybackNotPermitted); 143 removeRestriction(MediaSession::WebAudio, BackgroundPlaybackNotPermitted); 144 139 145 removeRestriction(MediaSession::Audio, MetadataPreloadingNotPermitted); 140 146 removeRestriction(MediaSession::Video, MetadataPreloadingNotPermitted); 147 141 148 addRestriction(MediaSession::Audio, AutoPreloadingNotPermitted); 142 149 addRestriction(MediaSession::Video, AutoPreloadingNotPermitted); … … 194 201 195 202 double currentTime = currentSession->currentTime(); 196 if (std::isfinite(currentTime) )203 if (std::isfinite(currentTime) && currentTime != MediaPlayer::invalidTime()) 197 204 [info setValue:@(currentTime) forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime]; 198 205 -
trunk/Source/WebCore/platform/audio/mac/MediaSessionManagerMac.cpp
r163657 r167767 1 1 /* 2 * Copyright (C) 2013 Apple Inc. All rights reserved.2 * Copyright (C) 2013-2014 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 47 47 if (has(MediaSession::WebAudio)) 48 48 AudioSession::sharedSession().setPreferredBufferSize(kWebAudioBufferSize); 49 // FIXME: <http://webkit.org/b/116725> Figure out why enabling the code below50 // causes media LayoutTests to fail on 10.8.51 49 #if PLATFORM(IOS) || __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090 52 else if ((has(MediaSession::Video) || has(MediaSession::Audio)) && Settings::lowPowerVideoAudioBufferSizeEnabled()) 50 else if ((has(MediaSession::Video) || has(MediaSession::Audio)) && Settings::lowPowerVideoAudioBufferSizeEnabled()) { 51 // FIXME: <http://webkit.org/b/116725> Figure out why enabling the code below 52 // causes media LayoutTests to fail on 10.8. 53 53 AudioSession::sharedSession().setPreferredBufferSize(kLowPowerVideoBufferSize); 54 } 55 #endif 56 57 #if PLATFORM(IOS) 58 if (has(MediaSession::WebAudio)) 59 AudioSession::sharedSession().setActive(true); 60 else 61 AudioSession::sharedSession().setActive(false); 62 63 if (!Settings::shouldManageAudioSession()) 64 return; 65 66 if (has(MediaSession::Video) || has(MediaSession::Audio)) 67 AudioSession::sharedSession().setCategory(AudioSession::MediaPlayback); 68 else if (has(MediaSession::WebAudio)) 69 AudioSession::sharedSession().setCategory(AudioSession::AmbientSound); 54 70 #endif 55 71 } -
trunk/Source/WebKit/mac/ChangeLog
r167745 r167767 1 2014-04-24 Eric Carlson <eric.carlson@apple.com> 2 3 [iOS] Manage AudioSession category according to media type 4 https://bugs.webkit.org/show_bug.cgi?id=132096 5 6 Reviewed by Jer Noble. 7 8 * WebView/WebView.mm: 9 (-[WebView _commonInitializationWithFrameName:groupName:]): Tell 10 WebCore to manage the AudioSession when running in MobileSafari. 11 1 12 2014-04-23 Andreas Kling <akling@apple.com> 2 13 -
trunk/Source/WebKit/mac/WebView/WebView.mm
r167730 r167767 903 903 Settings::setShouldRespectPriorityInCSSAttributeSetters(shouldRespectPriorityInCSSAttributeSetters()); 904 904 905 #if PLATFORM(IOS) 906 if (applicationIsMobileSafari()) 907 Settings::setShouldManageAudioSession(true); 908 #endif 909 905 910 didOneTimeInitialization = true; 906 911 } -
trunk/Source/WebKit2/ChangeLog
r167766 r167767 1 2014-04-24 Eric Carlson <eric.carlson@apple.com> 2 3 [iOS] Manage AudioSession category according to media type 4 https://bugs.webkit.org/show_bug.cgi?id=132096 5 6 Reviewed by Jer Noble. 7 8 * WebProcess/WebPage/WebPage.cpp: 9 (WebKit::WebPage::WebPage): Tell WebCore to manage the AudioSession. 10 1 11 2014-04-24 Tim Horton <timothy_horton@apple.com> 2 12 -
trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp
r167742 r167767 311 311 Settings::setDefaultMinDOMTimerInterval(0.004); 312 312 313 #if PLATFORM(IOS) 314 Settings::setShouldManageAudioSession(true); 315 #endif 316 313 317 Page::PageClients pageClients; 314 318 pageClients.chromeClient = new WebChromeClient(this);
Note:
See TracChangeset
for help on using the changeset viewer.