Use SourceDataLine instead of Clip for playback #77
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.
Clip does not have any methods for specifying the place where the playback should end - it always plays the sound till the end of the file.
Previous approach that used Thread.sleep combined with getMicrosecondPosition method is less than ideal, the method itself is inaccurate as the position is updated only once every 10 ms or so. Moreover it takes about 20 ms more from the clip.stop() method call to the time the playback actually stops, increasing the error. All in all, the starting point is deterministic, but the ending point is not - it is always 20+ ms late.
New approach uses more low-level solution by passing only the bytes from relevant frames to SourceDataLine for playback. Both the starting and the ending points are now fully deterministic and as accurate as they can be (down to one frame).
The audio file data is still loaded only once and kept in-mem.