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)
谢谢!
| 归档时间: |
|
| 查看次数: |
9179 次 |
| 最近记录: |