1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
|
/************************************************************************
FAUST Architecture File
Copyright (C) 2003-2024 GRAME, Centre National de Creation Musicale
---------------------------------------------------------------------
This Architecture section is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 3 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; If not, see <http://www.gnu.org/licenses/>.
EXCEPTION : As a special exception, you may create a larger work
that contains this FAUST architecture section and distribute
that work under terms of your choice, so long as this FAUST
architecture section is not modified.
************************************************************************
************************************************************************/
#![allow(unused_parens)]
#![allow(non_snake_case)]
#![allow(non_camel_case_types)]
#![allow(dead_code)]
#![allow(unused_variables)]
#![allow(unused_mut)]
#![allow(non_upper_case_globals)]
//! Faust JACK architecture file
extern crate jack;
use jack::prelude as j;
use std::io;
extern crate libm;
type F32 = f32;
type F64 = f64;
#[derive(Copy, Clone)]
pub struct ParamIndex(pub i32);
pub struct Soundfile<'a,T> {
fBuffers: &'a&'a T,
fLength: &'a i32,
fSR: &'a i32,
fOffset: &'a i32,
fChannels: i32
}
pub trait FaustDsp {
type T;
fn new() -> Self where Self: Sized;
fn metadata(&self, m: &mut dyn Meta);
fn get_sample_rate(&self) -> i32;
fn get_num_inputs(&self) -> i32;
fn get_num_outputs(&self) -> i32;
fn class_init(sample_rate: i32) where Self: Sized;
fn instance_reset_params(&mut self);
fn instance_clear(&mut self);
fn instance_constants(&mut self, sample_rate: i32);
fn instance_init(&mut self, sample_rate: i32);
fn init(&mut self, sample_rate: i32);
fn build_user_interface(&self, ui_interface: &mut dyn UI<Self::T>);
fn build_user_interface_static(ui_interface: &mut dyn UI<Self::T>) where Self: Sized;
fn get_param(&self, param: ParamIndex) -> Option<Self::T>;
fn set_param(&mut self, param: ParamIndex, value: Self::T);
fn compute(&mut self, count: i32, inputs: &[&[Self::T]], outputs: &mut[&mut[Self::T]]);
}
pub trait Meta {
// -- metadata declarations
fn declare(&mut self, key: &str, value: &str);
}
pub trait UI<T> {
// -- widget's layouts
fn open_tab_box(&mut self, label: &str);
fn open_horizontal_box(&mut self, label: &str);
fn open_vertical_box(&mut self, label: &str);
fn close_box(&mut self);
// -- active widgets
fn add_button(&mut self, label: &str, param: ParamIndex);
fn add_check_button(&mut self, label: &str, param: ParamIndex);
fn add_vertical_slider(&mut self, label: &str, param: ParamIndex, init: T, min: T, max: T, step: T);
fn add_horizontal_slider(&mut self, label: &str, param: ParamIndex, init: T, min: T, max: T, step: T);
fn add_num_entry(&mut self, label: &str, param: ParamIndex, init: T, min: T, max: T, step: T);
// -- passive widgets
fn add_horizontal_bargraph(&mut self, label: &str, param: ParamIndex, min: T, max: T);
fn add_vertical_bargraph(&mut self, label: &str, param: ParamIndex, min: T, max: T);
// -- metadata declarations
fn declare(&mut self, param: Option<ParamIndex>, key: &str, value: &str);
}
<<includeIntrinsic>>
<<includeclass>>
fn main() {
// Create JACK client
let (client, _status) = j::Client::new("faust_rust", j::client_options::NO_START_SERVER).unwrap();
// Allocation DSP on the heap
let mut dsp;
#[cfg(feature = "default-boxed")]
{
use default_boxed::DefaultBoxed;
dsp = mydsp::default_boxed();
}
#[cfg(not(feature = "default-boxed"))]
{
dsp = Box::new(mydsp::new());
}
println!("Faust Rust code running with JACK: sample-rate = {} buffer-size = {}", client.sample_rate(), client.buffer_size());
println!("get_num_inputs: {}", dsp.get_num_inputs());
println!("get_num_outputs: {}", dsp.get_num_outputs());
// Init DSP with a given SR
dsp.init(client.sample_rate() as i32);
// Register ports. They will be used in a callback that will be
// called when new data is available.
let in_a = client.register_port("in1", j::AudioInSpec::default()).unwrap();
let in_b = client.register_port("in2", j::AudioInSpec::default()).unwrap();
let mut out_a = client.register_port("out1", j::AudioOutSpec::default()).unwrap();
let mut out_b = client.register_port("out2", j::AudioOutSpec::default()).unwrap();
let process_callback = move |_: &j::Client, ps: &j::ProcessScope| -> j::JackControl {
let mut out_a_p = j::AudioOutPort::new(&mut out_a, ps);
let mut out_b_p = j::AudioOutPort::new(&mut out_b, ps);
let in_a_p = j::AudioInPort::new(&in_a, ps);
let in_b_p = j::AudioInPort::new(&in_b, ps);
let input0: &[f32] = &in_a_p;
let input1: &[f32] = &in_b_p;
let output0: &mut[f32] = &mut out_a_p;
let output1: &mut[f32] = &mut out_b_p;
let inputs = &[input0, input1];
let outputs = &mut[output0, output1];
dsp.compute(in_a_p.len() as usize, inputs, outputs);
j::JackControl::Continue
};
let process = j::ClosureProcessHandler::new(process_callback);
// Activate the client, which starts the processing.
let active_client = j::AsyncClient::new(client, (), process).unwrap();
// Wait for user input to quit
println!("Press enter/return to quit...");
let mut user_input = String::new();
io::stdin().read_line(&mut user_input).ok();
active_client.deactivate().unwrap();
}
|