update 8 mode support

This commit is contained in:
Steven Dan
2026-03-18 10:36:29 +08:00
parent cf1678b303
commit 4b9ea5f42e
14 changed files with 498 additions and 705 deletions

View File

@@ -1,10 +0,0 @@
# This variable should contain a space separated list of all
# the directories containing buildable applications (usually
# prefixed with the app_ prefix)
#
# If the variable is set to "all" then all directories that start with app_
# are built.
BUILD_SUBDIRS = all
XMOS_MAKE_PATH ?= ..
include $(XMOS_MAKE_PATH)/xcommon/module_xcommon/build/Makefile.toplevel

Binary file not shown.

View File

@@ -1,51 +1,51 @@
#ifndef __DS_BUILD_H__
#define __DS_BUILD_H__
//#define _DEBUG
#define XMOS_SDK
#define USE_OS // Thread, Event, Lock 등의 외부 OS API 사용
#define USE_FIXED_POINT // 내부 연산 고정소수점 사용
#define USE_PLANAR_ARRAY_INPUT // Audio Input Data Planar 배열 사용
#if (NUM_USB_CHAN_OUT > 5)
#define USE_LFE_UNIT // LFE 채널 Convolution 사용
#endif
// #define USE_UPMIX // Upmix 기능 사용
#if (NUM_USB_CHAN_OUT <= 8)
#if (NUM_USB_CHAN_OUT == 2)
#define USE_ONLY_STEREO
#endif
#define USE_ONLY_HORIZONTALITY // 수평 방향(Vertical 90도)만 사용
#elif (NUM_USB_CHAN_OUT == 12)
#define USE_7_1_4_IR_ARRARY // top: 1st~4th (45/135/225/315 ==> TFL/TFR/TBL/TBR)
// middle: 5th~12th (0/45/90/135/180/225/270/315 ==> FL/FR/C/LFE/BL/BR/SL/SR)
#elif (NUM_USB_CHAN_OUT == 16)
#define USE_7_1_4_4_IR_ARRARY // top: 1st~4th (45/135/225/315 ==> TFL/TFR/TBL/TBR)
// middle: 5th~12th (0/45/90/135/180/225/270/315 ==> FL/FR/C/LFE/BL/BR/SL/SR)
// bottom: 13th~16th (45/135/225/315 ==> BFL/BFR/BBL/BBR)
#elif (NUM_USB_CHAN_OUT == 24)
#define USE_7_1_8_8_IR_ARRARY // top: 1st~4th (0/45/90/135/180/225/270/315 ==> TFL/TFR/TFC/TBC/TBL/TBR/TSL/TSR)
// middle: 5th~12th (0/45/90/135/180/225/270/315 ==> FL/FR/C/LFE/BL/BR/SL/SR)
// bottom: 13th~16th (0/45/90/135/180/225/270/315 ==> BFL/BFR/BFC/BBC/BBL/BBR/BSL/BSR)
#endif
#if NUM_USB_CHAN_OUT == 8
// 6ch version
#define DSP_WORKER_COUNT 2//4//3 //the count of workers
#define DSP_WORKER_DATA_CH_COUNT 3//2 //3 //the number of channels each one handles
#define DSP_WORKER_FILTER_PER_DATA_CH 2 //the number of channels each one handles
#else
#define IR_PS5
#define DSP_WORKER_COUNT 4 //the count of workers
#define DSP_WORKER_DATA_CH_COUNT 1 //the number of channels each one handles
#define DSP_WORKER_FILTER_PER_DATA_CH 2 //the number of channels each one handles
#endif
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#endif //__DS_BUILD_H__
#ifndef __DS_BUILD_H__
#define __DS_BUILD_H__
//#define _DEBUG
#define XMOS_SDK
#define USE_OS // Thread, Event, Lock 등의 외부 OS API 사용
#define USE_FIXED_POINT // 내부 연산 고정소수점 사용
#define USE_PLANAR_ARRAY_INPUT // Audio Input Data Planar 배열 사용
#if (NUM_USB_CHAN_OUT > 5)
#define USE_LFE_UNIT // LFE 채널 Convolution 사용
#endif
// #define USE_UPMIX // Upmix 기능 사용
#if (NUM_USB_CHAN_OUT <= 8)
#if (NUM_USB_CHAN_OUT == 2)
#define USE_ONLY_STEREO
#endif
#define USE_ONLY_HORIZONTALITY // 수평 방향(Vertical 90도)만 사용
#elif (NUM_USB_CHAN_OUT == 12)
#define USE_7_1_4_IR_ARRARY // top: 1st~4th (45/135/225/315 ==> TFL/TFR/TBL/TBR)
// middle: 5th~12th (0/45/90/135/180/225/270/315 ==> FL/FR/C/LFE/BL/BR/SL/SR)
#elif (NUM_USB_CHAN_OUT == 16)
#define USE_7_1_4_4_IR_ARRARY // top: 1st~4th (45/135/225/315 ==> TFL/TFR/TBL/TBR)
// middle: 5th~12th (0/45/90/135/180/225/270/315 ==> FL/FR/C/LFE/BL/BR/SL/SR)
// bottom: 13th~16th (45/135/225/315 ==> BFL/BFR/BBL/BBR)
#elif (NUM_USB_CHAN_OUT == 24)
#define USE_7_1_8_8_IR_ARRARY // top: 1st~4th (0/45/90/135/180/225/270/315 ==> TFL/TFR/TFC/TBC/TBL/TBR/TSL/TSR)
// middle: 5th~12th (0/45/90/135/180/225/270/315 ==> FL/FR/C/LFE/BL/BR/SL/SR)
// bottom: 13th~16th (0/45/90/135/180/225/270/315 ==> BFL/BFR/BFC/BBC/BBL/BBR/BSL/BSR)
#endif
#if NUM_USB_CHAN_OUT == 8
// 6ch version
#define DSP_WORKER_COUNT 2//4//3 //the count of workers
#define DSP_WORKER_DATA_CH_COUNT 3//2 //3 //the number of channels each one handles
#define DSP_WORKER_FILTER_PER_DATA_CH 2 //the number of channels each one handles
#else
#define IR_PS5
#define DSP_WORKER_COUNT 4 //the count of workers
#define DSP_WORKER_DATA_CH_COUNT 1 //the number of channels each one handles
#define DSP_WORKER_FILTER_PER_DATA_CH 2 //the number of channels each one handles
#endif
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#endif //__DS_BUILD_H__

View File

