diff --git a/lib_xua/api/xua_conf_default.h b/lib_xua/api/xua_conf_default.h index 86854d8a..8b6242cd 100644 --- a/lib_xua/api/xua_conf_default.h +++ b/lib_xua/api/xua_conf_default.h @@ -1194,7 +1194,8 @@ enum USBEndpointNumber_Out #define AUDIO_START_FROM_DFU (0x87654321) #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) #define LEVEL_UPDATE_RATE (400000) diff --git a/lib_xua/src/core/buffer/decouple/decouple.xc b/lib_xua/src/core/buffer/decouple/decouple.xc index 0eb4b826..c276abda 100644 --- a/lib_xua/src/core/buffer/decouple/decouple.xc +++ b/lib_xua/src/core/buffer/decouple/decouple.xc @@ -43,7 +43,7 @@ /*** 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_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 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 */ #if (OUT_VOLUME_IN_MIXER == 0) && (OUTPUT_VOLUME_CONTROL == 1) unsigned int multOut[NUM_USB_CHAN_OUT + 1]; -static xc_ptr p_multOut; +unsafe +{ + unsigned int volatile * unsafe multOutPtr = multOut; +} #endif #if (IN_VOLUME_IN_MIXER == 0) && (INPUT_VOLUME_CONTROL == 1) unsigned int multIn[NUM_USB_CHAN_IN + 1]; -static xc_ptr p_multIn; +unsafe +{ + unsigned int volatile * unsafe multInPtr = multIn; +} #endif /* 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; #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 <<= 3; #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; #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 <<= 3; #if (STREAM_FORMAT_OUTPUT_RESOLUTION_32BIT_USED == 1) @@ -267,7 +279,10 @@ __builtin_unreachable(); sample <<= 16; #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); /* Note, in 2 byte subslot mode - ignore lower result of macs */ h <<= 3; @@ -326,18 +341,19 @@ __builtin_unreachable(); unpackState++; #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 <<= 3; outuint(c_mix_out, h); #else outuint(c_mix_out, sample); - #endif } break; - default: __builtin_unreachable(); break; @@ -376,7 +392,10 @@ __builtin_unreachable(); int mult; int h; 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); sample = h << 3; @@ -406,7 +425,10 @@ __builtin_unreachable(); int mult; int h; 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); sample = h << 3; #if (STREAM_FORMAT_INPUT_RESOLUTION_32BIT_USED == 1) @@ -437,7 +459,10 @@ __builtin_unreachable(); int mult; int h; 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); sample = h << 3; #endif @@ -676,13 +701,6 @@ void XUA_Buffer_Decouple(chanend c_mix_out 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_end = aud_from_host_fifo_start + BUFF_SIZE_OUT; 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 */ #if (OUT_VOLUME_IN_MIXER == 0) && (OUTPUT_VOLUME_CONTROL == 1) for (int i = 0; i < NUM_USB_CHAN_OUT + 1; i++) - { - asm volatile("stw %0, %1[%2]"::"r"(MAX_VOL),"r"(p_multOut),"r"(i)); + unsafe{ + multOutPtr[i] = MAX_VOLUME_MULT; } #endif #if (IN_VOLUME_IN_MIXER == 0) && (INPUT_VOLUME_CONTROL == 1) for (int i = 0; i < NUM_USB_CHAN_IN + 1; i++) - { - asm volatile("stw %0, %1[%2]"::"r"(MAX_VOL),"r"(p_multIn),"r"(i)); + unsafe{ + multInPtr[i] = MAX_VOLUME_MULT; } #endif diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index 71dfdc76..5ef46010 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -14,16 +14,20 @@ #include "usbaudio10.h" #include "dbcalc.h" #include "xua_commands.h" -#include "xc_ptr.h" #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]; +#endif +#if (IN_VOLUME_IN_MIXER == 0) && (INPUT_VOLUME_CONTROL == 1) extern unsigned int multIn[NUM_USB_CHAN_IN + 1]; +#endif extern int interfaceAlt[]; -/* Global volume and mute tables */ +/* Global volume and mute tables - from xua_endpoint0.c */ extern int volsOut[]; extern unsigned int mutesOut[]; @@ -101,20 +105,6 @@ void FeedbackStabilityDelay() 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) 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 */ 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) { 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) */ 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 (!isnull(c_mix_ctl)) @@ -162,8 +145,12 @@ static void updateMasterVol(int unitID, chanend ?c_mix_ctl) outuint(c_mix_ctl, x); outct(c_mix_ctl, XS1_CT_END); } -#else - asm("stw %0, %1[%2]"::"r"(x),"r"(p_multOut),"r"(i-1)); +#else + unsafe + { + unsigned int * unsafe multOutPtr = multOut; + multOutPtr[i-1] = x; + } #endif } } @@ -178,7 +165,7 @@ static void updateMasterVol(int unitID, chanend ?c_mix_ctl) /* 0x8000 is a special value representing -inf (i.e. mute) */ 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 (!isnull(c_mix_ctl)) @@ -191,7 +178,11 @@ static void updateMasterVol(int unitID, chanend ?c_mix_ctl) outct(c_mix_ctl, XS1_CT_END); } #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 } } @@ -205,12 +196,6 @@ static void updateMasterVol(int unitID, chanend ?c_mix_ctl) static void updateVol(int unitID, int channel, 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 /* Check for master volume update */ 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); } #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 break; } @@ -264,7 +253,11 @@ static void updateVol(int unitID, int channel, chanend ?c_mix_ctl) outct(c_mix_ctl, XS1_CT_END); } #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 break; } diff --git a/lib_xua/src/core/mixer/mixer.xc b/lib_xua/src/core/mixer/mixer.xc index 2f4ec3d0..afa2017a 100644 --- a/lib_xua/src/core/mixer/mixer.xc +++ b/lib_xua/src/core/mixer/mixer.xc @@ -23,7 +23,7 @@ static unsigned int multOut_array[NUM_USB_CHAN_OUT + 1]; unsafe { - int volatile * unsafe multOut = multOut_array; + unsigned int volatile * unsafe multOut = multOut_array; } #endif @@ -31,7 +31,7 @@ unsafe static unsigned int multIn_array[NUM_USB_CHAN_IN + 1]; unsafe { - int volatile * unsafe multIn = multIn_array; + unsigned int volatile * unsafe multIn = multIn_array; } #endif @@ -827,14 +827,14 @@ void mixer(chanend c_mix_in, chanend c_mix_out, chanend c_mix_ctl) #if (OUT_VOLUME_IN_MIXER) for (int i=0; i