Я пишу клиент удаленного рабочего стола для 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--;
}
Спасибо!