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.
5 #include "content/renderer/media/webrtc/webrtc_local_audio_track_adapter.h"
7 #include "base/logging.h"
8 #include "content/renderer/media/media_stream_audio_processor.h"
9 #include "content/renderer/media/webrtc/webrtc_audio_sink_adapter.h"
10 #include "content/renderer/media/webrtc_local_audio_track.h"
11 #include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h"
15 static const char kAudioTrackKind[] = "audio";
17 scoped_refptr<WebRtcLocalAudioTrackAdapter>
18 WebRtcLocalAudioTrackAdapter::Create(
19 const std::string& label,
20 webrtc::AudioSourceInterface* track_source) {
21 talk_base::RefCountedObject<WebRtcLocalAudioTrackAdapter>* adapter =
22 new talk_base::RefCountedObject<WebRtcLocalAudioTrackAdapter>(
27 WebRtcLocalAudioTrackAdapter::WebRtcLocalAudioTrackAdapter(
28 const std::string& label,
29 webrtc::AudioSourceInterface* track_source)
30 : webrtc::MediaStreamTrack<webrtc::AudioTrackInterface>(label),
32 track_source_(track_source),
36 WebRtcLocalAudioTrackAdapter::~WebRtcLocalAudioTrackAdapter() {
39 void WebRtcLocalAudioTrackAdapter::Initialize(WebRtcLocalAudioTrack* owner) {
45 void WebRtcLocalAudioTrackAdapter::SetAudioProcessor(
46 const scoped_refptr<MediaStreamAudioProcessor>& processor) {
47 base::AutoLock auto_lock(lock_);
48 audio_processor_ = processor;
51 std::string WebRtcLocalAudioTrackAdapter::kind() const {
52 return kAudioTrackKind;
55 void WebRtcLocalAudioTrackAdapter::AddSink(
56 webrtc::AudioTrackSinkInterface* sink) {
59 // Verify that |sink| has not been added.
60 for (ScopedVector<WebRtcAudioSinkAdapter>::const_iterator it =
61 sink_adapters_.begin();
62 it != sink_adapters_.end(); ++it) {
63 DCHECK(!(*it)->IsEqual(sink));
67 scoped_ptr<WebRtcAudioSinkAdapter> adapter(
68 new WebRtcAudioSinkAdapter(sink));
69 owner_->AddSink(adapter.get());
70 sink_adapters_.push_back(adapter.release());
73 void WebRtcLocalAudioTrackAdapter::RemoveSink(
74 webrtc::AudioTrackSinkInterface* sink) {
76 for (ScopedVector<WebRtcAudioSinkAdapter>::iterator it =
77 sink_adapters_.begin();
78 it != sink_adapters_.end(); ++it) {
79 if ((*it)->IsEqual(sink)) {
80 owner_->RemoveSink(*it);
81 sink_adapters_.erase(it);
87 bool WebRtcLocalAudioTrackAdapter::GetSignalLevel(int* level) {
88 base::AutoLock auto_lock(lock_);
89 // It is required to provide the signal level after audio processing. In
90 // case the audio processing is not enabled for the track, we return
91 // false here in order not to overwrite the value from WebRTC.
92 // TODO(xians): Remove this after we turn on the APM in Chrome by default.
93 // http://crbug/365672 .
94 if (!MediaStreamAudioProcessor::IsAudioTrackProcessingEnabled())
97 *level = signal_level_;
101 talk_base::scoped_refptr<webrtc::AudioProcessorInterface>
102 WebRtcLocalAudioTrackAdapter::GetAudioProcessor() {
103 base::AutoLock auto_lock(lock_);
104 return audio_processor_.get();
107 std::vector<int> WebRtcLocalAudioTrackAdapter::VoeChannels() const {
108 base::AutoLock auto_lock(lock_);
109 return voe_channels_;
112 void WebRtcLocalAudioTrackAdapter::SetSignalLevel(int signal_level) {
113 base::AutoLock auto_lock(lock_);
114 signal_level_ = signal_level;
117 void WebRtcLocalAudioTrackAdapter::AddChannel(int channel_id) {
118 DVLOG(1) << "WebRtcLocalAudioTrack::AddChannel(channel_id="
119 << channel_id << ")";
120 base::AutoLock auto_lock(lock_);
121 if (std::find(voe_channels_.begin(), voe_channels_.end(), channel_id) !=
122 voe_channels_.end()) {
123 // We need to handle the case when the same channel is connected to the
124 // track more than once.
128 voe_channels_.push_back(channel_id);
131 void WebRtcLocalAudioTrackAdapter::RemoveChannel(int channel_id) {
132 DVLOG(1) << "WebRtcLocalAudioTrack::RemoveChannel(channel_id="
133 << channel_id << ")";
134 base::AutoLock auto_lock(lock_);
135 std::vector<int>::iterator iter =
136 std::find(voe_channels_.begin(), voe_channels_.end(), channel_id);
137 DCHECK(iter != voe_channels_.end());
138 voe_channels_.erase(iter);
141 webrtc::AudioSourceInterface* WebRtcLocalAudioTrackAdapter::GetSource() const {
142 return track_source_;
145 cricket::AudioRenderer* WebRtcLocalAudioTrackAdapter::GetRenderer() {
149 } // namespace content