2011-05-10 2 views
2

내 응용 프로그램에서 오디오 데이터를 LinearPCM 형식으로 수신하고 있는데, 재생해야합니다. iOS SpeakHere 예제를 따르고 있습니다. 그러나 나는 어떻게 그리고 어디서 버퍼를 AudioQueue에 제공해야하는지 알 수 없다.오디오를 재생하기 위해 AudioQueue에 오디오 버퍼를 제공하는 방법은 무엇입니까?

누구나 AudioQueue을 통해 iOS에서 오디오 버퍼를 재생하는 작업 예제를 제공 할 수 있습니까?

답변

1

SpeakHere 예제에서 재생은 AudioQueue을 사용하여 이루어집니다.

AudioQueue의 설정에서 큐가 더 많은 데이터를 원할 때 호출 될 함수가 지정됩니다. 당신은이 방법이 볼 수

: 당신이 AQPlayer::AQBufferCallback을 살펴 경우가 얻는 곳

XThrowIfError(AudioQueueNewOutput(&mDataFormat, AQPlayer::AQBufferCallback, this, 
            CFRunLoopGetCurrent(), kCFRunLoopCommonModes, 0, &mQueue), "AudioQueueNew failed"); 

, 당신은 볼 수 있습니다 : 여기

void AQPlayer::SetupNewQueue() 

콜백 함수를 지정하는 라인이다 에서 데이터. 이 예에서 데이터는 디스크의 파일에 기록됩니다. 메모리를 절약하고 싶거나 오디오 파일이 상당히 클 경우에는 좋은 해결책입니다.

어쨌든 AQPlayer::AQBufferCallback을 보면 AudioFileReadPackets 함수가 호출됩니다. 디스크의 파일에서 오디오 패킷을 읽습니다. 버퍼가 inCompleteAQBuffer->mAudioData입니다

OSStatus result = AudioFileReadPackets(THIS->GetAudioFileID(), false, &numBytes, inCompleteAQBuffer->mPacketDescriptions, THIS->GetCurrentPacket(), &nPackets, 
             inCompleteAQBuffer->mAudioData); 

난 것이 바로 AudioQueue가 사용할 버퍼로 읽습니다. 다음

마지막 콜백 함수는 버퍼 대기열해야

if (nPackets > 0) { 
    inCompleteAQBuffer->mAudioDataByteSize = numBytes;  
    inCompleteAQBuffer->mPacketDescriptionCount = nPackets;  
    AudioQueueEnqueueBuffer(inAQ, inCompleteAQBuffer, 0, NULL); 
    THIS->mCurrentPacket = (THIS->GetCurrentPacket() + nPackets); 
} 

참고 먼저 우리 재생할 일부 패킷이 있는지 확인하는 것이다. 또한 버퍼에있는 바이트 수를 지정해야합니다.

그런 다음, 여기이 선 : 우리는 우리의 오디오 버퍼에 전체를 현 위치를 추적

THIS->mCurrentPacket = (THIS->GetCurrentPacket() + nPackets); 

. 즉, 더 많은 데이터가 파일에서 복사 될 때 mCurrentPacket을 다음 사본이 올바른 위치에 놓 이도록 배치해야합니다.

관련 문제