Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(33)

Unified Diff: content/renderer/media/webrtc_audio_device_impl.cc

Issue 37793005: move the APM to chrome. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: added a switch, it uses the APM in WebRtc if the switch is off, otherwise use the APM in Chrome. Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/renderer/media/webrtc_audio_device_impl.cc
diff --git a/content/renderer/media/webrtc_audio_device_impl.cc b/content/renderer/media/webrtc_audio_device_impl.cc
index aadcda9b67232434a7177501215c4b78215d0416..acf5a919c2b46b594f16420689018311423b1a65 100644
--- a/content/renderer/media/webrtc_audio_device_impl.cc
+++ b/content/renderer/media/webrtc_audio_device_impl.cc
@@ -51,6 +51,7 @@ int32_t WebRtcAudioDeviceImpl::Release() {
}
return ret;
}
+
int WebRtcAudioDeviceImpl::CaptureData(const std::vector<int>& channels,
const int16* audio_data,
int sample_rate,
@@ -74,36 +75,11 @@ int WebRtcAudioDeviceImpl::CaptureData(const std::vector<int>& channels,
DVLOG(2) << "total delay: " << input_delay_ms_ + output_delay_ms_;
}
- // Write audio samples in blocks of 10 milliseconds to the registered
- // webrtc::AudioTransport sink. Keep writing until our internal byte
- // buffer is empty.
- const int16* audio_buffer = audio_data;
- const int samples_per_10_msec = (sample_rate / 100);
- int accumulated_audio_samples = 0;
- uint32_t new_volume = 0;
- while (accumulated_audio_samples < number_of_frames) {
- // Deliver 10ms of recorded 16-bit linear PCM audio.
- int new_mic_level = audio_transport_callback_->OnDataAvailable(
- &channels[0],
- channels.size(),
- audio_buffer,
- sample_rate,
- number_of_channels,
- samples_per_10_msec,
- total_delay_ms,
- current_volume,
- key_pressed,
- need_audio_processing);
-
- accumulated_audio_samples += samples_per_10_msec;
- audio_buffer += samples_per_10_msec * number_of_channels;
-
- // The latest non-zero new microphone level will be returned.
- if (new_mic_level)
- new_volume = new_mic_level;
- }
-
- return new_volume;
+ // Deliver 10ms of recorded 16-bit linear PCM audio.
+ return audio_transport_callback_->OnDataAvailable(
+ &channels[0], channels.size(), audio_data, sample_rate,
+ number_of_channels, number_of_frames, total_delay_ms,
+ current_volume, key_pressed, need_audio_processing);
}
void WebRtcAudioDeviceImpl::SetCaptureFormat(
@@ -150,6 +126,18 @@ void WebRtcAudioDeviceImpl::RenderData(uint8* audio_data,
accumulated_audio_samples += num_audio_samples;
audio_data += bytes_per_10_msec;
}
+
+ base::AutoLock auto_lock(lock_);
+ for (RenderDataObservers::const_iterator iter =
+ render_data_observers_.begin();
+ iter != render_data_observers_.end(); ++iter) {
+ (*iter)->OnRenderData(
+ reinterpret_cast<const int16*>(audio_data),
+ samples_per_sec,
+ number_of_channels,
+ number_of_frames,
+ audio_delay_milliseconds);
+ }
}
void WebRtcAudioDeviceImpl::SetRenderFormat(const AudioParameters& params) {
@@ -202,6 +190,14 @@ int32_t WebRtcAudioDeviceImpl::Terminate() {
capturers_.clear();
+ // Notify all the remaining observers that the render object is going away.
+ for (RenderDataObservers::const_iterator iter =
+ render_data_observers_.begin();
+ iter != render_data_observers_.end(); ++iter) {
+ (*iter)->OnRenderClosing();
+ }
+ render_data_observers_.clear();
+
initialized_ = false;
return 0;
}
@@ -481,4 +477,27 @@ WebRtcAudioDeviceImpl::GetDefaultCapturer() const {
return NULL;
}
+void WebRtcAudioDeviceImpl::AddRenderDataObserver(
+ WebRtcAudioRenderDataObserver* observer) {
+ DCHECK(observer);
+ base::AutoLock auto_lock(lock_);
+ DCHECK(std::find(render_data_observers_.begin(),
+ render_data_observers_.end(),
+ observer) == render_data_observers_.end());
+ render_data_observers_.push_back(observer);
+}
+
+void WebRtcAudioDeviceImpl::RemoveRenderDataObserver(
+ WebRtcAudioRenderDataObserver* observer) {
+ DCHECK(observer);
+ base::AutoLock auto_lock(lock_);
+ RenderDataObservers::iterator iter = std::find(
+ render_data_observers_.begin(), render_data_observers_.end(), observer);
+ // TODO(xians): why not DCHECK.
+ if (iter == render_data_observers_.end())
+ return;
+
+ render_data_observers_.erase(iter);
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698