fix: correct Source trait semantics and span tracking bugs#831
fix: correct Source trait semantics and span tracking bugs#831
Conversation
|
I did not fix the decoders because I had already done so with the infamous #786. |
16c90ba to
7538971
Compare
|
Verifying span boundary behavior in the other sources, latest commits I also added:
w.r.t. the first, I wonder how many people use that, given it only ever worked correctly on mono sources. |
|
I want to take a final look at a couple of other sources, that may need to deal with mid-stream endings as well. In the meantime, feel free to review what we've got already, as I might apply the same patterns that we've already got. |
|
This thing is getting big but I think I've got it down now. Took me a good week's worth of evenings! I've left the intermediate commits intact so you can see my journey. I've been going back-and-forth to defend against the fact that when source iterators end mid-frame, multi-channel audio and queuing blows up. First I added defensive measures to "filter" sources that depend on proper frame alignment. Then, I removed it from the filters in favor of placing it with the "producer" sources: the decoders, mostly, and documenting the frame-alignment requirement. I think it's better this way. |
|
Indeed! And the sad part is that I expect that 90% of use cases will never use it. Two things I can think of:
Point 2 is easily done and I had already put in... well you know. Thanks for your review. |
|
Those perf. changes are indeed not insignificant, bummer. I would like to merge this sooner rather then later though (as it's not really isolated). How about we cut a release this week and then merge this after? That gives us until the next release to provide more performance either through 1 or 2. I feel confident we can land the experimental source architecture within half a year, so before the next release. I'm using it right now in a side project and I'm really happy with how that code looks. example: |
OK for me. |
|
|
||
| let sample_rate = input.sample_rate(); | ||
| let applier = formula.to_applier(sample_rate.get()); | ||
|
|
There was a problem hiding this comment.
TODO(yara): Copy the new multichannel logic to the fixed sources.
src/source/mod.rs
Outdated
|
|
||
| source_pointer_impl!(<'a, Src> Source for &'a mut Src where Src: Source,); | ||
|
|
||
| /// Detects if we're at a span boundary using dual-mode tracking. |
There was a problem hiding this comment.
this line does not add much for me (I dont know what dual-mode tracking means until I've read the function body)
There was a problem hiding this comment.
Yes we should clarify the modes or actually states.
yara-blue
left a comment
There was a problem hiding this comment.
yay done reviewing :)
Should be a simple rebase to get main up to date again. I think there are some refactor opportunities and I left some questions here and there.
Let me know when it's ready for a second pass
|
Sorry I as processing from top to bottom until I saw your last comment. So you do want me to make the changes here, not as-you-go? Just confirming. |
Yes confirmed, we will merge this to main after you make the changes here on this PR. Let me know when everything is ready then I'll give it a second pass and merge. Nothing else will be merged to main until that is done to make sure we get no further conflicts. So take your time do not feel rushed! |
Clarify Source::current_span_len() returns total span length (not remaining), while size_hint() returns remaining samples. Fix multiple bugs in span boundary detection, seeking, and iterator implementations. Opportunistic fixes: - fix division by zero, off-by-one error, and zero case handling - prevent counter overflows - optimize vector allocations Mid-span seeking: best-effort tracking after try_seek() to detect span boundaries when seeking lands mid-span. Fixes #691
Parameter updates (channels/sample_rate) occur only at span boundaries or during post-seek detection. Reset counters and enter a detection mode on try_seek (Duration::ZERO is treated as start-of-span).
Use detect_span_boundary and reset_seek_span_tracking to detect span boundaries and parameter changes.
Document that Sources must emit complete frames and pad with silence when ending mid-frame, and ensure that decoders do so.
0fbddd8 to
3ce9c63
Compare
3915168 to
ce29ecf
Compare
|
@yara-blue rebased and addressed your review comments. |
|
I wonder if we should replace this |
We could, though I would propose we resolve by removing it entirely and making the effects strictly mono. Then offer two ways to create multi channel effects:
I think this is neat since it makes the overall effects API simpler and moves the channel count decision into the audio pipeline. |
|
Anyway, this PR looks great. The I know it has taken quiet some effort to get this all sorted. I thought about doing all this myself at some point and gave up. Thank you for persevering through! |
That’s a good idea. Then we don’t even need |
|
You scare me. 😉 |


Clarify Source::current_span_len() returns total span length (not remaining), while size_hint() returns remaining samples of the entire iterator. Fix multiple bugs in span boundary detection, seeking, and iterator implementations.
Opportunistic fixes:
Mid-span seeking: best-effort tracking after try_seek() to detect span boundaries when seeking lands mid-span.
Fixes #691