diff --git a/docs/rh-log.txt b/docs/rh-log.txt index 9efe01e0a..cfb9dea18 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,3 +1,8 @@ +May 30, 2008 +- Disabled DUMB's mono destination mixers. It's not like I'm ever going to + target an original SoundBlaster, so they're a waste of space to have around. + This trims resample.obj down to ~60k now. + May 29, 2008 - Fixed: PrtScn/SysRq key did not work on Linux. @@ -13,6 +18,21 @@ May 29, 2008 (Changes by Graf Zahl) not need to access the sidedef data. - Added new ZDoom specific UDMF linedef and sidedef properties to map parser. +May 28, 2008 +- Added an alternate module replay engine that uses foo_dumb's replayer, a + heavily customized version of DUMB (Dynamic Universal Music Bibliotheque). + It has been slightly modified by me: + * Added support for Ogg Vorbis-compressed samples in XM files ala FMOD. + * Removed excessive mallocs from the replay core. + * Rerolled the loops in resample.c. Unrolling them made the object file + ~250k large while providing little benefit. Even at ~100k, I think it's + still larger than it ought to be, but I'll live with it for now. + Other than that, it's essentially the same thing you'd hear in foobar2000, + minus some subsong detection features. Release builds of the library look + like they might even be slightly faster than FMOD, which is a plus. +- Fixed: Timidity::font_add() did not release the file reader it created. +- Fixed: The SF2 loader did not free the sample headers in its destructor. + May 28, 2008 (Changes by Graf Zahl) - Added new ZDoom specific UDMF sector properties to map parser. - Added class definitions for new interpolators that are better @@ -35,21 +55,6 @@ May 27, 2008 (Changes by Graf Zahl) the DECORATE replacement feature instead of hacking the spawn state of the original item and calling a spawn function from there. -May 28, 2008 -- Added an alternate module replay engine that uses foo_dumb's replayer, a - heavily customized version of DUMB (Dynamic Universal Music Bibliotheque). - It has been slightly modified by me: - * Added support for Ogg Vorbis-compressed samples in XM files ala FMOD. - * Removed excessive mallocs from the replay core. - * Rerolled the loops in resample.c. Unrolling them made the object file - ~250k large while providing little benefit. Even at ~100k, I think it's - still larger than it ought to be, but I'll live with it for now. - Other than that, it's essentially the same thing you'd hear in foobar2000, - minus some subsong detection features. Release builds of the library look - like they might even be slightly faster than FMOD, which is a plus. -- Fixed: Timidity::font_add() did not release the file reader it created. -- Fixed: The SF2 loader did not free the sample headers in its destructor. - May 23, 2008 (Changes by Graf Zahl) - Fixed: The compatibility searches for teleport destinations did not work properly when the teleporter had both a tid and a tag. Now, if a teleporter diff --git a/dumb/include/dumb.h b/dumb/include/dumb.h index daa64c2e9..7af4a1d71 100644 --- a/dumb/include/dumb.h +++ b/dumb/include/dumb.h @@ -691,49 +691,49 @@ struct DUMB_VOLUME_RAMP_INFO void dumb_reset_resampler(DUMB_RESAMPLER *resampler, sample_t *src, int src_channels, int32 pos, int32 start, int32 end, int quality); DUMB_RESAMPLER *dumb_start_resampler(sample_t *src, int src_channels, int32 pos, int32 start, int32 end, int quality); -int32 dumb_resample_1_1(DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume, double delta); +//int32 dumb_resample_1_1(DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume, double delta); int32 dumb_resample_1_2(DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, double delta); -int32 dumb_resample_2_1(DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, double delta); +//int32 dumb_resample_2_1(DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, double delta); int32 dumb_resample_2_2(DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, double delta); -void dumb_resample_get_current_sample_1_1(DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume, sample_t *dst); +//void dumb_resample_get_current_sample_1_1(DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume, sample_t *dst); void dumb_resample_get_current_sample_1_2(DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst); -void dumb_resample_get_current_sample_2_1(DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst); +//void dumb_resample_get_current_sample_2_1(DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst); void dumb_resample_get_current_sample_2_2(DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst); void dumb_end_resampler(DUMB_RESAMPLER *resampler); void dumb_reset_resampler_16(DUMB_RESAMPLER *resampler, short *src, int src_channels, int32 pos, int32 start, int32 end, int quality); DUMB_RESAMPLER *dumb_start_resampler_16(short *src, int src_channels, int32 pos, int32 start, int32 end, int quality); -int32 dumb_resample_16_1_1(DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume, double delta); +//int32 dumb_resample_16_1_1(DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume, double delta); int32 dumb_resample_16_1_2(DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, double delta); -int32 dumb_resample_16_2_1(DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, double delta); +//int32 dumb_resample_16_2_1(DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, double delta); int32 dumb_resample_16_2_2(DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, double delta); -void dumb_resample_get_current_sample_16_1_1(DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume, sample_t *dst); +//void dumb_resample_get_current_sample_16_1_1(DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume, sample_t *dst); void dumb_resample_get_current_sample_16_1_2(DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst); -void dumb_resample_get_current_sample_16_2_1(DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst); +//void dumb_resample_get_current_sample_16_2_1(DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst); void dumb_resample_get_current_sample_16_2_2(DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst); void dumb_end_resampler_16(DUMB_RESAMPLER *resampler); void dumb_reset_resampler_8(DUMB_RESAMPLER *resampler, signed char *src, int src_channels, int32 pos, int32 start, int32 end, int quality); DUMB_RESAMPLER *dumb_start_resampler_8(signed char *src, int src_channels, int32 pos, int32 start, int32 end, int quality); -int32 dumb_resample_8_1_1(DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume, double delta); +//int32 dumb_resample_8_1_1(DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume, double delta); int32 dumb_resample_8_1_2(DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, double delta); -int32 dumb_resample_8_2_1(DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, double delta); +//int32 dumb_resample_8_2_1(DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, double delta); int32 dumb_resample_8_2_2(DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, double delta); -void dumb_resample_get_current_sample_8_1_1(DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume, sample_t *dst); +//void dumb_resample_get_current_sample_8_1_1(DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume, sample_t *dst); void dumb_resample_get_current_sample_8_1_2(DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst); -void dumb_resample_get_current_sample_8_2_1(DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst); +//void dumb_resample_get_current_sample_8_2_1(DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst); void dumb_resample_get_current_sample_8_2_2(DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst); void dumb_end_resampler_8(DUMB_RESAMPLER *resampler); void dumb_reset_resampler_n(int n, DUMB_RESAMPLER *resampler, void *src, int src_channels, int32 pos, int32 start, int32 end, int quality); DUMB_RESAMPLER *dumb_start_resampler_n(int n, void *src, int src_channels, int32 pos, int32 start, int32 end, int quality); -int32 dumb_resample_n_1_1(int n, DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume, double delta); +//int32 dumb_resample_n_1_1(int n, DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume, double delta); int32 dumb_resample_n_1_2(int n, DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, double delta); -int32 dumb_resample_n_2_1(int n, DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, double delta); +//int32 dumb_resample_n_2_1(int n, DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, double delta); int32 dumb_resample_n_2_2(int n, DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, double delta); -void dumb_resample_get_current_sample_n_1_1(int n, DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume, sample_t *dst); +//void dumb_resample_get_current_sample_n_1_1(int n, DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume, sample_t *dst); void dumb_resample_get_current_sample_n_1_2(int n, DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst); -void dumb_resample_get_current_sample_n_2_1(int n, DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst); +//void dumb_resample_get_current_sample_n_2_1(int n, DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst); void dumb_resample_get_current_sample_n_2_2(int n, DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst); void dumb_end_resampler_n(int n, DUMB_RESAMPLER *resampler); diff --git a/dumb/src/core/rendsig.c b/dumb/src/core/rendsig.c index 1acce0b87..72da173c5 100644 --- a/dumb/src/core/rendsig.c +++ b/dumb/src/core/rendsig.c @@ -48,6 +48,10 @@ DUH_SIGRENDERER *DUMBEXPORT duh_start_sigrenderer(DUH *duh, int sig, int n_chann DUH_SIGNAL *signal; DUH_START_SIGRENDERER proc; + /* [RH] Mono destination mixers are disabled. */ + if (n_channels != 2) + return NULL; + if (!duh) return NULL; diff --git a/dumb/src/helpers/resamp2.inc b/dumb/src/helpers/resamp2.inc index f4cf860d8..84826ce51 100644 --- a/dumb/src/helpers/resamp2.inc +++ b/dumb/src/helpers/resamp2.inc @@ -44,7 +44,7 @@ -#define SUFFIX3 _1 +#define SUFFIX3 _2 /* For convenience, returns nonzero on stop. */ static int process_pickup(DUMB_RESAMPLER *resampler) @@ -89,6 +89,7 @@ static int process_pickup(DUMB_RESAMPLER *resampler) /* Create mono destination resampler. */ /* SUFFIX3 was set above. */ +#if 0 #define VOLUME_PARAMETERS MONO_DEST_VOLUME_PARAMETERS #define VOLUME_VARIABLES MONO_DEST_VOLUME_VARIABLES #define SET_VOLUME_VARIABLES SET_MONO_DEST_VOLUME_VARIABLES @@ -99,6 +100,9 @@ static int process_pickup(DUMB_RESAMPLER *resampler) #define MIX_CUBIC(op, upd, x0, x3, o0, o1, o2, o3) MONO_DEST_MIX_CUBIC(op, upd, x0, x3, o0, o1, o2, o3) #define MIX_ZEROS(op) *dst++ op 0 #include "resamp3.inc" +#else +#undef SUFFIX3 +#endif /* Create stereo destination resampler. */ #define SUFFIX3 _2 diff --git a/dumb/src/helpers/resample.c b/dumb/src/helpers/resample.c index 47612e9cf..db42ee7ae 100644 --- a/dumb/src/helpers/resample.c +++ b/dumb/src/helpers/resample.c @@ -298,7 +298,7 @@ DUMB_RESAMPLER *dumb_start_resampler_n(int n, void *src, int src_channels, int32 } - +#if 0 int32 dumb_resample_n_1_1(int n, DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume, double delta) { if (n == 8) @@ -308,7 +308,7 @@ int32 dumb_resample_n_1_1(int n, DUMB_RESAMPLER *resampler, sample_t *dst, int32 else return dumb_resample_1_1(resampler, dst, dst_size, volume, delta); } - +#endif int32 dumb_resample_n_1_2(int n, DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, double delta) @@ -322,7 +322,7 @@ int32 dumb_resample_n_1_2(int n, DUMB_RESAMPLER *resampler, sample_t *dst, int32 } - +#if 0 int32 dumb_resample_n_2_1(int n, DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, double delta) { if (n == 8) @@ -332,7 +332,7 @@ int32 dumb_resample_n_2_1(int n, DUMB_RESAMPLER *resampler, sample_t *dst, int32 else return dumb_resample_2_1(resampler, dst, dst_size, volume_left, volume_right, delta); } - +#endif int32 dumb_resample_n_2_2(int n, DUMB_RESAMPLER *resampler, sample_t *dst, int32 dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, double delta) @@ -346,7 +346,7 @@ int32 dumb_resample_n_2_2(int n, DUMB_RESAMPLER *resampler, sample_t *dst, int32 } - +#if 0 void dumb_resample_get_current_sample_n_1_1(int n, DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume, sample_t *dst) { if (n == 8) @@ -356,7 +356,7 @@ void dumb_resample_get_current_sample_n_1_1(int n, DUMB_RESAMPLER *resampler, DU else dumb_resample_get_current_sample_1_1(resampler, volume, dst); } - +#endif void dumb_resample_get_current_sample_n_1_2(int n, DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst) @@ -370,7 +370,7 @@ void dumb_resample_get_current_sample_n_1_2(int n, DUMB_RESAMPLER *resampler, DU } - +#if 0 void dumb_resample_get_current_sample_n_2_1(int n, DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst) { if (n == 8) @@ -380,7 +380,7 @@ void dumb_resample_get_current_sample_n_2_1(int n, DUMB_RESAMPLER *resampler, DU else dumb_resample_get_current_sample_2_1(resampler, volume_left, volume_right, dst); } - +#endif void dumb_resample_get_current_sample_n_2_2(int n, DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst) diff --git a/dumb/src/helpers/resample.inc b/dumb/src/helpers/resample.inc index 494e1832d..eaef2976c 100644 --- a/dumb/src/helpers/resample.inc +++ b/dumb/src/helpers/resample.inc @@ -107,7 +107,7 @@ DUMB_RESAMPLER *dumb_start_resampler(SRCTYPE *src, int src_channels, int32 pos, #define COPYSRC2(dstarray, dstindex, condition, srcarray, srcindex) (dstarray)[dstindex] = condition ? (srcarray)[srcindex] : 0 #define MONO_DEST_VOLUME_PARAMETERS DUMB_VOLUME_RAMP_INFO * volume #define MONO_DEST_VOLUME_VARIABLES vol, volr, vold, volt, volm -#define MONO_DEST_VOLUME_ZEROS 0 +#define MONO_DEST_VOLUME_ZEROS 0, 0 #define SET_MONO_DEST_VOLUME_VARIABLES { \ if ( volume ) { \ volr = (int)(volume->volume * 16777216.0); \ diff --git a/dumb/src/it/itrender.c b/dumb/src/it/itrender.c index d2dedecea..87929e6fd 100644 --- a/dumb/src/it/itrender.c +++ b/dumb/src/it/itrender.c @@ -4309,7 +4309,9 @@ static int32 render_playing_part(DUMB_IT_SIGRENDERER *sigrenderer, IT_PLAYING *p dumb_record_click(sigrenderer->click_remover[1], pos + size_rendered, -click[1]); } } - } else { + } +#if 0 + else { if (playing->sample->flags & IT_SAMPLE_STEREO) { if ((cr_record_which & 1) && sigrenderer->click_remover) { sample_t click; @@ -4340,6 +4342,7 @@ static int32 render_playing_part(DUMB_IT_SIGRENDERER *sigrenderer, IT_PLAYING *p } } } +#endif return size_rendered; } @@ -4372,9 +4375,9 @@ static int32 render_playing_ramp(DUMB_IT_SIGRENDERER *sigrenderer, IT_PLAYING *p if (volume == 0) { if (playing->declick_stage < 2) { if (playing->sample->flags & IT_SAMPLE_STEREO) - size_rendered = dumb_resample_n_2_1(bits, &playing->resampler, NULL, size, 0, 0, delta); + size_rendered = dumb_resample_n_2_2(bits, &playing->resampler, NULL, size, 0, 0, delta); else - size_rendered = dumb_resample_n_1_1(bits, &playing->resampler, NULL, size, 0, delta); + size_rendered = dumb_resample_n_1_2(bits, &playing->resampler, NULL, size, 0, 0, delta); } else { playing->declick_stage = 3; } @@ -4760,6 +4763,11 @@ static DUMB_IT_SIGRENDERER *init_sigrenderer(DUMB_IT_SIGDATA *sigdata, int n_cha DUMB_IT_SIGRENDERER *sigrenderer; int i; + /* [RH] Mono destination mixers are disabled. */ + if (n_channels != 2) { + return NULL; + } + if (startorder > sigdata->n_orders) { free(callbacks); dumb_destroy_click_remover_array(n_channels, cr);