これが本当にバグかどうか誰かが確認できますか? (もしそうなら、私は出かけてAppleに提出します)。
kAudioSessionProperty_AudioRoute を取得しようとすると、4.3 (執筆時点での最新バージョン) より前のバージョンのシミュレーターでエラー コード kAudioSessionUnsupportedPropertyError が返されます。
これは簡単に再現できます。
新しいプロジェクトを開始します (私は Xcode 4.0.2 Build 4A2002a を使用しています。これは標準ビルドです)、ウィンドウベースのプロジェクト「AudioSessionBug」
AudioToolbox フレームワークを含める
アプリケーション デリゲートの .m ファイルを次のように置き換えます。
//
// AudioSessionBugAppDelegate.m
// AudioSessionBug
//
// Created by Pi on 02/07/2011.
// Copyright 2011 Pi. All rights reserved.
//
#import "AudioSessionBugAppDelegate.h"
#import <AudioToolbox/AudioToolbox.h>
#define SET_PROPERTY( prop, type, val ) \
{ \
OSStatus ret = AudioSessionSetProperty( prop, sizeof( type ), &(type){ val } ); \
if ( ret != kAudioSessionNoError ) \
{ \
NSLog( @"AudioSessionSETProperty failed for: %s!", #prop ); \
return; \
} \
}
enum {
kNo = 0,
kYes = 1
};
// - - -
@interface AudioSessionBugAppDelegate ( )
- (void) setupSession;
@end
// - - -
@implementation AudioSessionBugAppDelegate
@synthesize window=_window;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
[self.window makeKeyAndVisible];
[self setupSession];
return YES;
}
- (void) setupSession
{
OSStatus result = AudioSessionInitialize( NULL, NULL, NULL, NULL );
assert( result == kAudioSessionNoError );
SET_PROPERTY( kAudioSessionProperty_AudioCategory, UInt32, kAudioSessionCategory_PlayAndRecord );
// make sure headphones are plugged in!
{
// http://stackoverflow.com/questions/2753562/what-kind-of-routes-could-i-get-back-from-kaudiosessionproperty-audioroute-proper
CFStringRef state = nil;
UInt32 propertySize = sizeof(CFStringRef);
OSStatus status = AudioSessionGetProperty( kAudioSessionProperty_AudioRoute, &propertySize, &state );
if ( status == kAudioSessionUnsupportedPropertyError )
{
NSLog( @" WTF? GETTING kAudioSessionProperty_AudioRoute GIVES kAudioSessionUnsupportedPropertyError ?!?!? " );
}
NSLog( @" OK - done! " );
exit( 1 );
}
}
- (void)dealloc
{
[_window release];
[super dealloc];
}
@end
動作することを確認してください。
展開ターゲットを 4.3 より前のものに変更します。4.2と言います。
iPad シミュレーター 4.3 で再度実行 -- OK
iPad シミュレーター 4.2 で再度実行 -- 失敗