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::{SamplerConfig, SamplerNode, SamplerState};
8
9use crate::{PoolError, PoolableNode};
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq)]
14pub struct SamplerPool;
15
16impl PoolableNode for SamplerPool {
17 type AudioNode = SamplerNode;
18
19 fn num_output_channels(config: Option<&SamplerConfig>) -> NonZeroChannelCount {
21 config
22 .map(|c| c.channels)
23 .unwrap_or(SamplerConfig::default().channels)
24 }
25
26 fn params_stopped(params: &SamplerNode) -> bool {
29 params.stop_requested()
30 }
31
32 fn node_is_stopped<B: AudioBackend>(
36 node_id: NodeID,
37 cx: &FirewheelCtx<B>,
38 ) -> Result<bool, PoolError> {
39 cx.node_state::<SamplerState>(node_id)
40 .map(|s| s.stopped())
41 .ok_or(PoolError::InvalidNodeID(node_id))
42 }
43
44 fn worker_score<B: AudioBackend>(
50 params: &SamplerNode,
51 node_id: NodeID,
52 cx: &mut FirewheelCtx<B>,
53 ) -> Result<u64, PoolError> {
54 cx.node_state::<SamplerState>(node_id)
55 .map(|s| s.worker_score(params))
56 .ok_or(PoolError::InvalidNodeID(node_id))
57 }
58
59 fn diff<B: AudioBackend>(
61 baseline: &SamplerNode,
62 new: &SamplerNode,
63 event_queue: &mut ContextQueue<B>,
64 ) {
65 new.diff(baseline, PathBuilder::default(), event_queue);
66 }
67
68 fn mark_playing<B: AudioBackend>(
75 node_id: NodeID,
76 cx: &mut FirewheelCtx<B>,
77 ) -> Result<(), PoolError> {
78 cx.node_state_mut::<SamplerState>(node_id)
79 .map(|s| s.mark_playing())
80 .ok_or(PoolError::InvalidNodeID(node_id))
81 }
82
83 fn pause(params: &mut SamplerNode) {
85 params.pause();
86 }
87 fn resume(params: &mut SamplerNode) {
89 params.resume();
90 }
91 fn stop(params: &mut SamplerNode) {
93 params.stop();
94 }
95}