Adds mics master level. Adds set/get to bridge for scaled volume (0-65535) which accounts for min/max settings on DMPS.

This commit is contained in:
Alex Johnson
2021-10-01 18:10:57 -04:00
parent c65616a426
commit c296ef9e21
2 changed files with 106 additions and 15 deletions

View File

@@ -24,7 +24,8 @@ namespace PepperDash.Essentials.DM
Card.Dmps3OutputBase OutputCard;
public DmpsAudioOutput MasterVolumeLevel { get; private set; }
public DmpsAudioOutput SourceVolumeLevel { get; private set; }
public DmpsAudioOutput SourceVolumeLevel { get; private set; }
public DmpsAudioOutput MicsMasterVolumeLevel { get; private set; }
public DmpsAudioOutput Codec1VolumeLevel { get; private set; }
public DmpsAudioOutput Codec2VolumeLevel { get; private set; }
@@ -37,12 +38,11 @@ namespace PepperDash.Essentials.DM
OutputCard.BaseDevice.DMOutputChange += new DMOutputEventHandler(BaseDevice_DMOutputChange);
MasterVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Master);
SourceVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Source);
SourceVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Source);
MicsMasterVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.MicsMaster);
if (card is Card.Dmps3ProgramOutput)
{
//(card as Card.Dmps3ProgramOutput).OutputMixer.MicLevel
//TODO: Hook up mic levels and mutes
Codec1VolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Codec1);
Codec2VolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Codec2);
}
@@ -74,6 +74,16 @@ namespace PepperDash.Essentials.DM
{
SourceVolumeLevel.VolumeLevelFeedback.FireUpdate();
break;
}
case DMOutputEventIds.MicMasterLevelFeedBackEventId:
{
MicsMasterVolumeLevel.VolumeLevelFeedback.FireUpdate();
break;
}
case DMOutputEventIds.MicMasterMuteOnFeedBackEventId:
{
MicsMasterVolumeLevel.MuteFeedback.FireUpdate();
break;
}
case DMOutputEventIds.Codec1LevelFeedBackEventId:
{
@@ -130,6 +140,11 @@ namespace PepperDash.Essentials.DM
if (SourceVolumeLevel != null)
{
SetUpDmpsAudioOutputJoins(trilist, SourceVolumeLevel, joinMap.SourceVolumeLevel.JoinNumber);
}
if (MicsMasterVolumeLevel != null)
{
SetUpDmpsAudioOutputJoins(trilist, MicsMasterVolumeLevel, joinMap.MicsMasterVolumeLevel.JoinNumber);
}
if (Codec1VolumeLevel != null)
@@ -146,15 +161,18 @@ namespace PepperDash.Essentials.DM
static void SetUpDmpsAudioOutputJoins(BasicTriList trilist, DmpsAudioOutput output, uint joinStart)
{
var volumeLevelJoin = joinStart;
var volumeLevelJoin = joinStart;
var volumeLevelScaledJoin = joinStart + 1;
var muteOnJoin = joinStart;
var muteOffJoin = joinStart + 1;
var volumeUpJoin = joinStart + 2;
var volumeDownJoin = joinStart + 3;
trilist.SetUShortSigAction(volumeLevelJoin, output.SetVolume);
output.VolumeLevelFeedback.LinkInputSig(trilist.UShortInput[volumeLevelJoin]);
output.VolumeLevelFeedback.LinkInputSig(trilist.UShortInput[volumeLevelJoin]);
trilist.SetUShortSigAction(volumeLevelScaledJoin, output.SetVolumeScaled);
output.VolumeLevelScaledFeedback.LinkInputSig(trilist.UShortInput[volumeLevelScaledJoin]);
trilist.SetSigTrueAction(muteOnJoin, output.MuteOn);
output.MuteFeedback.LinkInputSig(trilist.BooleanInput[muteOnJoin]);
@@ -170,12 +188,15 @@ namespace PepperDash.Essentials.DM
{
Card.Dmps3OutputBase Output;
UShortInputSig Level;
UShortInputSig Level;
UShortOutputSig MinLevel;
UShortOutputSig MaxLevel;
eDmpsLevelType Type;
public BoolFeedback MuteFeedback { get; private set; }
public IntFeedback VolumeLevelFeedback { get; private set; }
public IntFeedback VolumeLevelFeedback { get; private set; }
public IntFeedback VolumeLevelScaledFeedback { get; private set; }
Action MuteOnAction;
Action MuteOffAction;
@@ -186,7 +207,10 @@ namespace PepperDash.Essentials.DM
{
Output = output;
Type = type;
Type = type;
MinLevel = (output as Card.Dmps3ProgramOutput).OutputMixer.MinVolumeFeedback;
MaxLevel = (output as Card.Dmps3ProgramOutput).OutputMixer.MaxVolumeFeedback;
switch (type)
{
@@ -200,7 +224,6 @@ namespace PepperDash.Essentials.DM
MuteOffAction = new Action(Output.MasterMuteOff);
VolumeUpAction = new Action<bool>((b) => Output.MasterVolumeUp.BoolValue = b);
VolumeDownAction = new Action<bool>((b) => Output.MasterVolumeDown.BoolValue = b);
break;
}
@@ -291,14 +314,43 @@ namespace PepperDash.Essentials.DM
}
break;
}
}
}
VolumeLevelScaledFeedback = new IntFeedback(new Func<int>(() => ScaleVolumeFeedback(VolumeLevelFeedback.UShortValue)));
}
public void SetVolumeScaled(ushort level)
{
//Master fader scaling depends on min and max settings on DMPS
if (Type == eDmpsLevelType.Master)
{
Level.UShortValue = (ushort)(level * (MaxLevel.UShortValue - MinLevel.UShortValue) / 65535 + MinLevel.UShortValue);
}
// Other faders have min = -800 and max = 100
else
{
Level.UShortValue = (ushort)(level * 900 / 65535 - 800);
}
}
public ushort ScaleVolumeFeedback(ushort level)
{
//Master fader scaling depends on min and max settings on DMPS
if (Type == eDmpsLevelType.Master)
{
return (ushort)((level - MinLevel.UShortValue) * 65535 / (MaxLevel.UShortValue - MinLevel.UShortValue));
}
// Other faders have min = -800 and max = 100
else
{
return (ushort)((level + 800) * 65535 / 900);
}
}
#region IBasicVolumeWithFeedback Members
public void SetVolume(ushort level)
{
{
Level.UShortValue = level;
}