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

Unified Diff: webrtc/voice_engine/voe_base_impl.cc

Issue 2665693002: Moves channel-dependent audio input processing to separate encoder task queue (Closed)
Patch Set: Final comments from Tommi Created 3 years, 9 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
« no previous file with comments | « webrtc/voice_engine/voe_base_impl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/voice_engine/voe_base_impl.cc
diff --git a/webrtc/voice_engine/voe_base_impl.cc b/webrtc/voice_engine/voe_base_impl.cc
index d1981a4a3a72a55495009f4e9dbcff4c004d7d15..8072cc86d91fed6ffbe8f99598266c4b40b8580c 100644
--- a/webrtc/voice_engine/voe_base_impl.cc
+++ b/webrtc/voice_engine/voe_base_impl.cc
@@ -77,19 +77,66 @@ void VoEBaseImpl::OnWarningIsReported(const WarningCode warning) {
}
}
-int32_t VoEBaseImpl::RecordedDataIsAvailable(const void* audioSamples,
- const size_t nSamples,
- const size_t nBytesPerSample,
- const size_t nChannels,
- const uint32_t samplesPerSec,
- const uint32_t totalDelayMS,
- const int32_t clockDrift,
- const uint32_t currentMicLevel,
- const bool keyPressed,
- uint32_t& newMicLevel) {
- newMicLevel = static_cast<uint32_t>(ProcessRecordedDataWithAPM(
- nullptr, 0, audioSamples, samplesPerSec, nChannels, nSamples,
- totalDelayMS, clockDrift, currentMicLevel, keyPressed));
+int32_t VoEBaseImpl::RecordedDataIsAvailable(
+ const void* audio_data,
+ const size_t number_of_frames,
+ const size_t bytes_per_sample,
+ const size_t number_of_channels,
+ const uint32_t sample_rate,
+ const uint32_t audio_delay_milliseconds,
+ const int32_t clock_drift,
+ const uint32_t volume,
+ const bool key_pressed,
+ uint32_t& new_mic_volume) {
+ RTC_DCHECK_EQ(2 * number_of_channels, bytes_per_sample);
+ RTC_DCHECK(shared_->transmit_mixer() != nullptr);
+ RTC_DCHECK(shared_->audio_device() != nullptr);
+
+ uint32_t max_volume = 0;
+ uint16_t voe_mic_level = 0;
+ // Check for zero to skip this calculation; the consumer may use this to
+ // indicate no volume is available.
+ if (volume != 0) {
+ // Scale from ADM to VoE level range
+ if (shared_->audio_device()->MaxMicrophoneVolume(&max_volume) == 0) {
+ if (max_volume) {
+ voe_mic_level = static_cast<uint16_t>(
+ (volume * kMaxVolumeLevel + static_cast<int>(max_volume / 2)) /
+ max_volume);
+ }
+ }
+ // We learned that on certain systems (e.g Linux) the voe_mic_level
+ // can be greater than the maxVolumeLevel therefore
+ // we are going to cap the voe_mic_level to the maxVolumeLevel
+ // and change the maxVolume to volume if it turns out that
+ // the voe_mic_level is indeed greater than the maxVolumeLevel.
+ if (voe_mic_level > kMaxVolumeLevel) {
+ voe_mic_level = kMaxVolumeLevel;
+ max_volume = volume;
+ }
+ }
+
+ // Perform channel-independent operations
+ // (APM, mix with file, record to file, mute, etc.)
+ shared_->transmit_mixer()->PrepareDemux(
+ audio_data, number_of_frames, number_of_channels, sample_rate,
+ static_cast<uint16_t>(audio_delay_milliseconds), clock_drift,
+ voe_mic_level, key_pressed);
+
+ // Copy the audio frame to each sending channel and perform
+ // channel-dependent operations (file mixing, mute, etc.), encode and
+ // packetize+transmit the RTP packet.
+ shared_->transmit_mixer()->ProcessAndEncodeAudio();
+
+ // Scale from VoE to ADM level range.
+ uint32_t new_voe_mic_level = shared_->transmit_mixer()->CaptureLevel();
+ if (new_voe_mic_level != voe_mic_level) {
+ // Return the new volume if AGC has changed the volume.
+ return static_cast<int>((new_voe_mic_level * max_volume +
+ static_cast<int>(kMaxVolumeLevel / 2)) /
+ kMaxVolumeLevel);
+ }
+
return 0;
}
@@ -112,14 +159,15 @@ void VoEBaseImpl::PushCaptureData(int voe_channel, const void* audio_data,
size_t number_of_channels,
size_t number_of_frames) {
voe::ChannelOwner ch = shared_->channel_manager().GetChannel(voe_channel);
- voe::Channel* channel_ptr = ch.channel();
- if (!channel_ptr) return;
-
- if (channel_ptr->Sending()) {
- channel_ptr->Demultiplex(static_cast<const int16_t*>(audio_data),
- sample_rate, number_of_frames, number_of_channels);
- channel_ptr->PrepareEncodeAndSend(sample_rate);
- channel_ptr->EncodeAndSend();
+ voe::Channel* channel = ch.channel();
+ if (!channel)
+ return;
+ if (channel->Sending()) {
+ // Send the audio to each channel directly without using the APM in the
+ // transmit mixer.
+ channel->ProcessAndEncodeAudio(static_cast<const int16_t*>(audio_data),
+ sample_rate, number_of_frames,
+ number_of_channels);
}
}
@@ -377,7 +425,8 @@ int VoEBaseImpl::InitializeChannel(voe::ChannelOwner* channel_owner) {
if (channel_owner->channel()->SetEngineInformation(
shared_->statistics(), *shared_->output_mixer(),
*shared_->process_thread(), *shared_->audio_device(),
- voiceEngineObserverPtr_, &callbackCritSect_) != 0) {
+ voiceEngineObserverPtr_, &callbackCritSect_,
+ shared_->encoder_queue()) != 0) {
shared_->SetLastError(
VE_CHANNEL_NOT_CREATED, kTraceError,
"CreateChannel() failed to associate engine and channel."
@@ -521,10 +570,7 @@ int VoEBaseImpl::StopSend(int channel) {
"StopSend() failed to locate channel");
return -1;
}
- if (channelPtr->StopSend() != 0) {
- LOG_F(LS_WARNING) << "StopSend() failed to stop sending for channel "
- << channel;
- }
+ channelPtr->StopSend();
return StopSend();
}
@@ -648,73 +694,6 @@ int32_t VoEBaseImpl::TerminateInternal() {
return shared_->statistics().SetUnInitialized();
}
-int VoEBaseImpl::ProcessRecordedDataWithAPM(
- const int voe_channels[], size_t number_of_voe_channels,
- const void* audio_data, uint32_t sample_rate, size_t number_of_channels,
- size_t number_of_frames, uint32_t audio_delay_milliseconds,
- int32_t clock_drift, uint32_t volume, bool key_pressed) {
- assert(shared_->transmit_mixer() != nullptr);
- assert(shared_->audio_device() != nullptr);
-
- uint32_t max_volume = 0;
- uint16_t voe_mic_level = 0;
- // Check for zero to skip this calculation; the consumer may use this to
- // indicate no volume is available.
- if (volume != 0) {
- // Scale from ADM to VoE level range
- if (shared_->audio_device()->MaxMicrophoneVolume(&max_volume) == 0) {
- if (max_volume) {
- voe_mic_level = static_cast<uint16_t>(
- (volume * kMaxVolumeLevel + static_cast<int>(max_volume / 2)) /
- max_volume);
- }
- }
- // We learned that on certain systems (e.g Linux) the voe_mic_level
- // can be greater than the maxVolumeLevel therefore
- // we are going to cap the voe_mic_level to the maxVolumeLevel
- // and change the maxVolume to volume if it turns out that
- // the voe_mic_level is indeed greater than the maxVolumeLevel.
- if (voe_mic_level > kMaxVolumeLevel) {
- voe_mic_level = kMaxVolumeLevel;
- max_volume = volume;
- }
- }
-
- // Perform channel-independent operations
- // (APM, mix with file, record to file, mute, etc.)
- shared_->transmit_mixer()->PrepareDemux(
- audio_data, number_of_frames, number_of_channels, sample_rate,
- static_cast<uint16_t>(audio_delay_milliseconds), clock_drift,
- voe_mic_level, key_pressed);
-
- // Copy the audio frame to each sending channel and perform
- // channel-dependent operations (file mixing, mute, etc.), encode and
- // packetize+transmit the RTP packet. When |number_of_voe_channels| == 0,
- // do the operations on all the existing VoE channels; otherwise the
- // operations will be done on specific channels.
- if (number_of_voe_channels == 0) {
- shared_->transmit_mixer()->DemuxAndMix();
- shared_->transmit_mixer()->EncodeAndSend();
- } else {
- shared_->transmit_mixer()->DemuxAndMix(voe_channels,
- number_of_voe_channels);
- shared_->transmit_mixer()->EncodeAndSend(voe_channels,
- number_of_voe_channels);
- }
-
- // Scale from VoE to ADM level range.
- uint32_t new_voe_mic_level = shared_->transmit_mixer()->CaptureLevel();
- if (new_voe_mic_level != voe_mic_level) {
- // Return the new volume if AGC has changed the volume.
- return static_cast<int>((new_voe_mic_level * max_volume +
- static_cast<int>(kMaxVolumeLevel / 2)) /
- kMaxVolumeLevel);
- }
-
- // Return 0 to indicate no change on the volume.
- return 0;
-}
-
void VoEBaseImpl::GetPlayoutData(int sample_rate, size_t number_of_channels,
size_t number_of_frames, bool feed_data_to_apm,
void* audio_data, int64_t* elapsed_time_ms,
« no previous file with comments | « webrtc/voice_engine/voe_base_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698