diff options
author | milanb@chromium.org <milanb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-19 00:40:46 +0000 |
---|---|---|
committer | milanb@chromium.org <milanb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-19 00:40:46 +0000 |
commit | 7bce13109d690333a522914e74d11a367bcbb7d4 (patch) | |
tree | f8446d0c8f33fe11a57c4c32781a8d4ddd77bb6f /media | |
parent | 437ee80fef0603c49997fe62fc694c338e663ca6 (diff) | |
download | chromium_src-7bce13109d690333a522914e74d11a367bcbb7d4.zip chromium_src-7bce13109d690333a522914e74d11a367bcbb7d4.tar.gz chromium_src-7bce13109d690333a522914e74d11a367bcbb7d4.tar.bz2 |
Create a utility for audio initialization.
The audio initialization on ios can happen on both UI and IO threads. Creating an audio session utility that prevents a potential race condition.
R=scherkus@chromium.org
BUG=None
Review URL: https://chromiumcodereview.appspot.com/11505005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@173816 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r-- | media/audio/ios/audio_manager_ios.h | 5 | ||||
-rw-r--r-- | media/audio/ios/audio_manager_ios.mm | 23 | ||||
-rw-r--r-- | media/audio/ios/audio_session_util_ios.h | 17 | ||||
-rw-r--r-- | media/audio/ios/audio_session_util_ios.mm | 35 | ||||
-rw-r--r-- | media/media.gyp | 11 |
5 files changed, 61 insertions, 30 deletions
diff --git a/media/audio/ios/audio_manager_ios.h b/media/audio/ios/audio_manager_ios.h index 55cbe6e..34a85fc 100644 --- a/media/audio/ios/audio_manager_ios.h +++ b/media/audio/ios/audio_manager_ios.h @@ -42,11 +42,6 @@ class MEDIA_EXPORT AudioManagerIOS : public AudioManagerBase { virtual ~AudioManagerIOS(); private: - // Initializes the audio session if necessary. Safe to call multiple times. - // Returns a bool indicating whether the audio session has been successfully - // initialized (either in the current call or in a previous call). - bool InitAudioSession(); - DISALLOW_COPY_AND_ASSIGN(AudioManagerIOS); }; diff --git a/media/audio/ios/audio_manager_ios.mm b/media/audio/ios/audio_manager_ios.mm index a4ffff5..8949b1c 100644 --- a/media/audio/ios/audio_manager_ios.mm +++ b/media/audio/ios/audio_manager_ios.mm @@ -9,6 +9,7 @@ #include "base/sys_info.h" #include "media/audio/fake_audio_input_stream.h" +#include "media/audio/ios/audio_session_util_ios.h" #include "media/audio/mac/audio_input_mac.h" #include "media/base/limits.h" @@ -16,21 +17,6 @@ namespace media { enum { kMaxInputChannels = 2 }; -// Initializes the audio session, returning a bool indicating whether -// initialization was successful. Should only be called once. -static bool InitAudioSessionInternal() { - OSStatus error = AudioSessionInitialize(NULL, NULL, NULL, NULL); - DCHECK(error != kAudioSessionAlreadyInitialized); - AVAudioSession* audioSession = [AVAudioSession sharedInstance]; - BOOL result = [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord - error:nil]; - DCHECK(result); - UInt32 allowMixing = true; - AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, - sizeof(allowMixing), &allowMixing); - return error == kAudioSessionNoError; -} - AudioManagerIOS::AudioManagerIOS() { } @@ -43,7 +29,7 @@ bool AudioManagerIOS::HasAudioOutputDevices() { } bool AudioManagerIOS::HasAudioInputDevices() { - if (!InitAudioSession()) + if (!InitAudioSessionIOS()) return false; // Note that the |kAudioSessionProperty_AudioInputAvailable| property is a // 32-bit integer, not a boolean. @@ -114,11 +100,6 @@ void AudioManagerIOS::ReleaseInputStream(AudioInputStream* stream) { delete stream; } -bool AudioManagerIOS::InitAudioSession() { - static const bool kSessionInitialized = InitAudioSessionInternal(); - return kSessionInitialized; -} - // static AudioManager* CreateAudioManager() { return new AudioManagerIOS(); diff --git a/media/audio/ios/audio_session_util_ios.h b/media/audio/ios/audio_session_util_ios.h new file mode 100644 index 0000000..175db91 --- /dev/null +++ b/media/audio/ios/audio_session_util_ios.h @@ -0,0 +1,17 @@ +// Copyright 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_AUDIO_IOS_AUDIO_SESSION_UTIL_IOS_H_ +#define MEDIA_AUDIO_IOS_AUDIO_SESSION_UTIL_IOS_H_ + +namespace media { + +// Initializes and configures the audio session, returning a bool indicating +// whether initialization was successful. Can be called multiple times. +// Safe to call from any thread. +bool InitAudioSessionIOS(); + +} // namespace media + +#endif // MEDIA_AUDIO_IOS_AUDIO_SESSION_UTIL_IOS_H_ diff --git a/media/audio/ios/audio_session_util_ios.mm b/media/audio/ios/audio_session_util_ios.mm new file mode 100644 index 0000000..3d75546a --- /dev/null +++ b/media/audio/ios/audio_session_util_ios.mm @@ -0,0 +1,35 @@ +// Copyright 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/audio/ios/audio_session_util_ios.h" + +#include <AVFoundation/AVFoundation.h> + +#include "base/logging.h" + +namespace media { + +bool InitAudioSessionIOS() { + static bool kSessionInitialized = false; + static dispatch_once_t once = 0; + dispatch_once(&once, ^{ + OSStatus error = AudioSessionInitialize(NULL, NULL, NULL, NULL); + if (error != kAudioSessionNoError) + DLOG(ERROR) << "AudioSessionInitialize OSStatus error: " << error; + BOOL result = [[AVAudioSession sharedInstance] + setCategory:AVAudioSessionCategoryPlayAndRecord + error:nil]; + if (!result) + DLOG(ERROR) << "AVAudioSession setCategory failed"; + UInt32 allowMixing = true; + AudioSessionSetProperty( + kAudioSessionProperty_OverrideCategoryMixWithOthers, + sizeof(allowMixing), &allowMixing); + // Speech input cannot be used if either of these two conditions fail. + kSessionInitialized = (error == kAudioSessionNoError) && result; + }); + return kSessionInitialized; +} + +} // namespace media diff --git a/media/media.gyp b/media/media.gyp index 59d48ec..6d20998 100644 --- a/media/media.gyp +++ b/media/media.gyp @@ -95,6 +95,8 @@ 'audio/fake_audio_output_stream.h', 'audio/ios/audio_manager_ios.h', 'audio/ios/audio_manager_ios.mm', + 'audio/ios/audio_session_util_ios.h', + 'audio/ios/audio_session_util_ios.mm', 'audio/linux/alsa_input.cc', 'audio/linux/alsa_input.h', 'audio/linux/alsa_output.cc', @@ -425,20 +427,21 @@ '<@(shared_memory_support_sources)', ], 'sources/': [ + # Exclude everything but iOS-specific files. + ['exclude', '\\.(cc|mm)$'], + ['include', '_ios\\.(cc|mm)$'], + ['include', '(^|/)ios/'], + # Re-include specific pieces. # iOS support is limited to audio input only. - ['exclude', '.*'], ['include', '^audio/audio_buffers_state\\.'], ['include', '^audio/audio_input_controller\\.'], - ['include', '^audio/audio_io\\.h$'], ['include', '^audio/audio_manager\\.'], ['include', '^audio/audio_manager_base\\.'], ['include', '^audio/audio_parameters\\.'], ['include', '^audio/fake_audio_input_stream\\.'], ['include', '^audio/fake_audio_output_stream\\.'], - ['include', '^audio/ios/audio_manager_ios\\.'], ['include', '^base/audio_bus\\.'], ['include', '^base/channel_layout\\.'], - ['include', '^base/media\\.h$'], ['include', '^base/media_stub\\.cc$'], ], 'link_settings': { |