servo_media_audio/
channel_node.rs

1use crate::block::FRAMES_PER_BLOCK_USIZE;
2use crate::block::{Block, Chunk};
3use crate::node::AudioNodeType;
4use crate::node::BlockInfo;
5use crate::node::{AudioNodeEngine, ChannelCountMode, ChannelInfo, ChannelInterpretation};
6
7#[derive(Copy, Clone, Debug)]
8pub struct ChannelNodeOptions {
9    pub channels: u8,
10}
11
12#[derive(AudioNodeCommon)]
13pub(crate) struct ChannelMergerNode {
14    channel_info: ChannelInfo,
15    channels: u8,
16}
17
18impl ChannelMergerNode {
19    pub fn new(params: ChannelNodeOptions, channel_info: ChannelInfo) -> Self {
20        ChannelMergerNode {
21            channel_info,
22            channels: params.channels,
23        }
24    }
25}
26
27impl AudioNodeEngine for ChannelMergerNode {
28    fn node_type(&self) -> AudioNodeType {
29        AudioNodeType::ChannelMergerNode
30    }
31
32    fn process(&mut self, mut inputs: Chunk, _: &BlockInfo) -> Chunk {
33        debug_assert!(inputs.len() == self.channels as usize);
34
35        let mut block = Block::default();
36        block.repeat(self.channels);
37        block.explicit_repeat();
38
39        for (i, channel) in block
40            .data_mut()
41            .chunks_mut(FRAMES_PER_BLOCK_USIZE)
42            .enumerate()
43        {
44            channel.copy_from_slice(inputs.blocks[i].data_mut())
45        }
46
47        inputs.blocks.clear();
48        inputs.blocks.push(block);
49        inputs
50    }
51
52    fn input_count(&self) -> u32 {
53        self.channels as u32
54    }
55
56    fn set_channel_count_mode(&mut self, _: ChannelCountMode) {
57        panic!("channel merger nodes cannot have their mode changed");
58    }
59
60    fn set_channel_count(&mut self, _: u8) {
61        panic!("channel merger nodes cannot have their channel count changed");
62    }
63}
64
65#[derive(AudioNodeCommon)]
66pub(crate) struct ChannelSplitterNode {
67    channel_info: ChannelInfo,
68}
69
70impl ChannelSplitterNode {
71    pub fn new(channel_info: ChannelInfo) -> Self {
72        ChannelSplitterNode { channel_info }
73    }
74}
75
76impl AudioNodeEngine for ChannelSplitterNode {
77    fn node_type(&self) -> AudioNodeType {
78        AudioNodeType::ChannelSplitterNode
79    }
80
81    fn process(&mut self, mut inputs: Chunk, _: &BlockInfo) -> Chunk {
82        debug_assert!(inputs.len() == 1);
83
84        let original = inputs.blocks.pop().unwrap();
85
86        if original.is_silence() {
87            inputs
88                .blocks
89                .resize(original.chan_count() as usize, Block::default())
90        } else {
91            for chan in 0..original.chan_count() {
92                let mut block = Block::empty();
93                block.push_chan(original.data_chan(chan));
94                inputs.blocks.push(block);
95            }
96        }
97
98        inputs
99    }
100
101    fn output_count(&self) -> u32 {
102        self.channel_count() as u32
103    }
104
105    fn set_channel_count_mode(&mut self, _: ChannelCountMode) {
106        panic!("channel splitter nodes cannot have their mode changed");
107    }
108
109    fn set_channel_interpretation(&mut self, _: ChannelInterpretation) {
110        panic!("channel splitter nodes cannot have their channel interpretation changed");
111    }
112
113    fn set_channel_count(&mut self, _: u8) {
114        panic!("channel splitter nodes cannot have their channel count changed");
115    }
116}