본문 바로가기

프로그래밍/iOS

[iOS] Audio 동시재생 등 (AVAudioSession 관련)

#출처 - http://blog.naver.com/hana_815/60118951525

이번에 App을 개발하면서 Ipod에서 음악을 재생시키고, 

App을 실행했을때, Ipod의 음악과 App에서 AvAudioPlayer에서 나오는 음악을 같이 재생하는게 필요했었습니다.

wav 파일이면 그냥 동시 재생되겠구나 했는데, 
안되더라구요.

그래서 알아보니, 간단하게 Category설정을 통해 할수 있었습니다.

저같은 경우는 applicationDidFinishLaunching 안에서 이렇게 Category를 설정하였습니다.


// AudioSession Category 설정하기

[[AVAudioSession sharedInstancesetCategoryAVAudioSessionCategoryAmbient errornil];


여기서 정하는 Category 에 따라서 설정이 됩니다. 


6개의 Category가 있구요.


각각의 기능은 그림을 참조하시구요.




디폴트는 AVAudioSessionCategorySoloAmbient 

입니다. 이것은 동시 재생이 안되는것입니다.




============================================

출처 - http://clbee.tistory.com/5


이 고민들을 쉽게 해결할 수 있는 방법미 AVAudioSession의 사용이다.
간단하게 2개의 명령사용으로 해결될 수도 있다.

NSError *setCategoryError = nil; 
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:&setCategoryError];
if (setCategoryError) NSLog(@"error AVAudioSession setCategory");

NSError *activationError = nil;
[[AVAudioSession sharedInstance] setActive:YES error:&activationError];
if (activationError) NSLog(@"error AVAudioSession setActive");


setCategory: 메소드 사용으로 iOS에서 제공하는 6가지 동작중 선택할 수 있다.
추가로 동작을 정의하려면 아래의 코드를 사용할 수도 있다.
UInt32 doSetProperty = 1;
AudioSessionSetProperty (
 kAudioSessionProperty_OverrideCategoryMixWithOthers,
 sizeof (doSetProperty),
 &doSetProperty
 );

setActive: 메소드는 catetory와 property를 모두 정의하고 나서 실행해야만 재대로 동작한다.

========================================
 # 출처 - http://blog.naver.com/PostView.nhn?blogId=ateon1&logNo=120169319704&redirect=Dlog&widgetTypeCall=true

* 백그라운드 음악 재생


NSBundle    *bundle = [ NSBundle mainBundle ];

    NSString    *path = [ bundle pathForResource@"aa" ofType@"mp3" ];

    NSURL       *url = [ NSURL fileURLWithPath: path ];

    NSError     *error;

//    //

    audioPlayer = [[AVAudioPlayer allocinitWithContentsOfURL:url error:&error ] ;

    [audioPlayer prepareToPlay];

    [audioPlayer play];

    AVAudioSession *session = [AVAudioSession sharedInstance];

    [session setCategory:AVAudioSessionCategorySoloAmbient error:nil];

    [session setActive:YES error:nil];




 [출처] [ 맥부기 ]Audio Session 프로그래밍|작성자 바우만


-(void)initAudioSession{

    AudioSessionInitialize(NULLkCFRunLoopDefaultModeNULLNULL); // 1

    AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,

                                    NULLNULL); // 2

    

    UInt32 otherAudioIsPlaying; // 3

    UInt32 propertySize = sizeof (otherAudioIsPlaying);

    

    AudioSessionGetProperty (kAudioSessionProperty_OtherAudioIsPlaying,

                             &propertySize,

                             &otherAudioIsPlaying

                             );

    

    if (otherAudioIsPlaying) {

        UInt32 sessionCategory = kAudioSessionCategory_AmbientSound// 4

        AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,

                                sizeof(sessionCategory), &sessionCategory);

    }

    else {

        UInt32 sessionCategory = kAudioSessionCategory_SoloAmbientSound;

        AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,

                                sizeof(sessionCategory), &sessionCategory);

    }

    AudioSessionSetActive(true);

}

    

//    디비깅이나 OSStatus 확인 없이  필요한 부분만 정말 간단하게 작성되어있습니다.

//    1.  실행중에 전화가 오거나 문자가 오면 전화벨 소리가 들립니다이때 앱의 오디오가 어떻게 작동하는지 설정합니다.

//    2. 이어폰으로 아이팟 음악을 듣다가 이어폰을 빼면 자동으로 아이팟의 음악이 정지됩니다이렇게 오디오의 하드웨어 변경에 따른 앱의 오디오 설정을 하는 부분입니다.

//    1,2 부분은 iOS default 설정을 굳이 변경하고 싶지 않으시다면 모두 NULL 채우셔도 됩니다.

//    

//    3번을 보기 앞서서

//    4.  부분이 앱의 오디오의 behavior 설정하는 부분입니다.

//    iOS에서는 다양한 behavior 따라서  개의 카테고리로 만들어 제공합니다.

//    제공되는 카테고리는 아래와 같습니다.

//   

//    

//    /////////////////////////////////////////////////////////////////////////////////////

//   

//    kAudioSessionCategory_SoloAmbientSound

//    - default 입니다앱이 실행되면 아이팟 오디오가 꺼지고 앱의 오디오만 작동됩니다.

//    

//    kAudioSessionCategory_AmbientSound

//    - 앱이 실행되면 아이팟 오디오는 계속 실행되면서 앱의 오디오도 같이 작동합니다.

//    

//    kAudioSessionCategory_MediaPlayback

//    - 앱이 실행되면 아이팟 오디오가 꺼지고 앱의 오디오만 작동합니다더불어 하드웨어의 Mute버튼을 작동시키거나 Lock 걸어도 앱의 오디오가 계속 작동합니다.

//    

//    kAudioSessionCategory_PlayAndRecord 

//    - 솔로 앰비언트와 같지만 녹음이 가능합니다.

//    

//    kAudioSessionCategory_AudioProcessing 

//    - 오디오 플레이는 안되고 오디오의 처리만 가능합니다

//    

//    

//    ////////////////////////////////////////////////////////////////////////

//    [출처] [ 맥부기 ]Audio Session 프로그래밍|작성자 바우만

//