Improve mixer control protocol to avoid deadlock

This commit is contained in:
Ross Owen
2023-03-14 11:48:54 +00:00
parent 3b2814f8cb
commit 53a65344fc
2 changed files with 37 additions and 7 deletions

View File

@@ -155,6 +155,8 @@ static void updateMasterVol(int unitID, chanend ?c_mix_ctl)
#if (OUT_VOLUME_IN_MIXER) #if (OUT_VOLUME_IN_MIXER)
if (!isnull(c_mix_ctl)) if (!isnull(c_mix_ctl))
{ {
outct(c_mix_ctl, XS1_CT_END);
inct(c_mix_ctl);
outuint(c_mix_ctl, SET_MIX_OUT_VOL); outuint(c_mix_ctl, SET_MIX_OUT_VOL);
outuint(c_mix_ctl, i-1); outuint(c_mix_ctl, i-1);
outuint(c_mix_ctl, x); outuint(c_mix_ctl, x);
@@ -181,6 +183,8 @@ static void updateMasterVol(int unitID, chanend ?c_mix_ctl)
#if (IN_VOLUME_IN_MIXER) #if (IN_VOLUME_IN_MIXER)
if (!isnull(c_mix_ctl)) if (!isnull(c_mix_ctl))
{ {
outct(c_mix_ctl, XS1_CT_END);
inct(c_mix_ctl);
outuint(c_mix_ctl, SET_MIX_IN_VOL); outuint(c_mix_ctl, SET_MIX_IN_VOL);
outuint(c_mix_ctl, i-1); outuint(c_mix_ctl, i-1);
outuint(c_mix_ctl, x); outuint(c_mix_ctl, x);
@@ -228,6 +232,8 @@ static void updateVol(int unitID, int channel, chanend ?c_mix_ctl)
#if (OUT_VOLUME_IN_MIXER) #if (OUT_VOLUME_IN_MIXER)
if (!isnull(c_mix_ctl)) if (!isnull(c_mix_ctl))
{ {
outct(c_mix_ctl, XS1_CT_END);
inct(c_mix_ctl);
outuint(c_mix_ctl, SET_MIX_OUT_VOL); outuint(c_mix_ctl, SET_MIX_OUT_VOL);
outuint(c_mix_ctl, channel-1); outuint(c_mix_ctl, channel-1);
outuint(c_mix_ctl, x); outuint(c_mix_ctl, x);
@@ -250,6 +256,8 @@ static void updateVol(int unitID, int channel, chanend ?c_mix_ctl)
#if (IN_VOLUME_IN_MIXER) #if (IN_VOLUME_IN_MIXER)
if (!isnull(c_mix_ctl)) if (!isnull(c_mix_ctl))
{ {
outct(c_mix_ctl, XS1_CT_END);
inct(c_mix_ctl);
outuint(c_mix_ctl, SET_MIX_IN_VOL); outuint(c_mix_ctl, SET_MIX_IN_VOL);
outuint(c_mix_ctl, channel-1); outuint(c_mix_ctl, channel-1);
outuint(c_mix_ctl, x); outuint(c_mix_ctl, x);
@@ -267,6 +275,8 @@ static void updateVol(int unitID, int channel, chanend ?c_mix_ctl)
void UpdateMixerOutputRouting(chanend c_mix_ctl, unsigned map, unsigned dst, unsigned src) void UpdateMixerOutputRouting(chanend c_mix_ctl, unsigned map, unsigned dst, unsigned src)
{ {
outct(c_mix_ctl, XS1_CT_END);
inct(c_mix_ctl);
outuint(c_mix_ctl, map); outuint(c_mix_ctl, map);
outuint(c_mix_ctl, dst); outuint(c_mix_ctl, dst);
outuint(c_mix_ctl, src); outuint(c_mix_ctl, src);
@@ -275,6 +285,8 @@ void UpdateMixerOutputRouting(chanend c_mix_ctl, unsigned map, unsigned dst, uns
void UpdateMixMap(chanend c_mix_ctl, int mix, int input, int src) void UpdateMixMap(chanend c_mix_ctl, int mix, int input, int src)
{ {
outct(c_mix_ctl, XS1_CT_END);
inct(c_mix_ctl);
outuint(c_mix_ctl, SET_MIX_MAP); outuint(c_mix_ctl, SET_MIX_MAP);
outuint(c_mix_ctl, mix); /* Mix bus */ outuint(c_mix_ctl, mix); /* Mix bus */
outuint(c_mix_ctl, input); /* Mixer input (cn) */ outuint(c_mix_ctl, input); /* Mixer input (cn) */
@@ -284,6 +296,8 @@ void UpdateMixMap(chanend c_mix_ctl, int mix, int input, int src)
void UpdateMixerWeight(chanend c_mix_ctl, int mix, int index, unsigned mult) void UpdateMixerWeight(chanend c_mix_ctl, int mix, int index, unsigned mult)
{ {
outct(c_mix_ctl, XS1_CT_END);
inct(c_mix_ctl);
outuint(c_mix_ctl, SET_MIX_MULT); outuint(c_mix_ctl, SET_MIX_MULT);
outuint(c_mix_ctl, mix); outuint(c_mix_ctl, mix);
outuint(c_mix_ctl, index); outuint(c_mix_ctl, index);
@@ -1014,6 +1028,8 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c
{ {
if (!isnull(c_mix_ctl)) if (!isnull(c_mix_ctl))
{ {
outct(c_mix_ctl, XS1_CT_END);
inct(c_mix_ctl);
outuint(c_mix_ctl, GET_STREAM_LEVELS); outuint(c_mix_ctl, GET_STREAM_LEVELS);
outuint(c_mix_ctl, i); outuint(c_mix_ctl, i);
outct(c_mix_ctl, XS1_CT_END); outct(c_mix_ctl, XS1_CT_END);
@@ -1029,6 +1045,8 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c
{ {
if (!isnull(c_mix_ctl)) if (!isnull(c_mix_ctl))
{ {
outct(c_mix_ctl, XS1_CT_END);
inct(c_mix_ctl);
outuint(c_mix_ctl, GET_INPUT_LEVELS); outuint(c_mix_ctl, GET_INPUT_LEVELS);
outuint(c_mix_ctl, (i - NUM_USB_CHAN_OUT)); outuint(c_mix_ctl, (i - NUM_USB_CHAN_OUT));
outct(c_mix_ctl, XS1_CT_END); outct(c_mix_ctl, XS1_CT_END);
@@ -1051,6 +1069,8 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c
{ {
if (!isnull(c_mix_ctl)) if (!isnull(c_mix_ctl))
{ {
outct(c_mix_ctl, XS1_CT_END);
inct(c_mix_ctl);
outuint(c_mix_ctl, GET_OUTPUT_LEVELS); outuint(c_mix_ctl, GET_OUTPUT_LEVELS);
outuint(c_mix_ctl, i); outuint(c_mix_ctl, i);
outct(c_mix_ctl, XS1_CT_END); outct(c_mix_ctl, XS1_CT_END);

View File

@@ -361,6 +361,7 @@ static void mixer1(chanend c_host, chanend c_mix_ctl, chanend c_mixer2)
#endif #endif
#if (MAX_MIX_COUNT > 0) || (IN_VOLUME_IN_MIXER) || (OUT_VOLUME_IN_MIXER) || defined (LEVEL_METER_HOST) || defined(LEVEL_METER_LEDS) #if (MAX_MIX_COUNT > 0) || (IN_VOLUME_IN_MIXER) || (OUT_VOLUME_IN_MIXER) || defined (LEVEL_METER_HOST) || defined(LEVEL_METER_LEDS)
unsigned cmd; unsigned cmd;
unsigned char ct;
#endif #endif
unsigned request = 0; unsigned request = 0;
@@ -381,9 +382,18 @@ static void mixer1(chanend c_host, chanend c_mix_ctl, chanend c_mixer2)
#if (MAX_MIX_COUNT > 0) || (IN_VOLUME_IN_MIXER) || (OUT_VOLUME_IN_MIXER) || defined (LEVEL_METER_HOST) || defined(LEVEL_METER_LEDS) #if (MAX_MIX_COUNT > 0) || (IN_VOLUME_IN_MIXER) || (OUT_VOLUME_IN_MIXER) || defined (LEVEL_METER_HOST) || defined(LEVEL_METER_LEDS)
select select
{ {
case inuint_byref(c_mix_ctl, cmd): /* Check if EP0 intends to send us a control command */
case inct_byref(c_mix_ctl, ct):
{ {
int mix, index, val; int mix, index, val;
/* Handshake back to tell EP0 we are ready for an update */
outct(c_mix_ctl, XS1_CT_END);
/* Receive command from EP0 */
cmd = inuint(c_mix_ctl);
/* Interpret control command */
switch (cmd) switch (cmd)
{ {
#if (MAX_MIX_COUNT > 0) #if (MAX_MIX_COUNT > 0)