@@ -6,7 +6,7 @@ use serde::{Deserialize, Serialize};
66
77use mizer_node:: * ;
88
9- use crate :: AudioContext ;
9+ use crate :: { AudioContext , CHANNEL_COUNT , INPUT_BUFFER_SIZE } ;
1010
1111const AUDIO_OUTPUT : & str = "Stereo" ;
1212
@@ -41,9 +41,9 @@ impl ProcessingNode for AudioInputNode {
4141 * state = AudioInputNodeState :: new ( context) . context ( "Creating audio input state" ) ?;
4242 }
4343 if let Some ( state) = state {
44- let buffer = state. read ( context) ?;
45-
46- context . write_port ( AUDIO_OUTPUT , buffer ) ;
44+ if let Some ( buffer) = state. read ( context) ? {
45+ context . write_port ( AUDIO_OUTPUT , buffer ) ;
46+ }
4747 }
4848
4949 Ok ( ( ) )
@@ -64,11 +64,12 @@ impl AudioInputNodeState {
6464 fn new ( audio_context : & impl AudioContext ) -> anyhow:: Result < Option < Self > > {
6565 tracing:: trace!( "Opening audio input device" ) ;
6666 if let Some ( device) = cpal:: default_host ( ) . default_input_device ( ) {
67- let buffer = SpscRb :: new ( audio_context. transfer_size ( ) * 2 ) ;
67+ let buffer = SpscRb :: new ( audio_context. transfer_size_per_channel ( ) * CHANNEL_COUNT * INPUT_BUFFER_SIZE ) ;
6868
6969 let config = device. supported_input_configs ( ) ?;
7070 let configs = config. collect :: < Vec < _ > > ( ) ;
7171 tracing:: trace!( "Supported Input Configs: {configs:?}" ) ;
72+ // TODO: find device with lowest buffer size
7273 if let Some ( config) = configs. into_iter ( ) . find ( |c| {
7374 c. channels ( ) == 2
7475 && c. sample_format ( ) == SampleFormat :: F32
@@ -112,14 +113,17 @@ impl AudioInputNodeState {
112113 }
113114 }
114115
115- fn read ( & mut self , audio_context : & impl AudioContext ) -> anyhow:: Result < Vec < f64 > > {
116- let mut buffer = vec ! [ 0. ; audio_context. transfer_size( ) ] ;
117- let count = self
118- . buffer
119- . consumer ( )
120- . read ( & mut buffer)
121- . map_err ( |err| anyhow:: anyhow!( "Unable to read from Ringbuffer: {err:?}" ) ) ?;
116+ fn read ( & mut self , audio_context : & impl AudioContext ) -> anyhow:: Result < Option < Vec < f64 > > > {
117+ let mut buffer = vec ! [ 0. ; audio_context. transfer_size_per_channel( ) * CHANNEL_COUNT ] ;
118+ let consumer = self . buffer . consumer ( ) ;
119+ let count = consumer. get ( & mut buffer) . unwrap_or ( 0 ) ;
120+ if count < buffer. len ( ) {
121+ return Ok ( None ) ;
122+ }
123+
124+ consumer. skip ( count)
125+ . map_err ( |err| anyhow:: anyhow!( "Unable to skip from Ringbuffer: {err:?}" ) ) ?;
122126
123- Ok ( buffer[ 0 ..count ] . iter ( ) . map ( |f| * f as f64 ) . collect ( ) )
127+ Ok ( Some ( buffer. into_iter ( ) . map ( |f| f as f64 ) . collect ( ) ) )
124128 }
125129}
0 commit comments