servo_media_audio/
channel_node.rs1use 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}