iPhone 용 원격 데스크톱 클라이언트를 작성 중이므로 오디오 리디렉션을 구현하려고합니다.
클라이언트가 소켓 연결을 통해 서버에 연결되어 있고 서버가 한 번에 32K 개의 PCM 데이터 청크를 보냅니다.오디오 대기열 서비스를 사용하여 소켓 연결을 통해 PCM 데이터 재생
AQS를 사용하여 데이터를 재생하려고하는데 처음 2 초 (1 버퍼 값)를 재생합니다. 그러나 다음 덩어리의 데이터가 아직 소켓을 통해 들어오지 않았으므로 다음 AudioQueueBuffer는 비어 있습니다. 데이터가 들어 오면 데이터로 다음 사용 가능한 버퍼를 채우고 AudioQueueEnqueueBuffer로 큐에 넣습니다. 그러나 이러한 버퍼는 재생되지 않습니다.
나중에 버퍼를 추가하더라도 큐에 버퍼가 없으면 큐 재생이 멈 춥니 다?
여기에 코드의 관련 부분입니다 :
void
wave_out_write(STREAM s, uint16 tick, uint8 index)
{
if(items_in_queue == NUM_BUFFERS){
return;
}
if(!playState.busy){
OSStatus status;
status = AudioQueueNewOutput(&playState.dataFormat, AudioOutputCallback, &playState, CFRunLoopGetCurrent(), NULL, 0, &playState.queue);
if(status == 0){
for(int i=0; i<NUM_BUFFERS; i++){
AudioQueueAllocateBuffer(playState.queue, 40000, &playState.buffers[i]);
}
AudioQueueAddPropertyListener(playState.queue, kAudioQueueProperty_IsRunning, MyAudioQueuePropertyListenerProc, &playState);
status = AudioQueueStart(playState.queue, NULL);
if(status ==0){
playState.busy = True;
}
else{
return;
}
}
else{
return;
}
}
playState.buffers[queue_hi]->mAudioDataByteSize = s->size;
memcpy(playState.buffers[queue_hi]->mAudioData, s->data, s->size);
AudioQueueEnqueueBuffer(playState.queue, playState.buffers[queue_hi], 0, 0);
queue_hi++;
queue_hi = queue_hi % NUM_BUFFERS;
items_in_queue++;
}
void AudioOutputCallback(void* inUserData, AudioQueueRef outAQ, AudioQueueBufferRef outBuffer)
{
PlayState *playState = (PlayState *)inUserData;
items_in_queue--;
}
감사합니다!
아무 소리도 들리지 않아도됩니다. 콜백이 호출 될 때 큐에 다시 넣을 데이터가 없다면 데이터를 저장하지 마십시오. 큐에 데이터가 부족한 경우 데이터를 다시 대기열에 넣기 전까지는 자체적으로 무음이 재생됩니다. 모든 버퍼가 대기열에서 벗어난 경우 콜백이 다시 호출되지 않지만 콜백이 아닌 다른 함수 (예 : 데이터가 다시 도착하자마자)에서 대기열에 데이터를 계속 대기열에 넣을 수 있습니다. 이것은 포스터의 문제가 아닙니다. 그의 문제는 큐에 하나의 버퍼 만 가지고 있다는 것입니다. 적어도 2가 필요합니다. – Mecki
감사합니다. Mecki, 비슷한 문제가 있습니다. 솔루션이 아직 작성되지 않았지만, 적어도 올바른 방향으로이 점을 지적하십시오 ... – Nick