It would be a bit annoying to provide parameters for spatial sounds every time you spawn them!
Yes, and it's also annoying to specify the effects when they're unchanged too. 🙂
For example, every time you play a sound in a pool with an effect that it doesn't have, well.... we could add it. In combination with automatic bypassing, this would allow people to freely add effects that, in practice, would only rarely cause recompilation.
Yes, please!
I think this particular example would go the wrong direction in terms of usability. It would be / is surprising to have to redundantly mention the effects that were already set up in the pool. That would mean, every time I made a slight change to a pool, I'd have to edit every call site where I spawn a sample and copy the effects in. Yuck!
Like other commenters have said, the SamplerPool API seems like it's providing a slightly different metaphor than it seems to be, and maybe that's where the repeated confusion comes from. The obvious benefit of a pool is limiting the maximum number of simultaneously-playing sounds. That makes sense and works as expected.
But I think when new users (myself included, when I was one) see the example code spawning a SamplerPool and effects, we assume that those effects would be provided by the pool automatically when I associate a new SamplePlayer with that pool.
I.e. in this imagined workflow, in any place in my code I should be able to spawn (MyPool, SamplePlayer), and have those reverb/volume/etc. effects from MyPool applied wholesale to that new SamplePlayer . I only need to set up those details once.
Think of specifying the effects in a pool as being similar to required components. Required components do not limit freedom: I would expect that if I spawned (MyPool, SamplePlayer) but wanted a different VolumeNode or SpatialBasicNode, I would just add them along with the SamplePlayer and it would override the "defaults" from the pool.
Similarly, I should be able to add additional effects that might be specific to a certain use case, without needing to jump through hoops (i.e. making a new pool, adding the effects to the original pool and fixing up all the other call sites, etc). As you've mentioned, this is like the DynamicBus metaphor, but that has less flexibility with limiting the total number of sounds.
The quoted example is saying "if you don't mention an effect component, it's bypassed." But I assert the opposite feels much more "right": if I don't want an effect, I should be able to explicitly add some other component/effect that does this (i.e. using whatever future bypass/disablement state you guys decide on). I don't want to touch every call site whenever I change the pool. (I.e. at some point I want a Doppler shift node which automatically applies to any samplers assigned to my "Sfx" pool.)
Like others here have said, architecting the Bevy-side API around the optimization-friendly requirements -- i.e. requiring an alignment of effects between the SamplerPool and any SamplePlayer -- is not intuitive and might even be necessary for peak performance in most use cases. There is (IMO) ample processing power to rebuild some node graphs a few times a second as needed.
I would expect optimizations to be addressed behind the scenes (say, treating the SamplerPool/effects components as metadata that Seedling uses to maintain a set of common effect chains corresponding to the actual runtime behavior of the code). If and when users get to the scale where they need to care, they can opt in to a more complex but optimized spawning pattern.
I hope I expressed my opinions clearly and am representing other users accurately here!