1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "content/renderer/media/media_stream_audio_source.h" 6 7 #include "content/renderer/render_frame_impl.h" 8 #include "content/renderer/render_view_impl.h" 9 10 namespace content { 11 12 namespace { 13 // TODO(miu): This is a temporary hack until the Chrome audio vertical is 14 // migrated for the Cross-Site Isolation project. http://crbug.com/392596 15 int ToRenderViewId(int render_frame_id) { 16 RenderFrameImpl* const frame = 17 RenderFrameImpl::FromRoutingID(render_frame_id); 18 RenderViewImpl* const view = frame ? frame->render_view() : NULL; 19 return view ? view->GetRoutingID() : -1; 20 } 21 } // namespace 22 23 MediaStreamAudioSource::MediaStreamAudioSource( 24 int render_frame_id, 25 const StreamDeviceInfo& device_info, 26 const SourceStoppedCallback& stop_callback, 27 PeerConnectionDependencyFactory* factory) 28 : render_view_id_(ToRenderViewId(render_frame_id)), 29 factory_(factory) { 30 SetDeviceInfo(device_info); 31 SetStopCallback(stop_callback); 32 } 33 34 MediaStreamAudioSource::MediaStreamAudioSource() 35 : render_view_id_(-1), 36 factory_(NULL) { 37 } 38 39 MediaStreamAudioSource::~MediaStreamAudioSource() {} 40 41 void MediaStreamAudioSource::DoStopSource() { 42 if (audio_capturer_.get()) 43 audio_capturer_->Stop(); 44 } 45 46 void MediaStreamAudioSource::AddTrack( 47 const blink::WebMediaStreamTrack& track, 48 const blink::WebMediaConstraints& constraints, 49 const ConstraintsCallback& callback) { 50 // TODO(xians): Properly implement for audio sources. 51 if (!local_audio_source_.get()) { 52 if (!factory_->InitializeMediaStreamAudioSource(render_view_id_, 53 constraints, 54 this)) { 55 // The source failed to start. 56 // UserMediaClientImpl rely on the |stop_callback| to be triggered when 57 // the last track is removed from the source. But in this case, the 58 // source is is not even started. So we need to fail both adding the 59 // track and trigger |stop_callback|. 60 callback.Run(this, MEDIA_DEVICE_TRACK_START_FAILURE, ""); 61 StopSource(); 62 return; 63 } 64 } 65 66 factory_->CreateLocalAudioTrack(track); 67 callback.Run(this, MEDIA_DEVICE_OK, ""); 68 } 69 70 } // namespace content 71