使用音频队列服务通过套接字连接播放PCM数据

Roh*_*han 11 iphone audioqueueservices

我正在为iPhone编写远程桌面客户端,我正在尝试实现音频重定向.
客户端通过套接字连接连接到服务器,服务器一次发送32K块PCM数据.

我正在尝试使用AQS播放数据,它播放前两秒(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--;
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

ite*_*ter 0

您可能会发现这个问题的答案很有用:AudioQueue ate my buffer (first 15 ms of it)