2011-01-13 3 views
4

OpenAL을 사용하여 많은 소리를 재생하는 iPhone 응용 프로그램을 만들었습니다. 이 사운드는 mp3에 저장되어 있으며, 메모리 사용량이 적어 (1 백만 개 이상) 매우 강하며 (사운드 당 버퍼 2 개) 스트리밍합니다. 내 SoundManager.m 파일에서openAL 스트리밍 및 중단

//used to disable openAL during a call 
    void openALInterruptionListener (void *inClientData, UInt32 inInterruptionState) 
    { 
     if (inInterruptionState == kAudioSessionBeginInterruption) 
     { 
      alcMakeContextCurrent (NULL); 
     } 
    } 

    //used to restore openAL after a call 
    void restoreOpenAL(void* a_context) 
    { 
     alcMakeContextCurrent(a_context); 
    } 

:

OpenALSupport.c 파일에서 : 은이 코드를 사용 중단을 관리하려면

:

- (void) restoreOpenAL 
    { 
     restoreOpenAL(mContext); 
    } 

    //OPENAL initialization 
    - (bool) initOpenAL 
    { 
     // Initialization 
     mDevice = alcOpenDevice(NULL); 
     if (mDevice) { 
    ... 

      // use the device to make a context 
      mContext=alcCreateContext(mDevice,NULL); 
      // set my context to the currently active one 
      alcMakeContextCurrent(mContext); 

      AudioSessionInitialize (NULL, NULL, openALInterruptionListener, mContext); 

      NSError *activationError = nil; 
      [[AVAudioSession sharedInstance] setActive: YES error: &activationError]; 

      NSError *setCategoryError = nil; 

      [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: &setCategoryError]; 

      ... 
    } 

그리고 마지막으로 내 AppDelegate에의

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    [[CSoundManager getInstance] restoreOpenAL]; 
    ... 
} 

이 방법을 사용하면 전화를 건 후에 소리가 들리지만 소리가 들리는 것은 pl 무작위로 ayed. 스트리밍 사운드의 중단을 관리하는 특별한 방법이 있습니까? 그것에 관한 기사는 찾을 수 없습니다.

도움 주셔서 감사합니다.

답변

1

좋아, 내 자신의 질문에 대답.

나는 나의 스트리밍 방식에 오류를 관리함으로써 문제를 해결 :

- (void) updateStream 
{ 
ALint processed;  
alGetSourcei(sourceID, AL_BUFFERS_PROCESSED, &processed); 

while(processed--) 
{ 
    oldPosition = position; 

    NSUInteger buffer; 

    alSourceUnqueueBuffers(sourceID, 1, &buffer); 

    //////////////////// 
    //code freshly added 
    ALint err = alGetError(); 
    if (err != 0) 
    { 
     NSLog(@"Error Calling alSourceUnQueueBuffers: %d",err); 
     processed++; 
     //restore old position for the next buffer 
     position = oldPosition; 
     usleep(10000); 
     continue; 
    } 
    ////////////////////  

    [self stream:buffer]; 

    alSourceQueueBuffers(sourceID, 1, &buffer); 

    //////////////////// 
    //code freshly added 
    err = alGetError(); 
    if (err != 0) 
    { 
     NSLog(@"Error Calling alSourceQueueBuffers: %d",err); 
     processed++; 
     usleep(10000); 
     //restore old position for the next buffer 
     position = oldPosition; 
    } 
    /////////////////// 
} 

}

+0

일반적인 생각은 많은 도움이 될 것입니다, 감사합니다. 그러나 position/oldPosition 지정이 사례 중 하나에서 바뀌지 않았습니까? –

+0

지금은 오래된 코드이고 더 이상 사용하지 않습니다. 그러나 나는 어떤 임무도 교환하지 않는다. 네가 원하면 수업 전체를 보낼 수있어. – Klem

+0

아아, 나는 처음에 oldPosition = 위치 지정을 알지 못했습니다. 모두 지금 취소. 감사! –