Send DTMF events typed

This commit is contained in:
Rafael Caricio 2023-03-26 19:49:26 +02:00
parent 7b56793c52
commit 3b046bdff3
Signed by: rafaelcaricio
GPG key ID: 3C86DBCE8E93C947

View file

@ -14,19 +14,27 @@ static CAT: Lazy<gst::DebugCategory> = Lazy::new(|| {
}); });
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
struct DtmfEvent { enum DtmfEvent {
number: Option<i32>, Start(DtmfStart),
volume: Option<i32>, End(i32),
start: bool, }
#[derive(Debug, Clone)]
struct DtmfStart {
number: i32,
volume: i32,
} }
impl DtmfEvent { impl DtmfEvent {
fn from_number(number: i32) -> Self { fn start(number: i32) -> Self {
Self { number: Some(number), volume: Some(36), start: true } Self::Start(DtmfStart { number, volume: 36 })
} }
fn end(&self) -> Self { fn end(self) -> Self {
Self { number: None, volume: None, start: false } match self {
Self::Start(start) => Self::End(start.number),
Self::End(_) => self,
}
} }
} }
@ -38,26 +46,35 @@ impl TryFrom<&gst::StructureRef> for DtmfEvent {
if !name.starts_with("dtmf-event") { if !name.starts_with("dtmf-event") {
anyhow::bail!("Not a dtmf-event structure: {name}"); anyhow::bail!("Not a dtmf-event structure: {name}");
} }
let number = structure.get_optional::<i32>("number")?; let number = structure.get::<i32>("number")?;
let volume = structure.get_optional::<i32>("volume")?; return if structure.get::<bool>("start")? {
let start = structure.get::<bool>("start")?; let volume = structure.get::<i32>("volume")?;
Ok(Self { number, volume, start }) Ok(Self::Start(DtmfStart { number, volume }))
} else {
Ok(Self::End(number))
}
} }
} }
impl From<DtmfEvent> for gst::Structure { impl From<DtmfEvent> for gst::Structure {
fn from(event: DtmfEvent) -> Self { fn from(event: DtmfEvent) -> Self {
let mut st = gst::Structure::builder("dtmf-event") match event {
.field("type", 1) DtmfEvent::Start(start) => {
.field("start", event.start) gst::Structure::builder("dtmf-event")
.build(); .field("type", 1)
if let Some(number) = event.number { .field("start", true)
st.set("number", number); .field("number", start.number)
.field("volume", start.volume)
.build()
}
DtmfEvent::End(number) => {
gst::Structure::builder("dtmf-event")
.field("type", 1)
.field("start", false)
.field("number", number)
.build()
}
} }
if let Some(volume) = event.volume {
st.set("volume", volume);
}
st
} }
} }
@ -103,7 +120,7 @@ fn main() -> Result<()> {
let dtmf_event = match DtmfEvent::try_from(element.structure().unwrap()) { let dtmf_event = match DtmfEvent::try_from(element.structure().unwrap()) {
Ok(ev) => ev, Ok(ev) => ev,
Err(err) => { Err(err) => {
gst::error!(CAT, "Failed to parse DTMF event {:?} with error: {:?}", element.structure().unwrap(), err); gst::info!(CAT, "Failed to parse DTMF event {:?} with error: {:?}", element.structure().unwrap(), err);
return glib::Continue(true); return glib::Continue(true);
} }
}; };
@ -112,10 +129,13 @@ fn main() -> Result<()> {
gst::info!(CAT, "Detected DTMF event"); gst::info!(CAT, "Detected DTMF event");
} }
"dtmf-event-processed" => { "dtmf-event-processed" => {
if dtmf_event.start { match dtmf_event {
gst::info!(CAT, "DTMF event processed: {:?}", dtmf_event); DtmfEvent::Start(start) => {
} else { gst::info!(CAT, "DTMF event {} processed", start.number);
gst::info!(CAT, "Ending DTMF event processed"); }
DtmfEvent::End(number) => {
gst::info!(CAT, "Ending DTMF event {number} processed");
}
} }
} }
_ => { _ => {
@ -142,7 +162,7 @@ fn main() -> Result<()> {
let mut rng = rand::thread_rng(); let mut rng = rand::thread_rng();
loop { loop {
let dtmf_event = DtmfEvent::from_number(rng.gen_range(0..15)); let dtmf_event = DtmfEvent::start(rng.gen_range(0..15));
source.send_event(gst::event::CustomUpstream::new(dtmf_event.clone().into())); source.send_event(gst::event::CustomUpstream::new(dtmf_event.clone().into()));
gst::info!(CAT, "Sent DTMF event {:?}", dtmf_event); gst::info!(CAT, "Sent DTMF event {:?}", dtmf_event);