Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
My method of testing was to play a song and repeatedly pause and unpause with a considerably long fade-in/out and listen for pops. My program stops the device from a different thread after the first
dataCallback
where it returned entirely silence.When draining the device,
waitTime
was being calculated in seconds, which could easily round to 0.WaitForSingleObject
doesn't wait if given a 0ms timeout, causing the unchanged available frames check to always be hit and not drain the device at all. Also, moveResetEvent
aboveWaitForSingleObject
in the loop so it doesn't immediately wake up, which I occasionally observed.Sometimes stopping the device gave a message
[WASAPI] Failed to reset internal playback device.
. That seems to be caused by not releasing an outstanding buffer before stopping the device. My understanding is that the remainder of that buffer would also have to be zeroed because the user has no way to handle that. The capture device case is untested but I assume it works the same.Draining in WASAPI exclusive mode also appears possibly broken, with or without the changes here. It seems to work very different from shared mode. If it's down to timing/latency, i.e. if your device is too slow it will always cutout, I don't think I can properly test that. I noticed pops on both device stop and start so it may even be a deeper issue.