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

Side by Side Diff: webrtc/modules/audio_device/ios/audio_device_ios.mm

Issue 2349263004: Ensures that ADM for Android and iOS uses identical states when stopping audio (Closed)
Patch Set: Changes based on tests py sophiechang@ Created 4 years, 3 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 unified diff | Download patch
« no previous file with comments | « webrtc/modules/audio_device/ios/audio_device_ios.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 } 90 }
91 } 91 }
92 #endif // !defined(NDEBUG) 92 #endif // !defined(NDEBUG)
93 93
94 AudioDeviceIOS::AudioDeviceIOS() 94 AudioDeviceIOS::AudioDeviceIOS()
95 : audio_device_buffer_(nullptr), 95 : audio_device_buffer_(nullptr),
96 audio_unit_(nullptr), 96 audio_unit_(nullptr),
97 recording_(0), 97 recording_(0),
98 playing_(0), 98 playing_(0),
99 initialized_(false), 99 initialized_(false),
100 rec_is_initialized_(false), 100 audio_is_initialized_(false),
101 play_is_initialized_(false),
102 is_interrupted_(false), 101 is_interrupted_(false),
103 has_configured_session_(false) { 102 has_configured_session_(false) {
104 LOGI() << "ctor" << ios::GetCurrentThreadDescription(); 103 LOGI() << "ctor" << ios::GetCurrentThreadDescription();
105 thread_ = rtc::Thread::Current(); 104 thread_ = rtc::Thread::Current();
106 audio_session_observer_ = 105 audio_session_observer_ =
107 [[RTCAudioSessionDelegateAdapter alloc] initWithObserver:this]; 106 [[RTCAudioSessionDelegateAdapter alloc] initWithObserver:this];
108 } 107 }
109 108
110 AudioDeviceIOS::~AudioDeviceIOS() { 109 AudioDeviceIOS::~AudioDeviceIOS() {
111 LOGI() << "~dtor" << ios::GetCurrentThreadDescription(); 110 LOGI() << "~dtor" << ios::GetCurrentThreadDescription();
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 StopPlayout(); 157 StopPlayout();
159 StopRecording(); 158 StopRecording();
160 initialized_ = false; 159 initialized_ = false;
161 return 0; 160 return 0;
162 } 161 }
163 162
164 int32_t AudioDeviceIOS::InitPlayout() { 163 int32_t AudioDeviceIOS::InitPlayout() {
165 LOGI() << "InitPlayout"; 164 LOGI() << "InitPlayout";
166 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 165 RTC_DCHECK(thread_checker_.CalledOnValidThread());
167 RTC_DCHECK(initialized_); 166 RTC_DCHECK(initialized_);
168 RTC_DCHECK(!play_is_initialized_); 167 RTC_DCHECK(!audio_is_initialized_);
169 RTC_DCHECK(!playing_); 168 RTC_DCHECK(!playing_);
170 if (!rec_is_initialized_) { 169 if (!audio_is_initialized_) {
171 if (!InitPlayOrRecord()) { 170 if (!InitPlayOrRecord()) {
172 LOG_F(LS_ERROR) << "InitPlayOrRecord failed for InitPlayout!"; 171 LOG_F(LS_ERROR) << "InitPlayOrRecord failed for InitPlayout!";
173 return -1; 172 return -1;
174 } 173 }
175 } 174 }
176 play_is_initialized_ = true; 175 audio_is_initialized_ = true;
177 return 0; 176 return 0;
178 } 177 }
179 178
180 int32_t AudioDeviceIOS::InitRecording() { 179 int32_t AudioDeviceIOS::InitRecording() {
181 LOGI() << "InitRecording"; 180 LOGI() << "InitRecording";
182 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 181 RTC_DCHECK(thread_checker_.CalledOnValidThread());
183 RTC_DCHECK(initialized_); 182 RTC_DCHECK(initialized_);
184 RTC_DCHECK(!rec_is_initialized_); 183 RTC_DCHECK(!audio_is_initialized_);
185 RTC_DCHECK(!recording_); 184 RTC_DCHECK(!recording_);
186 if (!play_is_initialized_) { 185 if (!audio_is_initialized_) {
187 if (!InitPlayOrRecord()) { 186 if (!InitPlayOrRecord()) {
188 LOG_F(LS_ERROR) << "InitPlayOrRecord failed for InitRecording!"; 187 LOG_F(LS_ERROR) << "InitPlayOrRecord failed for InitRecording!";
189 return -1; 188 return -1;
190 } 189 }
191 } 190 }
192 rec_is_initialized_ = true; 191 audio_is_initialized_ = true;
193 return 0; 192 return 0;
194 } 193 }
195 194
196 int32_t AudioDeviceIOS::StartPlayout() { 195 int32_t AudioDeviceIOS::StartPlayout() {
197 LOGI() << "StartPlayout"; 196 LOGI() << "StartPlayout";
198 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 197 RTC_DCHECK(thread_checker_.CalledOnValidThread());
199 RTC_DCHECK(play_is_initialized_); 198 RTC_DCHECK(audio_is_initialized_);
200 RTC_DCHECK(!playing_); 199 RTC_DCHECK(!playing_);
201 RTC_DCHECK(audio_unit_); 200 RTC_DCHECK(audio_unit_);
202 if (fine_audio_buffer_) { 201 if (fine_audio_buffer_) {
203 fine_audio_buffer_->ResetPlayout(); 202 fine_audio_buffer_->ResetPlayout();
204 } 203 }
205 if (!recording_ && 204 if (!recording_ &&
206 audio_unit_->GetState() == VoiceProcessingAudioUnit::kInitialized) { 205 audio_unit_->GetState() == VoiceProcessingAudioUnit::kInitialized) {
207 if (!audio_unit_->Start()) { 206 if (!audio_unit_->Start()) {
208 RTCLogError(@"StartPlayout failed to start audio unit."); 207 RTCLogError(@"StartPlayout failed to start audio unit.");
209 return -1; 208 return -1;
210 } 209 }
211 LOG(LS_INFO) << "Voice-Processing I/O audio unit is now started"; 210 LOG(LS_INFO) << "Voice-Processing I/O audio unit is now started";
212 } 211 }
213 rtc::AtomicOps::ReleaseStore(&playing_, 1); 212 rtc::AtomicOps::ReleaseStore(&playing_, 1);
214 return 0; 213 return 0;
215 } 214 }
216 215
217 int32_t AudioDeviceIOS::StopPlayout() { 216 int32_t AudioDeviceIOS::StopPlayout() {
218 LOGI() << "StopPlayout"; 217 LOGI() << "StopPlayout";
219 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 218 RTC_DCHECK(thread_checker_.CalledOnValidThread());
220 if (!play_is_initialized_) { 219 if (!audio_is_initialized_ || !playing_) {
221 return 0;
222 }
223 if (!playing_) {
224 play_is_initialized_ = false;
225 return 0; 220 return 0;
226 } 221 }
227 if (!recording_) { 222 if (!recording_) {
228 ShutdownPlayOrRecord(); 223 ShutdownPlayOrRecord();
224 audio_is_initialized_ = false;
229 } 225 }
230 play_is_initialized_ = false;
231 rtc::AtomicOps::ReleaseStore(&playing_, 0); 226 rtc::AtomicOps::ReleaseStore(&playing_, 0);
232 return 0; 227 return 0;
233 } 228 }
234 229
235 int32_t AudioDeviceIOS::StartRecording() { 230 int32_t AudioDeviceIOS::StartRecording() {
236 LOGI() << "StartRecording"; 231 LOGI() << "StartRecording";
237 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 232 RTC_DCHECK(thread_checker_.CalledOnValidThread());
238 RTC_DCHECK(rec_is_initialized_); 233 RTC_DCHECK(audio_is_initialized_);
239 RTC_DCHECK(!recording_); 234 RTC_DCHECK(!recording_);
240 RTC_DCHECK(audio_unit_); 235 RTC_DCHECK(audio_unit_);
241 if (fine_audio_buffer_) { 236 if (fine_audio_buffer_) {
242 fine_audio_buffer_->ResetRecord(); 237 fine_audio_buffer_->ResetRecord();
243 } 238 }
244 if (!playing_ && 239 if (!playing_ &&
245 audio_unit_->GetState() == VoiceProcessingAudioUnit::kInitialized) { 240 audio_unit_->GetState() == VoiceProcessingAudioUnit::kInitialized) {
246 if (!audio_unit_->Start()) { 241 if (!audio_unit_->Start()) {
247 RTCLogError(@"StartRecording failed to start audio unit."); 242 RTCLogError(@"StartRecording failed to start audio unit.");
248 return -1; 243 return -1;
249 } 244 }
250 LOG(LS_INFO) << "Voice-Processing I/O audio unit is now started"; 245 LOG(LS_INFO) << "Voice-Processing I/O audio unit is now started";
251 } 246 }
252 rtc::AtomicOps::ReleaseStore(&recording_, 1); 247 rtc::AtomicOps::ReleaseStore(&recording_, 1);
253 return 0; 248 return 0;
254 } 249 }
255 250
256 int32_t AudioDeviceIOS::StopRecording() { 251 int32_t AudioDeviceIOS::StopRecording() {
257 LOGI() << "StopRecording"; 252 LOGI() << "StopRecording";
258 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 253 RTC_DCHECK(thread_checker_.CalledOnValidThread());
259 if (!rec_is_initialized_) { 254 if (!audio_is_initialized_ || !recording_) {
260 return 0;
261 }
262 if (!recording_) {
263 rec_is_initialized_ = false;
264 return 0; 255 return 0;
265 } 256 }
266 if (!playing_) { 257 if (!playing_) {
267 ShutdownPlayOrRecord(); 258 ShutdownPlayOrRecord();
259 audio_is_initialized_ = false;
268 } 260 }
269 rec_is_initialized_ = false;
270 rtc::AtomicOps::ReleaseStore(&recording_, 0); 261 rtc::AtomicOps::ReleaseStore(&recording_, 0);
271 return 0; 262 return 0;
272 } 263 }
273 264
274 // Change the default receiver playout route to speaker. 265 // Change the default receiver playout route to speaker.
275 int32_t AudioDeviceIOS::SetLoudspeakerStatus(bool enable) { 266 int32_t AudioDeviceIOS::SetLoudspeakerStatus(bool enable) {
276 LOGI() << "SetLoudspeakerStatus(" << enable << ")"; 267 LOGI() << "SetLoudspeakerStatus(" << enable << ")";
277 268
278 RTCAudioSession* session = [RTCAudioSession sharedInstance]; 269 RTCAudioSession* session = [RTCAudioSession sharedInstance];
279 [session lockForConfiguration]; 270 [session lockForConfiguration];
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
682 RTCLog(@"Updating audio unit state. CanPlayOrRecord=%d IsInterrupted=%d", 673 RTCLog(@"Updating audio unit state. CanPlayOrRecord=%d IsInterrupted=%d",
683 can_play_or_record, is_interrupted_); 674 can_play_or_record, is_interrupted_);
684 675
685 if (is_interrupted_) { 676 if (is_interrupted_) {
686 RTCLog(@"Ignoring audio unit update due to interruption."); 677 RTCLog(@"Ignoring audio unit update due to interruption.");
687 return; 678 return;
688 } 679 }
689 680
690 // If we're not initialized we don't need to do anything. Audio unit will 681 // If we're not initialized we don't need to do anything. Audio unit will
691 // be initialized on initialization. 682 // be initialized on initialization.
692 if (!rec_is_initialized_ && !play_is_initialized_) 683 if (!audio_is_initialized_)
693 return; 684 return;
694 685
695 // If we're initialized, we must have an audio unit. 686 // If we're initialized, we must have an audio unit.
696 RTC_DCHECK(audio_unit_); 687 RTC_DCHECK(audio_unit_);
697 688
698 bool should_initialize_audio_unit = false; 689 bool should_initialize_audio_unit = false;
699 bool should_uninitialize_audio_unit = false; 690 bool should_uninitialize_audio_unit = false;
700 bool should_start_audio_unit = false; 691 bool should_start_audio_unit = false;
701 bool should_stop_audio_unit = false; 692 bool should_stop_audio_unit = false;
702 693
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
841 832
842 // All I/O should be stopped or paused prior to deactivating the audio 833 // All I/O should be stopped or paused prior to deactivating the audio
843 // session, hence we deactivate as last action. 834 // session, hence we deactivate as last action.
844 [session lockForConfiguration]; 835 [session lockForConfiguration];
845 UnconfigureAudioSession(); 836 UnconfigureAudioSession();
846 [session endWebRTCSession:nil]; 837 [session endWebRTCSession:nil];
847 [session unlockForConfiguration]; 838 [session unlockForConfiguration];
848 } 839 }
849 840
850 } // namespace webrtc 841 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/audio_device/ios/audio_device_ios.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698