On Jan 27, 2012, at 3:46 PM, Andrew Eikum wrote:

> +    if(list_count(&This->queued_bufinfos) == 0){
> +        sc = AudioQueueGetCurrentTime(This->aqueue, NULL, &req_time, NULL);

This isn't quite the same as the next start time.  Even if there are no 
remaining queued buffers, the queue may still be playing some audio from the 
last of them.  In that case, the queue's current time would not be the actual 
desired start time of this buffer.  Have you verified that the queue schedules 
it after whatever audio may be playing?

Also, what about the fact that AudioQueueGetCurrentTime() seems to return an 
unreliable time when the queue is paused?


> +    if(req_time.mFlags & kAudioTimeStampSampleTimeValid){
> +        sc = AudioQueueEnqueueBufferWithParameters(This->aqueue,
> +                This->public_buffer, 0, NULL, 0, 0, 0, NULL, &req_time, 
> &start_time);
> +        if(sc != noErr){
> +            OSSpinLockUnlock(&This->lock);
> +            WARN("Unable to enqueue buffer: %lx\n", sc);
> +            return E_FAIL;
> +        }
> +    }else{
> +        sc = AudioQueueEnqueueBufferWithParameters(This->aqueue,
> +                This->public_buffer, 0, NULL, 0, 0, 0, NULL, NULL, 
> &start_time);
> +        if(sc != noErr){
> +            OSSpinLockUnlock(&This->lock);
> +            WARN("Unable to enqueue buffer: %lx\n", sc);
> +            return E_FAIL;
> +        }

I would avoid duplicating those two branches just to change between &req_time 
or NULL.  Either use a pointer variable to hold the argument you're going to 
pass, computed in an "if", or use the conditional ?: operator inline.

-Ken



Reply via email to