use protobuf::Message;
use crate::{
AndroidAutoConfiguration, AndroidAutoFrame, AndroidAutoMainTrait, AvChannelMessage,
ChannelHandlerTrait, ChannelId, FrameIoError, StreamMux, Wifi,
common::AndroidAutoCommonMessage,
};
pub struct AvInputChannelHandler {}
impl ChannelHandlerTrait for AvInputChannelHandler {
fn build_channel<T: AndroidAutoMainTrait + ?Sized>(
&self,
_config: &AndroidAutoConfiguration,
chanid: ChannelId,
_main: &T,
) -> Option<Wifi::ChannelDescriptor> {
let mut chan = Wifi::ChannelDescriptor::new();
chan.set_channel_id(chanid as u32);
let mut avchan = Wifi::AVInputChannel::new();
avchan.set_stream_type(Wifi::avstream_type::Enum::AUDIO);
let mut ac = Wifi::AudioConfig::new();
ac.set_bit_depth(16);
ac.set_channel_count(1);
ac.set_sample_rate(16000);
avchan.audio_config.0.replace(Box::new(ac));
chan.av_input_channel.0.replace(Box::new(avchan));
if !chan.is_initialized() {
panic!("Channel not initialized?");
}
Some(chan)
}
async fn receive_data<T: AndroidAutoMainTrait + ?Sized>(
&self,
msg: AndroidAutoFrame,
stream: &crate::WriteHalf,
_config: &AndroidAutoConfiguration,
main: &T,
) -> Result<(), super::FrameIoError> {
let channel = msg.header.channel_id;
let msg2: Result<AndroidAutoCommonMessage, String> = (&msg).try_into();
if let Ok(msg2) = msg2 {
match msg2 {
AndroidAutoCommonMessage::ChannelOpenResponse(_, _) => unimplemented!(),
AndroidAutoCommonMessage::ChannelOpenRequest(_m) => {
let mut m2 = Wifi::ChannelOpenResponse::new();
m2.set_status(Wifi::status::Enum::OK);
stream
.write_frame(
AndroidAutoCommonMessage::ChannelOpenResponse(channel, m2).into(),
)
.await?;
}
}
return Ok(());
}
let msg2: Result<AvChannelMessage, String> = (&msg).try_into();
if let Ok(msg2) = msg2 {
log::info!("Received: {channel} {:?}", msg2);
match msg2 {
AvChannelMessage::AvChannelOpen(_chan, m) => {
if m.open() {
main.open_input_channel()
.await
.map_err(|_| FrameIoError::AudioInputOpenError)?;
} else {
main.close_input_channel()
.await
.map_err(|_| FrameIoError::AudioInputCloseError)?;
}
}
AvChannelMessage::MediaIndicationAck(chan, ack) => {
main.audio_input_ack(chan, ack).await;
}
AvChannelMessage::MediaIndication(_chan, _timestamp, _data) => unimplemented!(),
AvChannelMessage::SetupRequest(_chan, _m) => {
let mut m2 = Wifi::AVChannelSetupResponse::new();
m2.set_max_unacked(10);
m2.set_media_status(Wifi::avchannel_setup_status::Enum::OK);
m2.configs.push(0);
stream
.write_frame(AvChannelMessage::SetupResponse(channel, m2).into())
.await?;
}
AvChannelMessage::SetupResponse(_chan, _m) => unimplemented!(),
AvChannelMessage::VideoFocusRequest(_chan, _m) => unimplemented!(),
AvChannelMessage::VideoIndicationResponse(_, _) => unimplemented!(),
AvChannelMessage::StartIndication(_, _) => {
main.start_input_audio().await;
}
AvChannelMessage::StopIndication(_, _) => {
main.stop_input_audio().await;
}
}
return Ok(());
}
todo!("{:x?}", msg);
}
}