Merge pull request #322 from xross/fix/sw_usb_audio_152

Tidy up of volume control. Removal of xc_ptr.h in favour of built in xc pointers
This commit is contained in:
Ross Owen
2023-04-04 14:15:07 +01:00
committed by GitHub
4 changed files with 77 additions and 65 deletions

View File

@@ -1194,7 +1194,8 @@ enum USBEndpointNumber_Out
#define AUDIO_START_FROM_DFU (0x87654321) #define AUDIO_START_FROM_DFU (0x87654321)
#define AUDIO_REBOOT_FROM_DFU (0xa5a5a5a5) #define AUDIO_REBOOT_FROM_DFU (0xa5a5a5a5)
#define MAX_VOL (0x20000000) /* Result of db_to_mult(MAX_VOLUME, 8, 29) */
#define MAX_VOLUME_MULT (0x20000000)
#if defined(LEVEL_METER_LEDS) && !defined(LEVEL_UPDATE_RATE) #if defined(LEVEL_METER_LEDS) && !defined(LEVEL_UPDATE_RATE)
#define LEVEL_UPDATE_RATE (400000) #define LEVEL_UPDATE_RATE (400000)

View File

@@ -43,7 +43,7 @@
/*** BUFFER SIZES ***/ /*** BUFFER SIZES ***/
#define BUFFER_PACKET_COUNT 4 /* How many packets too allow for in buffer - minimum is 4 */ #define BUFFER_PACKET_COUNT (4) /* How many packets too allow for in buffer - minimum is 4 */
#define BUFF_SIZE_OUT_HS MAX_DEVICE_AUD_PACKET_SIZE_OUT_HS * BUFFER_PACKET_COUNT #define BUFF_SIZE_OUT_HS MAX_DEVICE_AUD_PACKET_SIZE_OUT_HS * BUFFER_PACKET_COUNT
#define BUFF_SIZE_OUT_FS MAX_DEVICE_AUD_PACKET_SIZE_OUT_FS * BUFFER_PACKET_COUNT #define BUFF_SIZE_OUT_FS MAX_DEVICE_AUD_PACKET_SIZE_OUT_FS * BUFFER_PACKET_COUNT
@@ -55,16 +55,22 @@
#define BUFF_SIZE_IN MAX(BUFF_SIZE_IN_HS, BUFF_SIZE_IN_FS) #define BUFF_SIZE_IN MAX(BUFF_SIZE_IN_HS, BUFF_SIZE_IN_FS)
#define OUT_BUFFER_PREFILL (MAX(MAX_DEVICE_AUD_PACKET_SIZE_OUT_HS, MAX_DEVICE_AUD_PACKET_SIZE_OUT_FS)) #define OUT_BUFFER_PREFILL (MAX(MAX_DEVICE_AUD_PACKET_SIZE_OUT_HS, MAX_DEVICE_AUD_PACKET_SIZE_OUT_FS))
#define IN_BUFFER_PREFILL (MAX(MAX_DEVICE_AUD_PACKET_SIZE_IN_HS, MAX_DEVICE_AUD_PACKET_SIZE_IN_FS)*2) #define IN_BUFFER_PREFILL (MAX(MAX_DEVICE_AUD_PACKET_SIZE_IN_HS, MAX_DEVICE_AUD_PACKET_SIZE_IN_FS)*2)
/* Volume and mute tables */ /* Volume and mute tables */
#if (OUT_VOLUME_IN_MIXER == 0) && (OUTPUT_VOLUME_CONTROL == 1) #if (OUT_VOLUME_IN_MIXER == 0) && (OUTPUT_VOLUME_CONTROL == 1)
unsigned int multOut[NUM_USB_CHAN_OUT + 1]; unsigned int multOut[NUM_USB_CHAN_OUT + 1];
static xc_ptr p_multOut; unsafe
{
unsigned int volatile * unsafe multOutPtr = multOut;
}
#endif #endif
#if (IN_VOLUME_IN_MIXER == 0) && (INPUT_VOLUME_CONTROL == 1) #if (IN_VOLUME_IN_MIXER == 0) && (INPUT_VOLUME_CONTROL == 1)
unsigned int multIn[NUM_USB_CHAN_IN + 1]; unsigned int multIn[NUM_USB_CHAN_IN + 1];
static xc_ptr p_multIn; unsafe
{
unsigned int volatile * unsafe multInPtr = multIn;
}
#endif #endif
/* Default to something sensible but the following are setup at stream start (unless UAC1 only..) */ /* Default to something sensible but the following are setup at stream start (unless UAC1 only..) */
@@ -162,7 +168,10 @@ static inline void SendSamples4(chanend c_mix_out)
g_aud_from_host_rdptr+=4; g_aud_from_host_rdptr+=4;
#if (OUTPUT_VOLUME_CONTROL == 1) && (!OUT_VOLUME_IN_MIXER) #if (OUTPUT_VOLUME_CONTROL == 1) && (!OUT_VOLUME_IN_MIXER)
asm volatile("ldw %0, %1[%2]":"=r"(mult):"r"(p_multOut),"r"(i)); unsafe
{
mult = multOutPtr[i];
}
{h, l} = macs(mult, sample, 0, 0); {h, l} = macs(mult, sample, 0, 0);
h <<= 3; h <<= 3;
#if (STREAM_FORMAT_OUTPUT_RESOLUTION_32BIT_USED == 1) #if (STREAM_FORMAT_OUTPUT_RESOLUTION_32BIT_USED == 1)
@@ -189,7 +198,10 @@ static inline void SendSamples4(chanend c_mix_out)
g_aud_from_host_rdptr+=4; g_aud_from_host_rdptr+=4;
#if (OUTPUT_VOLUME_CONTROL == 1) && (!OUT_VOLUME_IN_MIXER) #if (OUTPUT_VOLUME_CONTROL == 1) && (!OUT_VOLUME_IN_MIXER)
asm volatile("ldw %0, %1[%2]":"=r"(mult):"r"(p_multOut),"r"(i)); unsafe
{
mult = multOutPtr[i];
}
{h, l} = macs(mult, sample, 0, 0); {h, l} = macs(mult, sample, 0, 0);
h <<= 3; h <<= 3;
#if (STREAM_FORMAT_OUTPUT_RESOLUTION_32BIT_USED == 1) #if (STREAM_FORMAT_OUTPUT_RESOLUTION_32BIT_USED == 1)
@@ -267,7 +279,10 @@ __builtin_unreachable();
sample <<= 16; sample <<= 16;
#if (OUTPUT_VOLUME_CONTROL == 1) && (!OUT_VOLUME_IN_MIXER) #if (OUTPUT_VOLUME_CONTROL == 1) && (!OUT_VOLUME_IN_MIXER)
asm volatile("ldw %0, %1[%2]":"=r"(mult):"r"(p_multOut),"r"(i)); unsafe
{
mult = multOutPtr[i];
}
{h, l} = macs(mult, sample, 0, 0); {h, l} = macs(mult, sample, 0, 0);
/* Note, in 2 byte subslot mode - ignore lower result of macs */ /* Note, in 2 byte subslot mode - ignore lower result of macs */
h <<= 3; h <<= 3;
@@ -326,18 +341,19 @@ __builtin_unreachable();
unpackState++; unpackState++;
#if (OUTPUT_VOLUME_CONTROL == 1) && (!OUT_VOLUME_IN_MIXER) #if (OUTPUT_VOLUME_CONTROL == 1) && (!OUT_VOLUME_IN_MIXER)
asm volatile("ldw %0, %1[%2]":"=r"(mult):"r"(p_multOut),"r"(i)); unsafe
{
mult = multOutPtr[i];
}
{h, l} = macs(mult, sample, 0, 0); {h, l} = macs(mult, sample, 0, 0);
h <<= 3; h <<= 3;
outuint(c_mix_out, h); outuint(c_mix_out, h);
#else #else
outuint(c_mix_out, sample); outuint(c_mix_out, sample);
#endif #endif
} }
break; break;
default: default:
__builtin_unreachable(); __builtin_unreachable();
break; break;
@@ -376,7 +392,10 @@ __builtin_unreachable();
int mult; int mult;
int h; int h;
unsigned l; unsigned l;
asm volatile("ldw %0, %1[%2]":"=r"(mult):"r"(p_multIn),"r"(i)); unsafe
{
mult = multInPtr[i];
}
{h, l} = macs(mult, sample, 0, 0); {h, l} = macs(mult, sample, 0, 0);
sample = h << 3; sample = h << 3;
@@ -406,7 +425,10 @@ __builtin_unreachable();
int mult; int mult;
int h; int h;
unsigned l; unsigned l;
asm volatile("ldw %0, %1[%2]":"=r"(mult):"r"(p_multIn),"r"(i)); unsafe
{
mult = multInPtr[i];
}
{h, l} = macs(mult, sample, 0, 0); {h, l} = macs(mult, sample, 0, 0);
sample = h << 3; sample = h << 3;
#if (STREAM_FORMAT_INPUT_RESOLUTION_32BIT_USED == 1) #if (STREAM_FORMAT_INPUT_RESOLUTION_32BIT_USED == 1)
@@ -437,7 +459,10 @@ __builtin_unreachable();
int mult; int mult;
int h; int h;
unsigned l; unsigned l;
asm volatile("ldw %0, %1[%2]":"=r"(mult):"r"(p_multIn),"r"(i)); unsafe
{
mult = multInPtr[i];
}
{h, l} = macs(mult, sample, 0, 0); {h, l} = macs(mult, sample, 0, 0);
sample = h << 3; sample = h << 3;
#endif #endif
@@ -676,13 +701,6 @@ void XUA_Buffer_Decouple(chanend c_mix_out
int t = array_to_xc_ptr(outAudioBuff); int t = array_to_xc_ptr(outAudioBuff);
#if (!OUT_VOLUME_IN_MIXER) && (OUTPUT_VOLUME_CONTROL == 1)
p_multOut = array_to_xc_ptr(multOut);
#endif
#if (!IN_VOLUME_IN_MIXER) && (INPUT_VOLUME_CONTROL == 1)
p_multIn = array_to_xc_ptr(multIn);
#endif
aud_from_host_fifo_start = t; aud_from_host_fifo_start = t;
aud_from_host_fifo_end = aud_from_host_fifo_start + BUFF_SIZE_OUT; aud_from_host_fifo_end = aud_from_host_fifo_start + BUFF_SIZE_OUT;
g_aud_from_host_wrptr = aud_from_host_fifo_start; g_aud_from_host_wrptr = aud_from_host_fifo_start;
@@ -708,15 +726,15 @@ void XUA_Buffer_Decouple(chanend c_mix_out
/* Init vol mult tables */ /* Init vol mult tables */
#if (OUT_VOLUME_IN_MIXER == 0) && (OUTPUT_VOLUME_CONTROL == 1) #if (OUT_VOLUME_IN_MIXER == 0) && (OUTPUT_VOLUME_CONTROL == 1)
for (int i = 0; i < NUM_USB_CHAN_OUT + 1; i++) for (int i = 0; i < NUM_USB_CHAN_OUT + 1; i++)
{ unsafe{
asm volatile("stw %0, %1[%2]"::"r"(MAX_VOL),"r"(p_multOut),"r"(i)); multOutPtr[i] = MAX_VOLUME_MULT;
} }
#endif #endif
#if (IN_VOLUME_IN_MIXER == 0) && (INPUT_VOLUME_CONTROL == 1) #if (IN_VOLUME_IN_MIXER == 0) && (INPUT_VOLUME_CONTROL == 1)
for (int i = 0; i < NUM_USB_CHAN_IN + 1; i++) for (int i = 0; i < NUM_USB_CHAN_IN + 1; i++)
{ unsafe{
asm volatile("stw %0, %1[%2]"::"r"(MAX_VOL),"r"(p_multIn),"r"(i)); multInPtr[i] = MAX_VOLUME_MULT;
} }
#endif #endif

View File

@@ -14,16 +14,20 @@
#include "usbaudio10.h" #include "usbaudio10.h"
#include "dbcalc.h" #include "dbcalc.h"
#include "xua_commands.h" #include "xua_commands.h"
#include "xc_ptr.h"
#define CS_XU_MIXSEL (0x06) #define CS_XU_MIXSEL (0x06)
/* From decouple.xc */
#if (OUT_VOLUME_IN_MIXER == 0) && (OUTPUT_VOLUME_CONTROL == 1)
extern unsigned int multOut[NUM_USB_CHAN_OUT + 1]; extern unsigned int multOut[NUM_USB_CHAN_OUT + 1];
#endif
#if (IN_VOLUME_IN_MIXER == 0) && (INPUT_VOLUME_CONTROL == 1)
extern unsigned int multIn[NUM_USB_CHAN_IN + 1]; extern unsigned int multIn[NUM_USB_CHAN_IN + 1];
#endif
extern int interfaceAlt[]; extern int interfaceAlt[];
/* Global volume and mute tables */ /* Global volume and mute tables - from xua_endpoint0.c */
extern int volsOut[]; extern int volsOut[];
extern unsigned int mutesOut[]; extern unsigned int mutesOut[];
@@ -101,20 +105,6 @@ void FeedbackStabilityDelay()
t when timerafter(time + delay):> void; t when timerafter(time + delay):> void;
} }
#if 0
/* Original feedback implementation */
unsafe
{
unsigned * unsafe curSamFreqMultiplier = &g_curSamFreqMultiplier;
static void setG_curSamFreqMultiplier(unsigned x)
{
// asm(" stw %0, dp[g_curSamFreqMultiplier]" :: "r"(x));
*curSamFreqMultiplier = x;
}
}
#endif
#if (OUTPUT_VOLUME_CONTROL == 1) || (INPUT_VOLUME_CONTROL == 1) #if (OUTPUT_VOLUME_CONTROL == 1) || (INPUT_VOLUME_CONTROL == 1)
static unsigned longMul(unsigned a, unsigned b, int prec) static unsigned longMul(unsigned a, unsigned b, int prec)
{ {
@@ -131,13 +121,6 @@ static unsigned longMul(unsigned a, unsigned b, int prec)
/* Update master volume i.e. i.e update weights for all channels */ /* Update master volume i.e. i.e update weights for all channels */
static void updateMasterVol(int unitID, chanend ?c_mix_ctl) static void updateMasterVol(int unitID, chanend ?c_mix_ctl)
{ {
int x;
#if (OUT_VOLUME_IN_MIXER == 0)
xc_ptr p_multOut = array_to_xc_ptr(multOut);
#endif
#if (IN_VOLUME_IN_MIXER == 0)
xc_ptr p_multIn = array_to_xc_ptr(multIn);
#endif
switch(unitID) switch(unitID)
{ {
case FU_USBOUT: case FU_USBOUT:
@@ -150,7 +133,7 @@ static void updateMasterVol(int unitID, chanend ?c_mix_ctl)
/* 0x8000 is a special value representing -inf (i.e. mute) */ /* 0x8000 is a special value representing -inf (i.e. mute) */
unsigned vol = volsOut[i] == 0x8000 ? 0 : db_to_mult(volsOut[i], 8, 29); unsigned vol = volsOut[i] == 0x8000 ? 0 : db_to_mult(volsOut[i], 8, 29);
x = longMul(master_vol, vol, 29) * !mutesOut[0] * !mutesOut[i]; int x = longMul(master_vol, vol, 29) * !mutesOut[0] * !mutesOut[i];
#if (OUT_VOLUME_IN_MIXER) #if (OUT_VOLUME_IN_MIXER)
if (!isnull(c_mix_ctl)) if (!isnull(c_mix_ctl))
@@ -163,7 +146,11 @@ static void updateMasterVol(int unitID, chanend ?c_mix_ctl)
outct(c_mix_ctl, XS1_CT_END); outct(c_mix_ctl, XS1_CT_END);
} }
#else #else
asm("stw %0, %1[%2]"::"r"(x),"r"(p_multOut),"r"(i-1)); unsafe
{
unsigned int * unsafe multOutPtr = multOut;
multOutPtr[i-1] = x;
}
#endif #endif
} }
} }
@@ -178,7 +165,7 @@ static void updateMasterVol(int unitID, chanend ?c_mix_ctl)
/* 0x8000 is a special value representing -inf (i.e. mute) */ /* 0x8000 is a special value representing -inf (i.e. mute) */
unsigned vol = volsIn[i] == 0x8000 ? 0 : db_to_mult(volsIn[i], 8, 29); unsigned vol = volsIn[i] == 0x8000 ? 0 : db_to_mult(volsIn[i], 8, 29);
x = longMul(master_vol, vol, 29) * !mutesIn[0] * !mutesIn[i]; int x = longMul(master_vol, vol, 29) * !mutesIn[0] * !mutesIn[i];
#if (IN_VOLUME_IN_MIXER) #if (IN_VOLUME_IN_MIXER)
if (!isnull(c_mix_ctl)) if (!isnull(c_mix_ctl))
@@ -191,7 +178,11 @@ static void updateMasterVol(int unitID, chanend ?c_mix_ctl)
outct(c_mix_ctl, XS1_CT_END); outct(c_mix_ctl, XS1_CT_END);
} }
#else #else
asm("stw %0, %1[%2]"::"r"(x),"r"(p_multIn),"r"(i-1)); unsafe
{
unsigned int * unsafe multInPtr = multIn;
multInPtr[i-1] = x;
}
#endif #endif
} }
} }
@@ -205,12 +196,6 @@ static void updateMasterVol(int unitID, chanend ?c_mix_ctl)
static void updateVol(int unitID, int channel, chanend ?c_mix_ctl) static void updateVol(int unitID, int channel, chanend ?c_mix_ctl)
{ {
int x; int x;
#if (OUT_VOLUME_IN_MIXER == 0)
xc_ptr p_multOut = array_to_xc_ptr(multOut);
#endif
#if (IN_VOLUME_IN_MIXER == 0)
xc_ptr p_multIn = array_to_xc_ptr(multIn);
#endif
/* Check for master volume update */ /* Check for master volume update */
if (channel == 0) if (channel == 0)
{ {
@@ -240,7 +225,11 @@ static void updateVol(int unitID, int channel, chanend ?c_mix_ctl)
outct(c_mix_ctl, XS1_CT_END); outct(c_mix_ctl, XS1_CT_END);
} }
#else #else
asm("stw %0, %1[%2]"::"r"(x),"r"(p_multOut),"r"(channel-1)); unsafe
{
unsigned int * unsafe multOutPtr = multOut;
multOutPtr[channel-1] = x;
}
#endif #endif
break; break;
} }
@@ -264,7 +253,11 @@ static void updateVol(int unitID, int channel, chanend ?c_mix_ctl)
outct(c_mix_ctl, XS1_CT_END); outct(c_mix_ctl, XS1_CT_END);
} }
#else #else
asm("stw %0, %1[%2]"::"r"(x),"r"(p_multIn),"r"(channel-1)); unsafe
{
unsigned int * unsafe multInPtr = multIn;
multInPtr[channel-1] = x;
}
#endif #endif
break; break;
} }

