summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authormilanb@chromium.org <milanb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-19 00:40:46 +0000
committermilanb@chromium.org <milanb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-19 00:40:46 +0000
commit7bce13109d690333a522914e74d11a367bcbb7d4 (patch)
treef8446d0c8f33fe11a57c4c32781a8d4ddd77bb6f /media
parent437ee80fef0603c49997fe62fc694c338e663ca6 (diff)
downloadchromium_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.h5
-rw-r--r--media/audio/ios/audio_manager_ios.mm23
-rw-r--r--media/audio/ios/audio_session_util_ios.h17
-rw-r--r--media/audio/ios/audio_session_util_ios.mm35
-rw-r--r--media/media.gyp11
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': {