Я пишу клиент удаленного рабочего стола для 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--;
}
Спасибо!
Ответ на этот вопрос может оказаться полезным: AudioQueue съел мой буфер (первые 15 миллисекунд)
Как правило, при использовании кольцевых аудиобуфер следует предотвращать опустошение буферов. Если вам не хватает необходимых данных (например, из-за перегрузки сети), попробуйте дополнить аудиоданные тишиной или приостановить воспроизведение звука.
Может случиться так, что после того, как ваша цепочка буферов опустеет, вам нужно будет перезапустить воспроизведение. На самом деле я никогда не опустошал буфер AudioQueue, но из программирования Win32 помню, что это было именно так, поэтому, пожалуйста, не стесняйтесь поправлять меня, если я ошибаюсь.