diff --git a/module_queue/src/queue.h b/module_queue/src/queue.h index 23e4cea5..39b57728 100644 --- a/module_queue/src/queue.h +++ b/module_queue/src/queue.h @@ -43,6 +43,17 @@ inline unsigned queue_pop_word(queue_t &q, unsigned array[]) { return array[q.rdptr++ & q.mask]; } +inline void queue_push_byte(queue_t &q, unsigned char array[], unsigned data) +{ + assert(!queue_is_full(q)); + array[q.wrptr++ & q.mask] = data; +} + +inline unsigned queue_pop_byte(queue_t &q, unsigned char array[]) { + assert(!queue_is_empty(q)); + return array[q.rdptr++ & q.mask]; +} + inline unsigned queue_items(const queue_t &q) { return q.wrptr - q.rdptr; } diff --git a/module_queue/src/queue.xc b/module_queue/src/queue.xc index 58c78248..c78f2b0f 100644 --- a/module_queue/src/queue.xc +++ b/module_queue/src/queue.xc @@ -7,5 +7,7 @@ extern inline int queue_is_empty(const queue_t &q); extern inline int queue_is_full(const queue_t &q); extern inline void queue_push_word(queue_t &q, unsigned array[], unsigned data); extern inline unsigned queue_pop_word(queue_t &q, unsigned array[]); +extern inline void queue_push_byte(queue_t &q, unsigned char array[], unsigned data); +extern inline unsigned queue_pop_byte(queue_t &q, unsigned char array[]); extern inline unsigned queue_space(const queue_t &q); extern inline unsigned queue_items(const queue_t &q); diff --git a/module_usb_audio/endpoint0/descriptors.h b/module_usb_audio/endpoint0/descriptors.h index 3c745349..94158d33 100644 --- a/module_usb_audio/endpoint0/descriptors.h +++ b/module_usb_audio/endpoint0/descriptors.h @@ -242,45 +242,33 @@ unsigned char devQualDesc_Null[] = #define OUTPUT_ALT_LENGTH (OUTPUT_ALT_LENGTH_ADAT + OUTPUT_ALT_LENGTH_DSD) -// Positions in strDescs_Audio2 -#define INTERNAL_CLOCK_STRING_INDEX (14) -#define SPDIF_CLOCK_STRING_INDEX (15) - +// Positions in strDescs +enum { + INTERNAL_CLOCK_STRING_INDEX = 14, #ifdef SPDIF_RX -#define ADAT_CLOCK_STRING_INDEX (SPDIF_CLOCK_STRING_INDEX + 1) -#else -#define ADAT_CLOCK_STRING_INDEX (SPDIF_CLOCK_STRING_INDEX) + SPDIF_CLOCK_STRING_INDEX, #endif - #ifdef ADAT_RX -#define DFU_STRING_INDEX (ADAT_CLOCK_STRING_INDEX + 1) -#else -#define DFU_STRING_INDEX (ADAT_CLOCK_STRING_INDEX) + ADAT_CLOCK_STRING_INDEX, #endif - #ifdef DFU -#define MIDI_OUT_STRING_INDEX (DFU_STRING_INDEX + 1) -#else -#define MIDI_OUT_STRING_INDEX (DFU_STRING_INDEX) + DFU_STRING_INDEX, #endif - -#define MIDI_IN_STRING_INDEX (MIDI_OUT_STRING_INDEX + 1) - #ifdef MIDI -#define OUTPUT_INTERFACE_STRING_INDEX (MIDI_OUT_STRING_INDEX + 2) -#else -#define OUTPUT_INTERFACE_STRING_INDEX (MIDI_OUT_STRING_INDEX) + MIDI_OUT_STRING_INDEX, + MIDI_IN_STRING_INDEX, #endif - -#define INPUT_INTERFACE_STRING_INDEX (OUTPUT_INTERFACE_STRING_INDEX + NUM_USB_CHAN_OUT) - -#define MIXER_STRING_INDEX (INPUT_INTERFACE_STRING_INDEX + NUM_USB_CHAN_IN) - + OUTPUT_INTERFACE_STRING_INDEX, + OUTPUT_INTERFACE_LAST_STRING_INDEX = OUTPUT_INTERFACE_STRING_INDEX + NUM_USB_CHAN_OUT - 1, + INPUT_INTERFACE_STRING_INDEX, + INPUT_INTERFACE_LAST_STRING_INDEX = INPUT_INTERFACE_STRING_INDEX + NUM_USB_CHAN_IN - 1, #ifdef MIXER -#define IAP_INTERFACE_STRING_INDEX (MIXER_STRING_INDEX + MAX_MIX_COUNT) -#else -#define IAP_INTERFACE_STRING_INDEX (MIXER_STRING_INDEX) + MIXER_STRING_INDEX, #endif +#ifdef IAP + IAP_INTERFACE_STRING_INDEX, +#endif +}; #ifdef HID_CONTROLS unsigned char hidReportDescriptor[] = { @@ -1394,44 +1382,8 @@ unsigned char cfgDesc_Audio2[] = #endif - - - - - - }; - - -/* String table */ -#ifdef SPDIF_RX -#define SPDIF_RX_NUM_STRS 1 -#else -#define SPDIF_RX_NUM_STRS 0 -#endif - -#ifdef ADAT_RX -#define ADAT_RX_NUM_STRS 1 -#else -#define ADAT_RX_NUM_STRS 0 -#endif - -#ifdef MIDI -#define MIDI_NUM_STRS 2 -#else -#define MIDI_NUM_STRS 0 -#endif - -#ifdef DFU -#define DFU_NUM_STRS 1 -#else -#define DFU_NUM_STRS 0 -#endif - -#define STR_INDEX_OUT_CHAN (15 + SPDIF_RX_NUM_STRS + ADAT_RX_NUM_STRS + MIDI_NUM_STRS + DFU_NUM_STRS) -#define STR_INDEX_IN_CHAN (STR_INDEX_OUT_CHAN + NUM_USB_CHAN_OUT) - #define APPEND_VENDOR_STR(x) VENDOR_STR" "#x #define APPEND_PRODUCT_STR_A2(x) PRODUCT_STR_A2 " "#x @@ -1446,10 +1398,13 @@ unsigned char cfgDesc_Audio2[] = #endif #endif + +#define STR_USENG 0x0409 + static unsigned char strDescs[][40] = { - "Langids", // 0 LangIDs place holder - APPEND_VENDOR_STR(), // 1 iManufacturer (at MANUFACTURER_STRING_INDEX) + { STR_USENG & 0xff, STR_USENG >> 8, '\0'}, // 0 LangID + APPEND_VENDOR_STR(), // 1 iManufacturer (at MANUFACTURER_STRING_INDEX) "",//SERIAL_STR, // 2 iSerialNumber (at SERIAL_STR_INDEX) diff --git a/module_usb_audio/endpoint0/endpoint0.xc b/module_usb_audio/endpoint0/endpoint0.xc index ef389052..5bdd6205 100755 --- a/module_usb_audio/endpoint0/endpoint0.xc +++ b/module_usb_audio/endpoint0/endpoint0.xc @@ -100,24 +100,11 @@ unsigned g_curUsbSpeed = 0; extern unsigned g_iap_reset; #endif - -#define STR_USENG 0x0409 - -#define DESC_STR_LANGIDS \ -{ \ - STR_USENG & 0xff, /* 2 wLangID[0] */ \ - STR_USENG>>8, /* 3 wLangID[0] */ \ - '\0' \ -} - #ifdef NATIVE_DSD /* We remember if we are in DSD mode to avoid Configuring the DAC too often - thus avoiding pops and clicks */ unsigned g_dsdMode = 0; #endif -/* String descriptors */ -static unsigned char strDesc_langIDs[] = DESC_STR_LANGIDS; - void VendorAudioRequestsInit(chanend c_audioControl, chanend ?c_mix_ctl, chanend ?c_clk_ctl); /* Endpoint 0 function. Handles all requests to the device */ @@ -193,38 +180,36 @@ void Endpoint0( chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, } #endif - safememcpy(strDescs[0], strDesc_langIDs, sizeof(strDesc_langIDs)); - /* Build up channel string table - By default all channels are marked as analogue * TODO We really want to do this an build time... */ #if defined(SPDIF_RX) && (SPDIF_RX_INDEX != 0) - safestrcpy(strDescs[SPDIF_RX_INDEX + STR_INDEX_IN_CHAN], "S/PDIF 1"); - safestrcpy(strDescs[SPDIF_RX_INDEX + STR_INDEX_IN_CHAN + 1], "S/PDIF 2"); + safestrcpy(strDescs[SPDIF_RX_INDEX + INPUT_INTERFACE_STRING_INDEX], "S/PDIF 1"); + safestrcpy(strDescs[SPDIF_RX_INDEX + INPUT_INTERFACE_STRING_INDEX + 1], "S/PDIF 2"); #endif #if defined(ADAT_RX) && (ADAT_RX_INDEX != 0) - safestrcpy(strDescs[ADAT_RX_INDEX + STR_INDEX_IN_CHAN], "ADAT 1"); - safestrcpy(strDescs[ADAT_RX_INDEX + STR_INDEX_IN_CHAN + 1], "ADAT 2"); - safestrcpy(strDescs[ADAT_RX_INDEX + STR_INDEX_IN_CHAN + 2], "ADAT 3"); - safestrcpy(strDescs[ADAT_RX_INDEX + STR_INDEX_IN_CHAN + 3], "ADAT 4"); - safestrcpy(strDescs[ADAT_RX_INDEX + STR_INDEX_IN_CHAN + 4], "ADAT 5"); - safestrcpy(strDescs[ADAT_RX_INDEX + STR_INDEX_IN_CHAN + 5], "ADAT 6"); - safestrcpy(strDescs[ADAT_RX_INDEX + STR_INDEX_IN_CHAN + 6], "ADAT 7"); - safestrcpy(strDescs[ADAT_RX_INDEX + STR_INDEX_IN_CHAN + 7], "ADAT 8"); + safestrcpy(strDescs[ADAT_RX_INDEX + INPUT_INTERFACE_STRING_INDEX], "ADAT 1"); + safestrcpy(strDescs[ADAT_RX_INDEX + INPUT_INTERFACE_STRING_INDEX + 1], "ADAT 2"); + safestrcpy(strDescs[ADAT_RX_INDEX + INPUT_INTERFACE_STRING_INDEX + 2], "ADAT 3"); + safestrcpy(strDescs[ADAT_RX_INDEX + INPUT_INTERFACE_STRING_INDEX + 3], "ADAT 4"); + safestrcpy(strDescs[ADAT_RX_INDEX + INPUT_INTERFACE_STRING_INDEX + 4], "ADAT 5"); + safestrcpy(strDescs[ADAT_RX_INDEX + INPUT_INTERFACE_STRING_INDEX + 5], "ADAT 6"); + safestrcpy(strDescs[ADAT_RX_INDEX + INPUT_INTERFACE_STRING_INDEX + 6], "ADAT 7"); + safestrcpy(strDescs[ADAT_RX_INDEX + INPUT_INTERFACE_STRING_INDEX + 7], "ADAT 8"); #endif #if defined(SPDIF) && (SPDIF_TX_INDEX != 0) /* "Analogue naming gets priority */ - safestrcpy(strDescs[SPDIF_TX_INDEX + STR_INDEX_OUT_CHAN], "S/PDIF 1"); - safestrcpy(strDescs[SPDIF_TX_INDEX + STR_INDEX_OUT_CHAN + 1], "S/PDIF 2"); + safestrcpy(strDescs[SPDIF_TX_INDEX + OUTPUT_INTERFACE_STRING_INDEX], "S/PDIF 1"); + safestrcpy(strDescs[SPDIF_TX_INDEX + OUTPUT_INTERFACE_STRING_INDEX + 1], "S/PDIF 2"); #endif #if defined(ADAT_TX) && (ADAT_TX_INDEX != 0) - safestrcpy(strDescs[ADAT_TX_INDEX + STR_INDEX_OUT_CHAN], "ADAT 1"); - safestrcpy(strDescs[ADAT_TX_INDEX + STR_INDEX_OUT_CHAN + 1], "ADAT 2"); - safestrcpy(strDescs[ADAT_TX_INDEX + STR_INDEX_OUT_CHAN + 2], "ADAT 3"); - safestrcpy(strDescs[ADAT_TX_INDEX + STR_INDEX_OUT_CHAN + 3], "ADAT 4"); - safestrcpy(strDescs[ADAT_TX_INDEX + STR_INDEX_OUT_CHAN + 4], "ADAT 5"); - safestrcpy(strDescs[ADAT_TX_INDEX + STR_INDEX_OUT_CHAN + 5], "ADAT 6"); - safestrcpy(strDescs[ADAT_TX_INDEX + STR_INDEX_OUT_CHAN + 6], "ADAT 7"); - safestrcpy(strDescs[ADAT_TX_INDEX + STR_INDEX_OUT_CHAN + 7], "ADAT 8"); + safestrcpy(strDescs[ADAT_TX_INDEX + OUTPUT_INTERFACE_STRING_INDEX], "ADAT 1"); + safestrcpy(strDescs[ADAT_TX_INDEX + OUTPUT_INTERFACE_STRING_INDEX + 1], "ADAT 2"); + safestrcpy(strDescs[ADAT_TX_INDEX + OUTPUT_INTERFACE_STRING_INDEX + 2], "ADAT 3"); + safestrcpy(strDescs[ADAT_TX_INDEX + OUTPUT_INTERFACE_STRING_INDEX + 3], "ADAT 4"); + safestrcpy(strDescs[ADAT_TX_INDEX + OUTPUT_INTERFACE_STRING_INDEX + 4], "ADAT 5"); + safestrcpy(strDescs[ADAT_TX_INDEX + OUTPUT_INTERFACE_STRING_INDEX + 5], "ADAT 6"); + safestrcpy(strDescs[ADAT_TX_INDEX + OUTPUT_INTERFACE_STRING_INDEX + 6], "ADAT 7"); + safestrcpy(strDescs[ADAT_TX_INDEX + OUTPUT_INTERFACE_STRING_INDEX + 7], "ADAT 8"); #endif #ifdef VENDOR_AUDIO_REQS