Skip to content

Commit c8a33c2

Browse files
committed
ParamGestures type for communicating param edit gestures
1 parent 67a5a6e commit c8a33c2

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed

src/sync/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
pub mod bitset;
22
pub mod float;
3+
pub mod param_gestures;
34
pub mod params;

src/sync/param_gestures.rs

+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
use std::sync::atomic::Ordering;
2+
3+
use super::bitset::{self, AtomicBitset};
4+
use super::float::AtomicF64;
5+
use crate::params::{ParamInfo, ParamValue};
6+
7+
pub struct ParamGestures {
8+
values: Vec<AtomicF64>,
9+
gestures: AtomicBitset,
10+
dirty: AtomicBitset,
11+
}
12+
13+
impl ParamGestures {
14+
pub fn new(params: &[ParamInfo]) -> ParamGestures {
15+
ParamGestures {
16+
values: params.iter().map(|p| AtomicF64::new(p.default)).collect(),
17+
gestures: AtomicBitset::with_len(params.len()),
18+
dirty: AtomicBitset::with_len(params.len()),
19+
}
20+
}
21+
22+
pub fn begin_gesture(&self, index: usize) {
23+
self.gestures.set(index, Ordering::Relaxed);
24+
self.dirty.set(index, Ordering::Release);
25+
}
26+
27+
pub fn end_gesture(&self, index: usize) {
28+
self.gestures.reset(index, Ordering::Relaxed);
29+
self.dirty.set(index, Ordering::Release);
30+
}
31+
32+
pub fn set_value(&self, index: usize, value: ParamValue) {
33+
self.values[index].store(value, Ordering::Relaxed);
34+
self.dirty.set(index, Ordering::Release);
35+
}
36+
37+
pub fn poll(&self) -> Poll {
38+
Poll {
39+
values: &self.values,
40+
gestures: &self.gestures,
41+
iter: self.dirty.drain(Ordering::Acquire),
42+
}
43+
}
44+
}
45+
46+
#[derive(Copy, Clone, Eq, PartialEq)]
47+
pub enum GestureState {
48+
Off,
49+
On,
50+
}
51+
52+
#[derive(Copy, Clone)]
53+
pub struct GestureUpdate {
54+
value: ParamValue,
55+
state: GestureState,
56+
}
57+
58+
pub struct Poll<'a> {
59+
values: &'a [AtomicF64],
60+
gestures: &'a AtomicBitset,
61+
iter: bitset::Drain<'a>,
62+
}
63+
64+
impl<'a> Iterator for Poll<'a> {
65+
type Item = (usize, GestureUpdate);
66+
67+
fn next(&mut self) -> Option<Self::Item> {
68+
if let Some(index) = self.iter.next() {
69+
let value = self.values[index].load(Ordering::Relaxed);
70+
let state = if self.gestures.get(index, Ordering::Relaxed) {
71+
GestureState::On
72+
} else {
73+
GestureState::Off
74+
};
75+
76+
Some((index, GestureUpdate { value, state }))
77+
} else {
78+
None
79+
}
80+
}
81+
}

0 commit comments

Comments
 (0)