Skip to main content

melody_bay/webaudio/
node.rs

1#[allow(private_bounds)]
2pub trait AudioNodeHandle: private::AudioNodeHandlePrivate {}
3
4impl<T: private::AudioNodeHandlePrivate + ?Sized> AudioNodeHandle for T {}
5
6impl private::AudioNodeHandlePrivate for NodeId {
7    fn node_id(&self) -> NodeId {
8        *self
9    }
10}
11
12impl<T: private::AudioNodeHandlePrivate + ?Sized> private::AudioNodeHandlePrivate for &T {
13    fn node_id(&self) -> NodeId {
14        (*self).node_id()
15    }
16
17    fn context_identity(&self) -> Option<usize> {
18        (*self).context_identity()
19    }
20}
21
22#[derive(Clone)]
23pub struct AudioDestinationNode {
24    id: NodeId,
25    graph: Arc<Mutex<GraphInner>>,
26}
27
28impl fmt::Debug for AudioDestinationNode {
29    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
30        formatter
31            .debug_tuple("AudioDestinationNode")
32            .field(&self.id)
33            .finish()
34    }
35}
36
37impl private::AudioNodeHandlePrivate for AudioDestinationNode {
38    fn node_id(&self) -> NodeId {
39        self.id
40    }
41
42    fn context_identity(&self) -> Option<usize> {
43        Some(Arc::as_ptr(&self.graph) as usize)
44    }
45}
46
47impl From<AudioDestinationNode> for NodeId {
48    fn from(value: AudioDestinationNode) -> Self {
49        value.id
50    }
51}
52
53impl From<&AudioDestinationNode> for NodeId {
54    fn from(value: &AudioDestinationNode) -> Self {
55        value.id
56    }
57}
58
59impl AudioDestinationNode {
60    #[must_use]
61    pub fn max_channel_count(&self) -> usize {
62        node_channel_config(&self.graph, self.id).channel_count
63    }
64}
65
66#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
67pub(crate) struct ParamId {
68    node: NodeId,
69    param: ParamKind,
70}
71
72#[derive(Debug, Clone, Copy, PartialEq, Eq)]
73pub enum ChannelCountMode {
74    Max,
75    ClampedMax,
76    Explicit,
77}
78
79#[derive(Debug, Clone, Copy, PartialEq, Eq)]
80pub enum ChannelInterpretation {
81    Speakers,
82    Discrete,
83}
84
85#[derive(Debug, Clone, Copy, PartialEq, Eq)]
86pub struct AudioNodeInfo {
87    pub number_of_inputs: usize,
88    pub number_of_outputs: usize,
89    pub channel_count: usize,
90    pub channel_count_mode: ChannelCountMode,
91    pub channel_interpretation: ChannelInterpretation,
92}
93
94#[derive(Debug, Clone, Copy, PartialEq, Eq)]
95struct ChannelConfig {
96    channel_count: usize,
97    channel_count_mode: ChannelCountMode,
98    channel_interpretation: ChannelInterpretation,
99}
100
101impl Default for ChannelConfig {
102    fn default() -> Self {
103        Self {
104            channel_count: 2,
105            channel_count_mode: ChannelCountMode::Max,
106            channel_interpretation: ChannelInterpretation::Speakers,
107        }
108    }
109}
110