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

Unified Diff: webrtc/modules/audio_device/ios/voice_processing_audio_unit.mm

Issue 1945563003: Provide isAudioEnabled flag to control audio unit. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Fix some bluetooth issue. Created 4 years, 8 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: webrtc/modules/audio_device/ios/voice_processing_audio_unit.mm
diff --git a/webrtc/modules/audio_device/ios/voice_processing_audio_unit.mm b/webrtc/modules/audio_device/ios/voice_processing_audio_unit.mm
index 08816a41521b84ddc3dfe333caf683c0ff59d8b2..11e5820455c2d50343b70c9d8a7e83264a6ca249 100644
--- a/webrtc/modules/audio_device/ios/voice_processing_audio_unit.mm
+++ b/webrtc/modules/audio_device/ios/voice_processing_audio_unit.mm
@@ -175,7 +175,7 @@ VoiceProcessingAudioUnit::State VoiceProcessingAudioUnit::GetState() const {
bool VoiceProcessingAudioUnit::Initialize(Float64 sample_rate) {
RTC_DCHECK_GE(state_, kUninitialized);
- RTCLog(@"Initializing audio unit.");
+ RTCLog(@"Initializing audio unit with sample rate: %f", sample_rate);
OSStatus result = noErr;
AudioStreamBasicDescription format = GetFormat(sample_rate);
@@ -228,7 +228,9 @@ bool VoiceProcessingAudioUnit::Initialize(Float64 sample_rate) {
[NSThread sleepForTimeInterval:0.1f];
result = AudioUnitInitialize(vpio_unit_);
}
- RTCLog(@"Voice Processing I/O unit is now initialized.");
+ if (result == noErr) {
+ RTCLog(@"Voice Processing I/O unit is now initialized.");
+ }
state_ = kInitialized;
return true;
}
@@ -237,10 +239,20 @@ bool VoiceProcessingAudioUnit::Start() {
RTC_DCHECK_GE(state_, kUninitialized);
RTCLog(@"Starting audio unit.");
- OSStatus result = AudioOutputUnitStart(vpio_unit_);
+ OSStatus result =
henrika_webrtc 2016/05/04 12:33:07 Perhaps a comment regarding why we need this liste
tkchin_webrtc 2016/05/05 23:23:28 Removing these changes for now. Will address BT is
henrika_webrtc 2016/05/06 11:22:17 Acknowledged.
+ AudioUnitAddPropertyListener(vpio_unit_, kAudioUnitProperty_SampleRate,
+ OnSampleRateChange, this);
+ if (result != noErr) {
+ RTCLogError(@"Failed to add sample rate listener. Error=%ld.",
+ (long)result);
+ }
+
+ result = AudioOutputUnitStart(vpio_unit_);
if (result != noErr) {
RTCLogError(@"Failed to start audio unit. Error=%ld", (long)result);
return false;
+ } else {
+ RTCLog(@"Started audio unit");
}
state_ = kStarted;
return true;
@@ -254,7 +266,19 @@ bool VoiceProcessingAudioUnit::Stop() {
if (result != noErr) {
RTCLogError(@"Failed to stop audio unit. Error=%ld", (long)result);
return false;
+ } else {
+ RTCLog(@"Stopped audio unit");
+ }
+
+ result =
henrika_webrtc 2016/05/04 12:33:07 Do we need a check that it is disabled at close?
tkchin_webrtc 2016/05/05 23:23:28 Removing these changes for now. Will address BT is
henrika_webrtc 2016/05/06 11:22:16 Acknowledged.
+ AudioUnitRemovePropertyListenerWithUserData(vpio_unit_,
+ kAudioUnitProperty_SampleRate,
+ OnSampleRateChange, this);
+ if (result != noErr) {
+ RTCLogError(@"Failed to remove sample rate listener. Error=%ld.",
+ (long)result);
}
+
state_ = kInitialized;
return true;
}
@@ -267,6 +291,8 @@ bool VoiceProcessingAudioUnit::Uninitialize() {
if (result != noErr) {
RTCLogError(@"Failed to uninitialize audio unit. Error=%ld", (long)result);
return false;
+ } else {
+ RTCLog(@"Uninitialized audio unit.");
}
return true;
}
@@ -312,6 +338,17 @@ OSStatus VoiceProcessingAudioUnit::OnDeliverRecordedData(
num_frames, io_data);
}
+void VoiceProcessingAudioUnit::OnSampleRateChange(
henrika_webrtc 2016/05/04 12:33:07 Can we now get this callback and the routing chang
tkchin_webrtc 2016/05/05 23:23:28 There shouldn't be conflicts - we are always using
henrika_webrtc 2016/05/06 11:22:17 Acknowledged.
+ void* in_ref_con,
+ AudioUnit audio_unit,
+ AudioUnitPropertyID property_id,
+ AudioUnitScope scope,
+ AudioUnitElement element) {
+ VoiceProcessingAudioUnit* vp_unit =
+ static_cast<VoiceProcessingAudioUnit*>(in_ref_con);
+ vp_unit->NotifySampleRateChange(audio_unit, property_id, scope, element);
+}
+
OSStatus VoiceProcessingAudioUnit::NotifyGetPlayoutData(
AudioUnitRenderActionFlags* flags,
const AudioTimeStamp* time_stamp,
@@ -332,6 +369,32 @@ OSStatus VoiceProcessingAudioUnit::NotifyDeliverRecordedData(
num_frames, io_data);
}
+void VoiceProcessingAudioUnit::NotifySampleRateChange(
+ AudioUnit audio_unit,
+ AudioUnitPropertyID property_id,
+ AudioUnitScope scope,
+ AudioUnitElement element) {
+ RTC_DCHECK_EQ(audio_unit, vpio_unit_);
+ RTC_DCHECK_EQ(property_id, kAudioUnitProperty_SampleRate);
+ // We only care about the output.
henrika_webrtc 2016/05/04 12:33:07 Have you really been able to trigger callback on o
tkchin_webrtc 2016/05/05 23:23:28 Nope. But just in case.
henrika_webrtc 2016/05/06 11:22:17 Acknowledged.
+ if (scope != kAudioUnitScope_Output || element != kOutputBus) {
+ return;
+ }
+ Float64 sample_rate = 0;
+ UInt32 sample_rate_size = sizeof(Float64);
+ OSStatus status = AudioUnitGetProperty(audio_unit,
+ kAudioUnitProperty_SampleRate,
+ kAudioUnitScope_Output,
+ kOutputBus,
+ &sample_rate,
+ &sample_rate_size);
+ if (status != noErr) {
+ RTCLogError(@"Failed to get sample rate. Error=%ld.", (long)status);
+ return;
+ }
+ observer_->OnSampleRateChange(sample_rate);
+}
+
AudioStreamBasicDescription VoiceProcessingAudioUnit::GetFormat(
Float64 sample_rate) const {
// Set the application formats for input and output:

Powered by Google App Engine
This is Rietveld 408576698