Index: extensions/renderer/api/display_source/wifi_display/wifi_display_media_manager.cc |
diff --git a/extensions/renderer/api/display_source/wifi_display/wifi_display_media_manager.cc b/extensions/renderer/api/display_source/wifi_display/wifi_display_media_manager.cc |
index 2b9334ac196096acdf18f202e6812345170b8894..20070fe245cf2978f7ee326934932581ea711b1f 100644 |
--- a/extensions/renderer/api/display_source/wifi_display/wifi_display_media_manager.cc |
+++ b/extensions/renderer/api/display_source/wifi_display/wifi_display_media_manager.cc |
@@ -31,6 +31,33 @@ const char kErrorMediaPipelineFailure[] = |
"Failed to initialize media pipeline for the session"; |
} // namespace |
+class WiFiDisplayAudioSink { |
+ public: |
+ WiFiDisplayAudioSink(const blink::WebMediaStreamTrack& track, |
+ content::MediaStreamAudioSink* delegate) |
+ : track_(track), delegate_(delegate), sink_added_(false) {} |
+ |
+ ~WiFiDisplayAudioSink() { Stop(); } |
+ |
+ void Start() { |
+ DCHECK(!sink_added_); |
+ sink_added_ = true; |
+ delegate_->AddToAudioTrack(delegate_, track_); |
+ } |
+ |
+ void Stop() { |
+ if (sink_added_) { |
+ delegate_->RemoveFromAudioTrack(delegate_, track_); |
+ sink_added_ = false; |
+ } |
+ } |
+ |
+ private: |
+ blink::WebMediaStreamTrack track_; |
+ content::MediaStreamAudioSink* delegate_; |
+ bool sink_added_; |
+}; |
+ |
class WiFiDisplayVideoSink : public content::MediaStreamVideoSink { |
public: |
WiFiDisplayVideoSink( |
@@ -106,6 +133,12 @@ void WiFiDisplayMediaManager::Play() { |
return; // Waiting for initialization being completed. |
} |
+ if (!audio_track_.isNull()) { |
+ audio_sink_.reset( |
+ new WiFiDisplayAudioSink(audio_track_, player_->audio_sink())); |
+ audio_sink_->Start(); |
+ } |
+ |
if (!video_track_.isNull()) { |
// To be called on IO thread. |
auto on_raw_video_frame = base::Bind( |
@@ -129,6 +162,7 @@ void WiFiDisplayMediaManager::Teardown() { |
void WiFiDisplayMediaManager::Pause() { |
is_playing_ = false; |
+ audio_sink_.reset(); |
video_sink_.reset(); |
} |