Driver: Add ability to clear all global event handlers.

Closes #32. This should make event handler cleanup considerably easier depending on use case.
This commit is contained in:
Kyle Simpson
2021-01-17 21:29:19 +00:00
parent dcb6ad97b2
commit 55b8e7fb4e
6 changed files with 18 additions and 0 deletions

View File

@@ -238,6 +238,12 @@ impl Driver {
self.send(CoreMessage::AddEvent(EventData::new(event, action))); self.send(CoreMessage::AddEvent(EventData::new(event, action)));
} }
/// Removes all global event handlers from an audio context.
#[instrument(skip(self))]
pub fn remove_all_global_events(&mut self) {
self.send(CoreMessage::RemoveGlobalEvents);
}
/// Sends a message to the inner tasks, restarting it if necessary. /// Sends a message to the inner tasks, restarting it if necessary.
fn send(&mut self, status: CoreMessage) { fn send(&mut self, status: CoreMessage) {
// Restart thread if it errored. // Restart thread if it errored.

View File

@@ -43,6 +43,9 @@ pub(crate) async fn runner(_interconnect: Interconnect, evt_rx: Receiver<EventMe
global.fire_core_event(evt, ctx).await; global.fire_core_event(evt, ctx).await;
}, },
Ok(RemoveGlobalEvents) => {
global.remove_handlers();
},
Ok(AddTrack(store, state, handle)) => { Ok(AddTrack(store, state, handle)) => {
events.push(store); events.push(store);
states.push(state); states.push(state);

View File

@@ -18,6 +18,7 @@ pub enum CoreMessage {
AddTrack(Track), AddTrack(Track),
SetBitrate(Bitrate), SetBitrate(Bitrate),
AddEvent(EventData), AddEvent(EventData),
RemoveGlobalEvents,
SetConfig(Config), SetConfig(Config),
Mute(bool), Mute(bool),
Reconnect, Reconnect,

View File

@@ -12,6 +12,7 @@ pub enum EventMessage {
AddGlobalEvent(EventData), AddGlobalEvent(EventData),
AddTrackEvent(usize, EventData), AddTrackEvent(usize, EventData),
FireCoreEvent(CoreContext), FireCoreEvent(CoreContext),
RemoveGlobalEvents,
AddTrack(EventStore, TrackState, TrackHandle), AddTrack(EventStore, TrackState, TrackHandle),
ChangeState(usize, TrackStateChange), ChangeState(usize, TrackStateChange),

View File

@@ -109,6 +109,9 @@ async fn runner(mut config: Config, rx: Receiver<CoreMessage>, tx: Sender<CoreMe
Ok(CoreMessage::AddEvent(evt)) => { Ok(CoreMessage::AddEvent(evt)) => {
let _ = interconnect.events.send(EventMessage::AddGlobalEvent(evt)); let _ = interconnect.events.send(EventMessage::AddGlobalEvent(evt));
}, },
Ok(CoreMessage::RemoveGlobalEvents) => {
let _ = interconnect.events.send(EventMessage::RemoveGlobalEvents);
},
Ok(CoreMessage::Mute(m)) => { Ok(CoreMessage::Mute(m)) => {
let _ = interconnect.mixer.send(MixerMessage::SetMute(m)); let _ = interconnect.mixer.send(MixerMessage::SetMute(m));
}, },

View File

@@ -164,6 +164,10 @@ impl GlobalEvents {
holder.push(index); holder.push(index);
} }
pub(crate) fn remove_handlers(&mut self) {
self.store = EventStore::new();
}
pub(crate) async fn tick( pub(crate) async fn tick(
&mut self, &mut self,
events: &mut Vec<EventStore>, events: &mut Vec<EventStore>,