Skip to content

Commit 4a84441

Browse files
authored
fix drop (#198)
* fix client drop * fix warnings
1 parent 6da1c8f commit 4a84441

File tree

14 files changed

+93
-121
lines changed

14 files changed

+93
-121
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ license = "MIT"
88
name = "jack"
99
readme = "README.md"
1010
repository = "https://github.com/RustAudio/rust-jack"
11-
version = "0.11.4"
11+
version = "0.12.0"
1212

1313
[dependencies]
1414
bitflags = "1"

examples/playback_capture.rs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,10 @@ fn main() {
99

1010
// Register ports. They will be used in a callback that will be
1111
// called when new data is available.
12-
let in_a = client
13-
.register_port("rust_in_l", jack::AudioIn::default())
14-
.unwrap();
15-
let in_b = client
16-
.register_port("rust_in_r", jack::AudioIn::default())
17-
.unwrap();
18-
let mut out_a = client
19-
.register_port("rust_out_l", jack::AudioOut::default())
20-
.unwrap();
21-
let mut out_b = client
22-
.register_port("rust_out_r", jack::AudioOut::default())
23-
.unwrap();
12+
let in_a = client.register_port("rust_in_l", jack::AudioIn).unwrap();
13+
let in_b = client.register_port("rust_in_r", jack::AudioIn).unwrap();
14+
let mut out_a = client.register_port("rust_out_l", jack::AudioOut).unwrap();
15+
let mut out_b = client.register_port("rust_out_r", jack::AudioOut).unwrap();
2416
let process_callback = move |_: &jack::Client, ps: &jack::ProcessScope| -> jack::Control {
2517
let out_a_p = out_a.as_mut_slice(ps);
2618
let out_b_p = out_b.as_mut_slice(ps);

examples/show_midi.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,10 @@ fn main() {
5050

5151
// process logic
5252
let mut maker = client
53-
.register_port("rust_midi_maker", jack::MidiOut::default())
53+
.register_port("rust_midi_maker", jack::MidiOut)
5454
.unwrap();
5555
let shower = client
56-
.register_port("rust_midi_shower", jack::MidiIn::default())
56+
.register_port("rust_midi_shower", jack::MidiIn)
5757
.unwrap();
5858

5959
let cback = move |_: &jack::Client, ps: &jack::ProcessScope| -> jack::Control {

examples/sine.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@ fn main() {
1111
jack::Client::new("rust_jack_sine", jack::ClientOptions::NO_START_SERVER).unwrap();
1212

1313
// 2. register port
14-
let mut out_port = client
15-
.register_port("sine_out", jack::AudioOut::default())
16-
.unwrap();
14+
let mut out_port = client.register_port("sine_out", jack::AudioOut).unwrap();
1715

1816
// 3. define process callback handler
1917
let mut frequency = 220.0;

jack-sys/src/types.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#![allow(non_camel_case_types)]
12
#[cfg(not(target_os = "windows"))]
23
pub type jack_native_thread_t = ::libc::pthread_t;
34
pub type jack_uuid_t = u64;

src/client/async_client.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -104,15 +104,13 @@ impl<N, P> AsyncClient<N, P> {
104104

105105
// Helper function for deactivating. Any function that calls this should
106106
// have ownership of self and no longer use it after this call.
107-
unsafe fn maybe_deactivate(&mut self) -> Result<CallbackContext<N, P>, Error> {
107+
unsafe fn maybe_deactivate(&mut self) -> Result<Box<CallbackContext<N, P>>, Error> {
108108
let _m = CREATE_OR_DESTROY_CLIENT_MUTEX.lock().unwrap();
109109
if self.callback.is_none() {
110110
return Err(Error::ClientIsNoLongerAlive);
111111
}
112-
let client = self.callback.as_ref().unwrap().client.raw();
113-
// Prevent the callback from being deallocated in case deactivation
114-
// fails.
115-
let callback = Box::into_raw(self.callback.take().unwrap());
112+
let cb = self.callback.take().unwrap();
113+
let client = cb.client.raw();
116114

117115
// deactivate
118116
sleep_on_test();
@@ -123,15 +121,14 @@ impl<N, P> AsyncClient<N, P> {
123121
// clear the callbacks
124122
sleep_on_test();
125123
clear_callbacks(client)?;
126-
127124
// done, take ownership of callback
128-
Ok(*Box::from_raw(callback))
125+
Ok(cb)
129126
}
130127
}
131128

132129
/// Closes the client.
133130
impl<N, P> Drop for AsyncClient<N, P> {
134-
/// Deactivate and close the client.
131+
// Deactivate and close the client.
135132
fn drop(&mut self) {
136133
let _ = unsafe { self.maybe_deactivate() };
137134
}

src/client/callbacks.rs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ pub trait NotificationHandler: Send {
7575
pub trait ProcessHandler: Send {
7676
/// Indicates whether or not this process handler represents a
7777
/// slow-sync client
78-
const SLOW_SYNC:bool = false;
78+
const SLOW_SYNC: bool = false;
7979

8080
/// Called whenever there is work to be done.
8181
///
@@ -108,11 +108,12 @@ pub trait ProcessHandler: Send {
108108
/// It should return `false` until the handler is ready process audio.
109109
///
110110
/// Ignored unless Self::SLOW_SYNC == true.
111-
fn sync(&mut self,
112-
_: &Client,
113-
_state: crate::TransportState,
114-
_pos: &crate::TransportPosition
115-
)->bool {
111+
fn sync(
112+
&mut self,
113+
_: &Client,
114+
_state: crate::TransportState,
115+
_pos: &crate::TransportPosition,
116+
) -> bool {
116117
true
117118
}
118119
}
@@ -156,7 +157,7 @@ where
156157
unsafe extern "C" fn sync<N, P>(
157158
state: jack_sys::jack_transport_state_t,
158159
pos: *mut jack_sys::jack_position_t,
159-
data: *mut libc::c_void
160+
data: *mut libc::c_void,
160161
) -> libc::c_int
161162
where
162163
N: 'static + Send + Sync + NotificationHandler,
@@ -166,10 +167,10 @@ where
166167
match ctx.process.sync(
167168
&ctx.client,
168169
crate::Transport::state_from_ffi(state),
169-
&*(pos as *mut crate::TransportPosition)
170+
&*(pos as *mut crate::TransportPosition),
170171
) {
171172
true => 1,
172-
false => 0
173+
false => 0,
173174
}
174175
}
175176

@@ -295,9 +296,11 @@ where
295296
/// # TODO
296297
///
297298
/// * Implement correctly. Freezes on my system.
298-
pub unsafe fn clear_callbacks(_client: *mut j::jack_client_t) -> Result<(), Error> {
299-
// j::jack_set_thread_init_callback(client, None, ptr::null_mut());
300-
// j::jack_set_process_callback(client, None, ptr::null_mut());
299+
300+
//maybe this makes sense now? it doesn't disturb my program
301+
pub unsafe fn clear_callbacks(client: *mut j::jack_client_t) -> Result<(), Error> {
302+
j::jack_set_thread_init_callback(client, None, std::ptr::null_mut());
303+
j::jack_set_process_callback(client, None, std::ptr::null_mut());
301304
Ok(())
302305
}
303306

src/client/client_impl.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ use crate::{
3030
3131
pub type InternalClientID = j::jack_intclient_t;
3232

33+
#[allow(dead_code)]
3334
pub struct Client(
3435
*mut j::jack_client_t,
3536
Arc<()>,
@@ -659,7 +660,6 @@ impl Client {
659660
impl Drop for Client {
660661
fn drop(&mut self) {
661662
let _m = CREATE_OR_DESTROY_CLIENT_MUTEX.lock().unwrap();
662-
663663
debug_assert!(!self.raw().is_null()); // Rep invariant
664664
// Close the client
665665
sleep_on_test();

src/client/test_callback.rs

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -201,14 +201,8 @@ fn client_cback_reports_xruns() {
201201
#[test]
202202
fn client_cback_calls_port_registered() {
203203
let ac = active_test_client("client_cback_cpr");
204-
let _pa = ac
205-
.as_client()
206-
.register_port("pa", AudioIn::default())
207-
.unwrap();
208-
let _pb = ac
209-
.as_client()
210-
.register_port("pb", AudioIn::default())
211-
.unwrap();
204+
let _pa = ac.as_client().register_port("pa", AudioIn).unwrap();
205+
let _pb = ac.as_client().register_port("pb", AudioIn).unwrap();
212206
let counter = ac.deactivate().unwrap().1;
213207
assert_eq!(
214208
counter.port_register_history.len(),
@@ -224,14 +218,8 @@ fn client_cback_calls_port_registered() {
224218
#[test]
225219
fn client_cback_calls_port_unregistered() {
226220
let ac = active_test_client("client_cback_cpr");
227-
let pa = ac
228-
.as_client()
229-
.register_port("pa", AudioIn::default())
230-
.unwrap();
231-
let pb = ac
232-
.as_client()
233-
.register_port("pb", AudioIn::default())
234-
.unwrap();
221+
let pa = ac.as_client().register_port("pa", AudioIn).unwrap();
222+
let pb = ac.as_client().register_port("pb", AudioIn).unwrap();
235223
ac.as_client().unregister_port(pa).unwrap();
236224
ac.as_client().unregister_port(pb).unwrap();
237225
let counter = ac.deactivate().unwrap().1;

src/port/audio.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,10 @@ mod test {
107107
#[test]
108108
fn port_audio_can_read_write() {
109109
let c = open_test_client("port_audio_crw");
110-
let in_a = c.register_port("ia", AudioIn::default()).unwrap();
111-
let in_b = c.register_port("ib", AudioIn::default()).unwrap();
112-
let mut out_a = c.register_port("oa", AudioOut::default()).unwrap();
113-
let mut out_b = c.register_port("ob", AudioOut::default()).unwrap();
110+
let in_a = c.register_port("ia", AudioIn).unwrap();
111+
let in_b = c.register_port("ib", AudioIn).unwrap();
112+
let mut out_a = c.register_port("oa", AudioOut).unwrap();
113+
let mut out_b = c.register_port("ob", AudioOut).unwrap();
114114
let (signal_succeed, did_succeed) = bounded(1_000);
115115
let process_callback = move |_: &Client, ps: &ProcessScope| -> Control {
116116
let exp_a = 0.312_443;

0 commit comments

Comments
 (0)