audio/internal/readerdriver: Bug fix: AudioQueuePause/Reset might take long time

This issue has existed since ae14caee93.
This change fixes the issue by skipping the C function calls when
possible.

Updates #1650
This commit is contained in:
Hajime Hoshi 2021-05-28 02:45:31 +09:00
parent a4d28198f4
commit 72d8d77173

View File

@ -449,18 +449,20 @@ func (p *playerImpl) resetImpl() {
return return
} }
if osstatus := C.AudioQueuePause(p.audioQueue); osstatus != C.noErr && p.err == nil { if len(p.unqueuedBufs) < 2 {
p.setErrorImpl(fmt.Errorf("readerdriver: AudioQueuePause failed: %d", osstatus)) if osstatus := C.AudioQueuePause(p.audioQueue); osstatus != C.noErr && p.err == nil {
return p.setErrorImpl(fmt.Errorf("readerdriver: AudioQueuePause failed: %d", osstatus))
} return
// AudioQueueReset invokes the callback directry. }
q := p.audioQueue // AudioQueueReset invokes the callback directry.
p.cond.L.Unlock() q := p.audioQueue
osstatus := C.AudioQueueReset(q) p.cond.L.Unlock()
p.cond.L.Lock() osstatus := C.AudioQueueReset(q)
if osstatus != C.noErr && p.err == nil { p.cond.L.Lock()
p.setErrorImpl(fmt.Errorf("readerdriver: AudioQueueReset failed: %d", osstatus)) if osstatus != C.noErr && p.err == nil {
return p.setErrorImpl(fmt.Errorf("readerdriver: AudioQueueReset failed: %d", osstatus))
return
}
} }
p.state = playerPaused p.state = playerPaused