diff --git a/src/config/device.rs b/src/config/device.rs index 4ed4c3a..b9ee9e0 100644 --- a/src/config/device.rs +++ b/src/config/device.rs @@ -33,7 +33,9 @@ impl DeviceConfig { let mut r = Vec::new(); if let Some(ev) = v { for e in ev { - r.push( e.run(Event::new().make_env(None, false)?.to_map(e.envconf.as_ref()))? ) ; + if let Some(v) = e.run(Event::new().make_env(None, false)?.to_map(e.envconf.as_ref()))? { + r.push(v); + } } } Ok(r) diff --git a/src/config/run.rs b/src/config/run.rs index b499a00..104fdd6 100644 --- a/src/config/run.rs +++ b/src/config/run.rs @@ -1,5 +1,5 @@ use std::collections::HashMap; -use std::process::Command; +use std::process::{Command, ExitStatus}; use super::serializer::RunConfigSerializer; use super::EventEnvMap; @@ -8,15 +8,24 @@ use super::EventEnvMap; pub struct RunConfig { pub args: Vec, pub envconf: Option, + pub detach: bool, } impl RunConfig { - pub fn run(&self, env: HashMap<&str, String>) -> Result { + pub fn run(&self, env: HashMap<&str, String>) -> Result, std::io::Error> { let mut c = Command::new(&self.args[0]); if self.args.len() > 1 { c.args(&self.args[1..]); } - c.envs(env).status() + c.envs(env); + if self.detach { + std::thread::spawn(move || { + c.status() + }); + Ok(None) + } else { + c.status().map(|v| Some(v)) + } } } @@ -36,6 +45,7 @@ impl TryFrom for RunConfig { RunConfig { args, envconf: v.envconf, + detach: v.detach.unwrap_or(false), } ) } diff --git a/src/config/serializer/run.rs b/src/config/serializer/run.rs index c06ff84..87556e0 100644 --- a/src/config/serializer/run.rs +++ b/src/config/serializer/run.rs @@ -8,4 +8,5 @@ pub struct RunConfigSerializer { pub args: Option>, pub cmd: Option, pub envconf: Option, + pub detach: Option, } diff --git a/test/vmpk.yml b/test/vmpk.yml index d5057d1..a9546b0 100644 --- a/test/vmpk.yml +++ b/test/vmpk.yml @@ -23,6 +23,12 @@ devices: channel: 0 run: - cmd: "echo [$channel] NoteOn $id $value $raw" + - type: NoteOff + id: 30-127 + channel: 0 + run: + - cmd: "for I in $(seq 1 3) ; do echo wait $I ; sleep 1; done" + detach: true - type: PitchBend remap: 0-100 float: true