firewheel_pool/
sampler.rs1use firewheel_core::{
2 channel_config::NonZeroChannelCount,
3 diff::{Diff, PathBuilder},
4 node::NodeID,
5};
6use firewheel_graph::{backend::AudioBackend, ContextQueue, FirewheelCtx};
7use firewheel_nodes::sampler::{PlaybackState, SamplerConfig, SamplerNode, SamplerState};
8
9use crate::{PoolError, PoolableNode};
10
11pub struct SamplerPool;
14
15impl PoolableNode for SamplerPool {
16 type AudioNode = SamplerNode;
17
18 fn num_output_channels(config: Option<&SamplerConfig>) -> NonZeroChannelCount {
20 config
21 .map(|c| c.channels)
22 .unwrap_or(SamplerConfig::default().channels)
23 }
24
25 fn params_stopped(params: &SamplerNode) -> bool {
28 if let PlaybackState::Stop = *params.playback {
29 true
30 } else {
31 false
32 }
33 }
34
35 fn node_is_stopped<B: AudioBackend>(
39 node_id: NodeID,
40 cx: &FirewheelCtx<B>,
41 ) -> Result<bool, PoolError> {
42 cx.node_state::<SamplerState>(node_id)
43 .map(|s| s.stopped())
44 .ok_or(PoolError::InvalidNodeID(node_id))
45 }
46
47 fn worker_score<B: AudioBackend>(
53 params: &SamplerNode,
54 node_id: NodeID,
55 cx: &mut FirewheelCtx<B>,
56 ) -> Result<u64, PoolError> {
57 cx.node_state::<SamplerState>(node_id)
58 .map(|s| s.worker_score(params))
59 .ok_or(PoolError::InvalidNodeID(node_id))
60 }
61
62 fn diff<B: AudioBackend>(
64 baseline: &SamplerNode,
65 new: &SamplerNode,
66 event_queue: &mut ContextQueue<B>,
67 ) {
68 new.diff(baseline, PathBuilder::default(), event_queue);
69 }
70
71 fn mark_stopped<B: AudioBackend>(
81 stopped: bool,
82 node_id: NodeID,
83 cx: &mut FirewheelCtx<B>,
84 ) -> Result<(), PoolError> {
85 cx.node_state_mut::<SamplerState>(node_id)
86 .map(|s| s.mark_stopped(stopped))
87 .ok_or(PoolError::InvalidNodeID(node_id))
88 }
89
90 fn pause(params: &mut SamplerNode) {
92 params.pause();
93 }
94 fn resume(params: &mut SamplerNode) {
96 params.resume();
97 }
98 fn stop(params: &mut SamplerNode) {
100 params.stop();
101 }
102}