Skip to content

Commit

Permalink
Revert "click_events: use epoll"
Browse files Browse the repository at this point in the history
This reverts commit 13432af.

Reverted for the time being, there seems to be an issue in removing
fds:

thread '<unnamed>' panicked at 'epoll::ctl failed when removing fd: Os { code: 9, kind: Uncategorized, message: "Bad file descriptor" }', src/clicky_events.rs:176:18
  • Loading branch information
eras committed Sep 14, 2021
1 parent 4faaa89 commit 417cd5f
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 126 deletions.
1 change: 0 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ hound = "3.4.0"
rand = "0.8.3"
clap = "3.0.0-beta.2"
directories = "3.0"
epoll = "4.3.1"

# [lib]
# name = "mute_keyboard_plugin"
Expand Down
13 changes: 5 additions & 8 deletions src/click_mute.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,6 @@ struct ClickMute {
pub enum Error {
#[error(transparent)]
JackError(#[from] jack::Error),

#[error(transparent)]
ClickyEventsError(#[from] crate::clicky_events::Error),
}

impl ClickMute {
Expand All @@ -64,7 +61,7 @@ impl ClickMute {
click_info: Arc<Mutex<ClickInfo>>,
config: Config,
control: click_mute_control::Receiver,
) -> Result<ClickMute, Error> {
) -> ClickMute {
let in_a = client
.register_port("in_a", jack::AudioIn::default())
.unwrap();
Expand Down Expand Up @@ -97,7 +94,7 @@ impl ClickMute {
fader_a.fade_in(fade_samples);
fader_b.fade_in(fade_samples);

Ok(ClickMute {
ClickMute {
in_a,
in_b,
out_a,
Expand All @@ -116,7 +113,7 @@ impl ClickMute {
cross_fader_a,
cross_fader_b,

clicky_events: Arc::new(Mutex::new(ClickyEvents::new()?)),
clicky_events: Arc::new(Mutex::new(ClickyEvents::new())),

sample_index: 0,
mute_t0_index: None,
Expand All @@ -137,7 +134,7 @@ impl ClickMute {
background_looper: Looper::new(),

measure_when_clicked: Arc::new(Mutex::new(measure::Repeated::new())),
})
}
}

fn stop(&mut self) {
Expand Down Expand Up @@ -301,7 +298,7 @@ pub fn main(

let mute = Arc::new(Mutex::new(Some(ClickMute::new(
&client, click_info, config, control,
)?)));
))));

let process = jack::ClosureProcessHandler::new({
let mute = mute.clone();
Expand Down
154 changes: 37 additions & 117 deletions src/clicky_events.rs
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
use crate::level_event::LevelEvent;
use std::collections::HashMap;
use std::ffi::CString;
use std::os::unix::prelude::RawFd;
use std::sync::{Arc, Mutex};
use std::{thread, time};
use thiserror::Error;
extern crate libc;

pub struct ClickyEvents {
devices: Arc<Mutex<Option<DeviceState>>>,
devices: Arc<Mutex<Option<Vec<evdev::Device>>>>,
reenumerator_join: Option<thread::JoinHandle<()>>,
reenumerator_stop: LevelEvent,
epoll_fd: RawFd,
}

fn make_device_mapping(devices: Vec<evdev::Device>) -> HashMap<CString, evdev::Device> {
Expand All @@ -27,26 +24,8 @@ fn make_device_mapping(devices: Vec<evdev::Device>) -> HashMap<CString, evdev::D
mapping
}

struct DeviceState {
devices: Vec<evdev::Device>,

// keep a journal of updates for epoll; reset after processing
added: Vec<RawFd>,
removed: Vec<RawFd>,
}

impl DeviceState {
fn new() -> Self {
DeviceState {
devices: vec![],
added: vec![],
removed: vec![],
}
}
}

fn reenumerator_thread(
clicky_devices: Arc<Mutex<Option<DeviceState>>>,
clicky_devices: Arc<Mutex<Option<Vec<evdev::Device>>>>,
reenumerator_stop: LevelEvent,
) {
let mut first = true;
Expand All @@ -72,9 +51,7 @@ fn reenumerator_thread(
if let Ok(mut write_devices) = clicky_devices.clone().lock() {
// find new and removed devices
let device_state = (*write_devices).take().unwrap();
let mut old = make_device_mapping(device_state.devices);
let mut added_fds = device_state.added;
let mut removed_fds = device_state.removed;
let mut old = make_device_mapping(device_state);

let mut new_devices: Vec<evdev::Device> = vec![];

Expand All @@ -87,7 +64,6 @@ fn reenumerator_thread(
old_device_keys.push(old_key.clone())
} else {
println!("Device removed: {:?}", old_key);
removed_fds.push(old.get(old_key).unwrap().fd());
}
}

Expand All @@ -102,34 +78,22 @@ fn reenumerator_thread(
}
}
for old_key in old_device_keys {
new_devices.push(old.remove(&old_key).take().unwrap());
new_devices.push(old.remove(&old_key).take().unwrap())
}
for new_key in new_device_keys {
added_fds.push(new.get(&new_key).unwrap().fd());
new_devices.push(new.remove(&new_key).take().unwrap());
new_devices.push(new.remove(&new_key).take().unwrap())
}

*write_devices = Some(DeviceState {
devices: new_devices,
added: added_fds,
removed: removed_fds,
})
*write_devices = Some(new_devices)
}

first = false;
}
}

#[derive(Error, Debug)]
pub enum Error {
// produced by epoll::create
#[error(transparent)]
IOError(#[from] std::io::Error),
}

impl ClickyEvents {
pub fn new() -> Result<ClickyEvents, Error> {
let kbd_devices = Arc::new(Mutex::new(Some(DeviceState::new())));
pub fn new() -> ClickyEvents {
let kbd_devices = Arc::new(Mutex::new(Some(vec![])));

let reenumerator_stop = LevelEvent::new();

Expand All @@ -139,14 +103,11 @@ impl ClickyEvents {
thread::spawn(move || reenumerator_thread(kbd_devices, reenumerator_stop))
});

let epoll_fd = epoll::create(true)?;

Ok(ClickyEvents {
ClickyEvents {
devices: kbd_devices,
reenumerator_join,
reenumerator_stop,
epoll_fd,
})
}
}

pub fn stop(&mut self) {
Expand All @@ -166,80 +127,39 @@ impl ClickyEvents {
};
if let Ok(mut devices) = self.devices.clone().lock() {
let mut local_devices = devices.take().unwrap();
for removed in &local_devices.removed {
epoll::ctl(
self.epoll_fd,
epoll::ControlOptions::EPOLL_CTL_DEL,
*removed,
epoll::Event::new(epoll::Events::EPOLLIN, *removed as u64),
)
.expect("epoll::ctl failed when removing fd");
}
local_devices.removed.clear();

for added in &local_devices.added {
epoll::ctl(
self.epoll_fd,
epoll::ControlOptions::EPOLL_CTL_ADD,
*added,
epoll::Event::new(epoll::Events::EPOLLIN, *added as u64),
)
.expect("epoll::ctl failed when adding fd");
}
local_devices.added.clear();

let mut fd_events_in =
vec![epoll::Event::new(epoll::Events::empty(), 0); 2 * local_devices.devices.len()];

let num_events = if local_devices.devices.len() > 0 {
epoll::wait(self.epoll_fd, 0, &mut fd_events_in).expect("epoll::wait failed")
} else {
0
};

let fd_events_out: Vec<_> = fd_events_in.splice(..num_events, vec![]).collect();

for device in &mut local_devices.devices {
let device_fd = device.fd();
if let Some(_) = fd_events_out
.iter()
.position(|&event| event.data == device_fd as u64)
{
if let Ok(events) = device.events() {
for event in events {
if ((1_u32) << event._type) & evdev::KEY.bits() != 0
&& (event.value == 0 || event.value == 1)
{
let mut usec_delta = time_t1.tv_nsec / 1000 - event.time.tv_usec;
let mut sec_delta = time_t1.tv_sec - event.time.tv_sec;
if usec_delta < 0 {
usec_delta += 1000000;
sec_delta -= 1;
}
let delta = f64::min(
-0.0,
-(sec_delta as f64 + usec_delta as f64 / 1000000.0),
);
if delta < -0.100 {
// https://github.com/eras/ClickMuteJack/issues/6
println!(
for device in &mut local_devices {
if let Ok(events) = device.events() {
for event in events {
if ((1_u32) << event._type) & evdev::KEY.bits() != 0
&& (event.value == 0 || event.value == 1)
{
let mut usec_delta = time_t1.tv_nsec / 1000 - event.time.tv_usec;
let mut sec_delta = time_t1.tv_sec - event.time.tv_sec;
if usec_delta < 0 {
usec_delta += 1000000;
sec_delta -= 1;
}
let delta =
f64::min(-0.0, -(sec_delta as f64 + usec_delta as f64 / 1000000.0));
if delta < -0.100 {
// https://github.com/eras/ClickMuteJack/issues/6
println!(
"Dropped too old event value {} at {}+{} -> delta {} (issue #6)",
event.value, sec_delta, usec_delta, delta
);
} else {
clicked = match clicked {
None => Some((delta, delta)),
Some((oldest, newest)) => {
Some((f64::min(oldest, delta), f64::max(newest, delta)))
}
};
}
} else {
clicked = match clicked {
None => Some((delta, delta)),
Some((oldest, newest)) => {
Some((f64::min(oldest, delta), f64::max(newest, delta)))
}
};
}
}
} else {
// actually let's just ignore the error; we will
// re-enumerate the devices shortly
}
} else {
// actually let's just ignore the error; we will
// re-enumerate the devices shortly
}
}
// put it back 🙄
Expand Down

0 comments on commit 417cd5f

Please sign in to comment.