Programming/iOS SDK

[iOS SDK] 이어폰(헤드셋) 연결상태 확인 예제

smok95 2011. 6. 29. 00:28
반응형


/* AudioToolbox 헤더파일 임포트 ( AudioToolbox.framework 추가해야함.) */

#import <AudioToolbox/AudioToolbox.h>



/***

 *  리스너 함수 (callback함수)

 *

 *  inClientData : 사용자데이터 ( AudioSessionAddPropertyListener에서 4번째 인자값)

 *  inID : AudioSessionAddPropertyListener에서 1번째 인자값으로 현재는 한개의 ID 사용하기 때문에 사용하지 않음

 *  inDataSize : inData 크기

 *  inData : void*형으로 inID 맞는 데이터형으로 캐스팅 필요

 */

void Listener(void *inClientData, AudioSessionPropertyID inID,

                        UInt32 inDataSize, const void *inData)

{

    CFDictionaryRef routeChangeDict = inData;

    UILabel* p = (UILabel*)inClientData;

    

    // kAudioSession_AudioRouteChangeKey_Reason이름에 해당하는 값을 가져온다.

    CFNumberRef routeChangeReasonRef = CFDictionaryGetValue(routeChangeDict, CFSTR(kAudioSession_AudioRouteChangeKey_Reason));

    

    SInt32 routeChangeReason;

    

    CFNumberGetValue(routeChangeReasonRef, kCFNumberSInt32Type, &routeChangeReason);

    

    switch(routeChangeReason)

    {

        case kAudioSessionRouteChangeReason_OldDeviceUnavailable:

        {

            // 헤드셋 분리

            p.text = @"disconnected";

        }break;

        case kAudioSessionRouteChangeReason_NewDeviceAvailable:

        {

            // 헤드셋 연결

            p.text = @"connected";

        }

    }

}


@implementation HeadsetConnectionStateAppDelegate



@synthesize window=_window;


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

    // Override point for customization after application launch.

    [self.window makeKeyAndVisible];

    

    

    // 연결상태를 화면에 표시할 레이블 생성

    UILabel* statusLabel = [[UILabel alloc]initWithFrame:self.window.frame];

    [self.window addSubview:statusLabel];

    statusLabel.text = @"unknown";

    

    

    /**

     *  1. 오디오 세션 객체 초기화

     *  오디오 세션을 사용하기 위해서 프로그램 내에서 최초 1 AudioSessionInitialize 호출해 주어야 .

     */

    OSStatus result = AudioSessionInitialize(NULL,NULL,NULL,NULL);

    

    if(result) NSLog(@"AudioSessionInitialize error : %d", (int)result);

    else

    {

        /**

         *  2. 리스너 설정

         *  1번째 인자 : kAudioSessionProperty_AudioRouteChange 값을 설정

         *  2번째 인자 : 이벤트가 발생시 변경사항을 수신받을 리스너(callback)함수 

         *  3번째 인자 : 리스너함수 호출시 전달할 사용자데이터로 현재 예제의 경우에는 statusLabel 설정함.

         */

        result = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, Listener, statusLabel);

        if (result) 

        {

            NSLog(@"AudioSessionAddPropertyListener error : %d", (int)result);

        }

    }

    

    [statusLabel release];

    return YES;

}



- (void)dealloc

{

    [_window release];

    [super dealloc];

}


@end


HeadsetConnectionState.zip

반응형