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
use std::ops::{Deref, DerefMut};
use std::slice;
use jack_sys as j;
use libc;
use callbacks::ProcessScope;
use jack_flags::port_flags::{IS_INPUT, IS_OUTPUT, PortFlags};
use port::{Port, PortSpec};
#[derive(Debug, Default)]
pub struct AudioInSpec;
#[derive(Debug, Default)]
pub struct AudioOutSpec;
unsafe impl<'a> PortSpec for AudioOutSpec {
fn jack_port_type(&self) -> &'static str {
j::FLOAT_MONO_AUDIO
}
fn jack_flags(&self) -> PortFlags {
IS_OUTPUT
}
fn jack_buffer_size(&self) -> libc::c_ulong {
0
}
}
unsafe impl PortSpec for AudioInSpec {
fn jack_port_type(&self) -> &'static str {
j::FLOAT_MONO_AUDIO
}
fn jack_flags(&self) -> PortFlags {
IS_INPUT
}
fn jack_buffer_size(&self) -> libc::c_ulong {
0
}
}
pub struct AudioOutPort<'a> {
_port: &'a mut Port<AudioOutSpec>,
buffer: &'a mut [f32],
}
impl<'a> AudioOutPort<'a> {
pub fn new(port: &'a mut Port<AudioOutSpec>, ps: &'a ProcessScope) -> Self {
unsafe { assert_eq!(port.client_ptr(), ps.client_ptr()) };
let buff = unsafe {
slice::from_raw_parts_mut(port.buffer(ps.n_frames()) as *mut f32,
ps.n_frames() as usize)
};
AudioOutPort {
_port: port,
buffer: buff,
}
}
}
impl<'a> Deref for AudioOutPort<'a> {
type Target = [f32];
fn deref(&self) -> &[f32] {
self.buffer
}
}
impl<'a> DerefMut for AudioOutPort<'a> {
fn deref_mut(&mut self) -> &mut [f32] {
self.buffer
}
}
pub struct AudioInPort<'a> {
_port: &'a Port<AudioInSpec>,
buffer: &'a [f32],
}
impl<'a> AudioInPort<'a> {
pub fn new(port: &'a Port<AudioInSpec>, ps: &'a ProcessScope) -> Self {
unsafe { assert_eq!(port.client_ptr(), ps.client_ptr()) };
let buff = unsafe {
slice::from_raw_parts(port.buffer(ps.n_frames()) as *const f32,
ps.n_frames() as usize)
};
AudioInPort {
_port: port,
buffer: buff,
}
}
}
impl<'a> Deref for AudioInPort<'a> {
type Target = [f32];
fn deref(&self) -> &[f32] {
self.buffer
}
}