use crate::clap::plugin::{ClapParamPayload, NamClapShared};
use crate::common::spsc::GcItem;
use crate::models::StaticModel;
use rtrb::{Consumer, Producer};
use super::deactivated::DeactivatedDspState;
pub(crate) struct ActivateRollbackGuard<'a> {
shared: &'a NamClapShared,
pub(crate) param_rx: Option<Consumer<ClapParamPayload>>,
pub(crate) gc_tx: Option<Producer<GcItem>>,
pub(crate) slimmable_rx: Option<Consumer<Option<Box<StaticModel>>>>,
pub(crate) deactivated: Option<DeactivatedDspState>,
}
pub(crate) struct ActivatedResources {
pub(crate) param_rx: Consumer<ClapParamPayload>,
pub(crate) gc_tx: Producer<GcItem>,
pub(crate) slimmable_rx: Consumer<Option<Box<StaticModel>>>,
}
impl<'a> ActivateRollbackGuard<'a> {
pub(crate) fn new(shared: &'a NamClapShared) -> Self {
Self {
shared,
param_rx: None,
gc_tx: None,
slimmable_rx: None,
deactivated: None,
}
}
pub(crate) fn defuse(mut self) -> ActivatedResources {
let rx = self
.param_rx
.take()
.expect("param_rx must be set before defuse");
let tx = self.gc_tx.take().expect("gc_tx must be set before defuse");
let slimmable = self
.slimmable_rx
.take()
.expect("slimmable_rx must be set before defuse");
ActivatedResources {
param_rx: rx,
gc_tx: tx,
slimmable_rx: slimmable,
}
}
}
impl Drop for ActivateRollbackGuard<'_> {
fn drop(&mut self) {
if let Some(rx) = self.slimmable_rx.take()
&& let Ok(mut g) = self.shared.cold.slimmable_rx.lock()
{
*g = Some(rx);
}
if let Some(tx) = self.gc_tx.take()
&& let Ok(mut g) = self.shared.cold.gc_tx.lock()
{
*g = Some(tx);
}
if let Some(rx) = self.param_rx.take()
&& let Ok(mut g) = self.shared.cold.param_rx.lock()
{
*g = Some(rx);
}
if let Some(state) = self.deactivated.take()
&& let Ok(mut g) = self.shared.cold.deactivated_dsp.lock()
{
*g = Some(state);
}
}
}