diff --git a/lib_xua/api/xua_conf_default.h b/lib_xua/api/xua_conf_default.h index 9b89d8d3..24dd47e7 100644 --- a/lib_xua/api/xua_conf_default.h +++ b/lib_xua/api/xua_conf_default.h @@ -997,17 +997,12 @@ #define MIXER (0) #endif -/* Tidy up old ifndef usage */ -#if defined(MIXER) && (MIXER == 0) -#undef MIXER -#endif - /** * @brief Number of seperate mixes to perform * * Default: 8 if MIXER enabled, else 0 */ -#ifdef MIXER +#if (MIXER) #ifndef MAX_MIX_COUNT #define MAX_MIX_COUNT (8) #endif @@ -1087,44 +1082,24 @@ #define VOLUME_RES_MIXER (0x100) #endif -/* Handle out volume control in the mixer */ -#if defined(OUT_VOLUME_IN_MIXER) && (OUT_VOLUME_IN_MIXER==0) -#undef OUT_VOLUME_IN_MIXER -#else -#if defined(MIXER) -// Disabled by default -//#define OUT_VOLUME_IN_MIXER -#endif +/* Handle out volume control in the mixer - disabled by default */ +#ifndef OUT_VOLUME_IN_MIXER +#define OUT_VOLUME_IN_MIXER (0) #endif -/* Apply out volume controls after the mix */ -#if defined(OUT_VOLUME_AFTER_MIX) && (OUT_VOLUME_AFTER_MIX==0) -#undef OUT_VOLUME_AFTER_MIX -#else -#if defined(MIXER) && defined(OUT_VOLUME_IN_MIXER) -// Enabled by default -#define OUT_VOLUME_AFTER_MIX -#endif +/* Apply out volume controls after the mix. Only relevant when OUT_VOLUME_IN_MIXER enabled. Enabled by default */ +#ifndef OUT_VOLUME_AFTER_MIX +#define OUT_VOLUME_AFTER_MIX (1) #endif -/* Handle in volume control in the mixer */ -#if defined(IN_VOLUME_IN_MIXER) && (IN_VOLUME_IN_MIXER==0) -#undef IN_VOLUME_IN_MIXER -#else -#if defined(MIXER) -/* Disabled by default */ -//#define IN_VOLUME_IN_MIXER -#endif +/* Handle in volume control in the mixer - disabled by default */ +#ifdef IN_VOLUNE_IN_MIXER +#define IN_VOLUME_IN_MIXER (0) #endif -/* Apply in volume controls after the mix */ -#if defined(IN_VOLUME_AFTER_MIX) && (IN_VOLUME_AFTER_MIX==0) -#undef IN_VOLUME_AFTER_MIX -#else -#if defined(MIXER) && defined(IN_VOLUME_IN_MIXER) -// Enabled by default -#define IN_VOLUME_AFTER_MIX -#endif +/* Apply in volume controls after the mix. Only relebant when IN_VOLUMNE_IN MIXER enabled. Enabled by default */ +#ifndef IN_VOLUME_AFTER_MIX +#define IN_VOLUME_AFTER_MIX (1) #endif /* Always enable explicit feedback EP, even when input stream is present */ diff --git a/lib_xua/api/xua_mixer.h b/lib_xua/api/xua_mixer.h index 319c12d1..dfe561a7 100644 --- a/lib_xua/api/xua_mixer.h +++ b/lib_xua/api/xua_mixer.h @@ -1,4 +1,4 @@ -// Copyright 2011-2022 XMOS LIMITED. +// Copyright 2011-2023 XMOS LIMITED. // This Software is subject to the terms of the XMOS Public Licence: Version 1. #ifndef _XUA_MIXER_H_ #define _XUA_MIXER_H_ diff --git a/lib_xua/src/core/buffer/decouple/decouple.xc b/lib_xua/src/core/buffer/decouple/decouple.xc index ac27864a..2b2a91b9 100644 --- a/lib_xua/src/core/buffer/decouple/decouple.xc +++ b/lib_xua/src/core/buffer/decouple/decouple.xc @@ -58,11 +58,11 @@ #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 !defined(OUT_VOLUME_IN_MIXER) && (OUTPUT_VOLUME_CONTROL == 1) +#if (OUT_VOLUME_IN_MIXER == 0) && (OUTPUT_VOLUME_CONTROL == 1) unsigned int multOut[NUM_USB_CHAN_OUT + 1]; static xc_ptr p_multOut; #endif -#if !defined(IN_VOLUME_IN_MIXER) && (INPUT_VOLUME_CONTROL == 1) +#if (IN_VOLUME_IN_MIXER == 0) && (INPUT_VOLUME_CONTROL == 1) unsigned int multIn[NUM_USB_CHAN_IN + 1]; static xc_ptr p_multIn; #endif @@ -206,7 +206,7 @@ __builtin_unreachable(); g_aud_from_host_rdptr+=2; sample <<= 16; -#if (OUTPUT_VOLUME_CONTROL == 1) && !defined(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)); {h, l} = macs(mult, sample, 0, 0); /* Note, in 2 byte subslot mode - ignore lower result of macs */ @@ -234,7 +234,7 @@ __builtin_unreachable(); read_via_xc_ptr(sample, g_aud_from_host_rdptr); g_aud_from_host_rdptr+=4; -#if (OUTPUT_VOLUME_CONTROL == 1) && !defined(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)); {h, l} = macs(mult, sample, 0, 0); h <<= 3; @@ -289,7 +289,7 @@ __builtin_unreachable(); } unpackState++; -#if (OUTPUT_VOLUME_CONTROL == 1) && !defined(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)); {h, l} = macs(mult, sample, 0, 0); h <<= 3; @@ -335,7 +335,7 @@ __builtin_unreachable(); /* Receive sample */ int sample = inuint(c_mix_out); #if (INPUT_VOLUME_CONTROL == 1) -#if !defined(IN_VOLUME_IN_MIXER) +#if (!IN_VOLUME_IN_MIXER) /* Apply volume */ int mult; int h; @@ -345,7 +345,7 @@ __builtin_unreachable(); sample = h << 3; /* Note, in 2 byte sub slot - ignore lower bits of macs */ -#elif defined(IN_VOLUME_IN_MIXER) && defined(IN_VOLUME_AFTER_MIX) +#elif (IN_VOLUME_IN_MIXER) && defined(IN_VOLUME_AFTER_MIX) sample = sample << 3; #endif #endif @@ -365,7 +365,7 @@ __builtin_unreachable(); /* Receive sample */ int sample = inuint(c_mix_out); #if(INPUT_VOLUME_CONTROL == 1) -#if !defined(IN_VOLUME_IN_MIXER) +#if (!IN_VOLUME_IN_MIXER) /* Apply volume */ int mult; int h; @@ -376,7 +376,7 @@ __builtin_unreachable(); #if (STREAM_FORMAT_INPUT_RESOLUTION_32BIT_USED == 1) sample |= (l >> 29) & 0x7; // Note, this step is not required if we assume sample depth is 24 (rather than 32) #endif -#elif defined(IN_VOLUME_IN_MIXER) && defined(IN_VOLUME_AFTER_MIX) +#elif (IN_VOLUME_IN_MIXER) && (IN_VOLUME_AFTER_MIX) sample = sample << 3; #endif #endif @@ -396,7 +396,7 @@ __builtin_unreachable(); { /* Receive sample */ int sample = inuint(c_mix_out); -#if (INPUT_VOLUME_CONTROL) && !defined(IN_VOLUME_IN_MIXER) +#if (INPUT_VOLUME_CONTROL) && (!IN_VOLUME_IN_MIXER) /* Apply volume */ int mult; int h; @@ -640,10 +640,10 @@ void XUA_Buffer_Decouple(chanend c_mix_out int t = array_to_xc_ptr(outAudioBuff); -#if !defined(OUT_VOLUME_IN_MIXER) && (OUTPUT_VOLUME_CONTROL == 1) +#if (!OUT_VOLUME_IN_MIXER) && (OUTPUT_VOLUME_CONTROL == 1) p_multOut = array_to_xc_ptr(multOut); #endif -#if !defined(IN_VOLUME_IN_MIXER) && (INPUT_VOLUME_CONTROL == 1) +#if (!IN_VOLUME_IN_MIXER) && (INPUT_VOLUME_CONTROL == 1) p_multIn = array_to_xc_ptr(multIn); #endif @@ -670,14 +670,14 @@ void XUA_Buffer_Decouple(chanend c_mix_out xc_ptr aud_to_host_zeros = t; /* Init vol mult tables */ -#if !defined(OUT_VOLUME_IN_MIXER) && (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++) { asm volatile("stw %0, %1[%2]"::"r"(MAX_VOL),"r"(p_multOut),"r"(i)); } #endif -#if !defined(IN_VOLUME_IN_MIXER) && (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++) { asm volatile("stw %0, %1[%2]"::"r"(MAX_VOL),"r"(p_multIn),"r"(i)); diff --git a/lib_xua/src/core/endpoint0/xua_endpoint0.c b/lib_xua/src/core/endpoint0/xua_endpoint0.c index 9a9c0c32..98d88e51 100755 --- a/lib_xua/src/core/endpoint0/xua_endpoint0.c +++ b/lib_xua/src/core/endpoint0/xua_endpoint0.c @@ -106,7 +106,7 @@ unsigned int mutesOut[NUM_USB_CHAN_OUT + 1]; int volsIn[NUM_USB_CHAN_IN + 1]; unsigned int mutesIn[NUM_USB_CHAN_IN + 1]; -#ifdef MIXER +#if (MIXER) short mixer1Weights[MIX_INPUTS * MAX_MIX_COUNT]; //unsigned char channelMap[NUM_USB_CHAN_OUT + NUM_USB_CHAN_IN + MAX_MIX_COUNT]; @@ -429,7 +429,7 @@ void XUA_Endpoint0_init(chanend c_ep0_out, chanend c_ep0_in, NULLABLE_RESOURCE(c #endif VendorRequests_Init(VENDOR_REQUESTS_PARAMS); -#ifdef MIXER +#if (MIXER) /* Set up mixer default state */ for (int i = 0; i < MIX_INPUTS * MAX_MIX_COUNT; i++) { diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index 622ffcf2..2d5e21ea 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -308,28 +308,28 @@ typedef struct #error NUM_USB_CHAN > 32 #endif -#if defined(MIXER) && (MAX_MIX_COUNT > 0) +#if (MIXER) && (MAX_MIX_COUNT > 0) STR_TABLE_ENTRY(mixOutStr_1); #endif -#if defined(MIXER) && (MAX_MIX_COUNT > 1) +#if (MIXER) && (MAX_MIX_COUNT > 1) STR_TABLE_ENTRY(mixOutStr_2); #endif -#if defined(MIXER) && (MAX_MIX_COUNT > 2) +#if (MIXER) && (MAX_MIX_COUNT > 2) STR_TABLE_ENTRY(mixOutStr_3); #endif -#if defined(MIXER) && (MAX_MIX_COUNT > 3) +#if (MIXER) && (MAX_MIX_COUNT > 3) STR_TABLE_ENTRY(mixOutStr_4); #endif -#if defined(MIXER) && (MAX_MIX_COUNT > 4) +#if (MIXER) && (MAX_MIX_COUNT > 4) STR_TABLE_ENTRY(mixOutStr_5); #endif -#if defined(MIXER) && (MAX_MIX_COUNT > 5) +#if (MIXER) && (MAX_MIX_COUNT > 5) STR_TABLE_ENTRY(mixOutStr_6); #endif -#if defined(MIXER) && (MAX_MIX_COUNT > 6) +#if (MIXER) && (MAX_MIX_COUNT > 6) STR_TABLE_ENTRY(mixOutStr_7); #endif -#if defined(MIXER) && (MAX_MIX_COUNT > 7) +#if (MIXER) && (MAX_MIX_COUNT > 7) STR_TABLE_ENTRY(mixOutStr_8); #endif #ifdef IAP @@ -391,31 +391,31 @@ StringDescTable_t g_strTable = #error NUM_USB_CHAN_IN > 32 #endif -#if defined(MIXER) && (MAX_MIX_COUNT > 0) +#if (MIXER) && (MAX_MIX_COUNT > 0) .mixOutStr_1 = "Mix 1", #endif -#if defined(MIXER) && (MAX_MIX_COUNT > 1) +#if (MIXER) && (MAX_MIX_COUNT > 1) .mixOutStr_2 = "Mix 2", #endif -#if defined(MIXER) && (MAX_MIX_COUNT > 2) +#if (MIXER) && (MAX_MIX_COUNT > 2) .mixOutStr_3 = "Mix 3", #endif -#if defined(MIXER) && (MAX_MIX_COUNT > 3) +#if (MIXER) && (MAX_MIX_COUNT > 3) .mixOutStr_4 = "Mix 4", #endif -#if defined(MIXER) && (MAX_MIX_COUNT > 4) +#if (MIXER) && (MAX_MIX_COUNT > 4) .mixOutStr_5 = "Mix 5", #endif -#if defined(MIXER) && (MAX_MIX_COUNT > 5) +#if (MIXER) && (MAX_MIX_COUNT > 5) .mixOutStr_6 = "Mix 6", #endif -#if defined(MIXER) && (MAX_MIX_COUNT > 6) +#if (MIXER) && (MAX_MIX_COUNT > 6) .mixOutStr_7 = "Mix 7", #endif -#if defined(MIXER) && (MAX_MIX_COUNT > 7) +#if (MIXER) && (MAX_MIX_COUNT > 7) .mixOutStr_8 = "Mix 8", #endif -#if defined(MIXER) && (MAX_MIX_COUNT > 8) +#if (MIXER) && (MAX_MIX_COUNT > 8) #error #endif #ifdef IAP @@ -558,7 +558,7 @@ unsigned char devQualDesc_Null[] = }; -#if defined(MIXER) && !defined(AUDIO_PATH_XUS) && (MAX_MIX_COUNT > 0) +#if (MIXER) && !defined(AUDIO_PATH_XUS) && (MAX_MIX_COUNT > 0) //#warning Extension units on the audio path are required for mixer. Enabling them now. #define AUDIO_PATH_XUS #endif @@ -575,7 +575,7 @@ unsigned char devQualDesc_Null[] = #define DFU_LENGTH (0) #endif -#ifdef MIXER +#if (MIXER) #define MIX_BMCONTROLS_LEN_TMP ((MAX_MIX_COUNT * MIX_INPUTS) / 8) #if ((MAX_MIX_COUNT * MIX_INPUTS)%8)==0 @@ -666,7 +666,7 @@ typedef struct #if (NUM_USB_CHAN_OUT > 0) /* Output path */ USB_Descriptor_Audio_InputTerminal_t Audio_Out_InputTerminal; -#if defined(MIXER) && (MAX_MIX_COUNT > 0) +#if (MIXER) && (MAX_MIX_COUNT > 0) USB_Descriptor_Audio_ExtensionUnit_t Audio_Out_ExtensionUnit; #endif #if(OUTPUT_VOLUME_CONTROL == 1) @@ -677,7 +677,7 @@ typedef struct #if (NUM_USB_CHAN_IN > 0) /* Input path */ USB_Descriptor_Audio_InputTerminal_t Audio_In_InputTerminal; -#if defined(MIXER) && (MAX_MIX_COUNT > 0) +#if (MIXER) && (MAX_MIX_COUNT > 0) USB_Descriptor_Audio_ExtensionUnit_t Audio_In_ExtensionUnit; #endif #if(INPUT_VOLUME_CONTROL == 1) @@ -685,7 +685,7 @@ typedef struct #endif USB_Descriptor_Audio_OutputTerminal_t Audio_In_OutputTerminal; #endif -#if defined(MIXER) && (MAX_MIX_COUNT > 0) +#if (MIXER) && (MAX_MIX_COUNT > 0) USB_Descriptor_Audio_ExtensionUnit2_t Audio_Mix_ExtensionUnit; // Currently no struct for mixer unit // USB_Descriptor_Audio_MixerUnit_t Audio_MixerUnit; @@ -1168,7 +1168,7 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2= UAC_CS_DESCTYPE_INTERFACE, /* 1 bDescriptorType: CS_INTERFACE */ UAC_CS_AC_INTERFACE_SUBTYPE_FEATURE_UNIT, /* 2 bDescriptorSubType: FEATURE_UNIT */ FU_USBIN, /* 3 bUnitID */ -#if defined(MIXER) && (MAX_MIX_COUNT > 0) +#if (MIXER) && (MAX_MIX_COUNT > 0) ID_XU_IN, /* 4 bSourceID */ #else ID_IT_AUD, /* 4 bSourceID */ @@ -1300,7 +1300,7 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2= }, #endif /* (NUM_USB_CHAN_IN > 0) */ -#if defined(MIXER) && (MAX_MIX_COUNT > 0) +#if (MIXER) && (MAX_MIX_COUNT > 0) /* Extension Unit Descriptor (4.7.2.12) */ .Audio_Mix_ExtensionUnit = { @@ -1392,7 +1392,7 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2= 0x00, /* bmControls */ 0 /* Mixer unit string descriptor index */ }, -#endif /* defined(MIXER) && (MAX_MIX_COUNT > 0) */ +#endif /* (MIXER) && (MAX_MIX_COUNT > 0) */ #if (XUA_SPDIF_RX_EN) || (XUA_ADAT_RX_EN) /* Standard AS Interrupt Endpoint Descriptor (4.8.2.1): */ diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index 57d4aaad..e94e78fe 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -31,7 +31,7 @@ extern int volsIn[]; extern unsigned int mutesIn[]; /* Mixer settings */ -#ifdef MIXER +#if (MIXER) extern short mixer1Weights[]; /* Device channel mapping */ @@ -132,10 +132,10 @@ static unsigned longMul(unsigned a, unsigned b, int prec) static void updateMasterVol( int unitID, chanend ?c_mix_ctl) { int x; -#ifndef OUT_VOLUME_IN_MIXER +#if (OUT_VOLUME_IN_MIXER == 0) xc_ptr p_multOut = array_to_xc_ptr(multOut); #endif -#ifndef IN_VOLUME_IN_MIXER +#if (IN_VOLUME_IN_MIXER == 0) xc_ptr p_multIn = array_to_xc_ptr(multIn); #endif switch( unitID) @@ -152,7 +152,7 @@ static void updateMasterVol( int unitID, chanend ?c_mix_ctl) x = longMul(master_vol, vol, 29) * !mutesOut[0] * !mutesOut[i]; -#ifdef OUT_VOLUME_IN_MIXER +#if (OUT_VOLUME_IN_MIXER) if (!isnull(c_mix_ctl)) { outuint(c_mix_ctl, SET_MIX_OUT_VOL); @@ -178,7 +178,7 @@ static void updateMasterVol( int unitID, chanend ?c_mix_ctl) x = longMul(master_vol, vol, 29) * !mutesIn[0] * !mutesIn[i]; -#ifdef IN_VOLUME_IN_MIXER +#if (IN_VOLUME_IN_MIXER) if (!isnull(c_mix_ctl)) { outuint(c_mix_ctl, SET_MIX_IN_VOL); @@ -201,10 +201,10 @@ static void updateMasterVol( int unitID, chanend ?c_mix_ctl) static void updateVol(int unitID, int channel, chanend ?c_mix_ctl) { int x; -#ifndef OUT_VOLUME_IN_MIXER +#if (OUT_VOLUME_IN_MIXER == 0) xc_ptr p_multOut = array_to_xc_ptr(multOut); #endif -#ifndef IN_VOLUME_IN_MIXER +#if (IN_VOLUME_IN_MIXER == 0) xc_ptr p_multIn = array_to_xc_ptr(multIn); #endif /* Check for master volume update */ @@ -225,7 +225,7 @@ static void updateVol(int unitID, int channel, chanend ?c_mix_ctl) x = longMul(master_vol, vol, 29) * !mutesOut[0] * !mutesOut[channel]; -#ifdef OUT_VOLUME_IN_MIXER +#if (OUT_VOLUME_IN_MIXER) if (!isnull(c_mix_ctl)) { outuint(c_mix_ctl, SET_MIX_OUT_VOL); @@ -243,11 +243,11 @@ static void updateVol(int unitID, int channel, chanend ?c_mix_ctl) /* Calc multipliers with 29 fractional bits from a db value with 8 fractional bits */ /* 0x8000 is a special value representing -inf (i.e. mute) */ unsigned master_vol = volsIn[0] == 0x8000 ? 0 : db_to_mult(volsIn[0], 8, 29); - unsigned vol = volsIn[channel] == 0x8000 ? 0 : db_to_mult(volsIn[channel], 8, 29); + unsigned vol = volsIn[channel] == 0x8000 ? 0 : db_to_mult(volsIn[channel], 8, 29); x = longMul(master_vol, vol, 29) * !mutesIn[0] * !mutesIn[channel]; -#ifdef IN_VOLUME_IN_MIXER +#if (IN_VOLUME_IN_MIXER) if (!isnull(c_mix_ctl)) { outuint(c_mix_ctl, SET_MIX_IN_VOL); @@ -657,7 +657,7 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c break; /* FU_USBIN */ #endif -#if defined(MIXER) && (MAX_MIX_COUNT > 0) +#if ((MIXER) && (MAX_MIX_COUNT > 0)) case ID_XU_OUT: { if(sp.bmRequestType.Direction == USB_BM_REQTYPE_DIRECTION_H2D) /* Direction: Host-to-device */ @@ -974,7 +974,7 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c } break; -#ifdef MIXER +#if (MIXER) /* Mixer Unit */ case ID_MIXER_1: storeShort((buffer, unsigned char[]), 0, 1); @@ -994,7 +994,7 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c break; /* case: RANGE */ } -#if defined (MIXER) && (MAX_MIX_COUNT > 0) +#if ((MIXER) && (MAX_MIX_COUNT > 0)) case MEM: /* Memory Requests (5.2.7.1) */ unitID = sp.wIndex >> 8; diff --git a/lib_xua/src/core/main.xc b/lib_xua/src/core/main.xc index 86ef35d8..a79d3c26 100755 --- a/lib_xua/src/core/main.xc +++ b/lib_xua/src/core/main.xc @@ -273,7 +273,7 @@ void usb_audio_core(chanend c_mix_out #ifdef MIDI , chanend c_midi #endif - #ifdef MIXER +#if (MIXER) , chanend c_mix_ctl #endif , chanend ?c_clk_int @@ -290,7 +290,7 @@ VENDOR_REQUESTS_PARAMS_DEC_ chan c_xud_in[ENDPOINT_COUNT_IN]; chan c_aud_ctl; -#ifndef MIXER +#if (MIXER) #define c_mix_ctl null #endif @@ -401,7 +401,7 @@ void usb_audio_io(chanend ?c_aud_in, #if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE != AUDIO_IO_TILE) chanend c_spdif_tx, #endif -#ifdef MIXER +#if (MIXER) chanend c_mix_ctl, #endif streaming chanend ?c_spdif_rx, @@ -422,7 +422,7 @@ void usb_audio_io(chanend ?c_aud_in, #endif ) { -#ifdef MIXER +#if (MIXER) chan c_mix_out; #endif @@ -446,7 +446,7 @@ void usb_audio_io(chanend ?c_aud_in, par { -#ifdef MIXER +#if (MIXER) /* Mixer cores(s) */ { thread_speed(); @@ -464,7 +464,7 @@ void usb_audio_io(chanend ?c_aud_in, /* Audio I/O core (pars additional S/PDIF TX Core) */ { thread_speed(); -#ifdef MIXER +#if (MIXER) #define AUDIO_CHANNEL c_mix_out #else #define AUDIO_CHANNEL c_aud_in @@ -531,7 +531,7 @@ int main() #endif #endif -#ifdef MIXER +#if (MIXER) chan c_mix_ctl; #endif @@ -608,7 +608,7 @@ int main() , c_ea_data #endif #endif -#ifdef MIXER +#if (MIXER) , c_mix_ctl #endif , c_clk_int, c_clk_ctl, dfuInterface @@ -628,7 +628,7 @@ int main() #if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE != AUDIO_IO_TILE) , c_spdif_tx #endif -#ifdef MIXER +#if (MIXER) , c_mix_ctl #endif , c_spdif_rx, c_adat_rx, c_clk_ctl, c_clk_int diff --git a/lib_xua/src/core/mixer/fastmix.S b/lib_xua/src/core/mixer/fastmix.S index a2374a5e..8a8e008f 100644 --- a/lib_xua/src/core/mixer/fastmix.S +++ b/lib_xua/src/core/mixer/fastmix.S @@ -1,4 +1,4 @@ -// Copyright 2018-2021 XMOS LIMITED. +// Copyright 2018-2023 XMOS LIMITED. // This Software is subject to the terms of the XMOS Public Licence: Version 1. #define MAX_MIX_COUNT 8 diff --git a/lib_xua/src/core/mixer/mixer.xc b/lib_xua/src/core/mixer/mixer.xc index 8acfd639..32f8ccca 100644 --- a/lib_xua/src/core/mixer/mixer.xc +++ b/lib_xua/src/core/mixer/mixer.xc @@ -5,23 +5,36 @@ #include #include "xua.h" -#include "xc_ptr.h" #include "xua_commands.h" #include "dbcalc.h" +#include "print.h" -#ifdef MIXER +#if defined (LEVEL_METER_HOST) || defined(LEVEL_METER_LEDS) +#include "xc_ptr.h" +#endif + +#if (MIXER) /* FAST_MIXER has a bit of a nasty implentation but is more effcient */ -#define FAST_MIXER 1 +#ifndef FAST_MIXER +#define FAST_MIXER (1) +#endif -//#ifdef OUT_VOLUME_IN_MIXER +#if (OUT_VOLUME_IN_MIXER) static unsigned int multOut_array[NUM_USB_CHAN_OUT + 1]; -static xc_ptr multOut; -//#endif -//#ifdef IN_VOLUME_IN_MIXER +unsafe +{ + int volatile * unsafe multOut = multOut_array; +} +#endif + +#if (IN_VOLUME_IN_MIXER) static unsigned int multIn_array[NUM_USB_CHAN_IN + 1]; -static xc_ptr multIn; -//#endif +unsafe +{ + int volatile * unsafe multIn = multIn_array; +} +#endif #if defined (LEVEL_METER_LEDS) || defined (LEVEL_METER_HOST) static unsigned abs(int x) @@ -40,8 +53,8 @@ static unsigned abs(int x) static const int SOURCE_COUNT = NUM_USB_CHAN_OUT + NUM_USB_CHAN_IN + MAX_MIX_COUNT + 1; static int samples_array[NUM_USB_CHAN_OUT + NUM_USB_CHAN_IN + MAX_MIX_COUNT + 1]; /* One larger for an "off" channel for mixer sources" */ -int samples_to_host_map_array[NUM_USB_CHAN_IN]; -int samples_to_device_map_array[NUM_USB_CHAN_OUT]; +static int samples_to_host_map_array[NUM_USB_CHAN_IN]; +static int samples_to_device_map_array[NUM_USB_CHAN_OUT]; unsafe { @@ -50,19 +63,25 @@ unsafe int volatile * const unsafe samples_to_device_map = samples_to_device_map_array; } -#if MAX_MIX_COUNT > 0 -int mix_mult_array[MAX_MIX_COUNT][MIX_INPUTS]; -xc_ptr mix_mult; -#define write_word_to_mix_mult(x,y,val) write_via_xc_ptr_indexed(mix_mult,((x)*MIX_INPUTS)+(y), val) -#define mix_mult_slice(x) (mix_mult + x * MIX_INPUTS * sizeof(int)) -#ifndef FAST_MIXER -int mix_map_array[MAX_MIX_COUNT][MIX_INPUTS]; -xc_ptr mix_map; -#define write_word_to_mix_map(x,y,val) write_via_xc_ptr_indexed(mix_map,((x)*MIX_INPUTS)+(y), val) -#define mix_map_slice(x) (mix_map + x * MIX_INPUTS * sizeof(int)) -#endif +#if (MAX_MIX_COUNT > 0) +int mix_mult_array[MAX_MIX_COUNT * MIX_INPUTS]; +#if (FAST_MIXER == 0) +int mix_map_array[MAX_MIX_COUNT * MIX_INPUTS]; #endif +unsafe +{ + int volatile * const unsafe mix_mult = mix_mult_array; +#if (FAST_MIXER == 0) + int volatile * const unsafe mix_map = mix_map_array; +#endif +} + +#define slice(a, i) (a + i * MIX_INPUTS) + +#endif + +#if defined (LEVEL_METER_HOST) || defined(LEVEL_METER_LEDS) /* Arrays for level data */ int samples_to_host_inputs[NUM_USB_CHAN_IN]; /* Audio transmitted to host i.e. device inputs */ xc_ptr samples_to_host_inputs_ptr; @@ -76,7 +95,6 @@ static int samples_from_host_streams[NUM_USB_CHAN_OUT]; /* Peak samples for audi static int samples_mixer_outputs[MAX_MIX_COUNT]; /* Peak samples out of the mixer */ xc_ptr samples_mixer_outputs_ptr; -#if defined (LEVEL_METER_LEDS) || defined (LEVEL_METER_HOST) static inline void ComputeMixerLevel(int sample, int i) { int x; @@ -95,21 +113,22 @@ static inline void ComputeMixerLevel(int sample, int i) } } #endif -#ifdef FAST_MIXER + +#if (FAST_MIXER) void setPtr(int src, int dst, int mix); -int doMix0(volatile int * const unsafe samples, xc_ptr mult); -int doMix1(volatile int * const unsafe samples, xc_ptr mult); -int doMix2(volatile int * const unsafe samples, xc_ptr mult); -int doMix3(volatile int * const unsafe samples, xc_ptr mult); -int doMix4(volatile int * const unsafe samples, xc_ptr mult); -int doMix5(volatile int * const unsafe samples, xc_ptr mult); -int doMix6(volatile int * const unsafe samples, xc_ptr mult); -int doMix7(volatile int * const unsafe samples, xc_ptr mult); +int doMix0(volatile int * const unsafe samples, volatile int * const unsafe mult); +int doMix1(volatile int * const unsafe samples, volatile int * const unsafe mult); +int doMix2(volatile int * const unsafe samples, volatile int * const unsafe mult); +int doMix3(volatile int * const unsafe samples, volatile int * const unsafe mult); +int doMix4(volatile int * const unsafe samples, volatile int * const unsafe mult); +int doMix5(volatile int * const unsafe samples, volatile int * const unsafe mult); +int doMix6(volatile int * const unsafe samples, volatile int * const unsafe mult); +int doMix7(volatile int * const unsafe samples, volatile int * const unsafe mult); #else /* DO NOT inline, causes 10.4.2 tools to add extra loads in loop */ /* At 18 x 12dB we could get 64 x bigger */ #pragma unsafe arrays -static inline int doMix(volatile int * unsafe samples, xc_ptr ptr, xc_ptr mult) +static inline int doMix(volatile int * unsafe samples, volatile int * unsafe const mixMap, volatile int * const unsafe mult) { int h=0; int l=0; @@ -121,7 +140,7 @@ static inline int doMix(volatile int * unsafe samples, xc_ptr ptr, xc_ptr mult) int sample; int source; int weight; - read_via_xc_ptr_indexed(source, ptr, i); + read_via_xc_ptr_indexed(source, mixMap, i); sample = samples[source]; read_via_xc_ptr_indexed(weight, mult, i); {h,l} = macs(sample, weight, h, l); @@ -142,9 +161,9 @@ static inline int doMix(volatile int * unsafe samples, xc_ptr ptr, xc_ptr mult) #endif #pragma unsafe arrays -static inline void GiveSamplesToHost(chanend c, volatile int * unsafe hostMap, xc_ptr multIn) +static inline void GiveSamplesToHost(chanend c, volatile int * unsafe hostMap) { -#if defined(IN_VOLUME_IN_MIXER) && defined(IN_VOLUME_AFTER_MIX) +#if (IN_VOLUME_IN_MIXER && IN_VOLUME_AFTER_MIX) int mult; int h; unsigned l; @@ -164,12 +183,15 @@ static inline void GiveSamplesToHost(chanend c, volatile int * unsafe hostMap, x sample = ptr_sample[i + NUM_USB_CHAN_OUT]; #endif -#if defined(IN_VOLUME_IN_MIXER) && defined(IN_VOLUME_AFTER_MIX) +#if (IN_VOLUME_IN_MIXER && IN_VOLUME_AFTER_MIX) #warning IN Vols in mixer, AFTER mix & map - //asm("ldw %0, %1[%2]":"=r"(mult):"r"(multIn),"r"(i)); - read_via_xc_ptr_indexed(mult, multIn, i); + + unsafe + { + mult = multIn[i]; + } {h, l} = macs(mult, sample, 0, 0); - + //h <<= 3 done on other side */ outuint(c, h); @@ -190,7 +212,7 @@ static inline void GetSamplesFromHost(chanend c) for (int i=0; i>29)& 0x7; // Note: This step is not required if we assume sample depth is 24bit (rather than 32bit) - // Note: We need all 32bits for Native DSD + // Note: We need all 32bits for Native DSD #endif - write_via_xc_ptr_indexed(multOut, index, val); write_via_xc_ptr_indexed(samples_array, i, h); #else ptr_samples[i] = sample; @@ -227,23 +248,23 @@ static inline void GetSamplesFromHost(chanend c) } #pragma unsafe arrays -static inline void GiveSamplesToDevice(chanend c, volatile int * unsafe deviceMap, xc_ptr multOut) +static inline void GiveSamplesToDevice(chanend c, volatile int * unsafe deviceMap) { -#if(NUM_USB_CHAN_OUT == 0) +#if (NUM_USB_CHAN_OUT == 0) outuint(c, 0); #else #pragma loop unroll for (int i=0; i 0 +#if (MAX_MIX_COUNT > 0) /* If mixer turned on sort out the channel mapping */ unsafe { @@ -258,15 +279,19 @@ static inline void GiveSamplesToDevice(chanend c, volatile int * unsafe deviceMa } #endif -#if defined(OUT_VOLUME_IN_MIXER) && defined(OUT_VOLUME_AFTER_MIX) +#if (OUT_VOLUME_IN_MIXER && OUT_VOLUME_AFTER_MIX) /* Do volume control processing */ #warning OUT Vols in mixer, AFTER mix & map - read_via_xc_ptr_indexed(mult, multOut, i); + unsafe + { + mult = multOut[i]; + } + {h, l} = macs(mult, sample, 0, 0); h<<=3; // Shift used to be done in audio thread but now done here incase of 32bit support #if (STREAM_FORMAT_OUTPUT_RESOLUTION_32BIT_USED == 1) h |= (l >>29)& 0x7; // Note: This step is not required if we assume sample depth is 24bit (rather than 32bit) - // Note: We need all 32bits for Native DSD + // Note: We need all 32bits for Native DSD #endif outuint(c, h); #else @@ -279,7 +304,7 @@ static inline void GiveSamplesToDevice(chanend c, volatile int * unsafe deviceMa #pragma unsafe arrays static inline void GetSamplesFromDevice(chanend c) { -#if defined(IN_VOLUME_IN_MIXER) && !defined(IN_VOLUME_AFTER_MIX) +#if (IN_VOLUME_IN_MIXER && IN_VOLUME_AFTER_MIX) int mult; int h; unsigned l; @@ -306,9 +331,12 @@ static inline void GetSamplesFromDevice(chanend c) } #endif -#if defined(IN_VOLUME_IN_MIXER) && !defined(IN_VOLUME_AFTER_MIX) +#if (IN_VOLUME_IN_MIXER && IN_VOLUME_AFTER_MIX) /* Read relevant multiplier */ - read_via_xc_ptr_indexed(mult, multIn, i); + unsafe + { + mult = multIn[i]; + } /* Do the multiply */ {h, l} = macs(mult, sample, 0, 0); @@ -357,7 +385,7 @@ static void mixer1(chanend c_host, chanend c_mix_ctl, chanend c_mixer2) int mix, index, val; switch (cmd) { -#if MAX_MIX_COUNT > 0 +#if (MAX_MIX_COUNT > 0) case SET_SAMPLES_TO_HOST_MAP: index = inuint(c_mix_ctl); val = inuint(c_mix_ctl); @@ -388,8 +416,7 @@ static void mixer1(chanend c_host, chanend c_mix_ctl, chanend c_mixer2) if((index < MIX_INPUTS) && (mix < MAX_MIX_COUNT)) unsafe { - //mix_mult[(mix * MIX_INPUTS) + index] = val; - write_word_to_mix_mult(mix, index, val); + mix_mult[(mix * MIX_INPUTS) + index] = val; } assert((mix < MAX_MIX_COUNT) && msg("Mix mult mix out of range")); @@ -409,34 +436,46 @@ static void mixer1(chanend c_host, chanend c_mix_ctl, chanend c_mixer2) if((input < MIX_INPUTS) && (mix < MAX_MIX_COUNT) && (source < SOURCE_COUNT)) { -#ifdef FAST_MIXER +#if (FAST_MIXER) setPtr(input, source, mix); #else - write_word_to_mix_map(mix, input, source); -#endif + unsafe + { + mix_map[(mix * MIX_INPUTS) + input] = source; + } +#endif } } break; #endif /* if MAX_MIX_COUNT > 0 */ -#ifdef IN_VOLUME_IN_MIXER +#if (IN_VOLUME_IN_MIXER) case SET_MIX_IN_VOL: index = inuint(c_mix_ctl); val = inuint(c_mix_ctl); inct(c_mix_ctl); - write_via_xc_ptr_indexed(multIn, index, val); + if(index < NUM_USB_CHAN_IN+1) + unsafe{ + multIn[index] = val; + } + assert((index < (NUM_USB_CHAN_IN + 1)) && msg("In volume index out of range")); break; #endif -#ifdef OUT_VOLUME_IN_MIXER +#if (OUT_VOLUME_IN_MIXER) case SET_MIX_OUT_VOL: index = inuint(c_mix_ctl); val = inuint(c_mix_ctl); inct(c_mix_ctl); - write_via_xc_ptr_indexed(multOut, index, val); + if(index < NUM_USB_CHAN_OUT+1) + unsafe{ + multOut[index] = val; + } + assert((index < (NUM_USB_CHAN_OUT + 1)) && msg("Out volume index out of range")); break; #endif +#if defined (LEVEL_METER_HOST) || defined(LEVEL_METER_LEDS) /* Peak samples of stream from host to device (via USB) */ case GET_STREAM_LEVELS: index = inuint(c_mix_ctl); @@ -445,7 +484,6 @@ static void mixer1(chanend c_host, chanend c_mix_ctl, chanend c_mixer2) outct(c_mix_ctl, XS1_CT_END); samples_from_host_streams[index] = 0; break; - case GET_INPUT_LEVELS: index = inuint(c_mix_ctl); chkct(c_mix_ctl, XS1_CT_END); @@ -481,6 +519,7 @@ static void mixer1(chanend c_host, chanend c_mix_ctl, chanend c_mixer2) outuint(c_mix_ctl, val); outct(c_mix_ctl, XS1_CT_END); break; +#endif #endif } break; @@ -537,22 +576,22 @@ static void mixer1(chanend c_host, chanend c_mix_ctl, chanend c_mixer2) } else { -#if MAX_MIX_COUNT > 0 +#if (MAX_MIX_COUNT > 0) GetSamplesFromHost(c_host); - GiveSamplesToHost(c_host, samples_to_host_map, multIn); + GiveSamplesToHost(c_host, samples_to_host_map); /* Sync with mixer 2 (once it has swapped samples with audiohub) */ outuint(c_mixer2, 0); inuint(c_mixer2); /* Do the mixing */ -#ifdef FAST_MIXER - mixed = doMix0(ptr_samples, mix_mult_slice(0)); -#else - mixed = doMix(ptr_samples, mix_map_slice(0), mix_mult_slice(0)); -#endif unsafe { +#if (FAST_MIXER) + mixed = doMix0(ptr_samples, slice(mix_mult, 0)); +#else + mixed = doMix(ptr_samples, slice(mix_map, 0), slice(mix_mult, 0)); +#endif ptr_samples[NUM_USB_CHAN_OUT + NUM_USB_CHAN_IN + 0] = mixed; } @@ -565,13 +604,13 @@ static void mixer1(chanend c_host, chanend c_mix_ctl, chanend c_mixer2) #endif { -#if MAX_MIX_COUNT > 2 +#if (MAX_MIX_COUNT > 2) unsafe { -#ifdef FAST_MIXER - mixed = doMix2(ptr_samples, mix_mult_slice(2)); +#if (FAST_MIXER) + mixed = doMix2(ptr_samples, slice(mix_mult, 2)); #else - mixed = doMix(ptr_samples, mix_map_slice(2), mix_mult_slice(2)); + mixed = doMix(ptr_samples, slice(mix_map, 2), slice(mix_mult, 2)); #endif ptr_samples[NUM_USB_CHAN_OUT + NUM_USB_CHAN_IN + 2] = mixed; } @@ -580,13 +619,13 @@ static void mixer1(chanend c_host, chanend c_mix_ctl, chanend c_mixer2) #endif #endif -#if MAX_MIX_COUNT > 4 +#if (MAX_MIX_COUNT > 4) unsafe { -#ifdef FAST_MIXER - mixed = doMix4(ptr_samples, mix_mult_slice(4)); +#if (FAST_MIXER) + mixed = doMix4(ptr_samples, slice(mix_mult, 4)); #else - mixed = doMix(ptr_samples, mix_map_slice(4), mix_mult_slice(4)); + mixed = doMix(ptr_samples, slice(mix_map, 4), slice(mix_mult, 4)); #endif ptr_samples[XUA_MIXER_OFFSET_MIX + 4] = mixed; } @@ -595,13 +634,13 @@ static void mixer1(chanend c_host, chanend c_mix_ctl, chanend c_mixer2) #endif #endif -#if MAX_MIX_COUNT > 6 +#if (MAX_MIX_COUNT > 6) unsafe { -#ifdef FAST_MIXER - mixed = doMix6(ptr_samples, mix_mult_slice(6)); +#if (FAST_MIXER) + mixed = doMix6(ptr_samples, slice(mix_mult, 6)); #else - mixed = doMix(ptr_samples, mix_map_slice(6), mix_mult_slice(6)); + mixed = doMix(ptr_samples, slice(mix_map, 6), slice(mix_mult, 6)); #endif ptr_samples[XUA_MIXER_OFFSET_MIX + 6] = mixed; } @@ -612,7 +651,7 @@ static void mixer1(chanend c_host, chanend c_mix_ctl, chanend c_mixer2) } #else /* IF MAX_MIX_COUNT > 0 */ /* No mixes, this thread runs on its own doing just volume */ - GiveSamplesToDevice(c_mixer2, samples_to_device_map, multOut); + GiveSamplesToDevice(c_mixer2, samples_to_device_map); GetSamplesFromDevice(c_mixer2); GetSamplesFromHost(c_host); GiveSamplesToHost(c_host, samples_to_host_map, multIn); @@ -679,7 +718,7 @@ static void mixer2(chanend c_mixer1, chanend c_audio) } else { - GiveSamplesToDevice(c_audio, samples_to_device_map, multOut); + GiveSamplesToDevice(c_audio, samples_to_device_map); GetSamplesFromDevice(c_audio); /* Sync with mixer 1 (once it has swapped samples with the buffering sub-system) */ @@ -687,13 +726,13 @@ static void mixer2(chanend c_mixer1, chanend c_audio) outuint(c_mixer1, 0); /* Do the mixing */ -#if MAX_MIX_COUNT > 1 +#if (MAX_MIX_COUNT > 1) unsafe { -#ifdef FAST_MIXER - mixed = doMix1(ptr_samples, mix_mult_slice(1)); +#if (FAST_MIXER) + mixed = doMix1(ptr_samples, slice(mix_mult, 1)); #else - mixed = doMix(ptr_samples, mix_map_slice(1), mix_mult_slice(1)); + mixed = doMix(ptr_samples, slice(mix_map, 1), slice(mix_mult, 1)); #endif ptr_samples[NUM_USB_CHAN_OUT + NUM_USB_CHAN_IN + 1] = mixed; } @@ -707,13 +746,13 @@ static void mixer2(chanend c_mixer1, chanend c_audio) if (!mixer2_mix2_flag) #endif { -#if MAX_MIX_COUNT > 3 +#if (MAX_MIX_COUNT > 3) unsafe { -#ifdef FAST_MIXER - mixed = doMix3(ptr_samples, mix_mult_slice(3)); +#if (FAST_MIXER) + mixed = doMix3(ptr_samples, slice(mix_mult, 3)); #else - mixed = doMix(ptr_samples, mix_map_slice(3), mix_mult_slice(3)); + mixed = doMix(ptr_samples, slice(mix_map, 3), slice(mix_mult, 3)); #endif ptr_samples[NUM_USB_CHAN_OUT + NUM_USB_CHAN_IN + 3] = mixed; } @@ -722,29 +761,29 @@ static void mixer2(chanend c_mixer1, chanend c_audio) #endif #endif -#if MAX_MIX_COUNT > 5 - unsafe - { -#ifdef FAST_MIXER - mixed = doMix5(ptr_samples, mix_mult_slice(5)); +#if (MAX_MIX_COUNT > 5) + unsafe + { +#if (FAST_MIXER) + mixed = doMix5(ptr_samples, slice(mix_mult, 5)); #else - mixed = doMix(ptr_samples, mix_map_slice(5), mix_mult_slice(5)); + mixed = doMix(ptr_samples, slice(mix_map, 5), slice(mix_mult, 5)); #endif - ptr_samples[NUM_USB_CHAN_OUT + NUM_USB_CHAN_IN + 5] = mixed; + ptr_samples[NUM_USB_CHAN_OUT + NUM_USB_CHAN_IN + 5] = mixed; - } + } #if defined (LEVEL_METER_HOST) || defined(LEVEL_METER_LEDS) - ComputeMixerLevel(mixed, 5); + ComputeMixerLevel(mixed, 5); #endif #endif -#if MAX_MIX_COUNT > 7 +#if (MAX_MIX_COUNT > 7) unsafe { -#ifdef FAST_MIXER - mixed = doMix7(ptr_samples, mix_mult_slice(7)); +#if (FAST_MIXER) + mixed = doMix7(ptr_samples, slice(mix_mult, 7)); #else - mixed = doMix(ptr_samples, mix_map_slice(7), mix_mult_slice(7)); + mixed = doMix(ptr_samples, slice(mix_map, 7), slice(mix_mult, 7)); #endif ptr_samples[NUM_USB_CHAN_OUT + NUM_USB_CHAN_IN + 7] = mixed; } @@ -763,20 +802,13 @@ void mixer(chanend c_mix_in, chanend c_mix_out, chanend c_mix_ctl) #if (MAX_MIX_COUNT > 0) chan c; #endif - multOut = array_to_xc_ptr((multOut_array,unsigned[])); - multIn = array_to_xc_ptr((multIn_array,unsigned[])); +#if defined (LEVEL_METER_HOST) || defined(LEVEL_METER_LEDS) samples_to_host_inputs_ptr = array_to_xc_ptr((samples_to_host_inputs, unsigned[])); #ifdef LEVEL_METER_LEDS samples_to_host_inputs_buff_ptr = array_to_xc_ptr((samples_to_host_inputs, unsigned[])); #endif samples_mixer_outputs_ptr = array_to_xc_ptr((samples_mixer_outputs, unsigned[])); - -#if MAX_MIX_COUNT >0 - mix_mult = array_to_xc_ptr((mix_mult_array,unsigned[])); -#ifndef FAST_MIXER - mix_map = array_to_xc_ptr((mix_map_array,unsigned[])); -#endif #endif for (int i=0;i 96000 ? 2 : MAX_MIX_COUNT; - for (int i=0;i 0 +#if (MAX_MIX_COUNT> 0) for (int i=0;i