Index: content/browser/renderer_host/media/audio_renderer_host.cc |
diff --git a/content/browser/renderer_host/media/audio_renderer_host.cc b/content/browser/renderer_host/media/audio_renderer_host.cc |
index 49e395bd0edd694d600d280b7a72eb9568c1c043..0bc6af5b9d7044b36a144403d4bfb2b41a8a44ca 100644 |
--- a/content/browser/renderer_host/media/audio_renderer_host.cc |
+++ b/content/browser/renderer_host/media/audio_renderer_host.cc |
@@ -21,6 +21,7 @@ |
#include "content/browser/media/audio_stream_monitor.h" |
#include "content/browser/media/capture/audio_mirroring_manager.h" |
#include "content/browser/media/media_internals.h" |
+#include "content/browser/media/media_web_contents_observer.h" |
#include "content/browser/renderer_host/media/audio_input_device_manager.h" |
#include "content/browser/renderer_host/media/audio_sync_reader.h" |
#include "content/browser/renderer_host/media/media_stream_manager.h" |
@@ -182,6 +183,8 @@ class AudioRendererHost::AudioEntry |
bool playing() const { return playing_; } |
void set_playing(bool playing) { playing_ = playing; } |
+ void update_last_pause_time() { last_pause_time_ = base::TimeTicks::Now(); } |
+ base::TimeTicks last_pause_time() { return last_pause_time_; } |
private: |
// media::AudioOutputController::EventHandler implementation. |
@@ -206,6 +209,8 @@ class AudioRendererHost::AudioEntry |
const scoped_refptr<media::AudioOutputController> controller_; |
bool playing_; |
+ |
+ base::TimeTicks last_pause_time_; |
}; |
AudioRendererHost::AudioEntry::AudioEntry( |
@@ -637,6 +642,30 @@ void AudioRendererHost::OnPlayStream(int stream_id) { |
return; |
} |
+ if (entry->controller()->GetAudioParameters().effects() & |
+ media::AudioParameters::FOCUSABLE) { |
+ MediaWebContentsObserver::HasAudioFocus( |
+ render_process_id_, entry->render_frame_id(), |
+ base::Bind(&AudioRendererHost::OnFocusAvailable, this, stream_id, |
+ base::TimeTicks::Now())); |
+ } else { |
+ entry->controller()->Play(); |
+ audio_log_->OnStarted(stream_id); |
+ } |
+} |
+ |
+void AudioRendererHost::OnFocusAvailable(int stream_id, |
+ base::TimeTicks play_time) { |
+ // Abort the playback if: |
+ // - The entry has been destroyed while focus was requested. |
+ // - A subsequent pause has come through. |
+ // |
+ // A focus request never fails via this path. If it's denied a pause request |
+ // will be issues directly to the player. |
+ AudioEntry* entry = LookupById(stream_id); |
+ if (!entry || play_time < entry->last_pause_time()) |
+ return; |
+ |
entry->controller()->Play(); |
audio_log_->OnStarted(stream_id); |
} |
@@ -650,6 +679,7 @@ void AudioRendererHost::OnPauseStream(int stream_id) { |
return; |
} |
+ entry->update_last_pause_time(); |
entry->controller()->Pause(); |
audio_log_->OnStopped(stream_id); |
} |