are set back to 1. They don't work; the speed shift buffer won't line up
perfectly for all channels, and the resampler would need to be lined up
with the window and lerped. Make these only read directly if the buffers
are empty, so these filters are cheap if their ratios are never used. Fixes
clicks when moving the ratio around 1.0.
"the position seeked to". This fixes a special case: SetPosition(n)
returning 0 was EOF except when SetPosition(0). The returned value
on success was always n, anyway; we never seek to a different position
and return success.
different rate than the source it's reading from; one second
of returned data may correspond to two seconds in the source
material.
GetStreamToSourceRatio returns the ratio of returned data in
the next Read() call to source data. This is propagated
upwards in the filter tree, so rate changes by a speed changer
in the middle of the tree will be reflected in the final
GetStreamToSourceRatio().
This means that whenever the ratio changes, Read() stops
returning data; it returns whatever it has, so the caller
has an opportunity to call GetStreamToSourceRatio again
and notice the change.
These semantics can be annoying to implement in some
cases, where only the processing of Read() may notice
a ratio change. Read() may want to return 0, to say
"something changed, call GetStreamToSourceRatio again",
but 0 means EOF.
Add RageSoundReader::END_OF_FILE. 0 is now no
longer a special case; it means "there's more data, I
just didn't return any this time". This is functionally
equivalent to errno EINTR.
This eliminates the (optional) libresample dependency, which will clean up
building and eliminate the goofy 5k DLL. It's also faster.
This doesn't implement "HighQuality". That would involve changing L from
8 to 16. I might implement that in the future, but it sounds decent to me. (It's
a little tricky, since PolyphaseFilter::RunPolyphaseFilter needs L to be
a constant for speed.)