Using Audio Queue Services для проигрывания данных PCM по сокетному соединению

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

Спасибо!

11
задан Rohan 7 April 2010 в 20:58
поделиться

2 ответа

Ответ на этот вопрос может оказаться полезным: AudioQueue съел мой буфер (первые 15 миллисекунд)

0
ответ дан 3 December 2019 в 12:28
поделиться

Как правило, при использовании кольцевых аудиобуфер следует предотвращать опустошение буферов. Если вам не хватает необходимых данных (например, из-за перегрузки сети), попробуйте дополнить аудиоданные тишиной или приостановить воспроизведение звука.

Может случиться так, что после того, как ваша цепочка буферов опустеет, вам нужно будет перезапустить воспроизведение. На самом деле я никогда не опустошал буфер AudioQueue, но из программирования Win32 помню, что это было именно так, поэтому, пожалуйста, не стесняйтесь поправлять меня, если я ошибаюсь.

0
ответ дан 3 December 2019 в 12:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: