| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/media/media_stream_dependency_factory.h" | 5 #include "content/renderer/media/media_stream_dependency_factory.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/synchronization/waitable_event.h" | 10 #include "base/synchronization/waitable_event.h" |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 401 return false; | 401 return false; |
| 402 } | 402 } |
| 403 } | 403 } |
| 404 | 404 |
| 405 WebKit::WebMediaStreamSource::Type type = track.source().type(); | 405 WebKit::WebMediaStreamSource::Type type = track.source().type(); |
| 406 DCHECK(type == WebKit::WebMediaStreamSource::TypeAudio || | 406 DCHECK(type == WebKit::WebMediaStreamSource::TypeAudio || |
| 407 type == WebKit::WebMediaStreamSource::TypeVideo); | 407 type == WebKit::WebMediaStreamSource::TypeVideo); |
| 408 | 408 |
| 409 std::string track_id = UTF16ToUTF8(track.id()); | 409 std::string track_id = UTF16ToUTF8(track.id()); |
| 410 if (source.type() == WebKit::WebMediaStreamSource::TypeAudio) { | 410 if (source.type() == WebKit::WebMediaStreamSource::TypeAudio) { |
| 411 // TODO(henrika,xians): Refactor how an audio track is created to harmonize | |
| 412 // with video tracks. | |
| 413 scoped_refptr<webrtc::AudioTrackInterface> audio_track( | 411 scoped_refptr<webrtc::AudioTrackInterface> audio_track( |
| 414 CreateLocalAudioTrack(track_id, source_data->local_audio_source())); | 412 CreateLocalAudioTrack(track_id, source_data->local_audio_source())); |
| 415 audio_track->set_enabled(track.isEnabled()); | 413 audio_track->set_enabled(track.isEnabled()); |
| 416 if (GetWebRtcAudioDevice()) { | 414 // Start the audio track. This will hook the |audio_track| to the capturer |
| 417 WebRtcAudioCapturer* capturer = GetWebRtcAudioDevice()->capturer().get(); | 415 // as the sink of the audio, and only start the source of the capturer if |
| 418 if (!capturer->is_recording()) | 416 // it is the first audio track connecting to the capturer. |
| 419 capturer->Start(); | 417 static_cast<WebRtcLocalAudioTrack*>(audio_track.get())->Start(); |
| 420 } | 418 |
| 421 return native_stream->AddTrack(audio_track.get()); | 419 return native_stream->AddTrack(audio_track.get()); |
| 422 } else { | 420 } else { |
| 423 scoped_refptr<webrtc::VideoTrackInterface> video_track( | 421 scoped_refptr<webrtc::VideoTrackInterface> video_track( |
| 424 CreateLocalVideoTrack(track_id, source_data->video_source())); | 422 CreateLocalVideoTrack(track_id, source_data->video_source())); |
| 425 video_track->set_enabled(track.isEnabled()); | 423 video_track->set_enabled(track.isEnabled()); |
| 426 return native_stream->AddTrack(video_track.get()); | 424 return native_stream->AddTrack(video_track.get()); |
| 427 } | 425 } |
| 428 } | 426 } |
| 429 | 427 |
| 430 bool MediaStreamDependencyFactory::AddNativeVideoMediaTrack( | 428 bool MediaStreamDependencyFactory::AddNativeVideoMediaTrack( |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 684 MediaStreamDependencyFactory::GetWebRtcAudioDevice() { | 682 MediaStreamDependencyFactory::GetWebRtcAudioDevice() { |
| 685 return audio_device_.get(); | 683 return audio_device_.get(); |
| 686 } | 684 } |
| 687 | 685 |
| 688 void MediaStreamDependencyFactory::StopLocalAudioSource( | 686 void MediaStreamDependencyFactory::StopLocalAudioSource( |
| 689 const WebKit::WebMediaStream& description) { | 687 const WebKit::WebMediaStream& description) { |
| 690 MediaStreamExtraData* extra_data = static_cast<MediaStreamExtraData*>( | 688 MediaStreamExtraData* extra_data = static_cast<MediaStreamExtraData*>( |
| 691 description.extraData()); | 689 description.extraData()); |
| 692 if (extra_data && extra_data->is_local() && extra_data->stream().get() && | 690 if (extra_data && extra_data->is_local() && extra_data->stream().get() && |
| 693 !extra_data->stream()->GetAudioTracks().empty()) { | 691 !extra_data->stream()->GetAudioTracks().empty()) { |
| 694 if (GetWebRtcAudioDevice()) { | 692 // Stop the audio track. This will unhook the audio track from the capturer |
| 695 scoped_refptr<WebRtcAudioCapturer> capturer = | 693 // and will shutdown the source of the capturer if it is the last audio |
| 696 GetWebRtcAudioDevice()->capturer(); | 694 // track connecting to the capturer. |
| 697 if (capturer.get()) | 695 static_cast<WebRtcLocalAudioTrack*>( |
| 698 capturer->Stop(); | 696 extra_data->stream()->GetAudioTracks()[0].get())->Stop(); |
| 699 } | |
| 700 } | 697 } |
| 701 } | 698 } |
| 702 | 699 |
| 703 void MediaStreamDependencyFactory::InitializeWorkerThread( | 700 void MediaStreamDependencyFactory::InitializeWorkerThread( |
| 704 talk_base::Thread** thread, | 701 talk_base::Thread** thread, |
| 705 base::WaitableEvent* event) { | 702 base::WaitableEvent* event) { |
| 706 jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop(); | 703 jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop(); |
| 707 jingle_glue::JingleThreadWrapper::current()->set_send_allowed(true); | 704 jingle_glue::JingleThreadWrapper::current()->set_send_allowed(true); |
| 708 *thread = jingle_glue::JingleThreadWrapper::current(); | 705 *thread = jingle_glue::JingleThreadWrapper::current(); |
| 709 event->Signal(); | 706 event->Signal(); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 797 // processed before returning. We wait for the above task to finish before | 794 // processed before returning. We wait for the above task to finish before |
| 798 // letting the the function continue to avoid any potential race issues. | 795 // letting the the function continue to avoid any potential race issues. |
| 799 chrome_worker_thread_.Stop(); | 796 chrome_worker_thread_.Stop(); |
| 800 } else { | 797 } else { |
| 801 NOTREACHED() << "Worker thread not running."; | 798 NOTREACHED() << "Worker thread not running."; |
| 802 } | 799 } |
| 803 } | 800 } |
| 804 } | 801 } |
| 805 | 802 |
| 806 } // namespace content | 803 } // namespace content |
| OLD | NEW |