servo_media_audio/delay_node/
delay_writer.rs1use log::error;
6use num_traits::Zero;
7
8use crate::audio_node::{AudioNodeEngine, AudioNodeType, BlockInfo, ChannelInfo};
9use crate::block::{Chunk, FRAMES_PER_BLOCK_USIZE};
10use crate::delay_node::{CachedUpmixedBlock, DelayBuffer};
11
12#[derive(AudioNodeCommon)]
17pub(crate) struct DelayWriter {
18 channel_info: ChannelInfo,
19 delay_line: DelayBuffer,
22 upmixed_block: CachedUpmixedBlock,
24 max_delay_time: f64,
26}
27
28impl DelayWriter {
29 pub(super) fn new(
30 buffer: DelayBuffer,
31 upmixed_block: CachedUpmixedBlock,
32 channel_info: ChannelInfo,
33 max_delay_time: f64,
34 ) -> Self {
35 Self {
36 channel_info,
37 delay_line: buffer,
38 upmixed_block,
39 max_delay_time,
40 }
41 }
42
43 fn update_delay_line_capacity(&self, capacity: usize) {
45 let mut delay_line = self.delay_line.write();
46 if delay_line.capacity().is_zero() {
47 delay_line.reserve(capacity);
48 }
49 }
50
51 fn write(&self, mut input: Chunk) {
53 {
54 let Some(block) = input.blocks.pop() else {
56 error!(
57 "Attempted to write a chunk with no data to the delay node internal buffer. This should not have occurred due to size check prior to write"
58 );
59 return;
60 };
61 let mut delay_line = self.delay_line.write();
62 let last_index = delay_line.capacity() - 1;
63 delay_line.truncate(last_index);
64 delay_line.push_front(block);
66 }
67 if let Some(upmixed_block) = self.upmixed_block.write().as_mut() {
69 upmixed_block.increment_index();
70 }
71 }
72}
73
74impl AudioNodeEngine for DelayWriter {
75 fn node_type(&self) -> AudioNodeType {
76 AudioNodeType::DelayWriter
77 }
78
79 fn process(&mut self, inputs: Chunk, info: &BlockInfo) -> Chunk {
80 debug_assert!(inputs.len() == 1);
81
82 let max_delay_frame = self.max_delay_time * info.sample_rate as f64;
83 let max_delay_block = (max_delay_frame / FRAMES_PER_BLOCK_USIZE as f64).ceil() as usize;
84
85 self.update_delay_line_capacity(max_delay_block + 1);
87
88 self.write(inputs);
90 Chunk::default()
91 }
92
93 fn output_count(&self) -> u32 {
94 0
95 }
96}