use super::*;
#[derive(Default, Debug)]
pub struct ItwinProtocol;
impl TcatOperation for ItwinProtocol {}
impl TcatGlobalSectionSpecification for ItwinProtocol {}
pub type ItwinKnobSegment = TcKonnektSegment<ItwinKnob>;
pub type ItwinConfigSegment = TcKonnektSegment<ItwinConfig>;
pub type ItwinMixerStateSegment = TcKonnektSegment<ItwinMixerState>;
pub type ItwinReverbStateSegment = TcKonnektSegment<ItwinReverbState>;
pub type ItwinChStripStatesSegment = TcKonnektSegment<ItwinChStripStates>;
pub type ItwinMixerMeterSegment = TcKonnektSegment<ItwinMixerMeter>;
pub type ItwinHwStateSegment = TcKonnektSegment<ItwinHwState>;
pub type ItwinReverbMeterSegment = TcKonnektSegment<ItwinReverbMeter>;
pub type ItwinChStripMetersSegment = TcKonnektSegment<ItwinChStripMeters>;
macro_rules! segment_default {
($p:ty, $t:ty) => {
impl Default for TcKonnektSegment<$t> {
fn default() -> Self {
Self {
data: <$t>::default(),
raw: vec![0; <$p as TcKonnektSegmentSerdes<$t>>::SIZE],
}
}
}
};
}
segment_default!(ItwinProtocol, ItwinKnob);
segment_default!(ItwinProtocol, ItwinConfig);
segment_default!(ItwinProtocol, ItwinMixerState);
segment_default!(ItwinProtocol, ItwinReverbState);
segment_default!(ItwinProtocol, ItwinChStripStates);
segment_default!(ItwinProtocol, ItwinMixerMeter);
segment_default!(ItwinProtocol, ItwinHwState);
segment_default!(ItwinProtocol, ItwinReverbMeter);
segment_default!(ItwinProtocol, ItwinChStripMeters);
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct ItwinKnob {
pub target: ShellKnob0Target,
pub clock_recovery: bool,
}
impl Default for ItwinKnob {
fn default() -> Self {
Self {
target: <ItwinProtocol as ShellKnob0TargetSpecification>::KNOB0_TARGETS[0],
clock_recovery: Default::default(),
}
}
}
impl ShellKnob0TargetSpecification for ItwinProtocol {
const KNOB0_TARGETS: &'static [ShellKnob0Target] = &[
ShellKnob0Target::ChannelStrip0,
ShellKnob0Target::ChannelStrip1,
ShellKnob0Target::Reverb,
ShellKnob0Target::Mixer,
];
}
impl TcKonnektSegmentSerdes<ItwinKnob> for ItwinProtocol {
const NAME: &'static str = "knob";
const OFFSET: usize = 0x0004;
const SIZE: usize = SHELL_KNOB_SEGMENT_SIZE;
fn serialize(params: &ItwinKnob, raw: &mut [u8]) -> Result<(), String> {
serialize_knob0_target::<ItwinProtocol>(¶ms.target, &mut raw[..4])?;
serialize_bool(¶ms.clock_recovery, &mut raw[8..12]);
Ok(())
}
fn deserialize(params: &mut ItwinKnob, raw: &[u8]) -> Result<(), String> {
deserialize_knob0_target::<ItwinProtocol>(&mut params.target, &raw[..4])?;
deserialize_bool(&mut params.clock_recovery, &raw[8..12]);
Ok(())
}
}
impl TcKonnektMutableSegmentOperation<ItwinKnob> for ItwinProtocol {}
impl TcKonnektNotifiedSegmentOperation<ItwinKnob> for ItwinProtocol {
const NOTIFY_FLAG: u32 = SHELL_KNOB_NOTIFY_FLAG;
}
impl AsRef<ShellKnob0Target> for ItwinKnob {
fn as_ref(&self) -> &ShellKnob0Target {
&self.target
}
}
impl AsMut<ShellKnob0Target> for ItwinKnob {
fn as_mut(&mut self) -> &mut ShellKnob0Target {
&mut self.target
}
}
pub const ITWIN_PHYS_OUT_PAIR_COUNT: usize = 7;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum ItwinOutputPairSrc {
MixerOut01,
Analog01,
Analog23,
Spdif01,
Adat01,
Adat23,
Adat45,
Adat67,
Stream01,
Stream23,
Stream45,
Stream67,
Stream89,
Stream1011,
Stream1213,
MixerSend01,
}
impl Default for ItwinOutputPairSrc {
fn default() -> Self {
Self::MixerOut01
}
}
const OUTPUT_PAIR_SOURCES: &[ItwinOutputPairSrc] = &[
ItwinOutputPairSrc::MixerOut01,
ItwinOutputPairSrc::Analog01,
ItwinOutputPairSrc::Analog23,
ItwinOutputPairSrc::Spdif01,
ItwinOutputPairSrc::Adat01,
ItwinOutputPairSrc::Adat23,
ItwinOutputPairSrc::Adat45,
ItwinOutputPairSrc::Adat67,
ItwinOutputPairSrc::Stream01,
ItwinOutputPairSrc::Stream23,
ItwinOutputPairSrc::Stream45,
ItwinOutputPairSrc::Stream67,
ItwinOutputPairSrc::Stream89,
ItwinOutputPairSrc::Stream1011,
ItwinOutputPairSrc::Stream1213,
ItwinOutputPairSrc::MixerSend01,
];
const OUTPUT_PAIR_SOURCE_LABEL: &str = "output pair source";
fn serialize_output_pair_src(src: &ItwinOutputPairSrc, raw: &mut [u8]) -> Result<(), String> {
serialize_position(OUTPUT_PAIR_SOURCES, src, raw, OUTPUT_PAIR_SOURCE_LABEL)
}
fn deserialize_output_pair_src(src: &mut ItwinOutputPairSrc, raw: &[u8]) -> Result<(), String> {
deserialize_position(OUTPUT_PAIR_SOURCES, src, raw, OUTPUT_PAIR_SOURCE_LABEL)
}
#[derive(Default, Debug, Copy, Clone, PartialEq, Eq)]
pub struct ItwinConfig {
pub mixer_stream_src_pair: ShellMixerStreamSourcePair,
pub standalone_src: ShellStandaloneClockSource,
pub standalone_rate: TcKonnektStandaloneClockRate,
pub output_pair_src: [ItwinOutputPairSrc; ITWIN_PHYS_OUT_PAIR_COUNT],
}
impl ShellMixerStreamSourcePairSpecification for ItwinProtocol {
const MIXER_STREAM_SOURCE_PAIRS: &'static [ShellMixerStreamSourcePair] = &[
ShellMixerStreamSourcePair::Stream0_1,
ShellMixerStreamSourcePair::Stream2_3,
ShellMixerStreamSourcePair::Stream4_5,
ShellMixerStreamSourcePair::Stream6_7,
ShellMixerStreamSourcePair::Stream8_9,
ShellMixerStreamSourcePair::Stream10_11,
ShellMixerStreamSourcePair::Stream12_13,
];
}
impl ShellStandaloneClockSpecification for ItwinProtocol {
const STANDALONE_CLOCK_SOURCES: &'static [ShellStandaloneClockSource] = &[
ShellStandaloneClockSource::Optical,
ShellStandaloneClockSource::Coaxial,
ShellStandaloneClockSource::Internal,
];
}
impl TcKonnektSegmentSerdes<ItwinConfig> for ItwinProtocol {
const NAME: &'static str = "configuration";
const OFFSET: usize = 0x0028;
const SIZE: usize = 168;
fn serialize(params: &ItwinConfig, raw: &mut [u8]) -> Result<(), String> {
serialize_mixer_stream_source_pair::<ItwinProtocol>(
¶ms.mixer_stream_src_pair,
&mut raw[24..28],
)?;
serialize_standalone_clock_source::<ItwinProtocol>(
¶ms.standalone_src,
&mut raw[28..32],
)?;
serialize_standalone_clock_rate(¶ms.standalone_rate, &mut raw[32..36])?;
params
.output_pair_src
.iter()
.enumerate()
.try_for_each(|(i, src)| {
let pos = 120 + i * 4;
serialize_output_pair_src(src, &mut raw[pos..(pos + 4)])
})?;
Ok(())
}
fn deserialize(params: &mut ItwinConfig, raw: &[u8]) -> Result<(), String> {
deserialize_mixer_stream_source_pair::<ItwinProtocol>(
&mut params.mixer_stream_src_pair,
&raw[24..28],
)?;
deserialize_standalone_clock_source::<ItwinProtocol>(
&mut params.standalone_src,
&raw[28..32],
)?;
deserialize_standalone_clock_rate(&mut params.standalone_rate, &raw[32..36])?;
params
.output_pair_src
.iter_mut()
.enumerate()
.try_for_each(|(i, src)| {
let pos = 120 + i * 4;
deserialize_output_pair_src(src, &raw[pos..(pos + 4)])
})?;
Ok(())
}
}
impl TcKonnektMutableSegmentOperation<ItwinConfig> for ItwinProtocol {}
impl TcKonnektNotifiedSegmentOperation<ItwinConfig> for ItwinProtocol {
const NOTIFY_FLAG: u32 = SHELL_CONFIG_NOTIFY_FLAG;
}
impl AsRef<ShellStandaloneClockSource> for ItwinConfig {
fn as_ref(&self) -> &ShellStandaloneClockSource {
&self.standalone_src
}
}
impl AsMut<ShellStandaloneClockSource> for ItwinConfig {
fn as_mut(&mut self) -> &mut ShellStandaloneClockSource {
&mut self.standalone_src
}
}
impl AsRef<TcKonnektStandaloneClockRate> for ItwinConfig {
fn as_ref(&self) -> &TcKonnektStandaloneClockRate {
&self.standalone_rate
}
}
impl AsMut<TcKonnektStandaloneClockRate> for ItwinConfig {
fn as_mut(&mut self) -> &mut TcKonnektStandaloneClockRate {
&mut self.standalone_rate
}
}
impl AsRef<ShellMixerStreamSourcePair> for ItwinConfig {
fn as_ref(&self) -> &ShellMixerStreamSourcePair {
&self.mixer_stream_src_pair
}
}
impl AsMut<ShellMixerStreamSourcePair> for ItwinConfig {
fn as_mut(&mut self) -> &mut ShellMixerStreamSourcePair {
&mut self.mixer_stream_src_pair
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ItwinMixerState {
pub mixer: ShellMixerState,
pub stream_mix_balance: u32,
pub enabled: bool,
}
impl Default for ItwinMixerState {
fn default() -> Self {
ItwinMixerState {
mixer: ItwinProtocol::create_mixer_state(),
enabled: Default::default(),
stream_mix_balance: Default::default(),
}
}
}
impl ShellMixerStateSpecification for ItwinProtocol {
const MONITOR_SRC_MAP: [Option<ShellMixerMonitorSrcType>; SHELL_MIXER_MONITOR_SRC_COUNT] = [
Some(ShellMixerMonitorSrcType::Stream),
None,
None,
Some(ShellMixerMonitorSrcType::Spdif),
Some(ShellMixerMonitorSrcType::Analog),
Some(ShellMixerMonitorSrcType::Analog),
Some(ShellMixerMonitorSrcType::AdatSpdif),
Some(ShellMixerMonitorSrcType::Adat),
Some(ShellMixerMonitorSrcType::Adat),
Some(ShellMixerMonitorSrcType::Adat),
];
}
impl TcKonnektSegmentSerdes<ItwinMixerState> for ItwinProtocol {
const NAME: &'static str = "mixer-state";
const OFFSET: usize = 0x00d0;
const SIZE: usize = ShellMixerState::SIZE + 56;
fn serialize(params: &ItwinMixerState, raw: &mut [u8]) -> Result<(), String> {
serialize_mixer_state::<ItwinProtocol>(¶ms.mixer, raw)?;
serialize_u32(¶ms.stream_mix_balance, &mut raw[348..352]);
serialize_bool(¶ms.enabled, &mut raw[352..356]);
Ok(())
}
fn deserialize(params: &mut ItwinMixerState, raw: &[u8]) -> Result<(), String> {
deserialize_mixer_state::<ItwinProtocol>(&mut params.mixer, raw)?;
deserialize_u32(&mut params.stream_mix_balance, &raw[348..352]);
deserialize_bool(&mut params.enabled, &raw[352..356]);
Ok(())
}
}
impl TcKonnektMutableSegmentOperation<ItwinMixerState> for ItwinProtocol {}
impl TcKonnektNotifiedSegmentOperation<ItwinMixerState> for ItwinProtocol {
const NOTIFY_FLAG: u32 = SHELL_MIXER_NOTIFY_FLAG;
}
impl AsRef<ShellMixerState> for ItwinMixerState {
fn as_ref(&self) -> &ShellMixerState {
&self.mixer
}
}
impl AsMut<ShellMixerState> for ItwinMixerState {
fn as_mut(&mut self) -> &mut ShellMixerState {
&mut self.mixer
}
}
#[derive(Default, Debug, Copy, Clone, PartialEq, Eq)]
pub struct ItwinReverbState(pub ReverbState);
impl TcKonnektSegmentSerdes<ItwinReverbState> for ItwinProtocol {
const NAME: &'static str = "reverb-state";
const OFFSET: usize = 0x0244;
const SIZE: usize = ReverbState::SIZE;
fn serialize(params: &ItwinReverbState, raw: &mut [u8]) -> Result<(), String> {
serialize_reverb_state(¶ms.0, raw)
}
fn deserialize(params: &mut ItwinReverbState, raw: &[u8]) -> Result<(), String> {
deserialize_reverb_state(&mut params.0, raw)
}
}
impl TcKonnektMutableSegmentOperation<ItwinReverbState> for ItwinProtocol {}
impl TcKonnektNotifiedSegmentOperation<ItwinReverbState> for ItwinProtocol {
const NOTIFY_FLAG: u32 = SHELL_REVERB_NOTIFY_FLAG;
}
impl AsRef<ReverbState> for ItwinReverbState {
fn as_ref(&self) -> &ReverbState {
&self.0
}
}
impl AsMut<ReverbState> for ItwinReverbState {
fn as_mut(&mut self) -> &mut ReverbState {
&mut self.0
}
}
#[derive(Default, Debug, Copy, Clone, PartialEq, Eq)]
pub struct ItwinChStripStates(pub [ChStripState; SHELL_CH_STRIP_COUNT]);
impl TcKonnektSegmentSerdes<ItwinChStripStates> for ItwinProtocol {
const NAME: &'static str = "channel-strip-state";
const OFFSET: usize = 0x028c;
const SIZE: usize = ChStripState::SIZE * SHELL_CH_STRIP_COUNT + 4;
fn serialize(params: &ItwinChStripStates, raw: &mut [u8]) -> Result<(), String> {
serialize_ch_strip_states(¶ms.0, raw)
}
fn deserialize(params: &mut ItwinChStripStates, raw: &[u8]) -> Result<(), String> {
deserialize_ch_strip_states(&mut params.0, raw)
}
}
impl TcKonnektMutableSegmentOperation<ItwinChStripStates> for ItwinProtocol {}
impl TcKonnektNotifiedSegmentOperation<ItwinChStripStates> for ItwinProtocol {
const NOTIFY_FLAG: u32 = SHELL_CH_STRIP_NOTIFY_FLAG;
}
impl AsRef<[ChStripState]> for ItwinChStripStates {
fn as_ref(&self) -> &[ChStripState] {
&self.0
}
}
impl AsMut<[ChStripState]> for ItwinChStripStates {
fn as_mut(&mut self) -> &mut [ChStripState] {
&mut self.0
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum ListeningMode {
Monaural,
Stereo,
Side,
}
impl Default for ListeningMode {
fn default() -> Self {
Self::Monaural
}
}
const LISTENING_MODES: &[ListeningMode] = &[
ListeningMode::Monaural,
ListeningMode::Stereo,
ListeningMode::Side,
];
const LISTENING_MODE_LABEL: &str = "listening mode";
fn serialize_listening_mode(mode: &ListeningMode, raw: &mut [u8]) -> Result<(), String> {
serialize_position(LISTENING_MODES, mode, raw, LISTENING_MODE_LABEL)
}
fn deserialize_listening_mode(mode: &mut ListeningMode, raw: &[u8]) -> Result<(), String> {
deserialize_position(LISTENING_MODES, mode, raw, LISTENING_MODE_LABEL)
}
#[derive(Default, Debug, Copy, Clone, PartialEq, Eq)]
pub struct ItwinHwState {
pub hw_state: ShellHwState,
pub listening_mode: ListeningMode,
}
impl TcKonnektSegmentSerdes<ItwinHwState> for ItwinProtocol {
const NAME: &'static str = "hardware-state";
const OFFSET: usize = 0x1008;
const SIZE: usize = ShellHwState::SIZE;
fn serialize(params: &ItwinHwState, raw: &mut [u8]) -> Result<(), String> {
serialize_hw_state(¶ms.hw_state, raw)?;
serialize_listening_mode(¶ms.listening_mode, &mut raw[8..12])?;
Ok(())
}
fn deserialize(params: &mut ItwinHwState, raw: &[u8]) -> Result<(), String> {
deserialize_hw_state(&mut params.hw_state, raw)?;
deserialize_listening_mode(&mut params.listening_mode, &raw[8..12])?;
Ok(())
}
}
impl TcKonnektMutableSegmentOperation<ItwinHwState> for ItwinProtocol {}
impl TcKonnektNotifiedSegmentOperation<ItwinHwState> for ItwinProtocol {
const NOTIFY_FLAG: u32 = SHELL_HW_STATE_NOTIFY_FLAG;
}
impl AsRef<ShellHwState> for ItwinHwState {
fn as_ref(&self) -> &ShellHwState {
&self.hw_state
}
}
impl AsMut<ShellHwState> for ItwinHwState {
fn as_mut(&mut self) -> &mut ShellHwState {
&mut self.hw_state
}
}
impl AsRef<FireWireLedState> for ItwinHwState {
fn as_ref(&self) -> &FireWireLedState {
&self.hw_state.firewire_led
}
}
impl AsMut<FireWireLedState> for ItwinHwState {
fn as_mut(&mut self) -> &mut FireWireLedState {
&mut self.hw_state.firewire_led
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ItwinMixerMeter(pub ShellMixerMeter);
impl Default for ItwinMixerMeter {
fn default() -> Self {
ItwinMixerMeter(ItwinProtocol::create_meter_state())
}
}
impl ShellMixerMeterSpecification for ItwinProtocol {
const ANALOG_INPUT_COUNT: usize = 4;
const DIGITAL_INPUT_COUNT: usize = 8;
}
impl TcKonnektSegmentSerdes<ItwinMixerMeter> for ItwinProtocol {
const NAME: &'static str = "mixer-meter";
const OFFSET: usize = 0x106c;
const SIZE: usize = ShellMixerMeter::SIZE;
fn serialize(params: &ItwinMixerMeter, raw: &mut [u8]) -> Result<(), String> {
serialize_mixer_meter::<ItwinProtocol>(¶ms.0, raw)
}
fn deserialize(params: &mut ItwinMixerMeter, raw: &[u8]) -> Result<(), String> {
deserialize_mixer_meter::<ItwinProtocol>(&mut params.0, raw)
}
}
impl AsRef<ShellMixerMeter> for ItwinMixerMeter {
fn as_ref(&self) -> &ShellMixerMeter {
&self.0
}
}
impl AsMut<ShellMixerMeter> for ItwinMixerMeter {
fn as_mut(&mut self) -> &mut ShellMixerMeter {
&mut self.0
}
}
#[derive(Default, Debug, Copy, Clone, PartialEq, Eq)]
pub struct ItwinReverbMeter(pub ReverbMeter);
impl TcKonnektSegmentSerdes<ItwinReverbMeter> for ItwinProtocol {
const NAME: &'static str = "reverb-meter";
const OFFSET: usize = 0x10c8;
const SIZE: usize = ReverbMeter::SIZE;
fn serialize(params: &ItwinReverbMeter, raw: &mut [u8]) -> Result<(), String> {
serialize_reverb_meter(¶ms.0, raw)
}
fn deserialize(params: &mut ItwinReverbMeter, raw: &[u8]) -> Result<(), String> {
deserialize_reverb_meter(&mut params.0, raw)
}
}
impl AsRef<ReverbMeter> for ItwinReverbMeter {
fn as_ref(&self) -> &ReverbMeter {
&self.0
}
}
impl AsMut<ReverbMeter> for ItwinReverbMeter {
fn as_mut(&mut self) -> &mut ReverbMeter {
&mut self.0
}
}
#[derive(Default, Debug, Copy, Clone, PartialEq, Eq)]
pub struct ItwinChStripMeters(pub [ChStripMeter; SHELL_CH_STRIP_COUNT]);
impl TcKonnektSegmentSerdes<ItwinChStripMeters> for ItwinProtocol {
const NAME: &'static str = "channel-strip-meter";
const OFFSET: usize = 0x10e0;
const SIZE: usize = ChStripMeter::SIZE * SHELL_CH_STRIP_COUNT + 4;
fn serialize(params: &ItwinChStripMeters, raw: &mut [u8]) -> Result<(), String> {
serialize_ch_strip_meters(¶ms.0, raw)
}
fn deserialize(params: &mut ItwinChStripMeters, raw: &[u8]) -> Result<(), String> {
deserialize_ch_strip_meters(&mut params.0, raw)
}
}
impl AsRef<[ChStripMeter]> for ItwinChStripMeters {
fn as_ref(&self) -> &[ChStripMeter] {
&self.0
}
}
impl AsMut<[ChStripMeter]> for ItwinChStripMeters {
fn as_mut(&mut self) -> &mut [ChStripMeter] {
&mut self.0
}
}