@@ -62,20 +62,20 @@ EXTERN td_block_fir_filter_t td_block_fir_filter_SPATIAL_71_DRAMA_v090h090_left;
//This is the count of int32_t words to allocate for one data channel.
//i.e. int32_t channel_data[SPATIAL_71_DRAMA_v090h090_left_DATA_BUFFER_ELEMENTS] = { 0 };
#define SPATIAL_71_DRAMA_v090h090_left_DATA_BUFFER_ELEMENTS (1824)
#define SPATIAL_71_DRAMA_v090h090_left_DATA_BUFFER_ELEMENTS (1872)
#define SPATIAL_71_DRAMA_v090h090_left_TD_BLOCK_LENGTH (8)
#define SPATIAL_71_DRAMA_v090h090_left_BLOCK_COUNT (226)
#define SPATIAL_71_DRAMA_v090h090_left_BLOCK_COUNT (232)
#define SPATIAL_71_DRAMA_v090h090_left_FRAME_ADVANCE (8)
#define SPATIAL_71_DRAMA_v090h090_left_FRAME_OVERLAP (0)
EXTERN td_block_fir_filter_t td_block_fir_filter_SPATIAL_71_DRAMA_v090h090_right;
//This is the count of int32_t words to allocate for one data channel.
//i.e. int32_t channel_data[SPATIAL_71_DRAMA_v090h090_right_DATA_BUFFER_ELEMENTS] = { 0 };
#define SPATIAL_71_DRAMA_v090h090_right_DATA_BUFFER_ELEMENTS (1824)
#define SPATIAL_71_DRAMA_v090h090_right_DATA_BUFFER_ELEMENTS (1872)
#define SPATIAL_71_DRAMA_v090h090_right_TD_BLOCK_LENGTH (8)
#define SPATIAL_71_DRAMA_v090h090_right_BLOCK_COUNT (226)
#define SPATIAL_71_DRAMA_v090h090_right_BLOCK_COUNT (232)
#define SPATIAL_71_DRAMA_v090h090_right_FRAME_ADVANCE (8)
#define SPATIAL_71_DRAMA_v090h090_right_FRAME_OVERLAP (0)
EXTERN td_block_fir_filter_t td_block_fir_filter_SPATIAL_71_DRAMA_v090h135_left;
@@ -222,20 +222,20 @@ EXTERN td_block_fir_filter_t td_block_fir_filter_SPATIAL_71_GAME_v090h090_left;
//This is the count of int32_t words to allocate for one data channel.
//i.e. int32_t channel_data[SPATIAL_71_GAME_v090h090_left_DATA_BUFFER_ELEMENTS] = { 0 };
#define SPATIAL_71_GAME_v090h090_left_DATA_BUFFER_ELEMENTS (1824)
#define SPATIAL_71_GAME_v090h090_left_DATA_BUFFER_ELEMENTS (1872)
#define SPATIAL_71_GAME_v090h090_left_TD_BLOCK_LENGTH (8)
#define SPATIAL_71_GAME_v090h090_left_BLOCK_COUNT (226)
#define SPATIAL_71_GAME_v090h090_left_BLOCK_COUNT (232)
#define SPATIAL_71_GAME_v090h090_left_FRAME_ADVANCE (8)
#define SPATIAL_71_GAME_v090h090_left_FRAME_OVERLAP (0)
EXTERN td_block_fir_filter_t td_block_fir_filter_SPATIAL_71_GAME_v090h090_right;
//This is the count of int32_t words to allocate for one data channel.
//i.e. int32_t channel_data[SPATIAL_71_GAME_v090h090_right_DATA_BUFFER_ELEMENTS] = { 0 };
#define SPATIAL_71_GAME_v090h090_right_DATA_BUFFER_ELEMENTS (1824)
#define SPATIAL_71_GAME_v090h090_right_DATA_BUFFER_ELEMENTS (1872)
#define SPATIAL_71_GAME_v090h090_right_TD_BLOCK_LENGTH (8)
#define SPATIAL_71_GAME_v090h090_right_BLOCK_COUNT (226)
#define SPATIAL_71_GAME_v090h090_right_BLOCK_COUNT (232)
#define SPATIAL_71_GAME_v090h090_right_FRAME_ADVANCE (8)
#define SPATIAL_71_GAME_v090h090_right_FRAME_OVERLAP (0)
EXTERN td_block_fir_filter_t td_block_fir_filter_SPATIAL_71_GAME_v090h135_left;
@@ -382,20 +382,20 @@ EXTERN td_block_fir_filter_t td_block_fir_filter_SPATIAL_71_MOVIE_v090h090_left;
//This is the count of int32_t words to allocate for one data channel.
//i.e. int32_t channel_data[SPATIAL_71_MOVIE_v090h090_left_DATA_BUFFER_ELEMENTS] = { 0 };
#define SPATIAL_71_MOVIE_v090h090_left_DATA_BUFFER_ELEMENTS (1824)
#define SPATIAL_71_MOVIE_v090h090_left_DATA_BUFFER_ELEMENTS (1872)
#define SPATIAL_71_MOVIE_v090h090_left_TD_BLOCK_LENGTH (8)
#define SPATIAL_71_MOVIE_v090h090_left_BLOCK_COUNT (226)
#define SPATIAL_71_MOVIE_v090h090_left_BLOCK_COUNT (232)
#define SPATIAL_71_MOVIE_v090h090_left_FRAME_ADVANCE (8)
#define SPATIAL_71_MOVIE_v090h090_left_FRAME_OVERLAP (0)
EXTERN td_block_fir_filter_t td_block_fir_filter_SPATIAL_71_MOVIE_v090h090_right;
//This is the count of int32_t words to allocate for one data channel.
//i.e. int32_t channel_data[SPATIAL_71_MOVIE_v090h090_right_DATA_BUFFER_ELEMENTS] = { 0 };
#define SPATIAL_71_MOVIE_v090h090_right_DATA_BUFFER_ELEMENTS (1824)
#define SPATIAL_71_MOVIE_v090h090_right_DATA_BUFFER_ELEMENTS (1872)
#define SPATIAL_71_MOVIE_v090h090_right_TD_BLOCK_LENGTH (8)
#define SPATIAL_71_MOVIE_v090h090_right_BLOCK_COUNT (226)
#define SPATIAL_71_MOVIE_v090h090_right_BLOCK_COUNT (232)
#define SPATIAL_71_MOVIE_v090h090_right_FRAME_ADVANCE (8)
#define SPATIAL_71_MOVIE_v090h090_right_FRAME_OVERLAP (0)
EXTERN td_block_fir_filter_t td_block_fir_filter_SPATIAL_71_MOVIE_v090h135_left;
@@ -482,20 +482,20 @@ EXTERN td_block_fir_filter_t td_block_fir_filter_SPATIAL_71_MUSIC_lfe_left;
//This is the count of int32_t words to allocate for one data channel.
//i.e. int32_t channel_data[SPATIAL_71_MUSIC_lfe_left_DATA_BUFFER_ELEMENTS] = { 0 };
#define SPATIAL_71_MUSIC_lfe_left_DATA_BUFFER_ELEMENTS (1832)
#define SPATIAL_71_MUSIC_lfe_left_DATA_BUFFER_ELEMENTS (1224)
#define SPATIAL_71_MUSIC_lfe_left_TD_BLOCK_LENGTH (8)
#define SPATIAL_71_MUSIC_lfe_left_BLOCK_COUNT (227)
#define SPATIAL_71_MUSIC_lfe_left_BLOCK_COUNT (151)
#define SPATIAL_71_MUSIC_lfe_left_FRAME_ADVANCE (8)
#define SPATIAL_71_MUSIC_lfe_left_FRAME_OVERLAP (0)
EXTERN td_block_fir_filter_t td_block_fir_filter_SPATIAL_71_MUSIC_lfe_right;
//This is the count of int32_t words to allocate for one data channel.
//i.e. int32_t channel_data[SPATIAL_71_MUSIC_lfe_right_DATA_BUFFER_ELEMENTS] = { 0 };
#define SPATIAL_71_MUSIC_lfe_right_DATA_BUFFER_ELEMENTS (1832)
#define SPATIAL_71_MUSIC_lfe_right_DATA_BUFFER_ELEMENTS (1224)
#define SPATIAL_71_MUSIC_lfe_right_TD_BLOCK_LENGTH (8)
#define SPATIAL_71_MUSIC_lfe_right_BLOCK_COUNT (227)
#define SPATIAL_71_MUSIC_lfe_right_BLOCK_COUNT (151)
#define SPATIAL_71_MUSIC_lfe_right_FRAME_ADVANCE (8)
#define SPATIAL_71_MUSIC_lfe_right_FRAME_OVERLAP (0)
EXTERN td_block_fir_filter_t td_block_fir_filter_SPATIAL_71_MUSIC_v090h000_left;
@@ -542,20 +542,20 @@ EXTERN td_block_fir_filter_t td_block_fir_filter_SPATIAL_71_MUSIC_v090h090_left;
//This is the count of int32_t words to allocate for one data channel.
//i.e. int32_t channel_data[SPATIAL_71_MUSIC_v090h090_left_DATA_BUFFER_ELEMENTS] = { 0 };
#define SPATIAL_71_MUSIC_v090h090_left_DATA_BUFFER_ELEMENTS (1824)
#define SPATIAL_71_MUSIC_v090h090_left_DATA_BUFFER_ELEMENTS (1872)
#define SPATIAL_71_MUSIC_v090h090_left_TD_BLOCK_LENGTH (8)
#define SPATIAL_71_MUSIC_v090h090_left_BLOCK_COUNT (226)
#define SPATIAL_71_MUSIC_v090h090_left_BLOCK_COUNT (232)
#define SPATIAL_71_MUSIC_v090h090_left_FRAME_ADVANCE (8)
#define SPATIAL_71_MUSIC_v090h090_left_FRAME_OVERLAP (0)
EXTERN td_block_fir_filter_t td_block_fir_filter_SPATIAL_71_MUSIC_v090h090_right;
//This is the count of int32_t words to allocate for one data channel.
//i.e. int32_t channel_data[SPATIAL_71_MUSIC_v090h090_right_DATA_BUFFER_ELEMENTS] = { 0 };
#define SPATIAL_71_MUSIC_v090h090_right_DATA_BUFFER_ELEMENTS (1824)
#define SPATIAL_71_MUSIC_v090h090_right_DATA_BUFFER_ELEMENTS (1872)
#define SPATIAL_71_MUSIC_v090h090_right_TD_BLOCK_LENGTH (8)
#define SPATIAL_71_MUSIC_v090h090_right_BLOCK_COUNT (226)
#define SPATIAL_71_MUSIC_v090h090_right_BLOCK_COUNT (232)
#define SPATIAL_71_MUSIC_v090h090_right_FRAME_ADVANCE (8)
#define SPATIAL_71_MUSIC_v090h090_right_FRAME_OVERLAP (0)
EXTERN td_block_fir_filter_t td_block_fir_filter_SPATIAL_71_MUSIC_v090h135_left;

View File

@@ -30,7 +30,7 @@
#endif
#define EX3D_SET_CH_NUM NUM_USB_CHAN_OUT
#define EX3D_SF_NUM 1
#define EX3D_SF_NUM 6
EXTERN void audio_ex3d_load_key(chanend_t c);
EXTERN int audio_ex3d_activate_key(chanend_t c);

View File

