Index: apps/dsp_asm.h =================================================================== --- apps/dsp_asm.h (revision 27936) +++ apps/dsp_asm.h (working copy) @@ -28,7 +28,7 @@ #if defined(CPU_ARM) #define DSP_HAVE_ASM_APPLY_GAIN #define DSP_HAVE_ASM_RESAMPLING -#define DSP_HAVE_ASM_CROSSFEED +//#define DSP_HAVE_ASM_CROSSFEED #define DSP_HAVE_ASM_SOUND_CHAN_MONO #define DSP_HAVE_ASM_SOUND_CHAN_CUSTOM #define DSP_HAVE_ASM_SOUND_CHAN_KARAOKE @@ -37,7 +37,7 @@ #elif defined (CPU_COLDFIRE) #define DSP_HAVE_ASM_APPLY_GAIN #define DSP_HAVE_ASM_RESAMPLING -#define DSP_HAVE_ASM_CROSSFEED +//#define DSP_HAVE_ASM_CROSSFEED #define DSP_HAVE_ASM_SOUND_CHAN_MONO #define DSP_HAVE_ASM_SOUND_CHAN_CUSTOM #define DSP_HAVE_ASM_SOUND_CHAN_KARAOKE Index: apps/lang/english.lang =================================================================== --- apps/lang/english.lang (revision 27936) +++ apps/lang/english.lang (working copy) @@ -972,6 +972,23 @@ + id: LANG_CROSSFEED_DELAY + desc: in crossfeed settings + user: core + + *: none + swcodec: "Inter-ear Delay" + + + *: none + swcodec: "Inter-ear Delay" + + + *: none + swcodec: "Inter-ear delay" + + + id: LANG_EQUALIZER desc: in the sound settings menu user: core Index: apps/settings.c =================================================================== --- apps/settings.c (revision 27936) +++ apps/settings.c (working copy) @@ -978,7 +978,8 @@ dsp_set_crossfeed_direct_gain(global_settings.crossfeed_direct_gain); dsp_set_crossfeed_cross_params(global_settings.crossfeed_cross_gain, global_settings.crossfeed_hf_attenuation, - global_settings.crossfeed_hf_cutoff); + global_settings.crossfeed_hf_cutoff, + global_settings.crossfeed_delay); /* Configure software equalizer, hardware eq is handled in audio_init() */ dsp_set_eq(global_settings.eq_enabled); Index: apps/settings.h =================================================================== --- apps/settings.h (revision 27936) +++ apps/settings.h (working copy) @@ -326,6 +326,7 @@ unsigned int crossfeed_cross_gain; /* dB x 10 */ unsigned int crossfeed_hf_attenuation; /* dB x 10 */ unsigned int crossfeed_hf_cutoff; /* Frequency in Hz */ + unsigned int crossfeed_delay; /* inter-ear delay in us */ /* EQ */ bool eq_enabled; /* Enable equalizer */ Index: apps/menus/sound_menu.c =================================================================== --- apps/menus/sound_menu.c (revision 27936) +++ apps/menus/sound_menu.c (working copy) @@ -100,9 +100,11 @@ &global_settings.crossfeed_hf_attenuation, lowlatency_callback); MENUITEM_SETTING(crossfeed_hf_cutoff, &global_settings.crossfeed_hf_cutoff, lowlatency_callback); + MENUITEM_SETTING(crossfeed_delay, + &global_settings.crossfeed_delay, lowlatency_callback); MAKE_MENU(crossfeed_menu,ID2P(LANG_CROSSFEED), NULL, Icon_NOICON, &crossfeed, &crossfeed_direct_gain, &crossfeed_cross_gain, - &crossfeed_hf_attenuation, &crossfeed_hf_cutoff); + &crossfeed_hf_attenuation, &crossfeed_hf_cutoff, &crossfeed_delay); static int timestretch_callback(int action,const struct menu_item_ex *this_item) { Index: apps/dsp.c =================================================================== --- apps/dsp.c (revision 27936) +++ apps/dsp.c (working copy) @@ -118,9 +118,9 @@ int32_t gain; /* 00h - Direct path gain */ int32_t coefs[3]; /* 04h - Coefficients for the shelving filter */ int32_t history[4]; /* 10h - Format is x[n - 1], y[n - 1] for both channels */ - int32_t delay[13][2]; /* 20h */ + int32_t delay[44][2]; /* 20h */ int32_t *index; /* 88h - Current pointer into the delay line */ - /* 8ch */ + int32_t delaylen; /* 8ch */ }; /* Current setup is one lowshelf filters three peaking filters and one @@ -813,7 +813,7 @@ buf[1][i] = FRACMUL(right, gain) + hist_l[1]; /* Wrap delay line index if bigger than delay line size */ - if (di >= delay + 13*2) + if (di >= delay + crossfeed_data.delaylen * 2) di = delay; } /* Write back local copies of data we've modified */ @@ -844,7 +844,7 @@ } /* Both gains should be below 0 dB */ -void dsp_set_crossfeed_cross_params(long lf_gain, long hf_gain, long cutoff) +void dsp_set_crossfeed_cross_params(long lf_gain, long hf_gain, long cutoff, int usdelay) { int32_t *c = crossfeed_data.coefs; long scaler = get_replaygain_int(lf_gain * 10) << 7; @@ -864,6 +864,8 @@ c[0] = FRACMUL_SHL(c[0], scaler, 4); c[1] = FRACMUL_SHL(c[1], scaler, 4); c[2] <<= 4; + + crossfeed_data.delaylen = usdelay * NATIVE_FREQUENCY / 1000000; } /* Apply a constant gain to the samples (e.g., for ReplayGain). Index: apps/dsp.h =================================================================== --- apps/dsp.h (revision 27936) +++ apps/dsp.h (working copy) @@ -70,7 +70,7 @@ void dsp_set_crossfeed(bool enable); void dsp_set_crossfeed_direct_gain(int gain); void dsp_set_crossfeed_cross_params(long lf_gain, long hf_gain, - long cutoff); + long cutoff, int usdelay); void dsp_set_eq(bool enable); void dsp_set_eq_precut(int precut); void dsp_set_eq_coefs(int band); Index: apps/settings_list.c =================================================================== --- apps/settings_list.c (revision 27936) +++ apps/settings_list.c (working copy) @@ -379,7 +379,8 @@ (void)val; dsp_set_crossfeed_cross_params(global_settings.crossfeed_cross_gain, global_settings.crossfeed_hf_attenuation, - global_settings.crossfeed_hf_cutoff); + global_settings.crossfeed_hf_cutoff, + global_settings.crossfeed_delay); } static void compressor_set(int val) @@ -1303,6 +1304,10 @@ LANG_CROSSFEED_HF_CUTOFF, 700, "crossfeed hf cutoff", UNIT_HERTZ, 500, 2000, 100, NULL, NULL, crossfeed_cross_set), + INT_SETTING_NOWRAP(F_SOUNDSETTING, crossfeed_delay, + LANG_CROSSFEED_DELAY, 300, + "crossfeed delay", UNIT_INT, 50, 1000, 50, + NULL, NULL, crossfeed_cross_set), /* equalizer */ OFFON_SETTING(F_EQSETTING, eq_enabled, LANG_EQUALIZER_ENABLED, false,