我正在为 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--;
}
谢谢!