@@ -54,90 +54,93 @@ set(SW_USB_AUDIO_FLAGS ${EXTRA_BUILD_FLAGS} -O3
LINK_DIRECTORIES(${CMAKE_CURRENT_LIST_DIR}/../../lib_dnr/lib_dnr)
set(APP_COMPILER_FLAGS_ex3d_UAC1 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
-DI2S_CHANS_ADC=0
-DAUDIO_CLASS=1
-DMIN_FREQ=48000
-DMAX_FREQ=48000
-DUSE_EX3D
-DMIXER=0
-DAIZIP_DNR=0 #-ldnr_50ms
-llib_ex3d_stereo_2k
-DNUM_USB_CHAN_OUT=2
-DNUM_USB_CHAN_OUT_FS=2
-DNUM_USB_CHAN_IN=0
-DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=16
-DSTREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS=16
-DSTREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS=16
-DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=16
-DSTREAM_FORMAT_INPUT_2_RESOLUTION_BITS=16
-DSTREAM_FORMAT_INPUT_3_RESOLUTION_BITS=16
-DNUM_EX3D_CHAN_OUT=2
-DINPUT_VOLUME_CONTROL=0
-DUAC1_MODE=1
-DOUTPUT_VOLUME_CONTROL=0
-DXUA_DFU_EN=0
-DSTEREO_2K
-DHID_CONTROLS=0)
#set(APP_COMPILER_FLAGS_ex3d_UAC1 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
# -DI2S_CHANS_ADC=0
# -DAUDIO_CLASS=1
# -DMIN_FREQ=48000
# -DMAX_FREQ=48000
# -DUSE_EX3D
# -DMIXER=0
# -DAIZIP_DNR=0 #-ldnr_50ms
# -llib_ex3d_stereo_2k
# -DNUM_USB_CHAN_OUT=2
# -DNUM_USB_CHAN_OUT_FS=2
# -DNUM_USB_CHAN_IN=0
# -DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=16
# -DSTREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS=16
# -DSTREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS=16
# -DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=16
# -DSTREAM_FORMAT_INPUT_2_RESOLUTION_BITS=16
# -DSTREAM_FORMAT_INPUT_3_RESOLUTION_BITS=16
# -DNUM_EX3D_CHAN_OUT=2
# -DINPUT_VOLUME_CONTROL=0
# -DUAC1_MODE=1
# -DOUTPUT_VOLUME_CONTROL=0
# -DXUA_DFU_EN=0
# -DSTEREO_2K
# -DHID_CONTROLS=0)
#
#
#set(APP_COMPILER_FLAGS_ex3d_stereo_2k ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
# -DI2S_CHANS_ADC=2
# #-DAUDIO_CLASS=1
# -DMIN_FREQ=48000
# -DMAX_FREQ=48000
# -DUSE_EX3D
# -DMIXER=0
# -DAIZIP_DNR=0 #-ldnr_50ms
# -llib_ex3d_stereo_2k
# -DNUM_USB_CHAN_OUT=2
# -DNUM_USB_CHAN_IN=2
# -DEQ_EN=1
# -DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=16
# -DSTREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS=16
# -DSTREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS=16
# -DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=16
# -DSTREAM_FORMAT_INPUT_2_RESOLUTION_BITS=16
# -DSTREAM_FORMAT_INPUT_3_RESOLUTION_BITS=16
# -DNUM_EX3D_CHAN_OUT=2
# -DINPUT_VOLUME_CONTROL=1
# -DOUTPUT_VOLUME_CONTROL=1
# -DXUA_DFU_EN=1
# -DSTEREO_2K
# -DHID_CONTROLS=1)
#
#set(APP_COMPILER_FLAGS_ex3d_stereo_8k ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
# -DI2S_CHANS_ADC=0
# -DMIN_FREQ=48000
# -DMAX_FREQ=48000
# -DUSE_EX3D
# -DMIXER=0
# -DAIZIP_DNR=0 #-ldnr_50ms
# -llib_ex3d_stereo_8k
# -DNUM_USB_CHAN_OUT=2
# -DNUM_USB_CHAN_IN=2
# -DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=16
# -DSTREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS=16
# -DSTREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS=16
# -DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=16
# -DSTREAM_FORMAT_INPUT_2_RESOLUTION_BITS=16
# -DSTREAM_FORMAT_INPUT_3_RESOLUTION_BITS=16
# -DNUM_EX3D_CHAN_OUT=2
# -DXUA_DFU_EN=1
# -DINPUT_VOLUME_CONTROL=1
# -DOUTPUT_VOLUME_CONTROL=1
# -DSTEREO_8K
# -DHID_CONTROLS=1)
set(APP_COMPILER_FLAGS_ex3d_stereo_2k ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
-DI2S_CHANS_ADC=2
#-DAUDIO_CLASS=1
-DMIN_FREQ=48000
-DMAX_FREQ=48000
-DUSE_EX3D
-DMIXER=0
-DAIZIP_DNR=0 #-ldnr_50ms
-llib_ex3d_stereo_2k
-DNUM_USB_CHAN_OUT=2
-DNUM_USB_CHAN_IN=2
-DEQ_EN=1
-DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=16
-DSTREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS=16
-DSTREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS=16
-DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=16
-DSTREAM_FORMAT_INPUT_2_RESOLUTION_BITS=16
-DSTREAM_FORMAT_INPUT_3_RESOLUTION_BITS=16
-DNUM_EX3D_CHAN_OUT=2
-DINPUT_VOLUME_CONTROL=1
-DOUTPUT_VOLUME_CONTROL=1
-DXUA_DFU_EN=1
-DSTEREO_2K
-DHID_CONTROLS=1)
set(APP_COMPILER_FLAGS_ex3d_stereo_8k ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
-DI2S_CHANS_ADC=0
-DMIN_FREQ=48000
-DMAX_FREQ=48000
-DUSE_EX3D
-DMIXER=0
-DAIZIP_DNR=0 #-ldnr_50ms
-llib_ex3d_stereo_8k
-DNUM_USB_CHAN_OUT=2
-DNUM_USB_CHAN_IN=2
-DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=16
-DSTREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS=16
-DSTREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS=16
-DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=16
-DSTREAM_FORMAT_INPUT_2_RESOLUTION_BITS=16
-DSTREAM_FORMAT_INPUT_3_RESOLUTION_BITS=16
-DNUM_EX3D_CHAN_OUT=2
-DXUA_DFU_EN=1
-DINPUT_VOLUME_CONTROL=1
-DOUTPUT_VOLUME_CONTROL=1
-DSTEREO_8K
-DHID_CONTROLS=1)
set(APP_COMPILER_FLAGS_ex3d_71_game ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
## IR switching mode
set(APP_COMPILER_FLAGS_ex3d_71_all ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
-DI2S_CHANS_ADC=2
-DMIN_FREQ=48000
-DMAX_FREQ=48000
-DMIN_FREQ=48000
-DMAX_FREQ=48000
-DUSE_EX3D
-DMIXER=0
-DAIZIP_DNR=0 #-ldnr_50ms
-llib_ex3d_game
-DMIXER=0
-DAIZIP_DNR=0 -ldnr_50ms
-llib_ex3d_all
-DEQ_EN=1
-DEX3D_SF_NUM=3
-DNUM_USB_CHAN_OUT=8
-DNUM_USB_CHAN_IN=2
-DNUM_EX3D_CHAN_OUT=2
@@ -146,56 +149,75 @@ set(APP_COMPILER_FLAGS_ex3d_71_game ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
-DOUTPUT_VOLUME_CONTROL=1
#-DDEBUG_MEMORY_LOG_ENABLED=1
-DXUA_DFU_EN=1
-DSPATIAL_GAME
-DIR_SWITCHING_MODE
-DHID_CONTROLS=1)
set(APP_COMPILER_FLAGS_ex3d_71_music ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
-DI2S_CHANS_ADC=2
-DMIN_FREQ=48000
-DMAX_FREQ=48000
-DUSE_EX3D
-DMIXER=0
-DAIZIP_DNR=0 #-ldnr_50ms
-llib_ex3d_music
-DNUM_USB_CHAN_OUT=8
-DNUM_USB_CHAN_IN=2
-DNUM_EX3D_CHAN_OUT=2
-DMIN_VOLUME=0xE000
-DSPATIAL_MUSIC
-DHID_CONTROLS=1)
set(APP_COMPILER_FLAGS_ex3d_71_movie ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
-DI2S_CHANS_ADC=2
-DMIN_FREQ=48000
-DMAX_FREQ=48000
-DUSE_EX3D
-DMIXER=0
-DAIZIP_DNR=0 #-ldnr_50ms
-DEQ_EN=1
-llib_ex3d_movie
-DNUM_USB_CHAN_OUT=8
-DNUM_USB_CHAN_IN=2
-DNUM_EX3D_CHAN_OUT=2
-DMIN_VOLUME=0xE000
-DXUA_DFU_EN=1
-DSPATIAL_MOVIE
-DHID_CONTROLS=1)
set(APP_COMPILER_FLAGS_ex3d_71_drama ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
-DI2S_CHANS_ADC=2
-DMIN_FREQ=48000
-DMAX_FREQ=48000
-DUSE_EX3D
-DMIXER=0
-DAIZIP_DNR=0 #-ldnr_50ms
-llib_ex3d_drama
-DNUM_USB_CHAN_OUT=8
-DNUM_USB_CHAN_IN=2
-DNUM_EX3D_CHAN_OUT=2
-DMIN_VOLUME=0xE000
-DSPATIAL_DRAMA
-DHID_CONTROLS=1)
#set(APP_COMPILER_FLAGS_ex3d_71_game ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
# -DI2S_CHANS_ADC=2
# -DMIN_FREQ=48000
# -DMAX_FREQ=48000
# -DUSE_EX3D
# -DMIXER=0
# -DAIZIP_DNR=0 #-ldnr_50ms
# -llib_ex3d_game
# -DEQ_EN=1
# -DNUM_USB_CHAN_OUT=8
# -DNUM_USB_CHAN_IN=2
# -DNUM_EX3D_CHAN_OUT=2
# -DMIN_VOLUME=0xE000
# -DINPUT_VOLUME_CONTROL=1
# -DOUTPUT_VOLUME_CONTROL=1
# #-DDEBUG_MEMORY_LOG_ENABLED=1
# -DXUA_DFU_EN=1
# -DSPATIAL_GAME
# -DHID_CONTROLS=1)
#
#set(APP_COMPILER_FLAGS_ex3d_71_music ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
# -DI2S_CHANS_ADC=2
# -DMIN_FREQ=48000
# -DMAX_FREQ=48000
# -DUSE_EX3D
# -DMIXER=0
# -DAIZIP_DNR=0 #-ldnr_50ms
# -llib_ex3d_music
# -DNUM_USB_CHAN_OUT=8
# -DNUM_USB_CHAN_IN=2
# -DNUM_EX3D_CHAN_OUT=2
# -DMIN_VOLUME=0xE000
# -DSPATIAL_MUSIC
# -DHID_CONTROLS=1)
#
#set(APP_COMPILER_FLAGS_ex3d_71_movie ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
# -DI2S_CHANS_ADC=2
# -DMIN_FREQ=48000
# -DMAX_FREQ=48000
# -DUSE_EX3D
# -DMIXER=0
# -DAIZIP_DNR=0 #-ldnr_50ms
# -DEQ_EN=1
# -llib_ex3d_movie
# -DNUM_USB_CHAN_OUT=8
# -DNUM_USB_CHAN_IN=2
# -DNUM_EX3D_CHAN_OUT=2
# -DMIN_VOLUME=0xE000
# -DXUA_DFU_EN=1
# -DSPATIAL_MOVIE
# -DHID_CONTROLS=1)
#
#set(APP_COMPILER_FLAGS_ex3d_71_drama ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
# -DI2S_CHANS_ADC=2
# -DMIN_FREQ=48000
# -DMAX_FREQ=48000
# -DUSE_EX3D
# -DMIXER=0
# -DAIZIP_DNR=0 #-ldnr_50ms
# -llib_ex3d_drama
# -DNUM_USB_CHAN_OUT=8
# -DNUM_USB_CHAN_IN=2
# -DNUM_EX3D_CHAN_OUT=2
# -DMIN_VOLUME=0xE000
# -DSPATIAL_DRAMA
# -DHID_CONTROLS=1)
#
set(APP_INCLUDES src src/core src/extensions ../../lib_dnr/lib_dnr)
set(XMOS_SANDBOX_DIR ${CMAKE_CURRENT_LIST_DIR}/../..)

View File

@@ -61,8 +61,14 @@ unsigned g_mic_level_t1;
#define LED_OFF 1
#define S3D_ON LED_ON
#define S3D_OFF LED_OFF
#if defined(IR_SWITCHING_MODE)
enum {IR_OFF=0, IR_GAME=1, IR_MUSIC=2, IR_MOVIE=3, IR_7_1_GAME=4, IR_7_1_MUSIC=5, IR_7_1_MOVIE=6};
unsigned g_3d_on_off_t1 = IR_OFF; // Default 3D off
#else
enum {A3D_OFF=0, A3D_VON=1, A3D_ON=2};
unsigned g_3d_on_off_t1 = A3D_OFF; // Default 3D off
#endif
#define DNR_ON 1
#define DNR_OFF 0
unsigned g_dnr_on_off_t1 = DNR_OFF; // Default DNR off
@@ -182,8 +188,8 @@ void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudi
#endif
#endif
}
#if defined(SPATIAL_DRAMA) || defined(SPATIAL_GAME) || defined(SPATIAL_MOVIE) || defined(SPATIAL_MUSIC)
#if defined(SPATIAL_DRAMA) || defined(SPATIAL_GAME) || defined(SPATIAL_MOVIE) || defined(SPATIAL_MUSIC) || defined(IR_SWITCHING_MODE)
// 6ch version
// C and LFE -3dB mixed to L and R.
// L = L + C*-3dB + LFE*-3dB
@@ -212,8 +218,21 @@ void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudi
if (sum_R > 2147483647) sum_R = 2147483647;
else if (sum_R < -2147483648) sum_R = -2147483648;
ubm_egress[0][frame_index] = (int32_t)sum_L;
ubm_egress[1][frame_index] = (int32_t)sum_R;
// only for Stereo game, Stereo music and Stereo movie mode
if ((is_3d > IR_OFF) && (is_3d < IR_7_1_GAME)) {
// stereo mode
ubm_egress[0][frame_index] = 0;
ubm_egress[1][frame_index] = 0;
ubm_egress[2][frame_index] = 0;
ubm_egress[3][frame_index] = 0;
ubm_egress[4][frame_index] = 0;
ubm_egress[5][frame_index] = 0;
ubm_egress[6][frame_index] = (int32_t)sum_L; //SL
ubm_egress[7][frame_index] = (int32_t)sum_R; //SR
} else {
ubm_egress[0][frame_index] = (int32_t)sum_L;
ubm_egress[1][frame_index] = (int32_t)sum_R;
}
// Zero out C (2) and LFE (3) since they are mixed into L/R
ubm_egress[2][frame_index] = 0;
@@ -335,6 +354,11 @@ void hid_receive_task_in_c(unsigned char * RcvData, unsigned * SendData)
unsigned *pRcvBuf = (unsigned *)(RcvData + 4);
unsigned *pSendBuf = SendData;
unsigned angle;
// 改动原因:
// - host UI 根据 EX3D_SF_NUM 遍历声场列表;现在 EX3D_SF_NUM=3只暴露按键支持的3个“带算法声场”(GAME/MUSIC/MOVIE)
// - 算法开关通过 CMD_ONOFF 单独控制CMD_SOUND_FIELD 只选择声场,不允许隐式打开算法;
// 因此在HID命令层仅缓存“最近一次声场索引(0~2)”,供 CMD_SOUND_FIELD / CMD_ONOFF 共用算法OFF时也能记住选择
static unsigned last_sf_idx_0_2 = 0; // 0~2: GAME/MUSIC/MOVIE
command_code = pRcvBuf[0];
cmdItem = CMD_ITEM(command_code);
@@ -349,8 +373,31 @@ void hid_receive_task_in_c(unsigned char * RcvData, unsigned * SendData)
if (CMD_SET(CMD_ONOFF) == command_code) {
// set DrAX on/off
//audio_ex3d_onoff(pRcvBuf[1]);
audio_ex3d_set_onoff(pRcvBuf[1]);
debug_printf("Set CMD_ONOFF : %u\r\n", pRcvBuf[1]);
uint32_t onoff = pRcvBuf[1];
//audio_ex3d_set_onoff(pRcvBuf[1]);
audio_ex3d_set_onoff(onoff);
uint32_t cur_mode;
GET_SHARED_GLOBAL(cur_mode, g_3d_on_off_t1);
if (onoff == 0) {
// 改动原因:关闭算法时记录当前声场索引(0~2)供下次打开时恢复然后仅把共享变量置为IR_OFF
if (cur_mode == IR_7_1_MOVIE) {
last_sf_idx_0_2 = 2;
} else if (cur_mode == IR_7_1_GAME) {
last_sf_idx_0_2 = 1;
} else {
last_sf_idx_0_2 = 0;
}
cur_mode = IR_OFF;
SET_SHARED_GLOBAL(g_3d_on_off_t1, cur_mode);
} else {
// 改动原因:打开算法时恢复到最近一次选择的声场(0~2),并统一映射到 IR_GAME..IR_MOVIE不再暴露6个族
unsigned new_mode;
if (last_sf_idx_0_2 == 2) new_mode = IR_7_1_MOVIE;
else if (last_sf_idx_0_2 == 1) new_mode = IR_7_1_GAME;
else new_mode = IR_GAME;
SET_SHARED_GLOBAL(g_3d_on_off_t1, new_mode);
}
printf("Set CMD_ONOFF : %u\r\n", pRcvBuf[1]);
} else {
debug_printf("Get CMD_ONOFF : %u\r\n", bEX3D_On);
pSendBuf[idx] = bEX3D_On;
@@ -473,7 +520,26 @@ void hid_receive_task_in_c(unsigned char * RcvData, unsigned * SendData)
const char * sfIdxName = "SPATIAL GAME"; //sfDispName[sfIdx];
#elif defined(SPATIAL_MOVIE)
const char * sfIdxName = "SPATIAL MOVIE"; //sfDispName[sfIdx];
#else
#elif defined(IR_SWITCHING_MODE)
// 改动原因host UI 现在只遍历 EX3D_SF_NUM=3 的声场这里仅返回按键支持的3个“带算法声场”名字
// mapping: sfIdx(0..2) -> IR_GAME/IR_7_1_GAME/IR_7_1_MOVIE
const char * sfIdxName = "";
switch (sfIdx) {
case 0: sfIdxName = "STEREO GAME"; break;
case 1: sfIdxName = "SPATIAL GAME"; break;
case 2: sfIdxName = "SPATIAL MOVIE"; break;
default: break;
}
// if (cur_mode == IR_GAME) {
// sfIdxName = spatial_game;
// } else {
// if (cur_mode == IR_MUSIC) {
// sfIdxName = spatial_music;
// } else {
// sfIdxName = spatial_movie;
// }
// }
#else
const char * sfIdxName = "EXTREME";
#endif
int32_t NameLen = strlen(sfIdxName);
@@ -489,12 +555,45 @@ void hid_receive_task_in_c(unsigned char * RcvData, unsigned * SendData)
if (CMD_SET(CMD_SOUND_FIELD) == command_code) {
int32_t sfIdx = pRcvBuf[1];
debug_printf("Set CMD_SOUND_FIELD : ");
if (sfIdx < EX3D_SF_NUM) {
audio_ex3d_set_sf(sfIdx);
} else
// 改动原因:
// - host UI 现在只暴露3个“带算法声场”GAME/MUSIC/MOVIE 三选一)。
// - 算法开关通过 CMD_ONOFF/其它接口单独控制CMD_SOUND_FIELD 不能隐式把算法打开/关闭。
// 因此CMD_SOUND_FIELD 只接受 0~2对应 GAME/MUSIC/MOVIE并且在算法OFF(IR_OFF)时只缓存选择、不改共享变量。
if (sfIdx >= 0 && sfIdx < 3) {
unsigned cur_mode;
GET_SHARED_GLOBAL(cur_mode, g_3d_on_off_t1);
last_sf_idx_0_2 = (unsigned)sfIdx;
if (cur_mode == IR_OFF) {
// 改动原因:算法已关闭时不写 g_3d_on_off_t1避免 event_polling 误判“主机改变声场”而自动打开算法
debug_printf("algorithm OFF, cache sound field idx=%d only (no implicit on/off)\n", sfIdx);
} else {
// 改动原因算法已开启时才更新声场因EX3D_SF_NUM=3不再区分6个族
unsigned new_mode;
if (sfIdx == 1) new_mode = IR_7_1_GAME;
else if (sfIdx == 2) new_mode = IR_7_1_MOVIE;
else new_mode = IR_GAME;
SET_SHARED_GLOBAL(g_3d_on_off_t1, new_mode);
debug_printf("set sound field idx=%d -> g_3d_on_off_t1=%d (no implicit on/off)\n", sfIdx, new_mode);
}
} else {
// 改动原因EX3D_SF_NUM=3后只支持0~2超过范围返回错误
pSendBuf[idx] = 0xFFFFFFFF;
}
} else { // Get
pSendBuf[idx] = 0;//EX3D_SF_Idx;
// 改动原因:返回当前声场索引(0~2: GAME/MUSIC/MOVIE)若算法OFF则返回缓存值避免依赖 g_3d_on_off_t1=IR_OFF
unsigned cur_mode;
GET_SHARED_GLOBAL(cur_mode, g_3d_on_off_t1);
if (cur_mode == IR_OFF) {
pSendBuf[idx] = last_sf_idx_0_2;
} else if (cur_mode == IR_7_1_MOVIE) {
pSendBuf[idx] = 2;
} else if (cur_mode == IR_7_1_GAME) {
pSendBuf[idx] = 1;
} else {
pSendBuf[idx] = 0;
}
}
break;
@@ -785,7 +884,11 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
port_t p_leds = XS1_PORT_1G;
port_t p_leds2 = XS1_PORT_4D;
// set spatial audio on; LED on
#if defined (IR_SWITCHING_MODE)
static uint32_t is_3d_on = IR_OFF;
#else
static uint32_t is_3d_on = A3D_OFF;
#endif
static uint32_t is_dnr_on = DNR_OFF;
static uint8_t leds2_val = LED_DNR_OFF_71_OFF;
static uint8_t leds1_val = 1; // LED off
@@ -854,6 +957,7 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
event_mic_vol:
{
tmp = chan_in_byte(cc_mic_level);
#if 1
debug_printf("event_mic_vol received: 0x%02X\n", tmp);
// 改动原因检查是否是音频模式传输命令0xFC如果是则接收当前音频模式值0-3
if (tmp == 0xFC) {
@@ -869,7 +973,11 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
if (current_mode_local == 0) {
// 无音效模式:灯灭,算法关闭
audio_ex3d_onoff(0);
#if IR_SWITCHING_MODE
is_3d_on = IR_OFF;
#else
is_3d_on = A3D_OFF;
#endif
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
@@ -878,7 +986,11 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
} else if (current_mode_local == 1) {
// STEREO_2K模式红灯算法开启
audio_ex3d_onoff(1);
#if IR_SWITCHING_MODE
is_3d_on = IR_GAME;
#else
is_3d_on = A3D_ON;
#endif
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
leds1_val &= (~1); // Red LED on
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
@@ -887,7 +999,11 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
} else if (current_mode_local == 2) {
// SPATIAL_GAME模式蓝灯算法开启
audio_ex3d_onoff(1);
#if IR_SWITCHING_MODE
is_3d_on = IR_7_1_GAME;
#else
is_3d_on = A3D_ON;
#endif
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
leds1_val |= 1; // Red LED off
@@ -896,7 +1012,11 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
} else if (current_mode_local == 3) {
// SPATIAL_MOVIE模式蓝灯闪烁算法开启
audio_ex3d_onoff(1);
#if IR_SWITCHING_MODE
is_3d_on = IR_7_1_MOVIE;
#else
is_3d_on = A3D_ON;
#endif
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on (初始状态)
leds1_val |= 1; // Red LED off
@@ -907,6 +1027,7 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
port_out(p_leds2, leds2_val);
key_enable = 1;
// 模式接收完成后继续,不处理按键
} else {
// 正常的mic level命令处理
debug_printf("Processing mic level command: 0x%02X\n", tmp);
@@ -926,6 +1047,7 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
break;
}
}
#endif
}
continue;
@@ -985,7 +1107,7 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
if (press_hold_cnt > 0) {
// 改动原因短按切换模式0=无音效1=STEREO_2K2=SPATIAL_GAME3=SPATIAL_MOVIE
// 循环切换0→1→2→3→0
#if UAC1_MODE
#if !UAC1_MODE
unsigned old_mode = current_mode_local;
current_mode_local = (current_mode_local + 1) % 4; // 循环切换 0→1→2→3→0
debug_printf("Short press: switching mode from %d to %d\n", old_mode, current_mode_local);
@@ -993,7 +1115,11 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
if (current_mode_local == 0) {
// 无音效模式:灯灭,算法关闭
audio_ex3d_onoff(0);
#if IR_SWITCHING_MODE
is_3d_on = IR_OFF;
#else
is_3d_on = A3D_OFF;
#endif
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
@@ -1002,7 +1128,11 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
} else if (current_mode_local == 1) {
// STEREO_2K模式红灯算法开启
audio_ex3d_onoff(1);
#if IR_SWITCHING_MODE
is_3d_on = IR_GAME;
#else
is_3d_on = A3D_ON;
#endif
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
leds1_val &= (~1); // Red LED on
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
@@ -1011,7 +1141,11 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
} else if (current_mode_local == 2) {
// SPATIAL_GAME模式蓝灯算法开启
audio_ex3d_onoff(1);
#if IR_SWITCHING_MODE
is_3d_on = IR_7_1_GAME;
#else
is_3d_on = A3D_ON;
#endif
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
leds1_val |= 1; // Red LED off
@@ -1020,7 +1154,11 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
} else if (current_mode_local == 3) {
// SPATIAL_MOVIE模式蓝灯闪烁算法开启
audio_ex3d_onoff(1);
#if IR_SWITCHING_MODE
is_3d_on = IR_7_1_MOVIE;
#else
is_3d_on = A3D_ON;
#endif
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
// 初始状态蓝灯亮闪烁将在event_polling中处理
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
@@ -1073,6 +1211,50 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
else {
blink_counter = 0;
}
// check if host app changed the sound field
uint32_t host_app_sf;
GET_SHARED_GLOBAL(host_app_sf, g_3d_on_off_t1);
if (host_app_sf != is_3d_on) {
is_3d_on = host_app_sf;
audio_ex3d_onoff(is_3d_on != IR_OFF);
if (is_3d_on == IR_OFF) {
current_mode_local = 0;
leds2_val |= (1<<BLUE_LED_PIN);
leds2_val |= (1<<GREEN_LED_PIN);
leds1_val |= 1;
} else if (is_3d_on == IR_7_1_GAME) {
current_mode_local = 2;
leds2_val &= (~(1<<BLUE_LED_PIN));
leds1_val |= 1;
leds2_val |= (1<<GREEN_LED_PIN);
} else if (is_3d_on == IR_7_1_MOVIE) {
current_mode_local = 3;
leds2_val &= (~(1<<BLUE_LED_PIN));
leds1_val |= 1;
leds2_val |= (1<<GREEN_LED_PIN);
} else if (is_3d_on == IR_GAME) {
current_mode_local = 1;
leds1_val &= (~1);
leds2_val |= (1<<BLUE_LED_PIN);
leds2_val |= (1<<GREEN_LED_PIN);
}
switch (is_3d_on) {
case IR_GAME: printf("Stereo Game on\n"); break;
case IR_MUSIC: printf("Stereo Music on\n"); break;
case IR_MOVIE: printf("Stereo Movie on\n"); break;
case IR_7_1_GAME: printf("3d Game on\n"); break;
case IR_7_1_MUSIC: printf("3d Music on\n"); break;
case IR_7_1_MOVIE: printf("3d Movie on\n"); break;
case IR_OFF: printf("3d off\n"); break;
default: break;
}
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
port_out(p_leds2, leds2_val);
port_out(p_leds, leds1_val);
}
}
}
continue;
@@ -1159,7 +1341,13 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
if (host_os == OS_WIN) {
printf("Detected Windows OS (OS_WIN) saved_mode: %d\n", saved_mode);
#if IR_SWITCHING_MODE
if (saved_mode == 0) {
SetRoleSwitchFlag(MODE_STEREO_2K);
} else {
SetRoleSwitchFlag(MODE_SPATIAL_GAME);
}
#else
{
switch (saved_mode) {
case 0:
@@ -1183,6 +1371,7 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
device_reboot();
while (1);
}
#endif
}
#endif
@@ -1246,65 +1435,19 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
reportData[0] = hidData0;
if (hidData0 == 0xffffffff) {
debug_printf("receive end data\n");
// 改动原因:收到0xffffffff后循环切换模式并保存到flash然后设置切换标志
// 注意UAC1模式下不会收到此命令hid_button_task不发送
// 读取当前g_game_mode值
unsigned current_mode = chan_in_word(c_hidSendData);
// 改动原因:按键短按切换模式时tile1(hid_button_task) 已经完成“算新模式 + 立即切灯/算法”;
// tile0(button_task) 这里只负责接收最终模式值并保存(共享变量 + flash避免再次循环计算/触发重启导致不同步。
unsigned new_mode = chan_in_word(c_hidSendData);
debug_printf("received new_mode from tile1: %d\n", new_mode);
// 改动原因Windows模式下只循环切换0→1→2→3→0不包括UAC1模式4
// 循环切换模式0(STEREO_2K) -> 1(SPATIAL_GAME) -> 2(SPATIAL_MOVIE) -> 3(无音效) -> 0
unsigned new_mode;
unsigned mode_flag;
debug_printf("current_mode: %d\n", current_mode);
if (current_mode == 0) {
// 当前是STEREO_2K切换到STEREO_2K
new_mode = 1;
mode_flag = MODE_STEREO_2K;
debug_printf("Switching from STEREO_2K (0) to STEREO_2K (1)\n");
} else if (current_mode == 1) {
// 当前是STEREO_2K切换到SPATIAL_GAME
new_mode = 2;
mode_flag = MODE_SPATIAL_GAME;
debug_printf("Switching from STEREO_2K (1) to SPATIAL_GAME (2)\n");
} else if (current_mode == 2) {
// 当前是SPATIAL_GAME切换到SPATIAL_MOVIE
new_mode = 3;
mode_flag = MODE_SPATIAL_MOVIE; // SPATIAL_MOVIE模式使用SPATIAL_MOVIE固件
debug_printf("Switching from SPATIAL_GAME (2) to SPATIAL_MOVIE (3)\n");
} // 更新g_game_mode
else if(current_mode == 3) {
if (new_mode > 3) {
new_mode = 0;
mode_flag = MODE_STEREO_2K;
debug_printf("Switching from SPATIAL_MOVIE (3) to STEREO_2K (0)\n");
}
// 改动原因:保存新的模式值到flash的 "game_mode" 文件Windows模式专用
// 改动原因:把模式值传到tile0保存RAM共享变量用于运行时同步flash用于掉电保持
SET_SHARED_GLOBAL(g_game_mode, new_mode);
unsigned char path[] = "game_mode";
save_value(path, (unsigned char)new_mode);
debug_printf("Saved game_mode %d to flash\n", new_mode);
delay_milliseconds(20);
// 改动原因判断是否需要切换固件mode 0和mode 1都使用STEREO_2K固件不需要reboot
// 只有在需要切换固件时才reboot同一固件内的模式切换如0<->1只更新模式和算法状态
#if !UAC1_MODE
if (new_mode != 1) {
// 改动原因需要切换固件执行reboot
debug_printf("Set role switch flag: 0x%04X, switching firmware, rebooting...\n", mode_flag);
SetRoleSwitchFlag(mode_flag);
delay_milliseconds(20);
device_reboot();
while (1);
} else {
// 改动原因不需要切换固件只更新模式和算法状态如mode 0<->1切换不reboot
debug_printf("Same firmware mode (0x%04X), updating mode and algorithm state without reboot\n", mode_flag);
SET_SHARED_GLOBAL(g_game_mode, new_mode);
// 改动原因通过channel发送新的audio_mode给hid_button_task更新LED和算法状态
chan_out_byte(cc_mic_level, 0xFC); // 音频模式传输命令
chan_out_byte(cc_mic_level, new_mode); // 音频模式值
debug_printf("Sent audio_mode %d to hid_button_task via cc_mic_level channel\n", new_mode);
}
#endif
break;
}
#if (HID_CONTROLS == 1)
@@ -1497,15 +1640,25 @@ void ex3d_task(){
#define TD_DATA_BUFFER_ELEMENTS SPATIAL_STEREO_2K_v090h090_left_DATA_BUFFER_ELEMENTS
#elif defined(STEREO_8K)
#define TD_DATA_BUFFER_ELEMENTS SPATIAL_STEREO_8K_v090h090_left_DATA_BUFFER_ELEMENTS
#elif defined(IR_SWITCHING_MODE)
#define TD_DATA_BUFFER_ELEMENTS SPATIAL_71_GAME_v090h225_left_DATA_BUFFER_ELEMENTS
#else
#error you need to define SPATIAL_DRAMA or STEREO_8K....
#endif
int dsp_worker(chanend_t c_dsp_to_ex3d,
#if defined (IR_SWITCHING_MODE)
int dsp_worker(chanend_t c_dsp_to_ex3d,
td_block_fir_filter_t * filters[DSP_WORKER_FILTER_PER_DATA_CH*DSP_WORKER_DATA_CH_COUNT*4]){
#else
int dsp_worker(chanend_t c_dsp_to_ex3d,
td_block_fir_filter_t * filters[DSP_WORKER_FILTER_PER_DATA_CH*DSP_WORKER_DATA_CH_COUNT]){
#endif
int32_t sample_buffer[DSP_WORKER_DATA_CH_COUNT][TD_DATA_BUFFER_ELEMENTS];
td_block_fir_data_t fir_data[DSP_WORKER_DATA_CH_COUNT];
#if defined (IR_SWITCHING_MODE)
static uint32_t ir_mode;
GET_SHARED_GLOBAL(ir_mode, g_3d_on_off_t1);
#endif
for(int i=0;i<DSP_WORKER_DATA_CH_COUNT;i++)
td_block_fir_data_init(&(fir_data[i]), sample_buffer[i], TD_DATA_BUFFER_ELEMENTS);
@@ -1515,6 +1668,15 @@ int dsp_worker(chanend_t c_dsp_to_ex3d,
memset(sample_buffer, 0, sizeof(sample_buffer));
while(1){
GET_SHARED_GLOBAL(ir_mode, g_3d_on_off_t1);
if (ir_mode) {
//ir_mode = ir_mode & (0x03);
if (ir_mode > 3) {
ir_mode -= 4;
} else {
ir_mode -= 1;
}
}
for(int ch=0;ch<DSP_WORKER_DATA_CH_COUNT;ch++){
chan_in_buf_word(c_dsp_to_ex3d, (uint32_t *)input[ch], DSP_BLOCK_LENGTH);
@@ -1527,8 +1689,8 @@ int dsp_worker(chanend_t c_dsp_to_ex3d,
}
for(int ch=0;ch<DSP_WORKER_DATA_CH_COUNT;ch++){
for(int d=0;d<DSP_WORKER_FILTER_PER_DATA_CH;d++){
if(filters[DSP_WORKER_FILTER_PER_DATA_CH*ch+d] != 0){
td_block_fir_compute(output[DSP_WORKER_FILTER_PER_DATA_CH*ch+d], &(fir_data[ch]), filters[DSP_WORKER_FILTER_PER_DATA_CH*ch+d]);
if(filters[(ir_mode*6) + DSP_WORKER_FILTER_PER_DATA_CH*ch+d] != 0){
td_block_fir_compute(output[DSP_WORKER_FILTER_PER_DATA_CH*ch+d], &(fir_data[ch]), filters[(ir_mode*6) + DSP_WORKER_FILTER_PER_DATA_CH*ch+d]);
} else {
memset(output[DSP_WORKER_FILTER_PER_DATA_CH*ch+d], 0, TD_BLOCK_FIR_LENGTH*sizeof(int32_t));
}
@@ -1681,7 +1843,51 @@ int dsp_worker_tile(chanend_t c_dsp_to_ex3d, int worker_id){
} else {
exit(1);
}
// IR SWITCHING MODE
#elif defined(IR_SWITCHING_MODE)
if(worker_id == 0){
td_block_fir_filter_t * filters[DSP_WORKER_DATA_CH_COUNT*DSP_WORKER_FILTER_PER_DATA_CH*4] =
{
&td_block_fir_filter_SPATIAL_71_GAME_v090h225_left, &td_block_fir_filter_SPATIAL_71_GAME_v090h225_right,
&td_block_fir_filter_SPATIAL_71_GAME_v090h315_left, &td_block_fir_filter_SPATIAL_71_GAME_v090h315_right,
&td_block_fir_filter_SPATIAL_71_GAME_v090h090_left, &td_block_fir_filter_SPATIAL_71_GAME_v090h090_right,
&td_block_fir_filter_SPATIAL_71_MUSIC_v090h225_left, &td_block_fir_filter_SPATIAL_71_MUSIC_v090h225_right,
&td_block_fir_filter_SPATIAL_71_MUSIC_v090h315_left, &td_block_fir_filter_SPATIAL_71_MUSIC_v090h315_right,
&td_block_fir_filter_SPATIAL_71_MUSIC_v090h090_left, &td_block_fir_filter_SPATIAL_71_MUSIC_v090h090_right,
&td_block_fir_filter_SPATIAL_71_MOVIE_v090h225_left, &td_block_fir_filter_SPATIAL_71_MOVIE_v090h225_right,
&td_block_fir_filter_SPATIAL_71_MOVIE_v090h315_left, &td_block_fir_filter_SPATIAL_71_MOVIE_v090h315_right,
&td_block_fir_filter_SPATIAL_71_MOVIE_v090h090_left, &td_block_fir_filter_SPATIAL_71_MOVIE_v090h090_right,
0,0,//&td_block_fir_filter_SPATIAL_71_DRAMA_v090h225_left, &td_block_fir_filter_SPATIAL_71_DRAMA_v090h225_right,
0,0,//&td_block_fir_filter_SPATIAL_71_DRAMA_v090h315_left, &td_block_fir_filter_SPATIAL_71_DRAMA_v090h315_right,
0,0//&td_block_fir_filter_SPATIAL_71_DRAMA_v090h090_left, &td_block_fir_filter_SPATIAL_71_DRAMA_v090h090_right
};
dsp_worker(c_dsp_to_ex3d, filters);
} else if(worker_id == 1){
td_block_fir_filter_t * filters[DSP_WORKER_DATA_CH_COUNT*DSP_WORKER_FILTER_PER_DATA_CH*4] =
{
&td_block_fir_filter_SPATIAL_71_GAME_v090h045_left, &td_block_fir_filter_SPATIAL_71_GAME_v090h045_right,
&td_block_fir_filter_SPATIAL_71_GAME_v090h135_left, &td_block_fir_filter_SPATIAL_71_GAME_v090h135_right,
&td_block_fir_filter_SPATIAL_71_GAME_v090h270_left, &td_block_fir_filter_SPATIAL_71_GAME_v090h270_right,
&td_block_fir_filter_SPATIAL_71_MUSIC_v090h045_left, &td_block_fir_filter_SPATIAL_71_MUSIC_v090h045_right,
&td_block_fir_filter_SPATIAL_71_MUSIC_v090h135_left, &td_block_fir_filter_SPATIAL_71_MUSIC_v090h135_right,
&td_block_fir_filter_SPATIAL_71_MUSIC_v090h270_left, &td_block_fir_filter_SPATIAL_71_MUSIC_v090h270_right,
&td_block_fir_filter_SPATIAL_71_MOVIE_v090h045_left, &td_block_fir_filter_SPATIAL_71_MOVIE_v090h045_right,
&td_block_fir_filter_SPATIAL_71_MOVIE_v090h135_left, &td_block_fir_filter_SPATIAL_71_MOVIE_v090h135_right,
&td_block_fir_filter_SPATIAL_71_MOVIE_v090h270_left, &td_block_fir_filter_SPATIAL_71_MOVIE_v090h270_right,
0,0,//&td_block_fir_filter_SPATIAL_71_DRAMA_v090h045_left, &td_block_fir_filter_SPATIAL_71_DRAMA_v090h045_right,
0,0,//&td_block_fir_filter_SPATIAL_71_DRAMA_v090h135_left, &td_block_fir_filter_SPATIAL_71_DRAMA_v090h135_right,
0,0//&td_block_fir_filter_SPATIAL_71_DRAMA_v090h270_left, &td_block_fir_filter_SPATIAL_71_DRAMA_v090h270_right
};
dsp_worker(c_dsp_to_ex3d, filters);
} else {
exit(1);
}
#endif
return 0;

View File

@@ -1,425 +0,0 @@
// Copyright 2022 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
#ifndef _hid_report_descriptor_h_
#define _hid_report_descriptor_h_
#include "xua_hid_report.h"
#if 0
/* Existing static report descriptor kept for reference */
unsigned char hidReportDescriptor[] =
{
0x05, 0x0c, /* Usage Page (Consumer Device) */
0x09, 0x01, /* Usage (Consumer Control) */
0xa1, 0x01, /* Collection (Application) */
0x15, 0x00, /* Logical Minimum (0) */
0x25, 0x01, /* Logical Maximum (1) */
0x09, 0xb0, /* Usage (Play) */
0x09, 0xb5, /* Usage (Scan Next Track) */
0x09, 0xb6, /* Usage (Scan Previous Track) */
0x09, 0xe9, /* Usage (Volume Up) */
0x09, 0xea, /* Usage (Volume Down) */
0x09, 0xe2, /* Usage (Mute) */
0x75, 0x01, /* Report Size (1) */
0x95, 0x06, /* Report Count (6) */
0x81, 0x02, /* Input (Data, Var, Abs) */
0x95, 0x02, /* Report Count (2) */
0x81, 0x01, /* Input (Cnst, Ary, Abs) */
0xc0 /* End collection */
};
#endif
#if 0//AIZIP_DNR == 1
/*
* Define non-configurable items in the HID Report descriptor.
*/
static const USB_HID_Short_Item_t hidCollectionApplication = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_COLLECTION),
.data = { 0x01, 0x00 } };
static const USB_HID_Short_Item_t hidCollectionEnd = {
.header = HID_REPORT_SET_HEADER(0, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_END_COLLECTION),
.data = { 0x00, 0x00 } };
static const USB_HID_Short_Item_t hidInputConstArray = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_INPUT),
.data = { 0x01, 0x00 } };
static const USB_HID_Short_Item_t hidInputDataVar = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_INPUT),
.data = { 0x02, 0x00 } };
static const USB_HID_Short_Item_t hidOutputDataVar = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_OUTPUT),
.data = { 0x02, 0x00 } };
static const USB_HID_Short_Item_t hidOutputConstArray = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_OUTPUT),
.data = { 0x01, 0x00 } };
static const USB_HID_Short_Item_t hidReportId0 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_ID),
.data = { 0x00, 0x00 } };
static const USB_HID_Short_Item_t hidReportId1 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_ID),
.data = { 0x01, 0x00 } };
static const USB_HID_Short_Item_t hidLogicalMaximum0 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MAXIMUM),
.data = { 0x00, 0x00 } };
static const USB_HID_Short_Item_t hidLogicalMaximum1 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MAXIMUM),
.data = { 0x01, 0x00 } };
static const USB_HID_Short_Item_t hidLogicalMinimum0 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MINIMUM),
.data = { 0x00, 0x00 } };
static const USB_HID_Short_Item_t hidLogicalMaximum0F = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MAXIMUM),
.data = { 0x0f, 0x00 } };
static const USB_HID_Short_Item_t hidLogicalMaximumFF = {
.header = HID_REPORT_SET_HEADER(2, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MAXIMUM),
.data = { 0xFF, 0x00 } };
static const USB_HID_Short_Item_t hidReportCount1 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_COUNT),
.data = { 0x01, 0x00 } };
static const USB_HID_Short_Item_t hidReportCount2 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_COUNT),
.data = { 0x02, 0x00 } };
static const USB_HID_Short_Item_t hidReportCount6 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_COUNT),
.data = { 0x06, 0x00 } };
static const USB_HID_Short_Item_t hidReportCount63 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_COUNT),
.data = { 0x3F, 0x00 } };
static const USB_HID_Short_Item_t hidReportSize1 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_SIZE),
.data = { 0x01, 0x00 } };
static const USB_HID_Short_Item_t hidReportSize8 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_SIZE),
.data = { 0x08, 0x00 } };
static const USB_HID_Short_Item_t hidUsageConsumerControl = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
.data = { 0x01, 0x00 } };
static const USB_HID_Short_Item_t hidUsageLED = { // BUG: potential bug
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
.data = { 0x08, 0x00 } };
static const USB_HID_Short_Item_t hidUsageSpatialControl = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
.data = { 0x00, 0x00 } };
/*
* Define the HID Report Descriptor Item, Usage Page, Report ID and length for each HID Report
* For internal purposes, a report element with ID of 0 must be included if report IDs are not being used.
*/
static const USB_HID_Report_Element_t hidReportPageConsumer = {
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_USAGE_PAGE),
.item.data = { USB_HID_USAGE_PAGE_ID_CONSUMER, 0x00 },
.location = HID_REPORT_SET_LOC( 0, 1, 0, 0 )
};
static const USB_HID_Report_Element_t hidReportPageSpatial = {
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_USAGE_PAGE),
.item.data = { USB_HID_USAGE_PAGE_ID_GENERIC_DESKTOP, 0x00 },
.location = HID_REPORT_SET_LOC( 0, 1, 0, 0 )
};
/*
* Define configurable items in the HID Report descriptor.
*/
static USB_HID_Report_Element_t hidUsageByte0Bit5 = {
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
.item.data = { 0xE2, 0x00 },
.location = HID_REPORT_SET_LOC(0, 0, 0, 5)
}; // Mute
static USB_HID_Report_Element_t hidUsageByte0Bit4 = {
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
.item.data = { 0xEA, 0x00 },
.location = HID_REPORT_SET_LOC(0, 0, 0, 4)
}; // Vol-
static USB_HID_Report_Element_t hidUsageByte0Bit3 = {
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
.item.data = { 0xE9, 0x00 },
.location = HID_REPORT_SET_LOC(0, 0, 0, 3)
}; // Vol+
static USB_HID_Report_Element_t hidUsageByte0Bit2 = {
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
.item.data = { 0xB6, 0x00 },
.location = HID_REPORT_SET_LOC(0, 0, 0, 2)
}; // Scan Prev
static USB_HID_Report_Element_t hidUsageByte0Bit1 = {
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
.item.data = { 0xB5, 0x00 },
.location = HID_REPORT_SET_LOC(0, 0, 0, 1)
}; // Scan Next
static USB_HID_Report_Element_t hidUsageByte0Bit0 = {
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
.item.data = { 0xCD, 0x00 },
.location = HID_REPORT_SET_LOC(0, 0, 0, 0)
}; // Play/Pause
static USB_HID_Report_Element_t hidUsageUnassigned = {
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
.item.data = { 0x00, 0x00 },
.location = HID_REPORT_SET_LOC(1, 64, 0, 0)
}; //
/*
* List the configurable elements in the HID Report descriptor.
*/
static USB_HID_Report_Element_t* const hidConfigurableElements[] = {
&hidUsageByte0Bit0,
&hidUsageByte0Bit1,
&hidUsageByte0Bit2,
&hidUsageByte0Bit3,
&hidUsageByte0Bit4,
&hidUsageByte0Bit5,
&hidUsageUnassigned
};
/*
* List HID Reports, one per Report ID.
* If not using report IDs - still have one with report ID 0
*/
static const USB_HID_Report_Element_t* const hidReports[] = {
&hidReportPageConsumer
};
/*
* List all items in the HID Report descriptor.
*/
static const USB_HID_Short_Item_t* const hidReportDescriptorItems[] = {
#if 1
&(hidReportPageConsumer.item),
&hidUsageConsumerControl,
&hidCollectionApplication,
// &hidReportId1,
&hidLogicalMinimum0,
&hidLogicalMaximum1,
&(hidUsageByte0Bit0.item),
&(hidUsageByte0Bit1.item),
&(hidUsageByte0Bit2.item),
&(hidUsageByte0Bit3.item),
&(hidUsageByte0Bit4.item),
&(hidUsageByte0Bit5.item),
&hidReportSize1,
&hidReportCount6,
&hidInputDataVar,
&hidLogicalMaximum0,
&hidReportCount2,
&hidInputConstArray,
// LED Output Report
&hidUsageLED, //0x05, 0x08, // Usage Page (LED)
&hidLogicalMinimum0, //0x15, 0x00, // Logical Minimum (0)
&hidLogicalMaximum0F, //0x25, 0x0F, // Logical Minimum (16) - 8 bits */
&hidReportSize8, //0x75, 0x08, // Report Size (8 bits)
&hidReportCount1, //0x95, 0x01, // Report Count (1)
&hidOutputDataVar, //0x91, 0x02, // Output (Data, Var, Abs) - 1 byte for LED control
&hidCollectionEnd,
#endif
#if 0
&(hidReportPageConsumer.item),
&hidUsageConsumerControl,
&hidCollectionApplication,
&hidReportId1,
&hidLogicalMinimum0,
&hidLogicalMaximumFF,
&(hidUsageUnassigned.item),
&hidReportSize8,
&hidReportCount63,
&hidOutputDataVar,
&(hidUsageUnassigned.item),
&hidInputDataVar,
&hidCollectionEnd
#endif
};
#else
/*
* Define non-configurable items in the HID Report descriptor.
*/
static const USB_HID_Short_Item_t hidCollectionApplication = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_COLLECTION),
.data = { 0x01, 0x00 } };
static const USB_HID_Short_Item_t hidCollectionEnd = {
.header = HID_REPORT_SET_HEADER(0, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_END_COLLECTION),
.data = { 0x00, 0x00 } };
static const USB_HID_Short_Item_t hidInputConstArray = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_INPUT),
.data = { 0x01, 0x00 } };
static const USB_HID_Short_Item_t hidInputDataVar = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_INPUT),
.data = { 0x02, 0x00 } };
static const USB_HID_Short_Item_t hidOutputDataVar = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_OUTPUT),
.data = { 0x02, 0x00 } };
static const USB_HID_Short_Item_t hidOutputConstArray = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_OUTPUT),
.data = { 0x01, 0x00 } };
static const USB_HID_Short_Item_t hidReportId1 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_ID),
.data = { 0x01, 0x00 } };
static const USB_HID_Short_Item_t hidReportId24 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_ID),
.data = { 0x18, 0x00 } };
static const USB_HID_Short_Item_t hidReportId25 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_ID),
.data = { 0x19, 0x00 } };
static const USB_HID_Short_Item_t hidLogicalMaximum0 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MAXIMUM),
.data = { 0x00, 0x00 } };
static const USB_HID_Short_Item_t hidLogicalMaximum1 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MAXIMUM),
.data = { 0x01, 0x00 } };
static const USB_HID_Short_Item_t hidLogicalMaximum0F = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MAXIMUM),
.data = { 0x0f, 0x00 } };
static const USB_HID_Short_Item_t hidLogicalMaximumFF = {
.header = HID_REPORT_SET_HEADER(2, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MAXIMUM),
.data = { 0xFF, 0x00 } };
static const USB_HID_Short_Item_t hidLogicalMinimum0 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MINIMUM),
.data = { 0x00, 0x00 } };
static const USB_HID_Short_Item_t hidReportCount1 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_COUNT),
.data = { 0x01, 0x00 } };
static const USB_HID_Short_Item_t hidReportCount2 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_COUNT),
.data = { 0x02, 0x00 } };
static const USB_HID_Short_Item_t hidReportCount6 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_COUNT),
.data = { 0x06, 0x00 } };
static const USB_HID_Short_Item_t hidReportCount63 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_COUNT),
.data = { 0x3F, 0x00 } };
static const USB_HID_Short_Item_t hidReportSize1 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_SIZE),
.data = { 0x01, 0x00 } };
static const USB_HID_Short_Item_t hidReportSize8 = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_SIZE),
.data = { 0x08, 0x00 } };
static const USB_HID_Short_Item_t hidUsageConsumerControl = {
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
.data = { 0x01, 0x00 } };
/*
* Define the HID Report Descriptor Item, Usage Page, Report ID and length for each HID Report
* For internal purposes, a report element with ID of 0 must be included if report IDs are not being used.
*/
static const USB_HID_Report_Element_t hidReportPageConsumer = {
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_USAGE_PAGE),
.item.data = { USB_HID_USAGE_PAGE_ID_CONSUMER, 0x00 },
.location = HID_REPORT_SET_LOC( 1, 64, 0, 0 )
};
/*
* Define configurable items in the HID Report descriptor.
*/
static USB_HID_Report_Element_t hidUsageByte0Bit5 = {
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
.item.data = { 0xE2, 0x00 },
.location = HID_REPORT_SET_LOC(0, 0, 0, 5)
}; // Mute
static USB_HID_Report_Element_t hidUsageByte0Bit4 = {
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
.item.data = { 0xEA, 0x00 },
.location = HID_REPORT_SET_LOC(0, 0, 0, 4)
}; // Vol-
static USB_HID_Report_Element_t hidUsageByte0Bit3 = {
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
.item.data = { 0xE9, 0x00 },
.location = HID_REPORT_SET_LOC(0, 0, 0, 3)
}; // Vol+
static USB_HID_Report_Element_t hidUsageByte0Bit2 = {
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
.item.data = { 0xB6, 0x00 },
.location = HID_REPORT_SET_LOC(0, 0, 0, 2)
}; // Scan Prev
static USB_HID_Report_Element_t hidUsageByte0Bit1 = {
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
.item.data = { 0xB5, 0x00 },
.location = HID_REPORT_SET_LOC(0, 0, 0, 1)
}; // Scan Next
static USB_HID_Report_Element_t hidUsageByte0Bit0 = {
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
.item.data = { 0xCD, 0x00 },
.location = HID_REPORT_SET_LOC(0, 0, 0, 0)
}; // Play/Pause
static USB_HID_Report_Element_t hidUsageUnassigned = {
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
.item.data = { 0x00, 0x00 },
.location = HID_REPORT_SET_LOC(1, 64, 0, 0)
}; //
/*
* List the configurable elements in the HID Report descriptor.
*/
static USB_HID_Report_Element_t* const hidConfigurableElements[] = {
// &hidUsageByte0Bit0,
// &hidUsageByte0Bit1,
// &hidUsageByte0Bit2,
// &hidUsageByte0Bit3,
// &hidUsageByte0Bit4,
// &hidUsageByte0Bit5
&hidUsageUnassigned
};
/*
* List HID Reports, one per Report ID.
* If not using report IDs - still have one with report ID 0
*/
static const USB_HID_Report_Element_t* const hidReports[] = {
&hidReportPageConsumer
};
/*
* List all items in the HID Report descriptor.
*/
static const USB_HID_Short_Item_t* const hidReportDescriptorItems[] = {
&(hidReportPageConsumer.item),
&hidUsageConsumerControl,
&hidCollectionApplication,
&hidReportId1,
&hidLogicalMinimum0,
&hidLogicalMaximumFF,
&(hidUsageUnassigned.item),
&hidReportSize8,
&hidReportCount63,
&hidOutputDataVar,
&(hidUsageUnassigned.item),
&hidInputDataVar,
// &hidLogicalMinimum0,
// &hidLogicalMaximum1,
// &(hidUsageByte0Bit0.item),
// &(hidUsageByte0Bit1.item),
// &(hidUsageByte0Bit2.item),
// &(hidUsageByte0Bit3.item),
// &(hidUsageByte0Bit4.item),
// &(hidUsageByte0Bit5.item),
// &hidReportSize1,
// &hidReportCount6,
// &hidInputDataVar,
// &hidLogicalMaximum0,
// &hidReportCount2,
// &hidInputConstArray,
&hidCollectionEnd
};
#endif // AIZIP_DNR
/*
* Define the number of HID Reports
* Due to XC not supporting designated initializers, this constant has a hard-coded value.
* It must equal ( sizeof hidReports / sizeof ( USB_HID_Report_Element_t* ))
*/
#define HID_REPORT_COUNT ( 1 )
#endif // _hid_report_descriptor_h_