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 4b30909910e5b10bdfb05ddff5ba2b40a80192cc..db756a4972c57229e7a315ffc11e34aa58cc4697 100644 |
--- a/webrtc/modules/audio_device/ios/voice_processing_audio_unit.mm |
+++ b/webrtc/modules/audio_device/ios/voice_processing_audio_unit.mm |
@@ -56,7 +56,7 @@ static const AudioUnitElement kOutputBus = 0; |
VoiceProcessingAudioUnit::VoiceProcessingAudioUnit( |
VoiceProcessingAudioUnitObserver* observer) |
- : observer_(observer), vpio_unit_(nullptr) { |
+ : observer_(observer), vpio_unit_(nullptr), state_(kInitRequired) { |
RTC_DCHECK(observer); |
} |
@@ -67,7 +67,7 @@ VoiceProcessingAudioUnit::~VoiceProcessingAudioUnit() { |
const UInt32 VoiceProcessingAudioUnit::kBytesPerSample = 2; |
bool VoiceProcessingAudioUnit::Init() { |
- RTC_DCHECK(!vpio_unit_) << "Already called Init()."; |
+ RTC_DCHECK_EQ(state_, kInitRequired); |
// Create an audio component description to identify the Voice Processing |
// I/O audio unit. |
@@ -165,11 +165,16 @@ bool VoiceProcessingAudioUnit::Init() { |
return false; |
} |
+ state_ = kUninitialized; |
return true; |
} |
+VoiceProcessingAudioUnit::State VoiceProcessingAudioUnit::GetState() const { |
+ return state_; |
+} |
+ |
bool VoiceProcessingAudioUnit::Initialize(Float64 sample_rate) { |
- RTC_DCHECK(vpio_unit_) << "Init() not called."; |
+ RTC_DCHECK_GE(state_, kUninitialized); |
RTCLog(@"Initializing audio unit."); |
OSStatus result = noErr; |
@@ -224,11 +229,12 @@ bool VoiceProcessingAudioUnit::Initialize(Float64 sample_rate) { |
result = AudioUnitInitialize(vpio_unit_); |
} |
RTCLog(@"Voice Processing I/O unit is now initialized."); |
+ state_ = kInitialized; |
return true; |
} |
bool VoiceProcessingAudioUnit::Start() { |
- RTC_DCHECK(vpio_unit_) << "Init() not called."; |
+ RTC_DCHECK_GE(state_, kUninitialized); |
Chuck
2016/03/21 17:12:48
Should these be GE initialized instead of uninitia
tkchin_webrtc
2016/03/21 18:32:27
No, because we don't want to make callers have to
|
RTCLog(@"Starting audio unit."); |
OSStatus result = AudioOutputUnitStart(vpio_unit_); |
@@ -236,11 +242,12 @@ bool VoiceProcessingAudioUnit::Start() { |
RTCLogError(@"Failed to start audio unit. Error=%ld", (long)result); |
return false; |
} |
+ state_ = kStarted; |
return true; |
} |
bool VoiceProcessingAudioUnit::Stop() { |
- RTC_DCHECK(vpio_unit_) << "Init() not called."; |
+ RTC_DCHECK_GE(state_, kUninitialized); |
RTCLog(@"Stopping audio unit."); |
OSStatus result = AudioOutputUnitStop(vpio_unit_); |
@@ -248,11 +255,12 @@ bool VoiceProcessingAudioUnit::Stop() { |
RTCLogError(@"Failed to stop audio unit. Error=%ld", (long)result); |
return false; |
} |
+ state_ = kInitialized; |
return true; |
} |
bool VoiceProcessingAudioUnit::Uninitialize() { |
- RTC_DCHECK(vpio_unit_) << "Init() not called."; |
+ RTC_DCHECK_GE(state_, kUninitialized); |
RTCLog(@"Unintializing audio unit."); |
OSStatus result = AudioUnitUninitialize(vpio_unit_); |
@@ -347,6 +355,18 @@ AudioStreamBasicDescription VoiceProcessingAudioUnit::GetFormat( |
void VoiceProcessingAudioUnit::DisposeAudioUnit() { |
if (vpio_unit_) { |
+ switch (state_) { |
+ case kStarted: |
+ Stop(); |
+ // Fall through. |
+ case kInitialized: |
+ Uninitialize(); |
+ break; |
+ case kUninitialized: |
+ case kInitRequired: |
+ break; |
+ } |
+ |
OSStatus result = AudioComponentInstanceDispose(vpio_unit_); |
if (result != noErr) { |
RTCLogError(@"AudioComponentInstanceDispose failed. Error=%ld.", |