Estoy escribiendo un cliente de escritorio remoto para el iPhone y estoy tratando de implementar la redirección de audio.
El cliente está conectado al servidor a través de una conexión de socket, y el servidor envía 32K fragmentos de datos PCM a la vez.Uso de Audio Queue Services para reproducir datos PCM a través de una conexión de socket
Estoy tratando de usar AQS para reproducir los datos y reproduce los primeros dos segundos (vale 1 buffer). Sin embargo, dado que la siguiente porción de datos aún no ha llegado a través del socket, el siguiente AudioQueueBuffer está vacío. Cuando entran los datos, llenó el siguiente buffer disponible con los datos y los encola con AudioQueueEnqueueBuffer. Sin embargo, nunca juega estos búferes.
¿La cola deja de reproducirse si no hay búferes en la cola, incluso si luego agrega un búfer?
Aquí está la parte correspondiente del código:
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--;
}
Gracias!
No tiene que rellenar nada con silencio. Si no tiene ningún dato que volver a poner en la cola cuando se llama a su devolución de llamada, simplemente no coloque ningún dato allí. Si su cola se queda sin datos, guardará silencio por sí solo hasta que vuelva a poner los datos en cola. Si todos los buffers están fuera de la cola, su devolución de llamada no se volverá a llamar, pero aún puede poner datos en la cola desde otra función que no sea la devolución de llamada (por ejemplo, tan pronto como los datos vuelvan). Este no es el problema del cartel. Su problema es que solo tiene un buffer en la cola para empezar. Necesita al menos 2. – Mecki
Gracias Mecki, tengo un problema similar, y aunque la solución aún no se ha escrito, al menos esto apunta en la dirección correcta ... – Nick