Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for streaming DSP graphs #1

Open
2 of 3 tasks
harudagondi opened this issue Jul 29, 2022 · 6 comments
Open
2 of 3 tasks

Add support for streaming DSP graphs #1

harudagondi opened this issue Jul 29, 2022 · 6 comments
Labels
bug Something isn't working

Comments

@harudagondi
Copy link
Owner

harudagondi commented Jul 29, 2022

Currently, DSP graphs are stored in DspSources, where it has a definite length. Due to how bevy_audio and bevy_kira_audio works, this means that there is no way on how to play sounds forever, given a FunDSP graph.

Solution

Blocked by:

@harudagondi harudagondi added the bug Something isn't working label Jul 29, 2022
bors bot pushed a commit to bevyengine/bevy that referenced this issue Aug 29, 2022
# Objective

- Allow non-`Sync` Decoders
- Unblocks #5422.
- Unblocks harudagondi/bevy_fundsp#1

## Solution

- Remove `Sync` requirement in `Decodable::Decoder`
- This aligns with kira's [`Sound`] and majority of [oddio]'s types (like [`Mixer`]).

[`Sound`]: https://docs.rs/kira/latest/kira/sound/trait.Sound.html
[oddio]: https://docs.rs/oddio/latest/oddio/index.html
[`Mixer`]: https://docs.rs/oddio/latest/oddio/struct.Mixer.html

---

## Changelog

### Changed

- `Decodable::Decoder` now no longer requires `Sync` types.
james7132 pushed a commit to james7132/bevy that referenced this issue Oct 28, 2022
# Objective

- Allow non-`Sync` Decoders
- Unblocks bevyengine#5422.
- Unblocks harudagondi/bevy_fundsp#1

## Solution

- Remove `Sync` requirement in `Decodable::Decoder`
- This aligns with kira's [`Sound`] and majority of [oddio]'s types (like [`Mixer`]).

[`Sound`]: https://docs.rs/kira/latest/kira/sound/trait.Sound.html
[oddio]: https://docs.rs/oddio/latest/oddio/index.html
[`Mixer`]: https://docs.rs/oddio/latest/oddio/struct.Mixer.html

---

## Changelog

### Changed

- `Decodable::Decoder` now no longer requires `Sync` types.
harudagondi added a commit that referenced this issue Nov 14, 2022
# Objective

- This is a very big refactor that allows better ergonomics, better refactorability, and better support for streaming audio.
- Partially complete #1 for `bevy_audio`, 
	- bevyengine/bevy#5819 ~needs to be merged first.~ is now merged! Now waiting for bevy 0.9.
	- NiklasEi/bevy_kira_audio#63 is blocking for `kira`. 
- Partially complete #2 for `oddio`
	- bevyengine/bevy#5828 needs to be resolved first
	- NiklasEi/bevy_kira_audio#63 is blocking for `kira`
	- `oddio` isn't even implemented yet for this PR
    - By virtue of solving #2, then #3 will be unblocked
- Unblocks #4 by using `DspGraph`
- Fixes #5

## Solution

- [x] Add support for 
  - [x] `bevy_audio`, ~blocked by bevyengine/bevy#5819~ Now waiting for bevy 0.9.
  - [x] `bevy_kira_audio`, ~blocked by NiklasEi/bevy_kira_audio#72~ Now waiting for bevy 0.9.
  - [x] `bevy_oddio`
- [ ] Add support for streaming audio in
  - [x] `bevy_audio`, ~blocked by bevyengine/bevy#5819~
  - [ ] `bevy_kira_audio`, blocked by NiklasEi/bevy_kira_audio#63
  - [x] `bevy_oddio`
- [ ] Allow setting of parameters in
  - [ ] `bevy_audio`, blocked by bevyengine/bevy#5828
  - [ ] `bevy_kira_audio`, blocked by NiklasEi/bevy_kira_audio#63
  - [x] `bevy_oddio`

## Note for Users of this Branch

If you are a user of `bevy_fundsp`, please try to test this PR! This currently only works with bevy_audio (EDIT: and bevy_oddio!), because this relies on a branch I made on bevy.

---

## Changelog

Reworked the majority of the code.

## Added

- A way to play streaming DSP sources. See `SourceType::Dynamic`.
- You can play DSP sources using `Audio::play_dsp`.
- Two iterators on streaming audio sources: `Iter` and `IterMono`.

### Changed

- Adding the DSP plugin.
  - You must now call `DspPlugin::default()`.
- The method on adding DSP sources.
  - No more initializing using `DspAssets`!
  - Just add your DSP function using `app.add_dsp_source`
- Playing DSP sources require `Audio` to be mutable. (Use `ResMut`)
- A lot of internals are shuffled around.

### Removed

- `DspAssets`
- `FnDspGraph`
- `StreamingDspSource`
ItsDoot pushed a commit to ItsDoot/bevy that referenced this issue Feb 1, 2023
# Objective

- Allow non-`Sync` Decoders
- Unblocks bevyengine#5422.
- Unblocks harudagondi/bevy_fundsp#1

## Solution

- Remove `Sync` requirement in `Decodable::Decoder`
- This aligns with kira's [`Sound`] and majority of [oddio]'s types (like [`Mixer`]).

[`Sound`]: https://docs.rs/kira/latest/kira/sound/trait.Sound.html
[oddio]: https://docs.rs/oddio/latest/oddio/index.html
[`Mixer`]: https://docs.rs/oddio/latest/oddio/struct.Mixer.html

---

## Changelog

### Changed

- `Decodable::Decoder` now no longer requires `Sync` types.
@leeola
Copy link

leeola commented Apr 4, 2023

Would this issue be required for graphs with dynamic levels? Eg making a graph which has dynamic intensity via Midi velocity?

@harudagondi
Copy link
Owner Author

I believe the answer is yes. By the way, this issue is mostly solved except for integration with bevy_kira_audio, as per issue linked.

@leeola
Copy link

leeola commented Apr 5, 2023

Solved how? I wasn't clear on how this could work with Bevy directly, and given the tracking issue is still open on Bevy's side i figured it wasn't possible. For now i'm experimenting with using an external audio thread to manage the DSP.

Is there a better way?

@harudagondi
Copy link
Owner Author

I made an example that stimulates a piano. Maybe check this out?

@leeola
Copy link

leeola commented Apr 8, 2023

Yea i think that would work. At first i wasn't sure, but now that i'm wrapping my head around externally threaded solutions, in theory as long as you can access the Shared<f64> pointers then it should work. Even for velocity.

Is there a benefit in this model over the externally threaded examples in your mind? Would the performance be better in Bevy for any reason?

@harudagondi
Copy link
Owner Author

The benefit is that you are not going to eat up any threads in the thread pool that bevy uses. It is better to let bevy handle the threads. Otherwise you are taking away one thread that bevy could use for parallelization.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants