2011-10-05 5 views
3

AudioUnitExtAudioFile을 사용하는 맞춤형 오디오 플레이어 클래스를 만들었습니다. 내 수업에서 내가iOS에서 전달한 inNumberFrames를 AURenderCallback 함수에서 제한 할 수 있습니까?

OSStatus MyAURenderCallack (
    void      *inRefCon, 
    AudioUnitRenderActionFlags *ioActionFlags, 
    const AudioTimeStamp  *inTimeStamp, 
    UInt32      inBusNumber, 
    UInt32      inNumberFrames, 
    AudioBufferList    *ioData 
); 

내 응용 프로그램이 전경처럼 같은 내 자신의 렌더링 콜백 함수를 준비, OS에 의해 전달 된 매개 변수 inNumberFrames 항상 512 또는 1024이며, 내 플레이어는 잘 작동합니다.
그러나 iOS 장비가 잠자기에 들어갔을 때 inNumberFrames4096이되고 너무 많은 프레임을 한 번 준비 할 수 없기 때문에 플레이어가 작동하지 않습니다.

가속화하기가 힘든 extAudioFileRead 기능을 많이 사용하기 때문에 프레임 준비 프로세스를 개선하기가 어렵습니다.

따라서 inNumberFrames1024보다 커지지 않도록 제한하고 싶습니다.
만들 수 있습니까?

+0

렌더링 콜백에서'ExtAudioFileRead'를 호출하면 안됩니다. 불특정 다수의 시간 동안 방해를하여 글리치를 유발할 수 있습니다. – sbooth

+0

그래서 ExtAudioFileRead를 호출하고 다른 스레드에서 버퍼를 준비해야합니까? – Mekajiki

+0

예, 일반적인 방법은 생성자 스레드가 링 버퍼를 채우는 것입니다. 렌더링 콜백은 링 버퍼에서 읽고 더 많은 데이터가 필요하다는 제작자 스레드에 신호를 보냅니다. – sbooth

답변

3

@sbooth가 지적했듯이, 당신은 실제로 다른 스레드에서 디스크에 쓰고 있어야합니다. 그렇지 않은 경우, 이는 응용 프로그램의 주 스레드에 심각한 스트레스를 주는데, 이는 드롭 아웃없이 오디오를 전달하는 데 주력해야합니다.

질문에 직접 대답하는 경우 : 아니오, OS에 블록 크기에 사용할 정확한 프레임 수를 직접 말할 수 없습니다. 요청 된 샘플 속도와 결합 된 특정 레이턴시를 사용하도록 조언하여 야구장 블록 크기를 제공합니다. 그러나 iOS가이 블록 크기를 돌려 줄 것이라는 보장은 없습니다.

그러나 여기서 가장 좋은 방법은 임의의 블록 크기로 알고리즘을 작동시키는 것입니다. 컨볼 루션 (convolution)과 같은 작업을 수행하지 않는 한 일반적으로 이 더 쉽습니다. 큰 블록 크기가 있어야합니다. 따라서 4096에서 문제가 발생하면 코드를 프로파일 링하고 근본적인 문제가 무엇인지 확인해야합니다.