View File

@@ -23,7 +23,7 @@
static unsigned int multOut_array[NUM_USB_CHAN_OUT + 1]; static unsigned int multOut_array[NUM_USB_CHAN_OUT + 1];
unsafe unsafe
{ {
int volatile * unsafe multOut = multOut_array; unsigned int volatile * unsafe multOut = multOut_array;
} }
#endif #endif
@@ -31,7 +31,7 @@ unsafe
static unsigned int multIn_array[NUM_USB_CHAN_IN + 1]; static unsigned int multIn_array[NUM_USB_CHAN_IN + 1];
unsafe unsafe
{ {
int volatile * unsafe multIn = multIn_array; unsigned int volatile * unsafe multIn = multIn_array;
} }
#endif #endif
@@ -827,14 +827,14 @@ void mixer(chanend c_mix_in, chanend c_mix_out, chanend c_mix_ctl)
#if (OUT_VOLUME_IN_MIXER) #if (OUT_VOLUME_IN_MIXER)
for (int i=0; i<NUM_USB_CHAN_OUT; i++) for (int i=0; i<NUM_USB_CHAN_OUT; i++)
unsafe{ unsafe{
multOut[i] = MAX_VOL; multOut[i] = MAX_VOLUME_MULT;
} }
#endif #endif
#if (IN_VOLUME_IN_MIXER) #if (IN_VOLUME_IN_MIXER)
for (int i=0; i<NUM_USB_CHAN_IN; i++) for (int i=0; i<NUM_USB_CHAN_IN; i++)
unsafe{ unsafe{
multIn[i] = MAX_VOL; multIn[i] = MAX_VOLUME_MULT;
} }
#endif #endif