ref: 15c9b0d47b302f09348e69c9b5d22e505d916909
parent: 52fc437b85c46a528b604b7012ede8217d5e94ba
author: Christopher Snowhill <kode54@gmail.com>
date: Mon Sep 25 16:25:55 EDT 2017
Massive LLVM based reformat, with indent of 4 spaces, and no include sorting.
--- /dev/null
+++ b/.clang-format
@@ -1,0 +1,3 @@
+BasedOnStyle: LLVM
+IndentWidth: 4
+SortIncludes: false
--- a/examples/dumbout.c
+++ b/examples/dumbout.c
@@ -6,12 +6,9 @@
#include <math.h>
static const int endian_test = 1;
-#define is_bigendian() ((*(char*)&endian_test) == 0)
+#define is_bigendian() ((*(char *)&endian_test) == 0)
-enum ENDIANNESS {
- DUMB_LITTLE_ENDIAN = 0,
- DUMB_BIG_ENDIAN
-};
+enum ENDIANNESS { DUMB_LITTLE_ENDIAN = 0, DUMB_BIG_ENDIAN };
typedef struct {
DUH_SIGRENDERER *renderer;
@@ -37,7 +34,6 @@
char *output;
} settings_t;
-
int main(int argc, char *argv[]) {
int retcode = 1;
int nerrors = 0;
@@ -57,24 +53,38 @@
settings.quality = DUMB_RQ_CUBIC;
// commandline argument parser options
- struct arg_lit *arg_help = arg_lit0("h", "help", "print this help and exits");
- struct arg_dbl *arg_delay = arg_dbl0("d", "delay", "<delay>", "sets the initial delay in seconds (0.0 to 64.0, default 0.0)");
- struct arg_dbl *arg_volume = arg_dbl0("v", "volume", "<volume", "sets the output volume (-8.0 to +8.0, default 1.0)");
- struct arg_int *arg_samplerate = arg_int0("s", "samplerate", "<freq>", "sets the sampling rate (default 44100)");
- struct arg_int *arg_quality = arg_int0("r", "quality", "<quality>", "specify the resampling quality to use");
- struct arg_lit *arg_mono = arg_lit0("m", "mono", "generate mono output instead of stereo");
- struct arg_lit *arg_bigendian = arg_lit0("b", "bigendian", "generate big-endian data instead of little-endian");
- struct arg_lit *arg_eight = arg_lit0("8", "eight", "generate 8-bit instead of 16-bit");
- struct arg_lit *arg_unsigned = arg_lit0("u", "unsigned", "generate unsigned output instead of signed");
- struct arg_file *arg_output = arg_file0("o", "output", "<file>", "output file");
- struct arg_file *arg_input = arg_file1(NULL, NULL, "<file>", "input module file");
+ struct arg_lit *arg_help =
+ arg_lit0("h", "help", "print this help and exits");
+ struct arg_dbl *arg_delay = arg_dbl0(
+ "d", "delay", "<delay>",
+ "sets the initial delay in seconds (0.0 to 64.0, default 0.0)");
+ struct arg_dbl *arg_volume =
+ arg_dbl0("v", "volume", "<volume",
+ "sets the output volume (-8.0 to +8.0, default 1.0)");
+ struct arg_int *arg_samplerate = arg_int0(
+ "s", "samplerate", "<freq>", "sets the sampling rate (default 44100)");
+ struct arg_int *arg_quality = arg_int0(
+ "r", "quality", "<quality>", "specify the resampling quality to use");
+ struct arg_lit *arg_mono =
+ arg_lit0("m", "mono", "generate mono output instead of stereo");
+ struct arg_lit *arg_bigendian = arg_lit0(
+ "b", "bigendian", "generate big-endian data instead of little-endian");
+ struct arg_lit *arg_eight =
+ arg_lit0("8", "eight", "generate 8-bit instead of 16-bit");
+ struct arg_lit *arg_unsigned =
+ arg_lit0("u", "unsigned", "generate unsigned output instead of signed");
+ struct arg_file *arg_output =
+ arg_file0("o", "output", "<file>", "output file");
+ struct arg_file *arg_input =
+ arg_file1(NULL, NULL, "<file>", "input module file");
struct arg_end *arg_fend = arg_end(20);
- void* argtable[] = {arg_help, arg_input, arg_output, arg_delay, arg_volume, arg_samplerate, arg_quality,
- arg_mono, arg_bigendian, arg_eight, arg_unsigned, arg_fend};
- const char* progname = "dumbout";
+ void *argtable[] = {arg_help, arg_input, arg_output, arg_delay,
+ arg_volume, arg_samplerate, arg_quality, arg_mono,
+ arg_bigendian, arg_eight, arg_unsigned, arg_fend};
+ const char *progname = "dumbout";
// Make sure everything got allocated
- if(arg_nullcheck(argtable) != 0) {
+ if (arg_nullcheck(argtable) != 0) {
fprintf(stderr, "%s: insufficient memory\n", progname);
goto exit_0;
}
@@ -83,7 +93,7 @@
nerrors = arg_parse(argc, argv, argtable);
// Handle help
- if(arg_help->count > 0) {
+ if (arg_help->count > 0) {
fprintf(stderr, "Usage: %s", progname);
arg_print_syntax(stderr, argtable, "\n");
fprintf(stderr, "\nArguments:\n");
@@ -92,7 +102,7 @@
}
// Handle errors
- if(nerrors > 0) {
+ if (nerrors > 0) {
arg_print_errors(stderr, arg_fend, progname);
fprintf(stderr, "Try '%s --help' for more information.\n", progname);
goto exit_0;
@@ -100,48 +110,57 @@
// Get input and output filenames
settings.input = arg_input->filename[0];
- if(arg_output->count > 0) {
- settings.output = malloc(strlen(arg_output->filename[0])+1);
+ if (arg_output->count > 0) {
+ settings.output = malloc(strlen(arg_output->filename[0]) + 1);
strcpy(settings.output, arg_output->filename[0]);
} else {
- settings.output = malloc(strlen(arg_output->basename[0])+5);
+ settings.output = malloc(strlen(arg_output->basename[0]) + 5);
sprintf(settings.output, "%s%s", arg_output->basename[0], ".pcm");
}
// Handle the switch options
- if(arg_bigendian->count > 0) { settings.endianness = DUMB_BIG_ENDIAN; }
- if(arg_eight->count > 0) { settings.bits = 8; }
- if(arg_unsigned->count > 0) { settings.is_unsigned = true; }
- if(arg_mono->count > 0) { settings.n_channels = 1; }
+ if (arg_bigendian->count > 0) {
+ settings.endianness = DUMB_BIG_ENDIAN;
+ }
+ if (arg_eight->count > 0) {
+ settings.bits = 8;
+ }
+ if (arg_unsigned->count > 0) {
+ settings.is_unsigned = true;
+ }
+ if (arg_mono->count > 0) {
+ settings.n_channels = 1;
+ }
- if(arg_delay->count > 0) {
+ if (arg_delay->count > 0) {
settings.delay = arg_delay->dval[0];
- if(settings.delay < 0.0f || settings.delay >= 64.0f) {
+ if (settings.delay < 0.0f || settings.delay >= 64.0f) {
fprintf(stderr, "Initial delay must be between 0.0f and 64.0f.\n");
goto exit_0;
}
}
- if(arg_volume->count > 0) {
+ if (arg_volume->count > 0) {
settings.volume = arg_volume->dval[0];
- if(settings.volume < -8.0f || settings.volume > 8.0f) {
+ if (settings.volume < -8.0f || settings.volume > 8.0f) {
fprintf(stderr, "Volume must be between -8.0f and 8.0f.\n");
goto exit_0;
}
}
- if(arg_samplerate->count > 0) {
+ if (arg_samplerate->count > 0) {
settings.freq = arg_samplerate->ival[0];
- if(settings.freq < 1 || settings.freq > 96000) {
+ if (settings.freq < 1 || settings.freq > 96000) {
fprintf(stderr, "Sampling rate must be between 1 and 96000.\n");
goto exit_0;
}
}
- if(arg_quality->count > 0) {
+ if (arg_quality->count > 0) {
settings.quality = arg_quality->ival[0];
- if(settings.quality < 0 || settings.quality >= DUMB_RQ_N_LEVELS) {
- fprintf(stderr, "Quality must be between %d and %d.\n", 0, DUMB_RQ_N_LEVELS-1);
+ if (settings.quality < 0 || settings.quality >= DUMB_RQ_N_LEVELS) {
+ fprintf(stderr, "Quality must be between %d and %d.\n", 0,
+ DUMB_RQ_N_LEVELS - 1);
goto exit_0;
}
}
@@ -151,13 +170,15 @@
// Load source
streamer.src = dumb_load_any(settings.input, 0, 0);
- if(!streamer.src) {
- fprintf(stderr, "Unable to load file %s for playback!\n", settings.input);
+ if (!streamer.src) {
+ fprintf(stderr, "Unable to load file %s for playback!\n",
+ settings.input);
goto exit_0;
}
// Set up playback
- streamer.renderer = duh_start_sigrenderer(streamer.src, 0, settings.n_channels, 0);
+ streamer.renderer =
+ duh_start_sigrenderer(streamer.src, 0, settings.n_channels, 0);
streamer.delta = 65536.0f / settings.freq;
streamer.bufsize = 4096 * (settings.bits / 8) * settings.n_channels;
@@ -168,13 +189,13 @@
dumb_it_set_resampling_quality(itsr, settings.quality);
// Open output
- if(strcmp(settings.output, "-") == 0) {
+ if (strcmp(settings.output, "-") == 0) {
streamer.dst = stdout;
streamer.is_stdout = true;
} else {
streamer.dst = fopen(settings.output, "wb");
streamer.is_stdout = false;
- if(!streamer.dst) {
+ if (!streamer.dst) {
fprintf(stderr, "Could not open output file %s!", settings.output);
goto exit_1;
}
@@ -185,27 +206,31 @@
int read_samples;
int read_bytes;
- // If output endianness is different than machine endianness, and output is 16 bits, reorder bytes.
- int switch_endianness = ((is_bigendian() && settings.endianness == DUMB_LITTLE_ENDIAN) ||
- (!is_bigendian() && settings.endianness == DUMB_BIG_ENDIAN));
+ // If output endianness is different than machine endianness, and output is
+ // 16 bits, reorder bytes.
+ int switch_endianness =
+ ((is_bigendian() && settings.endianness == DUMB_LITTLE_ENDIAN) ||
+ (!is_bigendian() && settings.endianness == DUMB_BIG_ENDIAN));
// Write the initial delay to the file if one was requested.
- long d = ((long)floor(settings.delay * settings.freq + 0.5f)) * settings.n_channels * (settings.bits / 8);
- if(d) {
- // Fill the buffer with silence. Remember to take into account endianness
- if(settings.is_unsigned) {
- if(settings.bits == 16) {
- if(settings.endianness == DUMB_BIG_ENDIAN) {
+ long d = ((long)floor(settings.delay * settings.freq + 0.5f)) *
+ settings.n_channels * (settings.bits / 8);
+ if (d) {
+ // Fill the buffer with silence. Remember to take into account
+ // endianness
+ if (settings.is_unsigned) {
+ if (settings.bits == 16) {
+ if (settings.endianness == DUMB_BIG_ENDIAN) {
// Unsigned 16bits big endian
- for(int i = 0; i < streamer.bufsize; i += 2) {
- buffer[i ] = (char)0x80;
- buffer[i+1] = (char)0x00;
+ for (int i = 0; i < streamer.bufsize; i += 2) {
+ buffer[i] = (char)0x80;
+ buffer[i + 1] = (char)0x00;
}
} else {
// Unsigned 16bits little endian
- for(int i = 0; i < streamer.bufsize; i += 2) {
- buffer[i ] = (char)0x00;
- buffer[i+1] = (char)0x80;
+ for (int i = 0; i < streamer.bufsize; i += 2) {
+ buffer[i] = (char)0x00;
+ buffer[i + 1] = (char)0x80;
}
}
} else {
@@ -217,40 +242,38 @@
memset(buffer, 0, streamer.bufsize);
}
- while(d >= streamer.bufsize) {
+ while (d >= streamer.bufsize) {
fwrite(buffer, 1, streamer.bufsize, streamer.dst);
d -= streamer.bufsize;
}
- if(d) {
+ if (d) {
fwrite(buffer, 1, d, streamer.dst);
}
}
- // Loop until we have nothing to loop through. Dumb will stop giving out bytes when the file is done.
- while(run) {
- read_samples = duh_render_int(streamer.renderer,
- &streamer.sig_samples,
- &streamer.sig_samples_size,
- settings.bits,
- (int)settings.is_unsigned,
- settings.volume,
- streamer.delta,
- 4096, buffer);
+ // Loop until we have nothing to loop through. Dumb will stop giving out
+ // bytes when the file is done.
+ while (run) {
+ read_samples =
+ duh_render_int(streamer.renderer, &streamer.sig_samples,
+ &streamer.sig_samples_size, settings.bits,
+ (int)settings.is_unsigned, settings.volume,
+ streamer.delta, 4096, buffer);
read_bytes = read_samples * (settings.bits / 8) * settings.n_channels;
// switch endianness if required
- if(switch_endianness && settings.bits == 16) {
+ if (switch_endianness && settings.bits == 16) {
char tmp;
- for(int i = 0; i < read_bytes / 2; i++) {
- tmp = buffer[i*2+0];
- buffer[i*2+0] = buffer[i*2+1];
- buffer[i*2+1] = tmp;
+ for (int i = 0; i < read_bytes / 2; i++) {
+ tmp = buffer[i * 2 + 0];
+ buffer[i * 2 + 0] = buffer[i * 2 + 1];
+ buffer[i * 2 + 1] = tmp;
}
}
// Write to output stream and flush if it happens to be stdout
fwrite(buffer, 1, read_bytes, streamer.dst);
- if(streamer.is_stdout) {
+ if (streamer.is_stdout) {
fflush(streamer.dst);
}
run = (read_samples > 0);
@@ -260,24 +283,24 @@
// We made it this far without crashing, so let's just exit with no error :)
retcode = 0;
- if(!streamer.is_stdout && streamer.dst) {
+ if (!streamer.is_stdout && streamer.dst) {
fclose(streamer.dst);
}
- if(streamer.sig_samples) {
+ if (streamer.sig_samples) {
destroy_sample_buffer(streamer.sig_samples);
}
exit_1:
- if(streamer.renderer) {
+ if (streamer.renderer) {
duh_end_sigrenderer(streamer.renderer);
}
- if(streamer.src) {
+ if (streamer.src) {
unload_duh(streamer.src);
}
exit_0:
free(settings.output);
- arg_freetable(argtable, sizeof(argtable)/sizeof(argtable[0]));
+ arg_freetable(argtable, sizeof(argtable) / sizeof(argtable[0]));
return retcode;
}
--- a/examples/dumbplay.c
+++ b/examples/dumbplay.c
@@ -22,9 +22,9 @@
// Runtime vars
float delta;
- int spos; // Samples read
+ int spos; // Samples read
int ssize; // Total samples available
- int sbytes; // bytes per sample
+ int sbytes; // bytes per sample
bool ended;
// Config switches
@@ -41,34 +41,29 @@
static bool stop_signal = false;
// Simple signal handler function
-static void sig_fn(int signo) {
- stop_signal = true;
-}
+static void sig_fn(int signo) { stop_signal = true; }
-// This is called from SDL2, and should read data from a source and hand it over to SDL2 via the stream buffer.
-void stream_audio(void* userdata, Uint8* stream, int len) {
- streamer_t *streamer = (streamer_t*)userdata;
+// This is called from SDL2, and should read data from a source and hand it over
+// to SDL2 via the stream buffer.
+void stream_audio(void *userdata, Uint8 *stream, int len) {
+ streamer_t *streamer = (streamer_t *)userdata;
- // Read samples from libdumb save them to the SDL buffer. Note that we are reading SAMPLES, not bytes!
+ // Read samples from libdumb save them to the SDL buffer. Note that we are
+ // reading SAMPLES, not bytes!
int r_samples = len / streamer->sbytes;
- int got = duh_render_int(
- streamer->renderer,
- &streamer->sig_samples,
- &streamer->sig_samples_size,
- streamer->bits,
- 0,
- streamer->volume,
- streamer->delta,
- r_samples,
- stream);
- if(got == 0) {
+ int got =
+ duh_render_int(streamer->renderer, &streamer->sig_samples,
+ &streamer->sig_samples_size, streamer->bits, 0,
+ streamer->volume, streamer->delta, r_samples, stream);
+ if (got == 0) {
streamer->ended = true;
}
- // Get current position from libdumb for the playback display. If we get position that is 0, it probably
- // means that the song ended and duh_sigrenderer_get_position points to the start of the file.
+ // Get current position from libdumb for the playback display. If we get
+ // position that is 0, it probably means that the song ended and
+ // duh_sigrenderer_get_position points to the start of the file.
streamer->spos = duh_sigrenderer_get_position(streamer->renderer);
- if(streamer->spos == 0) {
+ if (streamer->spos == 0) {
streamer->spos = streamer->ssize;
}
}
@@ -81,11 +76,11 @@
int seconds = 0;
// Calculate hours, minutes and seconds
- if(total_seconds > 3600) {
+ if (total_seconds > 3600) {
hours = total_seconds / 3600;
total_seconds = total_seconds % 3600;
}
- if(total_seconds > 60) {
+ if (total_seconds > 60) {
minutes = total_seconds / 60;
total_seconds = total_seconds % 60;
}
@@ -92,7 +87,7 @@
seconds = total_seconds;
// If necessary, show hours. Otherwise only minutes and seconds.
- if(hours > 0) {
+ if (hours > 0) {
printf("%02d:%02d:%02d", hours, minutes, seconds);
} else {
printf("%02d:%02d", minutes, seconds);
@@ -102,11 +97,11 @@
// Shows progressbar and time played
void show_progress(int width, float progress, int ticks) {
int d = progress * width;
- printf("%3d%% [", (int)(progress*100));
- for(int x = 0; x < d; x++) {
+ printf("%3d%% [", (int)(progress * 100));
+ for (int x = 0; x < d; x++) {
printf("=");
}
- for(int x = 0; x < (width-d); x++) {
+ for (int x = 0; x < (width - d); x++) {
printf(" ");
}
printf("] ");
@@ -123,10 +118,10 @@
// Signal handlers
signal(SIGINT, sig_fn);
- signal(SIGTERM, sig_fn);
+ signal(SIGTERM, sig_fn);
// Initialize SDL2
- if(SDL_Init(SDL_INIT_AUDIO) != 0) {
+ if (SDL_Init(SDL_INIT_AUDIO) != 0) {
fprintf(stderr, "%s\n", SDL_GetError());
return 1;
}
@@ -139,21 +134,33 @@
streamer.quality = DUMB_RQ_CUBIC;
// commandline argument parser options
- struct arg_lit *arg_help = arg_lit0("h", "help", "print this help and exits");
- struct arg_dbl *arg_volume = arg_dbl0("v", "volume", "<volume", "sets the output volume (-8.0 to +8.0, default 1.0)");
- struct arg_int *arg_samplerate = arg_int0("s", "samplerate", "<freq>", "sets the sampling rate (default 44100)");
- struct arg_int *arg_quality = arg_int0("r", "quality", "<quality>", "specify the resampling quality to use");
- struct arg_lit *arg_mono = arg_lit0("m", "mono", "generate mono output instead of stereo");
- struct arg_lit *arg_eight = arg_lit0("8", "eight", "generate 8-bit instead of 16-bit");
- struct arg_lit *arg_noprogress = arg_lit0("n", "noprogress", "hide progress bar");
- struct arg_file *arg_output = arg_file0("o", "output", "<file>", "output file");
- struct arg_file *arg_input = arg_file1(NULL, NULL, "<file>", "input module file");
+ struct arg_lit *arg_help =
+ arg_lit0("h", "help", "print this help and exits");
+ struct arg_dbl *arg_volume =
+ arg_dbl0("v", "volume", "<volume",
+ "sets the output volume (-8.0 to +8.0, default 1.0)");
+ struct arg_int *arg_samplerate = arg_int0(
+ "s", "samplerate", "<freq>", "sets the sampling rate (default 44100)");
+ struct arg_int *arg_quality = arg_int0(
+ "r", "quality", "<quality>", "specify the resampling quality to use");
+ struct arg_lit *arg_mono =
+ arg_lit0("m", "mono", "generate mono output instead of stereo");
+ struct arg_lit *arg_eight =
+ arg_lit0("8", "eight", "generate 8-bit instead of 16-bit");
+ struct arg_lit *arg_noprogress =
+ arg_lit0("n", "noprogress", "hide progress bar");
+ struct arg_file *arg_output =
+ arg_file0("o", "output", "<file>", "output file");
+ struct arg_file *arg_input =
+ arg_file1(NULL, NULL, "<file>", "input module file");
struct arg_end *arg_fend = arg_end(20);
- void* argtable[] = {arg_help, arg_input, arg_volume, arg_samplerate, arg_quality, arg_mono, arg_eight, arg_noprogress, arg_fend};
- const char* progname = "dumbplay";
+ void *argtable[] = {arg_help, arg_input, arg_volume,
+ arg_samplerate, arg_quality, arg_mono,
+ arg_eight, arg_noprogress, arg_fend};
+ const char *progname = "dumbplay";
// Make sure everything got allocated
- if(arg_nullcheck(argtable) != 0) {
+ if (arg_nullcheck(argtable) != 0) {
fprintf(stderr, "%s: insufficient memory\n", progname);
goto exit_0;
}
@@ -162,7 +169,7 @@
nerrors = arg_parse(argc, argv, argtable);
// Handle help
- if(arg_help->count > 0) {
+ if (arg_help->count > 0) {
fprintf(stderr, "Usage: %s", progname);
arg_print_syntax(stderr, argtable, "\n");
fprintf(stderr, "\nArguments:\n");
@@ -171,7 +178,7 @@
}
// Handle libargtable errors
- if(nerrors > 0) {
+ if (nerrors > 0) {
arg_print_errors(stderr, arg_fend, progname);
fprintf(stderr, "Try '%s --help' for more information.\n", progname);
goto exit_0;
@@ -179,30 +186,37 @@
// Handle the switch options
streamer.input = arg_input->filename[0];
- if(arg_eight->count > 0) { streamer.bits = 8; }
- if(arg_mono->count > 0) { streamer.n_channels = 1; }
- if(arg_noprogress->count > 0) { streamer.no_progress = true; }
+ if (arg_eight->count > 0) {
+ streamer.bits = 8;
+ }
+ if (arg_mono->count > 0) {
+ streamer.n_channels = 1;
+ }
+ if (arg_noprogress->count > 0) {
+ streamer.no_progress = true;
+ }
- if(arg_volume->count > 0) {
+ if (arg_volume->count > 0) {
streamer.volume = arg_volume->dval[0];
- if(streamer.volume < -8.0f || streamer.volume > 8.0f) {
+ if (streamer.volume < -8.0f || streamer.volume > 8.0f) {
fprintf(stderr, "Volume must be between -8.0f and 8.0f.\n");
goto exit_0;
}
}
- if(arg_samplerate->count > 0) {
+ if (arg_samplerate->count > 0) {
streamer.freq = arg_samplerate->ival[0];
- if(streamer.freq < 1 || streamer.freq > 96000) {
+ if (streamer.freq < 1 || streamer.freq > 96000) {
fprintf(stderr, "Sampling rate must be between 1 and 96000.\n");
goto exit_0;
}
}
- if(arg_quality->count > 0) {
+ if (arg_quality->count > 0) {
streamer.quality = arg_quality->ival[0];
- if(streamer.quality < 0 || streamer.quality >= DUMB_RQ_N_LEVELS) {
- fprintf(stderr, "Quality must be between %d and %d.\n", 0, DUMB_RQ_N_LEVELS-1);
+ if (streamer.quality < 0 || streamer.quality >= DUMB_RQ_N_LEVELS) {
+ fprintf(stderr, "Quality must be between %d and %d.\n", 0,
+ DUMB_RQ_N_LEVELS - 1);
goto exit_0;
}
}
@@ -210,13 +224,15 @@
// Load source file.
dumb_register_stdfiles();
streamer.src = dumb_load_any(streamer.input, 0, 0);
- if(!streamer.src) {
- fprintf(stderr, "Unable to load file %s for playback!\n", streamer.input);
+ if (!streamer.src) {
+ fprintf(stderr, "Unable to load file %s for playback!\n",
+ streamer.input);
goto exit_0;
}
// Set up playback
- streamer.renderer = duh_start_sigrenderer(streamer.src, 0, streamer.n_channels, 0);
+ streamer.renderer =
+ duh_start_sigrenderer(streamer.src, 0, streamer.n_channels, 0);
streamer.delta = 65536.0f / streamer.freq;
streamer.sbytes = (streamer.bits / 8) * streamer.n_channels;
streamer.ssize = duh_get_length(streamer.src);
@@ -241,13 +257,13 @@
// SDL2 will tell us what we got in the "have" struct.
SDL_AudioSpec have;
streamer.dev = SDL_OpenAudioDevice(NULL, 0, &want, &have, 0);
- if(streamer.dev == 0) {
+ if (streamer.dev == 0) {
fprintf(stderr, "%s\n", SDL_GetError());
goto exit_1;
}
// Make sure we got the format we wanted. If not, stop here.
- if(have.format != want.format) {
+ if (have.format != want.format) {
fprintf(stderr, "Could not get correct playback format.\n");
goto exit_2;
}
@@ -259,13 +275,13 @@
int time_start = SDL_GetTicks();
float seek = 0.0f;
int ms_played = 0;
- if(!streamer.no_progress) {
+ if (!streamer.no_progress) {
show_progress(PROGRESSBAR_LENGTH, seek, ms_played);
}
// Loop while dumb is still giving data. Update progressbar if enabled.
- while(!stop_signal && !streamer.ended) {
- if(!streamer.no_progress) {
+ while (!stop_signal && !streamer.ended) {
+ if (!streamer.no_progress) {
seek = ((float)streamer.spos) / ((float)streamer.ssize);
ms_played = SDL_GetTicks() - time_start;
show_progress(PROGRESSBAR_LENGTH, seek, ms_played);
@@ -277,7 +293,7 @@
retcode = 0;
// Free up resources and exit.
- if(streamer.sig_samples) {
+ if (streamer.sig_samples) {
destroy_sample_buffer(streamer.sig_samples);
}
@@ -285,15 +301,15 @@
SDL_CloseAudioDevice(streamer.dev);
exit_1:
- if(streamer.renderer) {
+ if (streamer.renderer) {
duh_end_sigrenderer(streamer.renderer);
}
- if(streamer.src) {
+ if (streamer.src) {
unload_duh(streamer.src);
}
exit_0:
- arg_freetable(argtable, sizeof(argtable)/sizeof(argtable[0]));
+ arg_freetable(argtable, sizeof(argtable) / sizeof(argtable[0]));
SDL_Quit();
return retcode;
}
--- a/include/aldumb.h
+++ b/include/aldumb.h
@@ -20,17 +20,14 @@
#ifndef ALDUMB_H
#define ALDUMB_H
-
#include <allegro.h>
#include "dumb.h"
-
#ifdef __cplusplus
- extern "C" {
+extern "C" {
#endif
-
/* Packfile Support */
void dumb_register_packfiles(void);
@@ -38,14 +35,13 @@
DUMBFILE *dumbfile_open_packfile(PACKFILE *p);
DUMBFILE *dumbfile_from_packfile(PACKFILE *p);
-
/* Datafile Registration Functions */
-#define DUMB_DAT_DUH DAT_ID('D','U','H',' ')
-#define DUMB_DAT_IT DAT_ID('I','T',' ',' ')
-#define DUMB_DAT_XM DAT_ID('X','M',' ',' ')
-#define DUMB_DAT_S3M DAT_ID('S','3','M',' ')
-#define DUMB_DAT_MOD DAT_ID('M','O','D',' ')
+#define DUMB_DAT_DUH DAT_ID('D', 'U', 'H', ' ')
+#define DUMB_DAT_IT DAT_ID('I', 'T', ' ', ' ')
+#define DUMB_DAT_XM DAT_ID('X', 'M', ' ', ' ')
+#define DUMB_DAT_S3M DAT_ID('S', '3', 'M', ' ')
+#define DUMB_DAT_MOD DAT_ID('M', 'O', 'D', ' ')
void dumb_register_dat_duh(long type);
void dumb_register_dat_it(long type);
@@ -57,12 +53,12 @@
void dumb_register_dat_s3m_quick(long type);
void dumb_register_dat_mod_quick(long type);
-
/* DUH Playing Functions */
typedef struct AL_DUH_PLAYER AL_DUH_PLAYER;
-AL_DUH_PLAYER *al_start_duh(DUH *duh, int n_channels, long pos, float volume, long bufsize, int freq);
+AL_DUH_PLAYER *al_start_duh(DUH *duh, int n_channels, long pos, float volume,
+ long bufsize, int freq);
void al_stop_duh(AL_DUH_PLAYER *dp);
void al_pause_duh(AL_DUH_PLAYER *dp);
void al_resume_duh(AL_DUH_PLAYER *dp);
@@ -72,16 +68,16 @@
int al_poll_duh(AL_DUH_PLAYER *dp);
long al_duh_get_position(AL_DUH_PLAYER *dp);
-AL_DUH_PLAYER *al_duh_encapsulate_sigrenderer(DUH_SIGRENDERER *sigrenderer, float volume, long bufsize, int freq);
+AL_DUH_PLAYER *al_duh_encapsulate_sigrenderer(DUH_SIGRENDERER *sigrenderer,
+ float volume, long bufsize,
+ int freq);
DUH_SIGRENDERER *al_duh_get_sigrenderer(AL_DUH_PLAYER *dp);
/* IMPORTANT: This function will return NULL if the music has ended. */
DUH_SIGRENDERER *al_duh_decompose_to_sigrenderer(AL_DUH_PLAYER *dp);
-
#ifdef __cplusplus
- }
+}
#endif
-
#endif /* ALDUMB_H */
--- a/include/dumb.h
+++ b/include/dumb.h
@@ -20,7 +20,6 @@
#ifndef DUMB_H
#define DUMB_H
-
#include <stdlib.h>
#include <stdio.h>
@@ -32,7 +31,7 @@
#endif
#ifdef __cplusplus
- extern "C" {
+extern "C" {
#endif
/*
@@ -39,15 +38,16 @@
* When you bump major, minor, or patch, bump both the number and the string.
* When you bump major or minor version, bump them in CMakeLists.txt, too.
*/
-#define DUMB_MAJOR_VERSION 2
-#define DUMB_MINOR_VERSION 0
+#define DUMB_MAJOR_VERSION 2
+#define DUMB_MINOR_VERSION 0
#define DUMB_REVISION_VERSION 0
#define DUMB_VERSION_STR "2.0.0"
-#define DUMB_VERSION (DUMB_MAJOR_VERSION*10000 + DUMB_MINOR_VERSION*100 + DUMB_REVISION_VERSION)
+#define DUMB_VERSION \
+ (DUMB_MAJOR_VERSION * 10000 + DUMB_MINOR_VERSION * 100 + \
+ DUMB_REVISION_VERSION)
#define DUMB_NAME "DUMB v" DUMB_VERSION_STR
-
#ifdef DEBUGMODE
#ifndef ASSERT
@@ -70,12 +70,10 @@
#endif // DEBUGMODE
+#define DUMB_ID(a, b, c, d) \
+ (((unsigned int)(a) << 24) | ((unsigned int)(b) << 16) | \
+ ((unsigned int)(c) << 8) | ((unsigned int)(d)))
-#define DUMB_ID(a,b,c,d) (((unsigned int)(a) << 24) | \
- ((unsigned int)(b) << 16) | \
- ((unsigned int)(c) << 8) | \
- ((unsigned int)(d) ))
-
#if __GNUC__ * 100 + __GNUC_MINOR__ >= 301 /* GCC 3.1+ */
#ifndef DUMB_DECLARE_DEPRECATED
#define DUMB_DECLARE_DEPRECATED
@@ -85,12 +83,10 @@
#define DUMB_DEPRECATED
#endif
-
/* Basic Sample Type. Normal range is -0x800000 to 0x7FFFFF. */
typedef int sample_t;
-
/* Library Clean-up Management */
int dumb_atexit(void (*proc)(void));
@@ -97,18 +93,17 @@
void dumb_exit(void);
-
/* File Input Functions */
#ifdef DUMB_OFF_T_CUSTOM
- typedef dumb_off_t DUMB_OFF_T_CUSTOM;
-#elif defined _MSC_VER || defined __WATCOMC__
- typedef __int64 dumb_off_t;
+typedef dumb_off_t DUMB_OFF_T_CUSTOM;
+#elif defined _MSC_VER || defined __WATCOMC__
+typedef __int64 dumb_off_t;
#elif defined __DJGPP__
- typedef off64_t dumb_off_t;
+typedef off64_t dumb_off_t;
#elif _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 500 || defined __MINGW32__
- typedef off_t dumb_off_t;
+typedef off_t dumb_off_t;
#else
- typedef long long dumb_off_t;
+typedef long long dumb_off_t;
#endif
/*
@@ -121,13 +116,14 @@
* such as off64_t or int64_t before including dumb.h as follows:
* #define DUMB_OFF_T_CUSTOM int64_t
*/
-#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined __cplusplus
- _Static_assert(sizeof(dumb_off_t) >= 8, "fuse: off_t must be 64bit");
+#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && \
+ !defined __cplusplus
+_Static_assert(sizeof(dumb_off_t) >= 8, "fuse: off_t must be 64bit");
#else
- struct dumb_off_t_needs_to_be_at_least_8_bytes { \
- unsigned int dumb_off_t_needs_to_be_at_least_8_bytes: \
- ((sizeof(dumb_off_t) >= 8) ? 1 : -42); \
- };
+struct dumb_off_t_needs_to_be_at_least_8_bytes {
+ unsigned int dumb_off_t_needs_to_be_at_least_8_bytes
+ : ((sizeof(dumb_off_t) >= 8) ? 1 : -42);
+};
#endif
/*
@@ -153,37 +149,35 @@
*
* See DUMBFILE_SYSTEM.md in project's root for a complete spec.
*/
-typedef struct DUMBFILE_SYSTEM
-{
- /* open */
- /* Open filename. Returned file may be of any custom type. */
- void *(*open)(const char *filename);
+typedef struct DUMBFILE_SYSTEM {
+ /* open */
+ /* Open filename. Returned file may be of any custom type. */
+ void *(*open)(const char *filename);
- /* skip */
- /* Ignore the next n bytes in file f. Returns 0 on succes, -1 on error. */
- int (*skip)(void *f, dumb_off_t n);
+ /* skip */
+ /* Ignore the next n bytes in file f. Returns 0 on succes, -1 on error. */
+ int (*skip)(void *f, dumb_off_t n);
- /* getc */
- /* Read the next byte. Returns byte as unsigned, or -1 on error. */
- int (*getc)(void *f);
+ /* getc */
+ /* Read the next byte. Returns byte as unsigned, or -1 on error. */
+ int (*getc)(void *f);
- /* getnc */
- /* Read n bytes into buffer ptr. Returns number of bytes read or -1. */
- dumb_ssize_t (*getnc)(char *ptr, size_t n, void *f);
+ /* getnc */
+ /* Read n bytes into buffer ptr. Returns number of bytes read or -1. */
+ dumb_ssize_t (*getnc)(char *ptr, size_t n, void *f);
- /* close */
- /* Called when DUMB is done with the file. User code may do anything. */
- void (*close)(void *f);
+ /* close */
+ /* Called when DUMB is done with the file. User code may do anything. */
+ void (*close)(void *f);
- /* seek */
- /* Jump to offset in bytes from beginning. Returns 0 if OK, -1 on error. */
- int (*seek)(void *f, dumb_off_t offset);
+ /* seek */
+ /* Jump to offset in bytes from beginning. Returns 0 if OK, -1 on error. */
+ int (*seek)(void *f, dumb_off_t offset);
- /* get_size */
- /* Returns the size in bytes of the file. */
- dumb_off_t (*get_size)(void *f);
-}
-DUMBFILE_SYSTEM;
+ /* get_size */
+ /* Returns the size in bytes of the file. */
+ dumb_off_t (*get_size)(void *f);
+} DUMBFILE_SYSTEM;
typedef struct DUMBFILE DUMBFILE;
@@ -219,7 +213,6 @@
int dumbfile_error(DUMBFILE *f);
int dumbfile_close(DUMBFILE *f);
-
/* stdio File Input Module */
void dumb_register_stdfiles(void);
@@ -226,17 +219,15 @@
DUMBFILE *dumbfile_open_stdfile(FILE *p);
-
/* Memory File Input Module */
DUMBFILE *dumbfile_open_memory(const char *data, size_t size);
-
/* DUH Management */
typedef struct DUH DUH;
-#define DUH_SIGNATURE DUMB_ID('D','U','H','!')
+#define DUH_SIGNATURE DUMB_ID('D', 'U', 'H', '!')
void unload_duh(DUH *duh);
@@ -247,37 +238,38 @@
const char *duh_get_tag(DUH *duh, const char *key);
int duh_get_tag_iterator_size(DUH *duh);
-int duh_get_tag_iterator_get(DUH *duh, const char **key, const char **tag, int i);
+int duh_get_tag_iterator_get(DUH *duh, const char **key, const char **tag,
+ int i);
/* Signal Rendering Functions */
typedef struct DUH_SIGRENDERER DUH_SIGRENDERER;
-DUH_SIGRENDERER *duh_start_sigrenderer(DUH *duh, int sig, int n_channels, long pos);
+DUH_SIGRENDERER *duh_start_sigrenderer(DUH *duh, int sig, int n_channels,
+ long pos);
-typedef void (*DUH_SIGRENDERER_SAMPLE_ANALYSER_CALLBACK)(void *data, const sample_t *const *samples, int n_channels, long length);
+typedef void (*DUH_SIGRENDERER_SAMPLE_ANALYSER_CALLBACK)(
+ void *data, const sample_t *const *samples, int n_channels, long length);
void duh_sigrenderer_set_sample_analyser_callback(
- DUH_SIGRENDERER *sigrenderer,
- DUH_SIGRENDERER_SAMPLE_ANALYSER_CALLBACK callback, void *data
-);
+ DUH_SIGRENDERER *sigrenderer,
+ DUH_SIGRENDERER_SAMPLE_ANALYSER_CALLBACK callback, void *data);
int duh_sigrenderer_get_n_channels(DUH_SIGRENDERER *sigrenderer);
long duh_sigrenderer_get_position(DUH_SIGRENDERER *sigrenderer);
-void duh_sigrenderer_set_sigparam(DUH_SIGRENDERER *sigrenderer, unsigned char id, long value);
+void duh_sigrenderer_set_sigparam(DUH_SIGRENDERER *sigrenderer,
+ unsigned char id, long value);
-long duh_sigrenderer_generate_samples(
- DUH_SIGRENDERER *sigrenderer,
- float volume, float delta,
- long size, sample_t **samples
-);
+long duh_sigrenderer_generate_samples(DUH_SIGRENDERER *sigrenderer,
+ float volume, float delta, long size,
+ sample_t **samples);
-void duh_sigrenderer_get_current_sample(DUH_SIGRENDERER *sigrenderer, float volume, sample_t *samples);
+void duh_sigrenderer_get_current_sample(DUH_SIGRENDERER *sigrenderer,
+ float volume, sample_t *samples);
void duh_end_sigrenderer(DUH_SIGRENDERER *sigrenderer);
-
/* DUH Rendering Functions */
/* For packed integers: 8, 16, 24-bit wide.
@@ -284,41 +276,27 @@
* Intermediary buffer sig_samples must be freed with destroy_sample_buffer()
* in the end of the rendering loop.
*/
-long duh_render_int(
- DUH_SIGRENDERER *sigrenderer,
- sample_t ***sig_samples,
- long *sig_samples_size,
- int bits, int unsign,
- float volume, float delta,
- long size, void *sptr
-);
+long duh_render_int(DUH_SIGRENDERER *sigrenderer, sample_t ***sig_samples,
+ long *sig_samples_size, int bits, int unsign, float volume,
+ float delta, long size, void *sptr);
/* For floats: 32, 64-bit wide.
* Intermediary buffer sig_samples must be freed with destroy_sample_buffer()
* in the end of the rendering loop.
*/
-long duh_render_float(
- DUH_SIGRENDERER *sigrenderer,
- sample_t ***sig_samples,
- long *sig_samples_size,
- int bits,
- float volume, float delta,
- long size, void *sptr
-);
+long duh_render_float(DUH_SIGRENDERER *sigrenderer, sample_t ***sig_samples,
+ long *sig_samples_size, int bits, float volume,
+ float delta, long size, void *sptr);
#ifdef DUMB_DECLARE_DEPRECATED
/* DEPRECATED since 2.0.0. Please use duh_render_int or duh_render_float. */
-long duh_render(
- DUH_SIGRENDERER *sigrenderer,
- int bits, int unsign,
- float volume, float delta,
- long size, void *sptr
-) DUMB_DEPRECATED;
+long duh_render(DUH_SIGRENDERER *sigrenderer, int bits, int unsign,
+ float volume, float delta, long size,
+ void *sptr) DUMB_DEPRECATED;
#endif
-
/* Impulse Tracker Support */
extern int dumb_it_max_to_mix;
@@ -327,38 +305,53 @@
typedef struct DUMB_IT_SIGRENDERER DUMB_IT_SIGRENDERER;
DUMB_IT_SIGDATA *duh_get_it_sigdata(DUH *duh);
-DUH_SIGRENDERER *duh_encapsulate_it_sigrenderer(DUMB_IT_SIGRENDERER *it_sigrenderer, int n_channels, long pos);
+DUH_SIGRENDERER *
+duh_encapsulate_it_sigrenderer(DUMB_IT_SIGRENDERER *it_sigrenderer,
+ int n_channels, long pos);
DUMB_IT_SIGRENDERER *duh_get_it_sigrenderer(DUH_SIGRENDERER *sigrenderer);
-int dumb_it_trim_silent_patterns(DUH * duh);
+int dumb_it_trim_silent_patterns(DUH *duh);
typedef int (*dumb_scan_callback)(void *, int, long);
-int dumb_it_scan_for_playable_orders(DUMB_IT_SIGDATA *sigdata, dumb_scan_callback callback, void * callback_data);
+int dumb_it_scan_for_playable_orders(DUMB_IT_SIGDATA *sigdata,
+ dumb_scan_callback callback,
+ void *callback_data);
-DUH_SIGRENDERER *dumb_it_start_at_order(DUH *duh, int n_channels, int startorder);
+DUH_SIGRENDERER *dumb_it_start_at_order(DUH *duh, int n_channels,
+ int startorder);
-enum
-{
+enum {
DUMB_IT_RAMP_NONE = 0,
DUMB_IT_RAMP_ONOFF_ONLY = 1,
DUMB_IT_RAMP_FULL = 2
};
-void dumb_it_set_ramp_style(DUMB_IT_SIGRENDERER * sigrenderer, int ramp_style);
+void dumb_it_set_ramp_style(DUMB_IT_SIGRENDERER *sigrenderer, int ramp_style);
-void dumb_it_set_loop_callback(DUMB_IT_SIGRENDERER *sigrenderer, int (*callback)(void *data), void *data);
-void dumb_it_set_xm_speed_zero_callback(DUMB_IT_SIGRENDERER *sigrenderer, int (*callback)(void *data), void *data);
-void dumb_it_set_midi_callback(DUMB_IT_SIGRENDERER *sigrenderer, int (*callback)(void *data, int channel, unsigned char midi_byte), void *data);
-void dumb_it_set_global_volume_zero_callback(DUMB_IT_SIGRENDERER *sigrenderer, int (*callback)(void *data), void *data);
+void dumb_it_set_loop_callback(DUMB_IT_SIGRENDERER *sigrenderer,
+ int (*callback)(void *data), void *data);
+void dumb_it_set_xm_speed_zero_callback(DUMB_IT_SIGRENDERER *sigrenderer,
+ int (*callback)(void *data),
+ void *data);
+void dumb_it_set_midi_callback(DUMB_IT_SIGRENDERER *sigrenderer,
+ int (*callback)(void *data, int channel,
+ unsigned char midi_byte),
+ void *data);
+void dumb_it_set_global_volume_zero_callback(DUMB_IT_SIGRENDERER *sigrenderer,
+ int (*callback)(void *data),
+ void *data);
int dumb_it_callback_terminate(void *data);
-int dumb_it_callback_midi_block(void *data, int channel, unsigned char midi_byte);
+int dumb_it_callback_midi_block(void *data, int channel,
+ unsigned char midi_byte);
/* dumb_*_mod*: restrict_ - OR these together */
-enum
-{
- DUMB_MOD_RESTRICT_NO_15_SAMPLE = (1 << 0), /* Don't load 15 sample files, which have no identifying signature */
- DUMB_MOD_RESTRICT_OLD_PATTERN_COUNT = (1 << 1) /* Use old pattern counting method */
+enum {
+ DUMB_MOD_RESTRICT_NO_15_SAMPLE = (1 << 0), /* Don't load 15 sample files,
+ which have no identifying
+ signature */
+ DUMB_MOD_RESTRICT_OLD_PATTERN_COUNT =
+ (1 << 1) /* Use old pattern counting method */
};
DUH *dumb_load_it(const char *filename);
@@ -369,7 +362,7 @@
DUH *dumb_load_ptm(const char *filename);
DUH *dumb_load_669(const char *filename);
DUH *dumb_load_psm(const char *filename, int subsong);
-DUH *dumb_load_old_psm(const char * filename);
+DUH *dumb_load_old_psm(const char *filename);
DUH *dumb_load_mtm(const char *filename);
DUH *dumb_load_riff(const char *filename);
DUH *dumb_load_asy(const char *filename);
@@ -399,7 +392,7 @@
DUH *dumb_load_ptm_quick(const char *filename);
DUH *dumb_load_669_quick(const char *filename);
DUH *dumb_load_psm_quick(const char *filename, int subsong);
-DUH *dumb_load_old_psm_quick(const char * filename);
+DUH *dumb_load_old_psm_quick(const char *filename);
DUH *dumb_load_mtm_quick(const char *filename);
DUH *dumb_load_riff_quick(const char *filename);
DUH *dumb_load_asy_quick(const char *filename);
@@ -441,7 +434,8 @@
const unsigned char *dumb_it_sd_get_sample_name(DUMB_IT_SIGDATA *sd, int i);
const unsigned char *dumb_it_sd_get_sample_filename(DUMB_IT_SIGDATA *sd, int i);
const unsigned char *dumb_it_sd_get_instrument_name(DUMB_IT_SIGDATA *sd, int i);
-const unsigned char *dumb_it_sd_get_instrument_filename(DUMB_IT_SIGDATA *sd, int i);
+const unsigned char *dumb_it_sd_get_instrument_filename(DUMB_IT_SIGDATA *sd,
+ int i);
int dumb_it_sd_get_initial_global_volume(DUMB_IT_SIGDATA *sd);
void dumb_it_sd_set_initial_global_volume(DUMB_IT_SIGDATA *sd, int gv);
@@ -456,7 +450,8 @@
void dumb_it_sd_set_initial_tempo(DUMB_IT_SIGDATA *sd, int tempo);
int dumb_it_sd_get_initial_channel_volume(DUMB_IT_SIGDATA *sd, int channel);
-void dumb_it_sd_set_initial_channel_volume(DUMB_IT_SIGDATA *sd, int channel, int volume);
+void dumb_it_sd_set_initial_channel_volume(DUMB_IT_SIGDATA *sd, int channel,
+ int volume);
int dumb_it_sr_get_current_order(DUMB_IT_SIGRENDERER *sr);
int dumb_it_sr_get_current_row(DUMB_IT_SIGRENDERER *sr);
@@ -476,35 +471,36 @@
/* Channels passed to any of these functions are 0-based */
int dumb_it_sr_get_channel_volume(DUMB_IT_SIGRENDERER *sr, int channel);
-void dumb_it_sr_set_channel_volume(DUMB_IT_SIGRENDERER *sr, int channel, int volume);
+void dumb_it_sr_set_channel_volume(DUMB_IT_SIGRENDERER *sr, int channel,
+ int volume);
int dumb_it_sr_get_channel_muted(DUMB_IT_SIGRENDERER *sr, int channel);
-void dumb_it_sr_set_channel_muted(DUMB_IT_SIGRENDERER *sr, int channel, int muted);
+void dumb_it_sr_set_channel_muted(DUMB_IT_SIGRENDERER *sr, int channel,
+ int muted);
typedef struct DUMB_IT_CHANNEL_STATE DUMB_IT_CHANNEL_STATE;
-struct DUMB_IT_CHANNEL_STATE
-{
- int channel; /* 0-based; meaningful for NNA channels */
- int sample; /* 1-based; 0 if nothing playing, then other fields undef */
- int freq; /* in Hz */
- float volume; /* 1.0 maximum; affected by ALL factors, inc. mixing vol */
- unsigned char pan; /* 0-64, 100 for surround */
- signed char subpan; /* use (pan + subpan/256.0f) or ((pan<<8)+subpan) */
- unsigned char filter_cutoff; /* 0-127 cutoff=127 AND resonance=0 */
- unsigned char filter_subcutoff; /* 0-255 -> no filters (subcutoff */
- unsigned char filter_resonance; /* 0-127 always 0 in this case) */
- /* subcutoff only changes from zero if filter envelopes are in use. The
- * calculation (filter_cutoff + filter_subcutoff/256.0f) gives a more
- * accurate filter cutoff measurement as a float. It would often be more
- * useful to use a scaled int such as ((cutoff<<8) + subcutoff).
- */
+struct DUMB_IT_CHANNEL_STATE {
+ int channel; /* 0-based; meaningful for NNA channels */
+ int sample; /* 1-based; 0 if nothing playing, then other fields undef */
+ int freq; /* in Hz */
+ float volume; /* 1.0 maximum; affected by ALL factors, inc. mixing vol */
+ unsigned char pan; /* 0-64, 100 for surround */
+ signed char subpan; /* use (pan + subpan/256.0f) or ((pan<<8)+subpan) */
+ unsigned char filter_cutoff; /* 0-127 cutoff=127 AND resonance=0 */
+ unsigned char filter_subcutoff; /* 0-255 -> no filters (subcutoff */
+ unsigned char filter_resonance; /* 0-127 always 0 in this case) */
+ /* subcutoff only changes from zero if filter envelopes are in use. The
+ * calculation (filter_cutoff + filter_subcutoff/256.0f) gives a more
+ * accurate filter cutoff measurement as a float. It would often be more
+ * useful to use a scaled int such as ((cutoff<<8) + subcutoff).
+ */
};
/* Values of 64 or more will access NNA channels here. */
-void dumb_it_sr_get_channel_state(DUMB_IT_SIGRENDERER *sr, int channel, DUMB_IT_CHANNEL_STATE *state);
+void dumb_it_sr_get_channel_state(DUMB_IT_SIGRENDERER *sr, int channel,
+ DUMB_IT_CHANNEL_STATE *state);
-
/* Signal Design Helper Values */
/* Use pow(DUMB_SEMITONE_BASE, n) to get the 'delta' value to transpose up by
@@ -523,7 +519,6 @@
*/
#define DUMB_PITCH_BASE 1.000225659305069791926712241547647863626
-
/* Signal Design Function Types */
typedef void sigdata_t;
@@ -531,84 +526,66 @@
typedef sigdata_t *(*DUH_LOAD_SIGDATA)(DUH *duh, DUMBFILE *file);
-typedef sigrenderer_t *(*DUH_START_SIGRENDERER)(
- DUH *duh,
- sigdata_t *sigdata,
- int n_channels,
- long pos
-);
+typedef sigrenderer_t *(*DUH_START_SIGRENDERER)(DUH *duh, sigdata_t *sigdata,
+ int n_channels, long pos);
-typedef void (*DUH_SIGRENDERER_SET_SIGPARAM)(
- sigrenderer_t *sigrenderer,
- unsigned char id, long value
-);
+typedef void (*DUH_SIGRENDERER_SET_SIGPARAM)(sigrenderer_t *sigrenderer,
+ unsigned char id, long value);
-typedef long (*DUH_SIGRENDERER_GENERATE_SAMPLES)(
- sigrenderer_t *sigrenderer,
- float volume, float delta,
- long size, sample_t **samples
-);
+typedef long (*DUH_SIGRENDERER_GENERATE_SAMPLES)(sigrenderer_t *sigrenderer,
+ float volume, float delta,
+ long size, sample_t **samples);
-typedef void (*DUH_SIGRENDERER_GET_CURRENT_SAMPLE)(
- sigrenderer_t *sigrenderer,
- float volume,
- sample_t *samples
-);
+typedef void (*DUH_SIGRENDERER_GET_CURRENT_SAMPLE)(sigrenderer_t *sigrenderer,
+ float volume,
+ sample_t *samples);
-typedef long (*DUH_SIGRENDERER_GET_POSITION)(
- sigrenderer_t *sigrenderer
-);
+typedef long (*DUH_SIGRENDERER_GET_POSITION)(sigrenderer_t *sigrenderer);
typedef void (*DUH_END_SIGRENDERER)(sigrenderer_t *sigrenderer);
typedef void (*DUH_UNLOAD_SIGDATA)(sigdata_t *sigdata);
-
/* Signal Design Function Registration */
-typedef struct DUH_SIGTYPE_DESC
-{
- long type;
- DUH_LOAD_SIGDATA load_sigdata;
- DUH_START_SIGRENDERER start_sigrenderer;
- DUH_SIGRENDERER_SET_SIGPARAM sigrenderer_set_sigparam;
- DUH_SIGRENDERER_GENERATE_SAMPLES sigrenderer_generate_samples;
- DUH_SIGRENDERER_GET_CURRENT_SAMPLE sigrenderer_get_current_sample;
- DUH_SIGRENDERER_GET_POSITION sigrenderer_get_position;
- DUH_END_SIGRENDERER end_sigrenderer;
- DUH_UNLOAD_SIGDATA unload_sigdata;
-}
-DUH_SIGTYPE_DESC;
+typedef struct DUH_SIGTYPE_DESC {
+ long type;
+ DUH_LOAD_SIGDATA load_sigdata;
+ DUH_START_SIGRENDERER start_sigrenderer;
+ DUH_SIGRENDERER_SET_SIGPARAM sigrenderer_set_sigparam;
+ DUH_SIGRENDERER_GENERATE_SAMPLES sigrenderer_generate_samples;
+ DUH_SIGRENDERER_GET_CURRENT_SAMPLE sigrenderer_get_current_sample;
+ DUH_SIGRENDERER_GET_POSITION sigrenderer_get_position;
+ DUH_END_SIGRENDERER end_sigrenderer;
+ DUH_UNLOAD_SIGDATA unload_sigdata;
+} DUH_SIGTYPE_DESC;
void dumb_register_sigtype(DUH_SIGTYPE_DESC *desc);
int duh_add_signal(DUH *duh, DUH_SIGTYPE_DESC *desc, sigdata_t *sigdata);
-
// Decide where to put these functions; new heading?
sigdata_t *duh_get_raw_sigdata(DUH *duh, int sig, long type);
-DUH_SIGRENDERER *duh_encapsulate_raw_sigrenderer(sigrenderer_t *vsigrenderer, DUH_SIGTYPE_DESC *desc, int n_channels, long pos);
+DUH_SIGRENDERER *duh_encapsulate_raw_sigrenderer(sigrenderer_t *vsigrenderer,
+ DUH_SIGTYPE_DESC *desc,
+ int n_channels, long pos);
sigrenderer_t *duh_get_raw_sigrenderer(DUH_SIGRENDERER *sigrenderer, long type);
-
/* Standard Signal Types */
-//void dumb_register_sigtype_sample(void);
+// void dumb_register_sigtype_sample(void);
-
/* Sample Buffer Allocation Helpers */
sample_t **allocate_sample_buffer(int n_channels, long length);
void destroy_sample_buffer(sample_t **samples);
-
/* Silencing Helper */
void dumb_silence(sample_t *samples, long length);
-
/* Click Removal Helpers */
typedef struct DUMB_CLICK_REMOVER DUMB_CLICK_REMOVER;
@@ -615,30 +592,35 @@
DUMB_CLICK_REMOVER *dumb_create_click_remover(void);
void dumb_record_click(DUMB_CLICK_REMOVER *cr, long pos, sample_t step);
-void dumb_remove_clicks(DUMB_CLICK_REMOVER *cr, sample_t *samples, long length, int step, float halflife);
+void dumb_remove_clicks(DUMB_CLICK_REMOVER *cr, sample_t *samples, long length,
+ int step, float halflife);
sample_t dumb_click_remover_get_offset(DUMB_CLICK_REMOVER *cr);
void dumb_destroy_click_remover(DUMB_CLICK_REMOVER *cr);
DUMB_CLICK_REMOVER **dumb_create_click_remover_array(int n);
-void dumb_record_click_array(int n, DUMB_CLICK_REMOVER **cr, long pos, sample_t *step);
-void dumb_record_click_negative_array(int n, DUMB_CLICK_REMOVER **cr, long pos, sample_t *step);
-void dumb_remove_clicks_array(int n, DUMB_CLICK_REMOVER **cr, sample_t **samples, long length, float halflife);
-void dumb_click_remover_get_offset_array(int n, DUMB_CLICK_REMOVER **cr, sample_t *offset);
+void dumb_record_click_array(int n, DUMB_CLICK_REMOVER **cr, long pos,
+ sample_t *step);
+void dumb_record_click_negative_array(int n, DUMB_CLICK_REMOVER **cr, long pos,
+ sample_t *step);
+void dumb_remove_clicks_array(int n, DUMB_CLICK_REMOVER **cr,
+ sample_t **samples, long length, float halflife);
+void dumb_click_remover_get_offset_array(int n, DUMB_CLICK_REMOVER **cr,
+ sample_t *offset);
void dumb_destroy_click_remover_array(int n, DUMB_CLICK_REMOVER **cr);
-
/* Resampling Helpers */
#define DUMB_RQ_ALIASING 0
-#define DUMB_RQ_BLEP 1
-#define DUMB_RQ_LINEAR 2
-#define DUMB_RQ_BLAM 3
-#define DUMB_RQ_CUBIC 4
-#define DUMB_RQ_FIR 5
+#define DUMB_RQ_BLEP 1
+#define DUMB_RQ_LINEAR 2
+#define DUMB_RQ_BLAM 3
+#define DUMB_RQ_CUBIC 4
+#define DUMB_RQ_FIR 5
#define DUMB_RQ_N_LEVELS 6
extern int dumb_resampling_quality; /* This specifies the default */
-void dumb_it_set_resampling_quality(DUMB_IT_SIGRENDERER * sigrenderer, int quality); /* This overrides it */
+void dumb_it_set_resampling_quality(DUMB_IT_SIGRENDERER *sigrenderer,
+ int quality); /* This overrides it */
typedef struct DUMB_RESAMPLER DUMB_RESAMPLER;
@@ -646,82 +628,166 @@
typedef void (*DUMB_RESAMPLE_PICKUP)(DUMB_RESAMPLER *resampler, void *data);
-struct DUMB_RESAMPLER
-{
- void *src;
- long pos;
- int subpos;
- long start, end;
- int dir;
- DUMB_RESAMPLE_PICKUP pickup;
- void *pickup_data;
- int quality;
- /* Everything below this point is internal: do not use. */
- union {
- sample_t x24[3*2];
- short x16[3*2];
- signed char x8[3*2];
- } x;
- int overshot;
+struct DUMB_RESAMPLER {
+ void *src;
+ long pos;
+ int subpos;
+ long start, end;
+ int dir;
+ DUMB_RESAMPLE_PICKUP pickup;
+ void *pickup_data;
+ int quality;
+ /* Everything below this point is internal: do not use. */
+ union {
+ sample_t x24[3 * 2];
+ short x16[3 * 2];
+ signed char x8[3 * 2];
+ } x;
+ int overshot;
double fir_resampler_ratio;
- void* fir_resampler[2];
+ void *fir_resampler[2];
};
-struct DUMB_VOLUME_RAMP_INFO
-{
- float volume;
- float delta;
- float target;
- float mix;
+struct DUMB_VOLUME_RAMP_INFO {
+ float volume;
+ float delta;
+ float target;
+ float mix;
unsigned char declick_stage;
};
-void dumb_reset_resampler(DUMB_RESAMPLER *resampler, sample_t *src, int src_channels, long pos, long start, long end, int quality);
-DUMB_RESAMPLER *dumb_start_resampler(sample_t *src, int src_channels, long pos, long start, long end, int quality);
-long dumb_resample_1_1(DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size, DUMB_VOLUME_RAMP_INFO * volume, float delta);
-long dumb_resample_1_2(DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, float delta);
-long dumb_resample_2_1(DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, float delta);
-long dumb_resample_2_2(DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, float 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_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_2(DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst);
+void dumb_reset_resampler(DUMB_RESAMPLER *resampler, sample_t *src,
+ int src_channels, long pos, long start, long end,
+ int quality);
+DUMB_RESAMPLER *dumb_start_resampler(sample_t *src, int src_channels, long pos,
+ long start, long end, int quality);
+long dumb_resample_1_1(DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size,
+ DUMB_VOLUME_RAMP_INFO *volume, float delta);
+long dumb_resample_1_2(DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size,
+ DUMB_VOLUME_RAMP_INFO *volume_left,
+ DUMB_VOLUME_RAMP_INFO *volume_right, float delta);
+long dumb_resample_2_1(DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size,
+ DUMB_VOLUME_RAMP_INFO *volume_left,
+ DUMB_VOLUME_RAMP_INFO *volume_right, float delta);
+long dumb_resample_2_2(DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size,
+ DUMB_VOLUME_RAMP_INFO *volume_left,
+ DUMB_VOLUME_RAMP_INFO *volume_right, float 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_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_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, long pos, long start, long end, int quality);
-DUMB_RESAMPLER *dumb_start_resampler_16(short *src, int src_channels, long pos, long start, long end, int quality);
-long dumb_resample_16_1_1(DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size, DUMB_VOLUME_RAMP_INFO * volume, float delta);
-long dumb_resample_16_1_2(DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, float delta);
-long dumb_resample_16_2_1(DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, float delta);
-long dumb_resample_16_2_2(DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, float 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_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_2(DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst);
+void dumb_reset_resampler_16(DUMB_RESAMPLER *resampler, short *src,
+ int src_channels, long pos, long start, long end,
+ int quality);
+DUMB_RESAMPLER *dumb_start_resampler_16(short *src, int src_channels, long pos,
+ long start, long end, int quality);
+long dumb_resample_16_1_1(DUMB_RESAMPLER *resampler, sample_t *dst,
+ long dst_size, DUMB_VOLUME_RAMP_INFO *volume,
+ float delta);
+long dumb_resample_16_1_2(DUMB_RESAMPLER *resampler, sample_t *dst,
+ long dst_size, DUMB_VOLUME_RAMP_INFO *volume_left,
+ DUMB_VOLUME_RAMP_INFO *volume_right, float delta);
+long dumb_resample_16_2_1(DUMB_RESAMPLER *resampler, sample_t *dst,
+ long dst_size, DUMB_VOLUME_RAMP_INFO *volume_left,
+ DUMB_VOLUME_RAMP_INFO *volume_right, float delta);
+long dumb_resample_16_2_2(DUMB_RESAMPLER *resampler, sample_t *dst,
+ long dst_size, DUMB_VOLUME_RAMP_INFO *volume_left,
+ DUMB_VOLUME_RAMP_INFO *volume_right, float 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_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_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, long pos, long start, long end, int quality);
-DUMB_RESAMPLER *dumb_start_resampler_8(signed char *src, int src_channels, long pos, long start, long end, int quality);
-long dumb_resample_8_1_1(DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size, DUMB_VOLUME_RAMP_INFO * volume, float delta);
-long dumb_resample_8_1_2(DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, float delta);
-long dumb_resample_8_2_1(DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, float delta);
-long dumb_resample_8_2_2(DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, float 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_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_2(DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst);
+void dumb_reset_resampler_8(DUMB_RESAMPLER *resampler, signed char *src,
+ int src_channels, long pos, long start, long end,
+ int quality);
+DUMB_RESAMPLER *dumb_start_resampler_8(signed char *src, int src_channels,
+ long pos, long start, long end,
+ int quality);
+long dumb_resample_8_1_1(DUMB_RESAMPLER *resampler, sample_t *dst,
+ long dst_size, DUMB_VOLUME_RAMP_INFO *volume,
+ float delta);
+long dumb_resample_8_1_2(DUMB_RESAMPLER *resampler, sample_t *dst,
+ long dst_size, DUMB_VOLUME_RAMP_INFO *volume_left,
+ DUMB_VOLUME_RAMP_INFO *volume_right, float delta);
+long dumb_resample_8_2_1(DUMB_RESAMPLER *resampler, sample_t *dst,
+ long dst_size, DUMB_VOLUME_RAMP_INFO *volume_left,
+ DUMB_VOLUME_RAMP_INFO *volume_right, float delta);
+long dumb_resample_8_2_2(DUMB_RESAMPLER *resampler, sample_t *dst,
+ long dst_size, DUMB_VOLUME_RAMP_INFO *volume_left,
+ DUMB_VOLUME_RAMP_INFO *volume_right, float 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_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_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, long pos, long start, long end, int quality);
-DUMB_RESAMPLER *dumb_start_resampler_n(int n, void *src, int src_channels, long pos, long start, long end, int quality);
-long dumb_resample_n_1_1(int n, DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size, DUMB_VOLUME_RAMP_INFO * volume, float delta);
-long dumb_resample_n_1_2(int n, DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, float delta);
-long dumb_resample_n_2_1(int n, DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, float delta);
-long dumb_resample_n_2_2(int n, DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, float 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_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_2(int n, DUMB_RESAMPLER *resampler, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, sample_t *dst);
+void dumb_reset_resampler_n(int n, DUMB_RESAMPLER *resampler, void *src,
+ int src_channels, long pos, long start, long end,
+ int quality);
+DUMB_RESAMPLER *dumb_start_resampler_n(int n, void *src, int src_channels,
+ long pos, long start, long end,
+ int quality);
+long dumb_resample_n_1_1(int n, DUMB_RESAMPLER *resampler, sample_t *dst,
+ long dst_size, DUMB_VOLUME_RAMP_INFO *volume,
+ float delta);
+long dumb_resample_n_1_2(int n, DUMB_RESAMPLER *resampler, sample_t *dst,
+ long dst_size, DUMB_VOLUME_RAMP_INFO *volume_left,
+ DUMB_VOLUME_RAMP_INFO *volume_right, float delta);
+long dumb_resample_n_2_1(int n, DUMB_RESAMPLER *resampler, sample_t *dst,
+ long dst_size, DUMB_VOLUME_RAMP_INFO *volume_left,
+ DUMB_VOLUME_RAMP_INFO *volume_right, float delta);
+long dumb_resample_n_2_2(int n, DUMB_RESAMPLER *resampler, sample_t *dst,
+ long dst_size, DUMB_VOLUME_RAMP_INFO *volume_left,
+ DUMB_VOLUME_RAMP_INFO *volume_right, float 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_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_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);
/* This sets the default panning separation for hard panned formats,
@@ -732,21 +798,13 @@
/* DUH Construction */
-DUH *make_duh(
- dumb_off_t length,
- int n_tags,
- const char *const tag[][2],
- int n_signals,
- DUH_SIGTYPE_DESC *desc[],
- sigdata_t *sigdata[]
-);
+DUH *make_duh(dumb_off_t length, int n_tags, const char *const tag[][2],
+ int n_signals, DUH_SIGTYPE_DESC *desc[], sigdata_t *sigdata[]);
void duh_set_length(DUH *duh, dumb_off_t length);
-
#ifdef __cplusplus
- }
+}
#endif
-
#endif /* DUMB_H */
--- a/include/internal/aldumb.h
+++ b/include/internal/aldumb.h
@@ -20,8 +20,6 @@
#ifndef INTERNAL_ALDUMB_H
#define INTERNAL_ALDUMB_H
-
void _dat_unload_duh(void *duh);
-
#endif /* INTERNAL_DUMB_H */
--- a/include/internal/barray.h
+++ b/include/internal/barray.h
@@ -6,38 +6,38 @@
#ifdef BARRAY_DECORATE
#undef PASTE
#undef EVALUATE
-#define PASTE(a,b) a ## b
-#define EVALUATE(a,b) PASTE(a,b)
-#define bit_array_create EVALUATE(BARRAY_DECORATE,_bit_array_create)
-#define bit_array_destroy EVALUATE(BARRAY_DECORATE,_bit_array_destroy)
-#define bit_array_dup EVALUATE(BARRAY_DECORATE,_bit_array_dup)
-#define bit_array_reset EVALUATE(BARRAY_DECORATE,_bit_array_reset)
-#define bit_array_set EVALUATE(BARRAY_DECORATE,_bit_array_set)
-#define bit_array_set_range EVALUATE(BARRAY_DECORATE,_bit_array_set_range)
-#define bit_array_test EVALUATE(BARRAY_DECORATE,_bit_array_test)
-#define bit_array_test_range EVALUATE(BARRAY_DECORATE,_bit_array_test_range)
-#define bit_array_clear EVALUATE(BARRAY_DECORATE,_bit_array_clear)
-#define bit_array_clear_range EVALUATE(BARRAY_DECORATE,_bit_array_clear_range)
-#define bit_array_merge EVALUATE(BARRAY_DECORATE,_bit_array_merge)
-#define bit_array_mask EVALUATE(BARRAY_DECORATE,_bit_array_mask)
+#define PASTE(a, b) a##b
+#define EVALUATE(a, b) PASTE(a, b)
+#define bit_array_create EVALUATE(BARRAY_DECORATE, _bit_array_create)
+#define bit_array_destroy EVALUATE(BARRAY_DECORATE, _bit_array_destroy)
+#define bit_array_dup EVALUATE(BARRAY_DECORATE, _bit_array_dup)
+#define bit_array_reset EVALUATE(BARRAY_DECORATE, _bit_array_reset)
+#define bit_array_set EVALUATE(BARRAY_DECORATE, _bit_array_set)
+#define bit_array_set_range EVALUATE(BARRAY_DECORATE, _bit_array_set_range)
+#define bit_array_test EVALUATE(BARRAY_DECORATE, _bit_array_test)
+#define bit_array_test_range EVALUATE(BARRAY_DECORATE, _bit_array_test_range)
+#define bit_array_clear EVALUATE(BARRAY_DECORATE, _bit_array_clear)
+#define bit_array_clear_range EVALUATE(BARRAY_DECORATE, _bit_array_clear_range)
+#define bit_array_merge EVALUATE(BARRAY_DECORATE, _bit_array_merge)
+#define bit_array_mask EVALUATE(BARRAY_DECORATE, _bit_array_mask)
#endif
-void * bit_array_create(size_t size);
-void bit_array_destroy(void * array);
-void * bit_array_dup(void * array);
+void *bit_array_create(size_t size);
+void bit_array_destroy(void *array);
+void *bit_array_dup(void *array);
-void bit_array_reset(void * array);
+void bit_array_reset(void *array);
-void bit_array_set(void * array, size_t bit);
-void bit_array_set_range(void * array, size_t bit, size_t count);
+void bit_array_set(void *array, size_t bit);
+void bit_array_set_range(void *array, size_t bit, size_t count);
-int bit_array_test(void * array, size_t bit);
-int bit_array_test_range(void * array, size_t bit, size_t count);
+int bit_array_test(void *array, size_t bit);
+int bit_array_test_range(void *array, size_t bit, size_t count);
-void bit_array_clear(void * array, size_t bit);
-void bit_array_clear_range(void * array, size_t bit, size_t count);
+void bit_array_clear(void *array, size_t bit);
+void bit_array_clear_range(void *array, size_t bit, size_t count);
-void bit_array_merge(void * array, void * source, size_t offset);
-void bit_array_mask(void * array, void * source, size_t offset);
+void bit_array_merge(void *array, void *source, size_t offset);
+void bit_array_mask(void *array, void *source, size_t offset);
#endif
--- a/include/internal/dumb.h
+++ b/include/internal/dumb.h
@@ -32,52 +32,44 @@
#undef MAX
#undef MID
-#define MIN(x,y) (((x) < (y)) ? (x) : (y))
-#define MAX(x,y) (((x) > (y)) ? (x) : (y))
-#define MID(x,y,z) MAX((x), MIN((y), (z)))
+#define MIN(x, y) (((x) < (y)) ? (x) : (y))
+#define MAX(x, y) (((x) > (y)) ? (x) : (y))
+#define MID(x, y, z) MAX((x), MIN((y), (z)))
#undef ABS
#define ABS(x) (((x) >= 0) ? (x) : (-(x)))
#ifndef LONG_LONG
-# if defined __GNUC__ || defined __INTEL_COMPILER || defined __MWERKS__ || defined __sgi
-# define LONG_LONG long long
-# elif defined _MSC_VER || defined __WATCOMC__
-# define LONG_LONG __int64
-# else
-# error 64-bit integer type unknown
-# endif
+#if defined __GNUC__ || defined __INTEL_COMPILER || defined __MWERKS__ || \
+ defined __sgi
+#define LONG_LONG long long
+#elif defined _MSC_VER || defined __WATCOMC__
+#define LONG_LONG __int64
+#else
+#error 64-bit integer type unknown
#endif
+#endif
-typedef struct DUH_SIGTYPE_DESC_LINK
-{
- struct DUH_SIGTYPE_DESC_LINK *next;
- DUH_SIGTYPE_DESC *desc;
-}
-DUH_SIGTYPE_DESC_LINK;
+typedef struct DUH_SIGTYPE_DESC_LINK {
+ struct DUH_SIGTYPE_DESC_LINK *next;
+ DUH_SIGTYPE_DESC *desc;
+} DUH_SIGTYPE_DESC_LINK;
+typedef struct DUH_SIGNAL {
+ sigdata_t *sigdata;
+ DUH_SIGTYPE_DESC *desc;
+} DUH_SIGNAL;
-typedef struct DUH_SIGNAL
-{
- sigdata_t *sigdata;
- DUH_SIGTYPE_DESC *desc;
-}
-DUH_SIGNAL;
+struct DUH {
+ dumb_off_t length;
+ int n_tags;
+ char *(*tag)[2];
-struct DUH
-{
- dumb_off_t length;
-
- int n_tags;
- char *(*tag)[2];
-
- int n_signals;
- DUH_SIGNAL **signal;
+ int n_signals;
+ DUH_SIGNAL **signal;
};
-
DUH_SIGTYPE_DESC *_dumb_get_sigtype_desc(long type);
-
#endif /* INTERNAL_DUMB_H */
--- a/include/internal/dumbfile.h
+++ b/include/internal/dumbfile.h
@@ -3,8 +3,7 @@
#include "../dumb.h"
-struct DUMBFILE
-{
+struct DUMBFILE {
const DUMBFILE_SYSTEM *dfs;
void *file;
long pos;
--- a/include/internal/fir_resampler.h
+++ b/include/internal/fir_resampler.h
@@ -3,13 +3,13 @@
void fir_init();
-void * fir_resampler_create();
+void *fir_resampler_create();
void fir_resampler_delete(void *);
-void * fir_resampler_dup(void *);
+void *fir_resampler_dup(void *);
int fir_resampler_get_free_count(void *);
void fir_resampler_write_sample(void *, short sample);
-void fir_resampler_set_rate( void *, double new_factor );
+void fir_resampler_set_rate(void *, double new_factor);
int fir_resampler_ready(void *);
void fir_resampler_clear(void *);
int fir_resampler_get_sample(void *);
--- a/include/internal/it.h
+++ b/include/internal/it.h
@@ -27,7 +27,6 @@
#ifndef INTERNAL_IT_H
#define INTERNAL_IT_H
-
#define BIT_ARRAY_BULLSHIT
#include <stddef.h>
@@ -35,7 +34,6 @@
#include "barray.h"
#include "tarray.h"
-
/** TO DO: THINK ABOUT THE FOLLOWING:
sigdata->flags & IT_COMPATIBLE_GXX
@@ -49,8 +47,6 @@
NewFrequency = OldFrequency * NewC5 / OldC5;
*/
-
-
/* These #defines are TEMPORARY. They are used to write alternative code to
* handle ambiguities in the format specification. The correct code in each
* case will be determined most likely by experimentation.
@@ -60,25 +56,20 @@
#define SUSTAIN_LOOP_OVERRIDES_NORMAL_LOOP
#define VOLUME_OUT_OF_RANGE_SETS_MAXIMUM
-
-
#define SIGTYPE_IT DUMB_ID('I', 'T', ' ', ' ')
-#define IT_SIGNATURE DUMB_ID('I', 'M', 'P', 'M')
+#define IT_SIGNATURE DUMB_ID('I', 'M', 'P', 'M')
#define IT_INSTRUMENT_SIGNATURE DUMB_ID('I', 'M', 'P', 'I')
-#define IT_SAMPLE_SIGNATURE DUMB_ID('I', 'M', 'P', 'S')
+#define IT_SAMPLE_SIGNATURE DUMB_ID('I', 'M', 'P', 'S')
// olivier sux
-#define IT_MPTX_SIGNATURE DUMB_ID('X', 'T', 'P', 'M')
-#define IT_INSM_SIGNATURE DUMB_ID('M', 'S', 'N', 'I')
+#define IT_MPTX_SIGNATURE DUMB_ID('X', 'T', 'P', 'M')
+#define IT_INSM_SIGNATURE DUMB_ID('M', 'S', 'N', 'I')
-
/* This is divided by the tempo times 256 to get the interval between ticks.
*/
#define TICK_TIME_DIVIDEND (65536 * 5 * 128)
-
-
/* I'm not going to try to explain this, because I didn't derive it very
* formally ;)
*/
@@ -88,8 +79,6 @@
#define AMIGA_CLOCK 3546895
#define AMIGA_DIVISOR ((float)(16.0 * AMIGA_CLOCK))
-
-
typedef struct IT_MIDI IT_MIDI;
typedef struct IT_FILTER_STATE IT_FILTER_STATE;
typedef struct IT_ENVELOPE IT_ENVELOPE;
@@ -103,147 +92,130 @@
typedef struct IT_CHECKPOINT IT_CHECKPOINT;
typedef struct IT_CALLBACKS IT_CALLBACKS;
-
-
-struct IT_MIDI
-{
- unsigned char SFmacro[16][16]; // read these from 0x120
- unsigned char SFmacrolen[16];
- unsigned short SFmacroz[16]; /* Bitfield; bit 0 set = z in first position */
- unsigned char Zmacro[128][16]; // read these from 0x320
- unsigned char Zmacrolen[128];
+struct IT_MIDI {
+ unsigned char SFmacro[16][16]; // read these from 0x120
+ unsigned char SFmacrolen[16];
+ unsigned short SFmacroz[16]; /* Bitfield; bit 0 set = z in first position */
+ unsigned char Zmacro[128][16]; // read these from 0x320
+ unsigned char Zmacrolen[128];
};
-
-
-struct IT_FILTER_STATE
-{
- sample_t currsample, prevsample;
+struct IT_FILTER_STATE {
+ sample_t currsample, prevsample;
};
-
-
-#define IT_ENVELOPE_ON 1
-#define IT_ENVELOPE_LOOP_ON 2
-#define IT_ENVELOPE_SUSTAIN_LOOP 4
-#define IT_ENVELOPE_CARRY 8
+#define IT_ENVELOPE_ON 1
+#define IT_ENVELOPE_LOOP_ON 2
+#define IT_ENVELOPE_SUSTAIN_LOOP 4
+#define IT_ENVELOPE_CARRY 8
#define IT_ENVELOPE_PITCH_IS_FILTER 128
-struct IT_ENVELOPE
-{
- unsigned char flags;
- unsigned char n_nodes;
- unsigned char loop_start;
- unsigned char loop_end;
- unsigned char sus_loop_start;
- unsigned char sus_loop_end;
- signed char node_y[25];
- unsigned short node_t[25];
+struct IT_ENVELOPE {
+ unsigned char flags;
+ unsigned char n_nodes;
+ unsigned char loop_start;
+ unsigned char loop_end;
+ unsigned char sus_loop_start;
+ unsigned char sus_loop_end;
+ signed char node_y[25];
+ unsigned short node_t[25];
};
-
-
-#define NNA_NOTE_CUT 0
+#define NNA_NOTE_CUT 0
#define NNA_NOTE_CONTINUE 1
-#define NNA_NOTE_OFF 2
-#define NNA_NOTE_FADE 3
+#define NNA_NOTE_OFF 2
+#define NNA_NOTE_FADE 3
-#define DCT_OFF 0
-#define DCT_NOTE 1
-#define DCT_SAMPLE 2
+#define DCT_OFF 0
+#define DCT_NOTE 1
+#define DCT_SAMPLE 2
#define DCT_INSTRUMENT 3
-#define DCA_NOTE_CUT 0
-#define DCA_NOTE_OFF 1
+#define DCA_NOTE_CUT 0
+#define DCA_NOTE_OFF 1
#define DCA_NOTE_FADE 2
-struct IT_INSTRUMENT
-{
- unsigned char name[27];
- unsigned char filename[14];
+struct IT_INSTRUMENT {
+ unsigned char name[27];
+ unsigned char filename[14];
- int fadeout;
+ int fadeout;
- IT_ENVELOPE volume_envelope;
- IT_ENVELOPE pan_envelope;
- IT_ENVELOPE pitch_envelope;
+ IT_ENVELOPE volume_envelope;
+ IT_ENVELOPE pan_envelope;
+ IT_ENVELOPE pitch_envelope;
- unsigned char new_note_action;
- unsigned char dup_check_type;
- unsigned char dup_check_action;
- signed char pp_separation;
- unsigned char pp_centre;
- unsigned char global_volume;
- unsigned char default_pan;
- unsigned char random_volume;
- unsigned char random_pan;
+ unsigned char new_note_action;
+ unsigned char dup_check_type;
+ unsigned char dup_check_action;
+ signed char pp_separation;
+ unsigned char pp_centre;
+ unsigned char global_volume;
+ unsigned char default_pan;
+ unsigned char random_volume;
+ unsigned char random_pan;
- unsigned char filter_cutoff;
- unsigned char filter_resonance;
+ unsigned char filter_cutoff;
+ unsigned char filter_resonance;
- unsigned char map_note[120];
- unsigned short map_sample[120];
+ unsigned char map_note[120];
+ unsigned short map_sample[120];
- //int output;
+ // int output;
};
-
-
-#define IT_SAMPLE_EXISTS 1
-#define IT_SAMPLE_16BIT 2
-#define IT_SAMPLE_STEREO 4
-#define IT_SAMPLE_LOOP 16
-#define IT_SAMPLE_SUS_LOOP 32
-#define IT_SAMPLE_PINGPONG_LOOP 64
+#define IT_SAMPLE_EXISTS 1
+#define IT_SAMPLE_16BIT 2
+#define IT_SAMPLE_STEREO 4
+#define IT_SAMPLE_LOOP 16
+#define IT_SAMPLE_SUS_LOOP 32
+#define IT_SAMPLE_PINGPONG_LOOP 64
#define IT_SAMPLE_PINGPONG_SUS_LOOP 128
-#define IT_VIBRATO_SINE 0
-#define IT_VIBRATO_SAWTOOTH 1
-#define IT_VIBRATO_SQUARE 2
-#define IT_VIBRATO_RANDOM 3
+#define IT_VIBRATO_SINE 0
+#define IT_VIBRATO_SAWTOOTH 1
+#define IT_VIBRATO_SQUARE 2
+#define IT_VIBRATO_RANDOM 3
#define IT_VIBRATO_XM_SQUARE 4
#define IT_VIBRATO_RAMP_DOWN 5
-#define IT_VIBRATO_RAMP_UP 6
+#define IT_VIBRATO_RAMP_UP 6
-struct IT_SAMPLE
-{
- unsigned char name[35];
- unsigned char filename[15];
- unsigned char flags;
- unsigned char global_volume;
- unsigned char default_volume;
- unsigned char default_pan;
- /* default_pan:
- * 0-255 for XM
- * ignored for MOD
- * otherwise, 0-64, and add 128 to enable
- */
+struct IT_SAMPLE {
+ unsigned char name[35];
+ unsigned char filename[15];
+ unsigned char flags;
+ unsigned char global_volume;
+ unsigned char default_volume;
+ unsigned char default_pan;
+ /* default_pan:
+ * 0-255 for XM
+ * ignored for MOD
+ * otherwise, 0-64, and add 128 to enable
+ */
- long length;
- long loop_start;
- long loop_end;
- long C5_speed;
- long sus_loop_start;
- long sus_loop_end;
+ long length;
+ long loop_start;
+ long loop_end;
+ long C5_speed;
+ long sus_loop_start;
+ long sus_loop_end;
- unsigned char vibrato_speed;
- unsigned char vibrato_depth;
- unsigned char vibrato_rate;
- unsigned char vibrato_waveform;
+ unsigned char vibrato_speed;
+ unsigned char vibrato_depth;
+ unsigned char vibrato_rate;
+ unsigned char vibrato_waveform;
- signed short finetune;
+ signed short finetune;
- void *data;
+ void *data;
- int max_resampling_quality;
+ int max_resampling_quality;
};
-
-
-#define IT_ENTRY_NOTE 1
+#define IT_ENTRY_NOTE 1
#define IT_ENTRY_INSTRUMENT 2
-#define IT_ENTRY_VOLPAN 4
-#define IT_ENTRY_EFFECT 8
+#define IT_ENTRY_VOLPAN 4
+#define IT_ENTRY_EFFECT 8
#define IT_SET_END_ROW(entry) ((entry)->channel = 255)
#define IT_IS_END_ROW(entry) ((entry)->channel >= DUMB_IT_N_CHANNELS)
@@ -257,78 +229,78 @@
#define IT_IS_SURROUND(pan) ((pan) > 64)
#define IT_IS_SURROUND_SHIFTED(pan) ((pan) > 64 << IT_ENVELOPE_SHIFT)
-#define IT_SET_SPEED 1
-#define IT_JUMP_TO_ORDER 2
-#define IT_BREAK_TO_ROW 3
-#define IT_VOLUME_SLIDE 4
-#define IT_PORTAMENTO_DOWN 5
-#define IT_PORTAMENTO_UP 6
-#define IT_TONE_PORTAMENTO 7
-#define IT_VIBRATO 8
-#define IT_TREMOR 9
-#define IT_ARPEGGIO 10
-#define IT_VOLSLIDE_VIBRATO 11
-#define IT_VOLSLIDE_TONEPORTA 12
-#define IT_SET_CHANNEL_VOLUME 13
-#define IT_CHANNEL_VOLUME_SLIDE 14
-#define IT_SET_SAMPLE_OFFSET 15
-#define IT_PANNING_SLIDE 16
-#define IT_RETRIGGER_NOTE 17
-#define IT_TREMOLO 18
-#define IT_S 19
-#define IT_SET_SONG_TEMPO 20
-#define IT_FINE_VIBRATO 21
-#define IT_SET_GLOBAL_VOLUME 22
-#define IT_GLOBAL_VOLUME_SLIDE 23
-#define IT_SET_PANNING 24
-#define IT_PANBRELLO 25
-#define IT_MIDI_MACRO 26 //see MIDI.TXT
+#define IT_SET_SPEED 1
+#define IT_JUMP_TO_ORDER 2
+#define IT_BREAK_TO_ROW 3
+#define IT_VOLUME_SLIDE 4
+#define IT_PORTAMENTO_DOWN 5
+#define IT_PORTAMENTO_UP 6
+#define IT_TONE_PORTAMENTO 7
+#define IT_VIBRATO 8
+#define IT_TREMOR 9
+#define IT_ARPEGGIO 10
+#define IT_VOLSLIDE_VIBRATO 11
+#define IT_VOLSLIDE_TONEPORTA 12
+#define IT_SET_CHANNEL_VOLUME 13
+#define IT_CHANNEL_VOLUME_SLIDE 14
+#define IT_SET_SAMPLE_OFFSET 15
+#define IT_PANNING_SLIDE 16
+#define IT_RETRIGGER_NOTE 17
+#define IT_TREMOLO 18
+#define IT_S 19
+#define IT_SET_SONG_TEMPO 20
+#define IT_FINE_VIBRATO 21
+#define IT_SET_GLOBAL_VOLUME 22
+#define IT_GLOBAL_VOLUME_SLIDE 23
+#define IT_SET_PANNING 24
+#define IT_PANBRELLO 25
+#define IT_MIDI_MACRO 26 // see MIDI.TXT
/* Some effects needed for XM compatibility */
-#define IT_XM_PORTAMENTO_DOWN 27
-#define IT_XM_PORTAMENTO_UP 28
-#define IT_XM_FINE_VOLSLIDE_DOWN 29
-#define IT_XM_FINE_VOLSLIDE_UP 30
-#define IT_XM_RETRIGGER_NOTE 31
-#define IT_XM_KEY_OFF 32
+#define IT_XM_PORTAMENTO_DOWN 27
+#define IT_XM_PORTAMENTO_UP 28
+#define IT_XM_FINE_VOLSLIDE_DOWN 29
+#define IT_XM_FINE_VOLSLIDE_UP 30
+#define IT_XM_RETRIGGER_NOTE 31
+#define IT_XM_KEY_OFF 32
#define IT_XM_SET_ENVELOPE_POSITION 33
/* More effects needed for PTM compatibility */
-#define IT_PTM_NOTE_SLIDE_DOWN 34
-#define IT_PTM_NOTE_SLIDE_UP 35
+#define IT_PTM_NOTE_SLIDE_DOWN 34
+#define IT_PTM_NOTE_SLIDE_UP 35
#define IT_PTM_NOTE_SLIDE_DOWN_RETRIG 36
-#define IT_PTM_NOTE_SLIDE_UP_RETRIG 37
+#define IT_PTM_NOTE_SLIDE_UP_RETRIG 37
/* More effects needed for OKT compatibility */
-#define IT_OKT_NOTE_SLIDE_DOWN 38
-#define IT_OKT_NOTE_SLIDE_DOWN_ROW 39
-#define IT_OKT_NOTE_SLIDE_UP 40
-#define IT_OKT_NOTE_SLIDE_UP_ROW 41
-#define IT_OKT_ARPEGGIO_3 42
-#define IT_OKT_ARPEGGIO_4 43
-#define IT_OKT_ARPEGGIO_5 44
-#define IT_OKT_VOLUME_SLIDE_DOWN 45
-#define IT_OKT_VOLUME_SLIDE_UP 46
+#define IT_OKT_NOTE_SLIDE_DOWN 38
+#define IT_OKT_NOTE_SLIDE_DOWN_ROW 39
+#define IT_OKT_NOTE_SLIDE_UP 40
+#define IT_OKT_NOTE_SLIDE_UP_ROW 41
+#define IT_OKT_ARPEGGIO_3 42
+#define IT_OKT_ARPEGGIO_4 43
+#define IT_OKT_ARPEGGIO_5 44
+#define IT_OKT_VOLUME_SLIDE_DOWN 45
+#define IT_OKT_VOLUME_SLIDE_UP 46
-#define IT_N_EFFECTS 47
+#define IT_N_EFFECTS 47
/* These represent the top nibble of the command value. */
-#define IT_S_SET_FILTER 0 /* Greyed out in IT... */
-#define IT_S_SET_GLISSANDO_CONTROL 1 /* Greyed out in IT... */
-#define IT_S_FINETUNE 2 /* Greyed out in IT... */
-#define IT_S_SET_VIBRATO_WAVEFORM 3
-#define IT_S_SET_TREMOLO_WAVEFORM 4
-#define IT_S_SET_PANBRELLO_WAVEFORM 5
-#define IT_S_FINE_PATTERN_DELAY 6
-#define IT_S7 7
-#define IT_S_SET_PAN 8
-#define IT_S_SET_SURROUND_SOUND 9
-#define IT_S_SET_HIGH_OFFSET 10
-#define IT_S_PATTERN_LOOP 11
-#define IT_S_DELAYED_NOTE_CUT 12
-#define IT_S_NOTE_DELAY 13
-#define IT_S_PATTERN_DELAY 14
-#define IT_S_SET_MIDI_MACRO 15
+#define IT_S_SET_FILTER 0 /* Greyed out in IT... */
+#define IT_S_SET_GLISSANDO_CONTROL 1 /* Greyed out in IT... */
+#define IT_S_FINETUNE 2 /* Greyed out in IT... */
+#define IT_S_SET_VIBRATO_WAVEFORM 3
+#define IT_S_SET_TREMOLO_WAVEFORM 4
+#define IT_S_SET_PANBRELLO_WAVEFORM 5
+#define IT_S_FINE_PATTERN_DELAY 6
+#define IT_S7 7
+#define IT_S_SET_PAN 8
+#define IT_S_SET_SURROUND_SOUND 9
+#define IT_S_SET_HIGH_OFFSET 10
+#define IT_S_PATTERN_LOOP 11
+#define IT_S_DELAYED_NOTE_CUT 12
+#define IT_S_NOTE_DELAY 13
+#define IT_S_PATTERN_DELAY 14
+#define IT_S_SET_MIDI_MACRO 15
/*
S0x Set filter
@@ -369,547 +341,523 @@
SFx Set parameterised MIDI Macro
*/
-struct IT_ENTRY
-{
- unsigned char channel; /* End of row if channel >= DUMB_IT_N_CHANNELS */
- unsigned char mask;
- unsigned char note;
- unsigned char instrument;
- unsigned char volpan;
- unsigned char effect;
- unsigned char effectvalue;
+struct IT_ENTRY {
+ unsigned char channel; /* End of row if channel >= DUMB_IT_N_CHANNELS */
+ unsigned char mask;
+ unsigned char note;
+ unsigned char instrument;
+ unsigned char volpan;
+ unsigned char effect;
+ unsigned char effectvalue;
};
-
-
-struct IT_PATTERN
-{
- int n_rows;
- int n_entries;
- IT_ENTRY *entry;
+struct IT_PATTERN {
+ int n_rows;
+ int n_entries;
+ IT_ENTRY *entry;
};
+#define IT_STEREO 1
+#define IT_USE_INSTRUMENTS 4
+#define IT_LINEAR_SLIDES 8 /* If not set, use Amiga slides */
+#define IT_OLD_EFFECTS 16
+#define IT_COMPATIBLE_GXX 32
-
-#define IT_STEREO 1
-#define IT_USE_INSTRUMENTS 4
-#define IT_LINEAR_SLIDES 8 /* If not set, use Amiga slides */
-#define IT_OLD_EFFECTS 16
-#define IT_COMPATIBLE_GXX 32
-
/* Make sure IT_WAS_AN_XM and IT_WAS_A_MOD aren't set accidentally */
-#define IT_REAL_FLAGS 63
+#define IT_REAL_FLAGS 63
-#define IT_WAS_AN_XM 64 /* Set for both XMs and MODs */
-#define IT_WAS_A_MOD 128
+#define IT_WAS_AN_XM 64 /* Set for both XMs and MODs */
+#define IT_WAS_A_MOD 128
-#define IT_WAS_AN_S3M 256
+#define IT_WAS_AN_S3M 256
-#define IT_WAS_A_PTM 512
+#define IT_WAS_A_PTM 512
-#define IT_WAS_A_669 1024
+#define IT_WAS_A_669 1024
-#define IT_WAS_AN_OKT 2048
+#define IT_WAS_AN_OKT 2048
-#define IT_WAS_AN_STM 4096
+#define IT_WAS_AN_STM 4096
-#define IT_WAS_PROCESSED 8192 /* Will be set the first time a sigdata passes through a sigrenderer */
+#define IT_WAS_PROCESSED \
+ 8192 /* Will be set the first time a sigdata passes through a sigrenderer \
+ */
-#define IT_ORDER_END 255
+#define IT_ORDER_END 255
#define IT_ORDER_SKIP 254
-struct DUMB_IT_SIGDATA
-{
- unsigned char name[65];
+struct DUMB_IT_SIGDATA {
+ unsigned char name[65];
- unsigned char *song_message;
+ unsigned char *song_message;
- int n_orders;
- int n_instruments;
- int n_samples;
- int n_patterns;
- int n_pchannels;
+ int n_orders;
+ int n_instruments;
+ int n_samples;
+ int n_patterns;
+ int n_pchannels;
- int flags;
+ int flags;
- int global_volume;
- int mixing_volume;
- int speed;
- int tempo;
- int pan_separation;
+ int global_volume;
+ int mixing_volume;
+ int speed;
+ int tempo;
+ int pan_separation;
- unsigned char channel_pan[DUMB_IT_N_CHANNELS];
- unsigned char channel_volume[DUMB_IT_N_CHANNELS];
+ unsigned char channel_pan[DUMB_IT_N_CHANNELS];
+ unsigned char channel_volume[DUMB_IT_N_CHANNELS];
- unsigned char *order;
- unsigned char restart_position; /* for XM compatiblity */
+ unsigned char *order;
+ unsigned char restart_position; /* for XM compatiblity */
- IT_INSTRUMENT *instrument;
- IT_SAMPLE *sample;
- IT_PATTERN *pattern;
+ IT_INSTRUMENT *instrument;
+ IT_SAMPLE *sample;
+ IT_PATTERN *pattern;
- IT_MIDI *midi;
+ IT_MIDI *midi;
- IT_CHECKPOINT *checkpoint;
+ IT_CHECKPOINT *checkpoint;
};
-
-
-struct IT_PLAYING_ENVELOPE
-{
- int next_node;
- int tick;
- int value;
+struct IT_PLAYING_ENVELOPE {
+ int next_node;
+ int tick;
+ int value;
};
-
-
#define IT_PLAYING_BACKGROUND 1
#define IT_PLAYING_SUSTAINOFF 2
-#define IT_PLAYING_FADING 4
-#define IT_PLAYING_DEAD 8
-#define IT_PLAYING_REVERSE 16
+#define IT_PLAYING_FADING 4
+#define IT_PLAYING_DEAD 8
+#define IT_PLAYING_REVERSE 16
-struct IT_PLAYING
-{
- int flags;
+struct IT_PLAYING {
+ int flags;
- int resampling_quality;
+ int resampling_quality;
- IT_CHANNEL *channel;
- IT_SAMPLE *sample;
- IT_INSTRUMENT *instrument;
- IT_INSTRUMENT *env_instrument;
+ IT_CHANNEL *channel;
+ IT_SAMPLE *sample;
+ IT_INSTRUMENT *instrument;
+ IT_INSTRUMENT *env_instrument;
- unsigned short sampnum;
- unsigned char instnum;
+ unsigned short sampnum;
+ unsigned char instnum;
- unsigned char declick_stage;
+ unsigned char declick_stage;
- float float_volume[2];
- float ramp_volume[2];
- float ramp_delta[2];
+ float float_volume[2];
+ float ramp_volume[2];
+ float ramp_delta[2];
- unsigned char channel_volume;
+ unsigned char channel_volume;
- unsigned char volume;
- unsigned short pan;
+ unsigned char volume;
+ unsigned short pan;
- signed char volume_offset, panning_offset;
+ signed char volume_offset, panning_offset;
- unsigned char note;
+ unsigned char note;
- unsigned char enabled_envelopes;
+ unsigned char enabled_envelopes;
- unsigned char filter_cutoff;
- unsigned char filter_resonance;
+ unsigned char filter_cutoff;
+ unsigned char filter_resonance;
- unsigned short true_filter_cutoff; /* These incorporate the filter envelope, and will not */
- unsigned char true_filter_resonance; /* be changed if they would be set to 127<<8 and 0. */
+ unsigned short
+ true_filter_cutoff; /* These incorporate the filter envelope, and will
+ not */
+ unsigned char true_filter_resonance; /* be changed if they would be set to
+ 127<<8 and 0. */
- unsigned char vibrato_speed;
- unsigned char vibrato_depth;
- unsigned char vibrato_n; /* May be specified twice: volpan & effect. */
- unsigned char vibrato_time;
- unsigned char vibrato_waveform;
+ unsigned char vibrato_speed;
+ unsigned char vibrato_depth;
+ unsigned char vibrato_n; /* May be specified twice: volpan & effect. */
+ unsigned char vibrato_time;
+ unsigned char vibrato_waveform;
- unsigned char tremolo_speed;
- unsigned char tremolo_depth;
- unsigned char tremolo_time;
- unsigned char tremolo_waveform;
+ unsigned char tremolo_speed;
+ unsigned char tremolo_depth;
+ unsigned char tremolo_time;
+ unsigned char tremolo_waveform;
- unsigned char panbrello_speed;
- unsigned char panbrello_depth;
- unsigned char panbrello_time;
- unsigned char panbrello_waveform;
- signed char panbrello_random;
+ unsigned char panbrello_speed;
+ unsigned char panbrello_depth;
+ unsigned char panbrello_time;
+ unsigned char panbrello_waveform;
+ signed char panbrello_random;
- unsigned char sample_vibrato_time;
- unsigned char sample_vibrato_waveform;
- int sample_vibrato_depth; /* Starts at rate?0:depth, increases by rate */
+ unsigned char sample_vibrato_time;
+ unsigned char sample_vibrato_waveform;
+ int sample_vibrato_depth; /* Starts at rate?0:depth, increases by rate */
- int slide;
- float delta;
- int finetune;
+ int slide;
+ float delta;
+ int finetune;
- IT_PLAYING_ENVELOPE volume_envelope;
- IT_PLAYING_ENVELOPE pan_envelope;
- IT_PLAYING_ENVELOPE pitch_envelope;
+ IT_PLAYING_ENVELOPE volume_envelope;
+ IT_PLAYING_ENVELOPE pan_envelope;
+ IT_PLAYING_ENVELOPE pitch_envelope;
- int fadeoutcount;
+ int fadeoutcount;
- IT_FILTER_STATE filter_state[2]; /* Left and right */
+ IT_FILTER_STATE filter_state[2]; /* Left and right */
- DUMB_RESAMPLER resampler;
+ DUMB_RESAMPLER resampler;
- /* time_lost is used to emulate Impulse Tracker's sample looping
- * characteristics. When time_lost is added to pos, the result represents
- * the position in the theoretical version of the sample where all loops
- * have been expanded. If this is stored, the resampling helpers will
- * safely convert it for use with new loop boundaries. The situation is
- * slightly more complicated if dir == -1 when the change takes place; we
- * must reflect pos off the loop end point and set dir to 1 before
- * proceeding.
- */
- long time_lost;
+ /* time_lost is used to emulate Impulse Tracker's sample looping
+ * characteristics. When time_lost is added to pos, the result represents
+ * the position in the theoretical version of the sample where all loops
+ * have been expanded. If this is stored, the resampling helpers will
+ * safely convert it for use with new loop boundaries. The situation is
+ * slightly more complicated if dir == -1 when the change takes place; we
+ * must reflect pos off the loop end point and set dir to 1 before
+ * proceeding.
+ */
+ long time_lost;
- //int output;
+ // int output;
};
-
-
#define IT_CHANNEL_MUTED 1
-#define IT_ENV_VOLUME 1
+#define IT_ENV_VOLUME 1
#define IT_ENV_PANNING 2
-#define IT_ENV_PITCH 4
+#define IT_ENV_PITCH 4
-struct IT_CHANNEL
-{
- int flags;
+struct IT_CHANNEL {
+ int flags;
- unsigned char volume;
- signed char volslide;
- signed char xm_volslide;
- signed char panslide;
+ unsigned char volume;
+ signed char volslide;
+ signed char xm_volslide;
+ signed char panslide;
- /* xm_volslide is used for volume slides done in the volume column in an
- * XM file, since it seems the volume column slide is applied first,
- * followed by clamping, followed by the effects column slide. IT does
- * not exhibit this behaviour, so xm_volslide is maintained at zero.
- */
+ /* xm_volslide is used for volume slides done in the volume column in an
+ * XM file, since it seems the volume column slide is applied first,
+ * followed by clamping, followed by the effects column slide. IT does
+ * not exhibit this behaviour, so xm_volslide is maintained at zero.
+ */
- unsigned char pan;
- unsigned short truepan;
+ unsigned char pan;
+ unsigned short truepan;
- unsigned char channelvolume;
- signed char channelvolslide;
+ unsigned char channelvolume;
+ signed char channelvolslide;
- unsigned char instrument;
- unsigned char note;
+ unsigned char instrument;
+ unsigned char note;
- unsigned char SFmacro;
+ unsigned char SFmacro;
- unsigned char filter_cutoff;
- unsigned char filter_resonance;
+ unsigned char filter_cutoff;
+ unsigned char filter_resonance;
- unsigned char key_off_count;
- unsigned char note_cut_count;
- unsigned char note_delay_count;
- IT_ENTRY *note_delay_entry;
+ unsigned char key_off_count;
+ unsigned char note_cut_count;
+ unsigned char note_delay_count;
+ IT_ENTRY *note_delay_entry;
- unsigned char new_note_action;
+ unsigned char new_note_action;
- unsigned char const* arpeggio_table;
- signed char arpeggio_offsets[3];
+ unsigned char const *arpeggio_table;
+ signed char arpeggio_offsets[3];
- int arpeggio_shift;
- unsigned char retrig;
- unsigned char xm_retrig;
- int retrig_tick;
+ int arpeggio_shift;
+ unsigned char retrig;
+ unsigned char xm_retrig;
+ int retrig_tick;
- unsigned char tremor;
- unsigned char tremor_time; /* Bit 6 set if note on; bit 7 set if tremor active. */
+ unsigned char tremor;
+ unsigned char
+ tremor_time; /* Bit 6 set if note on; bit 7 set if tremor active. */
- unsigned char vibrato_waveform;
- unsigned char tremolo_waveform;
- unsigned char panbrello_waveform;
+ unsigned char vibrato_waveform;
+ unsigned char tremolo_waveform;
+ unsigned char panbrello_waveform;
- int portamento;
- int toneporta;
- int toneslide;
- unsigned char toneslide_tick, last_toneslide_tick, ptm_toneslide, ptm_last_toneslide, okt_toneslide;
- unsigned char destnote;
- unsigned char toneslide_retrig;
+ int portamento;
+ int toneporta;
+ int toneslide;
+ unsigned char toneslide_tick, last_toneslide_tick, ptm_toneslide,
+ ptm_last_toneslide, okt_toneslide;
+ unsigned char destnote;
+ unsigned char toneslide_retrig;
- unsigned char glissando;
+ unsigned char glissando;
- /** WARNING - for neatness, should one or both of these be in the IT_PLAYING struct? */
- unsigned short sample;
- unsigned char truenote;
+ /** WARNING - for neatness, should one or both of these be in the IT_PLAYING
+ * struct? */
+ unsigned short sample;
+ unsigned char truenote;
- unsigned char midi_state;
+ unsigned char midi_state;
- signed char lastvolslide;
- unsigned char lastDKL;
- unsigned char lastEF; /* Doubles as last portamento up for XM files */
- unsigned char lastG;
- unsigned char lastHspeed;
- unsigned char lastHdepth;
- unsigned char lastRspeed;
- unsigned char lastRdepth;
- unsigned char lastYspeed;
- unsigned char lastYdepth;
- unsigned char lastI;
- unsigned char lastJ; /* Doubles as last portamento down for XM files */
- unsigned char lastN;
- unsigned char lastO;
- unsigned char high_offset;
- unsigned char lastP;
- unsigned char lastQ;
- unsigned char lastS;
- unsigned char pat_loop_row;
- unsigned char pat_loop_count;
- unsigned char pat_loop_end_row; /* Used to catch infinite pattern loops */
- unsigned char lastW;
+ signed char lastvolslide;
+ unsigned char lastDKL;
+ unsigned char lastEF; /* Doubles as last portamento up for XM files */
+ unsigned char lastG;
+ unsigned char lastHspeed;
+ unsigned char lastHdepth;
+ unsigned char lastRspeed;
+ unsigned char lastRdepth;
+ unsigned char lastYspeed;
+ unsigned char lastYdepth;
+ unsigned char lastI;
+ unsigned char lastJ; /* Doubles as last portamento down for XM files */
+ unsigned char lastN;
+ unsigned char lastO;
+ unsigned char high_offset;
+ unsigned char lastP;
+ unsigned char lastQ;
+ unsigned char lastS;
+ unsigned char pat_loop_row;
+ unsigned char pat_loop_count;
+ unsigned char pat_loop_end_row; /* Used to catch infinite pattern loops */
+ unsigned char lastW;
- unsigned char xm_lastE1;
- unsigned char xm_lastE2;
- unsigned char xm_lastEA;
- unsigned char xm_lastEB;
- unsigned char xm_lastX1;
- unsigned char xm_lastX2;
+ unsigned char xm_lastE1;
+ unsigned char xm_lastE2;
+ unsigned char xm_lastEA;
+ unsigned char xm_lastEB;
+ unsigned char xm_lastX1;
+ unsigned char xm_lastX2;
- unsigned char inv_loop_delay;
- unsigned char inv_loop_speed;
- int inv_loop_offset;
+ unsigned char inv_loop_delay;
+ unsigned char inv_loop_speed;
+ int inv_loop_offset;
- IT_PLAYING *playing;
+ IT_PLAYING *playing;
#ifdef BIT_ARRAY_BULLSHIT
- void * played_patjump;
- int played_patjump_order;
+ void *played_patjump;
+ int played_patjump_order;
#endif
- //int output;
+ // int output;
};
+struct DUMB_IT_SIGRENDERER {
+ DUMB_IT_SIGDATA *sigdata;
+ int n_channels;
-struct DUMB_IT_SIGRENDERER
-{
- DUMB_IT_SIGDATA *sigdata;
+ int resampling_quality;
- int n_channels;
+ unsigned char globalvolume;
+ signed char globalvolslide;
- int resampling_quality;
+ int tempo;
+ signed char temposlide;
- unsigned char globalvolume;
- signed char globalvolslide;
+ IT_CHANNEL channel[DUMB_IT_N_CHANNELS];
- int tempo;
- signed char temposlide;
+ IT_PLAYING *playing[DUMB_IT_N_NNA_CHANNELS];
- IT_CHANNEL channel[DUMB_IT_N_CHANNELS];
+ int tick;
+ int speed;
+ int rowcount;
- IT_PLAYING *playing[DUMB_IT_N_NNA_CHANNELS];
+ int order; /* Set to -1 if the song is terminated by a callback. */
+ int row;
+ int processorder;
+ int processrow;
+ int breakrow;
- int tick;
- int speed;
- int rowcount;
+ int restart_position;
- int order; /* Set to -1 if the song is terminated by a callback. */
- int row;
- int processorder;
- int processrow;
- int breakrow;
+ int n_rows;
- int restart_position;
+ IT_ENTRY *entry_start;
+ IT_ENTRY *entry;
+ IT_ENTRY *entry_end;
- int n_rows;
+ long time_left; /* Time before the next tick is processed */
+ int sub_time_left;
- IT_ENTRY *entry_start;
- IT_ENTRY *entry;
- IT_ENTRY *entry_end;
+ DUMB_CLICK_REMOVER **click_remover;
- long time_left; /* Time before the next tick is processed */
- int sub_time_left;
+ IT_CALLBACKS *callbacks;
- DUMB_CLICK_REMOVER **click_remover;
-
- IT_CALLBACKS *callbacks;
-
#ifdef BIT_ARRAY_BULLSHIT
- /* bit array, which rows are played, only checked by pattern break or loop commands */
- void * played;
+ /* bit array, which rows are played, only checked by pattern break or loop
+ * commands */
+ void *played;
- /*
- Loop indicator for internal processes, may also be useful for external processes
- 0 - Not looped
- 1 - Looped
- -1 - Continued past loop
- */
- int looped;
+ /*
+ Loop indicator for internal processes, may also be useful for external
+ processes 0 - Not looped 1 - Looped -1 - Continued past loop
+ */
+ int looped;
- /*
- Kept until looped
- */
- LONG_LONG time_played;
+ /*
+ Kept until looped
+ */
+ LONG_LONG time_played;
- void * row_timekeeper;
+ void *row_timekeeper;
#endif
- long gvz_time;
- int gvz_sub_time;
+ long gvz_time;
+ int gvz_sub_time;
int ramp_style;
- //int max_output;
+ // int max_output;
};
-
-
-struct IT_CHECKPOINT
-{
- IT_CHECKPOINT *next;
- long time;
- DUMB_IT_SIGRENDERER *sigrenderer;
+struct IT_CHECKPOINT {
+ IT_CHECKPOINT *next;
+ long time;
+ DUMB_IT_SIGRENDERER *sigrenderer;
};
+struct IT_CALLBACKS {
+ int (*loop)(void *data);
+ void *loop_data;
+ /* Return 1 to prevent looping; the music will terminate abruptly. If you
+ * want to make the music stop but allow samples to fade (beware, as they
+ * might not fade at all!), use dumb_it_sr_set_speed() and set the speed
+ * to 0. Note that xm_speed_zero() will not be called if you set the
+ * speed manually, and also that this will work for IT and S3M files even
+ * though the music can't stop in this way by itself.
+ */
+ int (*xm_speed_zero)(void *data);
+ void *xm_speed_zero_data;
+ /* Return 1 to terminate the mod, without letting samples fade. */
-struct IT_CALLBACKS
-{
- int (*loop)(void *data);
- void *loop_data;
- /* Return 1 to prevent looping; the music will terminate abruptly. If you
- * want to make the music stop but allow samples to fade (beware, as they
- * might not fade at all!), use dumb_it_sr_set_speed() and set the speed
- * to 0. Note that xm_speed_zero() will not be called if you set the
- * speed manually, and also that this will work for IT and S3M files even
- * though the music can't stop in this way by itself.
- */
+ int (*midi)(void *data, int channel, unsigned char byte);
+ void *midi_data;
+ /* Return 1 to prevent DUMB from subsequently interpreting the MIDI bytes
+ * itself. In other words, return 1 if the Zxx macros in an IT file are
+ * controlling filters and shouldn't be.
+ */
- int (*xm_speed_zero)(void *data);
- void *xm_speed_zero_data;
- /* Return 1 to terminate the mod, without letting samples fade. */
-
- int (*midi)(void *data, int channel, unsigned char byte);
- void *midi_data;
- /* Return 1 to prevent DUMB from subsequently interpreting the MIDI bytes
- * itself. In other words, return 1 if the Zxx macros in an IT file are
- * controlling filters and shouldn't be.
- */
-
- int (*global_volume_zero)(void *data);
- void *global_volume_zero_data;
- /* Return 1 to terminate the module when global volume is set to zero. */
+ int (*global_volume_zero)(void *data);
+ void *global_volume_zero_data;
+ /* Return 1 to terminate the module when global volume is set to zero. */
};
-
-
void _dumb_it_end_sigrenderer(sigrenderer_t *sigrenderer);
void _dumb_it_unload_sigdata(sigdata_t *vsigdata);
extern DUH_SIGTYPE_DESC _dumb_sigtype_it;
-
-
-#define XM_APPREGIO 0
-#define XM_PORTAMENTO_UP 1
-#define XM_PORTAMENTO_DOWN 2
-#define XM_TONE_PORTAMENTO 3
-#define XM_VIBRATO 4
-#define XM_VOLSLIDE_TONEPORTA 5
-#define XM_VOLSLIDE_VIBRATO 6
-#define XM_TREMOLO 7
-#define XM_SET_PANNING 8
-#define XM_SAMPLE_OFFSET 9
-#define XM_VOLUME_SLIDE 10 /* A */
-#define XM_POSITION_JUMP 11 /* B */
-#define XM_SET_CHANNEL_VOLUME 12 /* C */
-#define XM_PATTERN_BREAK 13 /* D */
-#define XM_E 14 /* E */
-#define XM_SET_TEMPO_BPM 15 /* F */
-#define XM_SET_GLOBAL_VOLUME 16 /* G */
-#define XM_GLOBAL_VOLUME_SLIDE 17 /* H */
-#define XM_KEY_OFF 20 /* K (undocumented) */
-#define XM_SET_ENVELOPE_POSITION 21 /* L */
-#define XM_PANNING_SLIDE 25 /* P */
-#define XM_MULTI_RETRIG 27 /* R */
-#define XM_TREMOR 29 /* T */
-#define XM_X 33 /* X */
-#define XM_N_EFFECTS (10+26)
+#define XM_APPREGIO 0
+#define XM_PORTAMENTO_UP 1
+#define XM_PORTAMENTO_DOWN 2
+#define XM_TONE_PORTAMENTO 3
+#define XM_VIBRATO 4
+#define XM_VOLSLIDE_TONEPORTA 5
+#define XM_VOLSLIDE_VIBRATO 6
+#define XM_TREMOLO 7
+#define XM_SET_PANNING 8
+#define XM_SAMPLE_OFFSET 9
+#define XM_VOLUME_SLIDE 10 /* A */
+#define XM_POSITION_JUMP 11 /* B */
+#define XM_SET_CHANNEL_VOLUME 12 /* C */
+#define XM_PATTERN_BREAK 13 /* D */
+#define XM_E 14 /* E */
+#define XM_SET_TEMPO_BPM 15 /* F */
+#define XM_SET_GLOBAL_VOLUME 16 /* G */
+#define XM_GLOBAL_VOLUME_SLIDE 17 /* H */
+#define XM_KEY_OFF 20 /* K (undocumented) */
+#define XM_SET_ENVELOPE_POSITION 21 /* L */
+#define XM_PANNING_SLIDE 25 /* P */
+#define XM_MULTI_RETRIG 27 /* R */
+#define XM_TREMOR 29 /* T */
+#define XM_X 33 /* X */
+#define XM_N_EFFECTS (10 + 26)
-#define XM_E_SET_FILTER 0x0
-#define XM_E_FINE_PORTA_UP 0x1
-#define XM_E_FINE_PORTA_DOWN 0x2
+#define XM_E_SET_FILTER 0x0
+#define XM_E_FINE_PORTA_UP 0x1
+#define XM_E_FINE_PORTA_DOWN 0x2
#define XM_E_SET_GLISSANDO_CONTROL 0x3
-#define XM_E_SET_VIBRATO_CONTROL 0x4
-#define XM_E_SET_FINETUNE 0x5
-#define XM_E_SET_LOOP 0x6
-#define XM_E_SET_TREMOLO_CONTROL 0x7
-#define XM_E_SET_PANNING 0x8
-#define XM_E_RETRIG_NOTE 0x9
-#define XM_E_FINE_VOLSLIDE_UP 0xA
-#define XM_E_FINE_VOLSLIDE_DOWN 0xB
-#define XM_E_NOTE_CUT 0xC
-#define XM_E_NOTE_DELAY 0xD
-#define XM_E_PATTERN_DELAY 0xE
-#define XM_E_SET_MIDI_MACRO 0xF
+#define XM_E_SET_VIBRATO_CONTROL 0x4
+#define XM_E_SET_FINETUNE 0x5
+#define XM_E_SET_LOOP 0x6
+#define XM_E_SET_TREMOLO_CONTROL 0x7
+#define XM_E_SET_PANNING 0x8
+#define XM_E_RETRIG_NOTE 0x9
+#define XM_E_FINE_VOLSLIDE_UP 0xA
+#define XM_E_FINE_VOLSLIDE_DOWN 0xB
+#define XM_E_NOTE_CUT 0xC
+#define XM_E_NOTE_DELAY 0xD
+#define XM_E_PATTERN_DELAY 0xE
+#define XM_E_SET_MIDI_MACRO 0xF
-#define XM_X_EXTRAFINE_PORTA_UP 1
-#define XM_X_EXTRAFINE_PORTA_DOWN 2
+#define XM_X_EXTRAFINE_PORTA_UP 1
+#define XM_X_EXTRAFINE_PORTA_DOWN 2
/* To make my life a bit simpler during conversion, effect E:xy is converted
* to effect number EBASE+x:y. The same applies to effect X, and IT's S. That
* way, these effects can be manipulated like regular effects.
*/
-#define EBASE (XM_N_EFFECTS)
-#define XBASE (EBASE+16)
-#define SBASE (IT_N_EFFECTS)
+#define EBASE (XM_N_EFFECTS)
+#define XBASE (EBASE + 16)
+#define SBASE (IT_N_EFFECTS)
-#define EFFECT_VALUE(x, y) (((x)<<4)|(y))
-#define HIGH(v) ((v)>>4)
-#define LOW(v) ((v)&0x0F)
-#define SET_HIGH(v, x) v = (((x)<<4)|((v)&0x0F))
-#define SET_LOW(v, y) v = (((v)&0xF0)|(y))
-#define BCD_TO_NORMAL(v) (HIGH(v)*10+LOW(v))
+#define EFFECT_VALUE(x, y) (((x) << 4) | (y))
+#define HIGH(v) ((v) >> 4)
+#define LOW(v) ((v)&0x0F)
+#define SET_HIGH(v, x) v = (((x) << 4) | ((v)&0x0F))
+#define SET_LOW(v, y) v = (((v)&0xF0) | (y))
+#define BCD_TO_NORMAL(v) (HIGH(v) * 10 + LOW(v))
-
-
#if 0
unsigned char **_dumb_malloc2(int w, int h);
void _dumb_free2(unsigned char **line);
#endif
-void _dumb_it_xm_convert_effect(int effect, int value, IT_ENTRY *entry, int mod);
+void _dumb_it_xm_convert_effect(int effect, int value, IT_ENTRY *entry,
+ int mod);
int _dumb_it_fix_invalid_orders(DUMB_IT_SIGDATA *sigdata);
-
-#define PTM_APPREGIO 0
-#define PTM_PORTAMENTO_UP 1
-#define PTM_PORTAMENTO_DOWN 2
-#define PTM_TONE_PORTAMENTO 3
-#define PTM_VIBRATO 4
-#define PTM_VOLSLIDE_TONEPORTA 5
-#define PTM_VOLSLIDE_VIBRATO 6
-#define PTM_TREMOLO 7
-#define PTM_SAMPLE_OFFSET 9
-#define PTM_VOLUME_SLIDE 10 /* A */
-#define PTM_POSITION_JUMP 11 /* B */
-#define PTM_SET_CHANNEL_VOLUME 12 /* C */
-#define PTM_PATTERN_BREAK 13 /* D */
-#define PTM_E 14 /* E */
-#define PTM_SET_TEMPO_BPM 15 /* F */
-#define PTM_SET_GLOBAL_VOLUME 16 /* G */
-#define PTM_RETRIGGER 17 /* H */
-#define PTM_FINE_VIBRATO 18 /* I */
-#define PTM_NOTE_SLIDE_UP 19 /* J */
-#define PTM_NOTE_SLIDE_DOWN 20 /* K */
-#define PTM_NOTE_SLIDE_UP_RETRIG 21 /* L */
-#define PTM_NOTE_SLIDE_DOWN_RETRIG 22 /* M */
-#define PTM_N_EFFECTS 23
+#define PTM_APPREGIO 0
+#define PTM_PORTAMENTO_UP 1
+#define PTM_PORTAMENTO_DOWN 2
+#define PTM_TONE_PORTAMENTO 3
+#define PTM_VIBRATO 4
+#define PTM_VOLSLIDE_TONEPORTA 5
+#define PTM_VOLSLIDE_VIBRATO 6
+#define PTM_TREMOLO 7
+#define PTM_SAMPLE_OFFSET 9
+#define PTM_VOLUME_SLIDE 10 /* A */
+#define PTM_POSITION_JUMP 11 /* B */
+#define PTM_SET_CHANNEL_VOLUME 12 /* C */
+#define PTM_PATTERN_BREAK 13 /* D */
+#define PTM_E 14 /* E */
+#define PTM_SET_TEMPO_BPM 15 /* F */
+#define PTM_SET_GLOBAL_VOLUME 16 /* G */
+#define PTM_RETRIGGER 17 /* H */
+#define PTM_FINE_VIBRATO 18 /* I */
+#define PTM_NOTE_SLIDE_UP 19 /* J */
+#define PTM_NOTE_SLIDE_DOWN 20 /* K */
+#define PTM_NOTE_SLIDE_UP_RETRIG 21 /* L */
+#define PTM_NOTE_SLIDE_DOWN_RETRIG 22 /* M */
+#define PTM_N_EFFECTS 23
-#define PTM_E_FINE_PORTA_DOWN 0x1
-#define PTM_E_FINE_PORTA_UP 0x2
-#define PTM_E_SET_VIBRATO_CONTROL 0x4
-#define PTM_E_SET_FINETUNE 0x5
-#define PTM_E_SET_LOOP 0x6
-#define PTM_E_SET_TREMOLO_CONTROL 0x7
-#define PTM_E_SET_PANNING 0x8
-#define PTM_E_RETRIG_NOTE 0x9
-#define PTM_E_FINE_VOLSLIDE_UP 0xA
-#define PTM_E_FINE_VOLSLIDE_DOWN 0xB
-#define PTM_E_NOTE_CUT 0xC
-#define PTM_E_NOTE_DELAY 0xD
-#define PTM_E_PATTERN_DELAY 0xE
+#define PTM_E_FINE_PORTA_DOWN 0x1
+#define PTM_E_FINE_PORTA_UP 0x2
+#define PTM_E_SET_VIBRATO_CONTROL 0x4
+#define PTM_E_SET_FINETUNE 0x5
+#define PTM_E_SET_LOOP 0x6
+#define PTM_E_SET_TREMOLO_CONTROL 0x7
+#define PTM_E_SET_PANNING 0x8
+#define PTM_E_RETRIG_NOTE 0x9
+#define PTM_E_FINE_VOLSLIDE_UP 0xA
+#define PTM_E_FINE_VOLSLIDE_DOWN 0xB
+#define PTM_E_NOTE_CUT 0xC
+#define PTM_E_NOTE_DELAY 0xD
+#define PTM_E_PATTERN_DELAY 0xE
/* To make my life a bit simpler during conversion, effect E:xy is converted
* to effect number EBASE+x:y. The same applies to effect X, and IT's S. That
* way, these effects can be manipulated like regular effects.
*/
-#define PTM_EBASE (PTM_N_EFFECTS)
+#define PTM_EBASE (PTM_N_EFFECTS)
void _dumb_it_ptm_convert_effect(int effect, int value, IT_ENTRY *entry);
--- a/include/internal/resampler.h
+++ b/include/internal/resampler.h
@@ -5,36 +5,44 @@
#ifdef RESAMPLER_DECORATE
#undef PASTE
#undef EVALUATE
-#define PASTE(a,b) a ## b
-#define EVALUATE(a,b) PASTE(a,b)
-#define resampler_init EVALUATE(RESAMPLER_DECORATE,_resampler_init)
-#define resampler_create EVALUATE(RESAMPLER_DECORATE,_resampler_create)
-#define resampler_delete EVALUATE(RESAMPLER_DECORATE,_resampler_delete)
-#define resampler_dup EVALUATE(RESAMPLER_DECORATE,_resampler_dup)
-#define resampler_dup_inplace EVALUATE(RESAMPLER_DECORATE,_resampler_dup_inplace)
-#define resampler_set_quality EVALUATE(RESAMPLER_DECORATE,_resampler_set_quality)
-#define resampler_get_free_count EVALUATE(RESAMPLER_DECORATE,_resampler_get_free_count)
-#define resampler_write_sample EVALUATE(RESAMPLER_DECORATE,_resampler_write_sample)
-#define resampler_write_sample_fixed EVALUATE(RESAMPLER_DECORATE,_resampler_write_sample_fixed)
-#define resampler_write_sample_float EVALUATE(RESAMPLER_DECORATE,_resampler_write_sample_float)
-#define resampler_set_rate EVALUATE(RESAMPLER_DECORATE,_resampler_set_rate)
-#define resampler_ready EVALUATE(RESAMPLER_DECORATE,_resampler_ready)
-#define resampler_clear EVALUATE(RESAMPLER_DECORATE,_resampler_clear)
-#define resampler_get_sample_count EVALUATE(RESAMPLER_DECORATE,_resampler_get_sample_count)
-#define resampler_get_sample EVALUATE(RESAMPLER_DECORATE,_resampler_get_sample)
-#define resampler_get_sample_float EVALUATE(RESAMPLER_DECORATE,_resampler_get_sample_float)
-#define resampler_remove_sample EVALUATE(RESAMPLER_DECORATE,_resampler_remove_sample)
+#define PASTE(a, b) a##b
+#define EVALUATE(a, b) PASTE(a, b)
+#define resampler_init EVALUATE(RESAMPLER_DECORATE, _resampler_init)
+#define resampler_create EVALUATE(RESAMPLER_DECORATE, _resampler_create)
+#define resampler_delete EVALUATE(RESAMPLER_DECORATE, _resampler_delete)
+#define resampler_dup EVALUATE(RESAMPLER_DECORATE, _resampler_dup)
+#define resampler_dup_inplace \
+ EVALUATE(RESAMPLER_DECORATE, _resampler_dup_inplace)
+#define resampler_set_quality \
+ EVALUATE(RESAMPLER_DECORATE, _resampler_set_quality)
+#define resampler_get_free_count \
+ EVALUATE(RESAMPLER_DECORATE, _resampler_get_free_count)
+#define resampler_write_sample \
+ EVALUATE(RESAMPLER_DECORATE, _resampler_write_sample)
+#define resampler_write_sample_fixed \
+ EVALUATE(RESAMPLER_DECORATE, _resampler_write_sample_fixed)
+#define resampler_write_sample_float \
+ EVALUATE(RESAMPLER_DECORATE, _resampler_write_sample_float)
+#define resampler_set_rate EVALUATE(RESAMPLER_DECORATE, _resampler_set_rate)
+#define resampler_ready EVALUATE(RESAMPLER_DECORATE, _resampler_ready)
+#define resampler_clear EVALUATE(RESAMPLER_DECORATE, _resampler_clear)
+#define resampler_get_sample_count \
+ EVALUATE(RESAMPLER_DECORATE, _resampler_get_sample_count)
+#define resampler_get_sample EVALUATE(RESAMPLER_DECORATE, _resampler_get_sample)
+#define resampler_get_sample_float \
+ EVALUATE(RESAMPLER_DECORATE, _resampler_get_sample_float)
+#define resampler_remove_sample \
+ EVALUATE(RESAMPLER_DECORATE, _resampler_remove_sample)
#endif
void resampler_init(void);
-void * resampler_create(void);
+void *resampler_create(void);
void resampler_delete(void *);
-void * resampler_dup(const void *);
+void *resampler_dup(const void *);
void resampler_dup_inplace(void *, const void *);
-enum
-{
+enum {
RESAMPLER_QUALITY_MIN = 0,
RESAMPLER_QUALITY_ZOH = 0,
RESAMPLER_QUALITY_BLEP = 1,
@@ -51,7 +59,7 @@
void resampler_write_sample(void *, short sample);
void resampler_write_sample_fixed(void *, int sample, unsigned char depth);
void resampler_write_sample_float(void *, float sample);
-void resampler_set_rate( void *, double new_factor );
+void resampler_set_rate(void *, double new_factor);
int resampler_ready(void *);
void resampler_clear(void *);
int resampler_get_sample_count(void *);
--- a/include/internal/riff.h
+++ b/include/internal/riff.h
@@ -3,22 +3,20 @@
struct riff;
-struct riff_chunk
-{
- unsigned type;
+struct riff_chunk {
+ unsigned type;
long offset;
- unsigned size;
- struct riff * nested;
+ unsigned size;
+ struct riff *nested;
};
-struct riff
-{
- unsigned type;
- unsigned chunk_count;
- struct riff_chunk * chunks;
+struct riff {
+ unsigned type;
+ unsigned chunk_count;
+ struct riff_chunk *chunks;
};
-struct riff * riff_parse( DUMBFILE * f, long offset, long size, unsigned proper );
-void riff_free( struct riff * );
+struct riff *riff_parse(DUMBFILE *f, long offset, long size, unsigned proper);
+void riff_free(struct riff *);
#endif
--- a/include/internal/stack_alloc.h
+++ b/include/internal/stack_alloc.h
@@ -36,14 +36,14 @@
#define STACK_ALLOC_H
#ifdef WIN32
-# include <malloc.h>
+#include <malloc.h>
#else
-# ifdef HAVE_ALLOCA_H
-# include <alloca.h>
-# else
-# include <stdlib.h>
-# endif
+#ifdef HAVE_ALLOCA_H
+#include <alloca.h>
+#else
+#include <stdlib.h>
#endif
+#endif
/**
* @def ALIGN(stack, size)
@@ -86,15 +86,21 @@
#include <valgrind/memcheck.h>
-#define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1))
+#define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size)-1))
-#define PUSH(stack, size, type) (VALGRIND_MAKE_NOACCESS(stack, 1000),ALIGN((stack),sizeof(type)),VALGRIND_MAKE_WRITABLE(stack, ((size)*sizeof(type))),(stack)+=((size)*sizeof(type)),(type*)((stack)-((size)*sizeof(type))))
+#define PUSH(stack, size, type) \
+ (VALGRIND_MAKE_NOACCESS(stack, 1000), ALIGN((stack), sizeof(type)), \
+ VALGRIND_MAKE_WRITABLE(stack, ((size) * sizeof(type))), \
+ (stack) += ((size) * sizeof(type)), \
+ (type *)((stack) - ((size) * sizeof(type))))
#else
-#define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1))
+#define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size)-1))
-#define PUSH(stack, size, type) (ALIGN((stack),sizeof(type)),(stack)+=((size)*sizeof(type)),(type*)((stack)-((size)*sizeof(type))))
+#define PUSH(stack, size, type) \
+ (ALIGN((stack), sizeof(type)), (stack) += ((size) * sizeof(type)), \
+ (type *)((stack) - ((size) * sizeof(type))))
#endif
@@ -103,11 +109,10 @@
#define ALLOC(var, size, type) type var[size]
#elif defined(USE_ALLOCA)
#define VARDECL(var) var
-#define ALLOC(var, size, type) var = alloca(sizeof(type)*(size))
+#define ALLOC(var, size, type) var = alloca(sizeof(type) * (size))
#else
#define VARDECL(var) var
#define ALLOC(var, size, type) var = PUSH(stack, size, type)
#endif
-
#endif
--- a/include/internal/tarray.h
+++ b/include/internal/tarray.h
@@ -4,17 +4,17 @@
#include <stdlib.h>
#include "internal/dumb.h"
-void * timekeeping_array_create(size_t size);
-void timekeeping_array_destroy(void * array);
-void * timekeeping_array_dup(void * array);
+void *timekeeping_array_create(size_t size);
+void timekeeping_array_destroy(void *array);
+void *timekeeping_array_dup(void *array);
-void timekeeping_array_reset(void * array, size_t loop_start);
+void timekeeping_array_reset(void *array, size_t loop_start);
-void timekeeping_array_push(void * array, size_t index, LONG_LONG time);
-void timekeeping_array_bump(void * array, size_t index);
+void timekeeping_array_push(void *array, size_t index, LONG_LONG time);
+void timekeeping_array_bump(void *array, size_t index);
-unsigned int timekeeping_array_get_count(void * array, size_t index);
+unsigned int timekeeping_array_get_count(void *array, size_t index);
-LONG_LONG timekeeping_array_get_item(void * array, size_t index);
+LONG_LONG timekeeping_array_get_item(void *array, size_t index);
#endif
--- a/src/allegro/alplay.c
+++ b/src/allegro/alplay.c
@@ -23,231 +23,195 @@
#include "aldumb.h"
-
-
#define ADP_PLAYING 1
-struct AL_DUH_PLAYER
-{
- int flags;
- long bufsize;
- int freq;
- AUDIOSTREAM *stream;
- DUH_SIGRENDERER *sigrenderer; /* If this is NULL, stream is invalid. */
- float volume;
- int silentcount;
+struct AL_DUH_PLAYER {
+ int flags;
+ long bufsize;
+ int freq;
+ AUDIOSTREAM *stream;
+ DUH_SIGRENDERER *sigrenderer; /* If this is NULL, stream is invalid. */
+ float volume;
+ int silentcount;
};
+AL_DUH_PLAYER *al_start_duh(DUH *duh, int n_channels, long pos, float volume,
+ long bufsize, int freq) {
+ AL_DUH_PLAYER *dp;
+ /* This restriction is imposed by Allegro. */
+ ASSERT(n_channels > 0);
+ ASSERT(n_channels <= 2);
-AL_DUH_PLAYER *al_start_duh(DUH *duh, int n_channels, long pos, float volume, long bufsize, int freq)
-{
- AL_DUH_PLAYER *dp;
+ if (!duh)
+ return NULL;
- /* This restriction is imposed by Allegro. */
- ASSERT(n_channels > 0);
- ASSERT(n_channels <= 2);
+ dp = malloc(sizeof(*dp));
+ if (!dp)
+ return NULL;
- if (!duh)
- return NULL;
+ dp->flags = ADP_PLAYING;
+ dp->bufsize = bufsize;
+ dp->freq = freq;
- dp = malloc(sizeof(*dp));
- if (!dp)
- return NULL;
+ dp->stream = play_audio_stream(bufsize, 16, n_channels - 1, freq, 255, 128);
- dp->flags = ADP_PLAYING;
- dp->bufsize = bufsize;
- dp->freq = freq;
+ if (!dp->stream) {
+ free(dp);
+ return NULL;
+ }
- dp->stream = play_audio_stream(bufsize, 16, n_channels - 1, freq, 255, 128);
+ voice_set_priority(dp->stream->voice, 255);
- if (!dp->stream) {
- free(dp);
- return NULL;
- }
+ dp->sigrenderer = duh_start_sigrenderer(duh, 0, n_channels, pos);
- voice_set_priority(dp->stream->voice, 255);
+ if (!dp->sigrenderer) {
+ stop_audio_stream(dp->stream);
+ free(dp);
+ return NULL;
+ }
- dp->sigrenderer = duh_start_sigrenderer(duh, 0, n_channels, pos);
+ dp->volume = volume;
+ dp->silentcount = 0;
- if (!dp->sigrenderer) {
- stop_audio_stream(dp->stream);
- free(dp);
- return NULL;
- }
-
- dp->volume = volume;
- dp->silentcount = 0;
-
- return dp;
+ return dp;
}
-
-
-void al_stop_duh(AL_DUH_PLAYER *dp)
-{
- if (dp) {
- if (dp->sigrenderer) {
- duh_end_sigrenderer(dp->sigrenderer);
- stop_audio_stream(dp->stream);
- }
- free(dp);
- }
+void al_stop_duh(AL_DUH_PLAYER *dp) {
+ if (dp) {
+ if (dp->sigrenderer) {
+ duh_end_sigrenderer(dp->sigrenderer);
+ stop_audio_stream(dp->stream);
+ }
+ free(dp);
+ }
}
-
-
-void al_pause_duh(AL_DUH_PLAYER *dp)
-{
- if (dp && dp->sigrenderer && (dp->flags & ADP_PLAYING)) {
- voice_stop(dp->stream->voice);
- dp->flags &= ~ADP_PLAYING;
- }
+void al_pause_duh(AL_DUH_PLAYER *dp) {
+ if (dp && dp->sigrenderer && (dp->flags & ADP_PLAYING)) {
+ voice_stop(dp->stream->voice);
+ dp->flags &= ~ADP_PLAYING;
+ }
}
-
-
-void al_resume_duh(AL_DUH_PLAYER *dp)
-{
- if (dp && dp->sigrenderer && !(dp->flags & ADP_PLAYING)) {
- voice_start(dp->stream->voice);
- dp->flags |= ADP_PLAYING;
- }
+void al_resume_duh(AL_DUH_PLAYER *dp) {
+ if (dp && dp->sigrenderer && !(dp->flags & ADP_PLAYING)) {
+ voice_start(dp->stream->voice);
+ dp->flags |= ADP_PLAYING;
+ }
}
-
-
-void al_duh_set_priority(AL_DUH_PLAYER *dp, int priority)
-{
- if (dp && dp->sigrenderer)
- voice_set_priority(dp->stream->voice, priority);
+void al_duh_set_priority(AL_DUH_PLAYER *dp, int priority) {
+ if (dp && dp->sigrenderer)
+ voice_set_priority(dp->stream->voice, priority);
}
-
-
-void al_duh_set_volume(AL_DUH_PLAYER *dp, float volume)
-{
- if (dp)
- dp->volume = volume;
+void al_duh_set_volume(AL_DUH_PLAYER *dp, float volume) {
+ if (dp)
+ dp->volume = volume;
}
+float al_duh_get_volume(AL_DUH_PLAYER *dp) { return dp ? dp->volume : 0; }
+int al_poll_duh(AL_DUH_PLAYER *dp) {
+ unsigned short *sptr;
+ long n;
+ long size;
+ int n_channels;
-float al_duh_get_volume(AL_DUH_PLAYER *dp)
-{
- return dp ? dp->volume : 0;
-}
+ if (!dp || !dp->sigrenderer)
+ return 1;
+ if (!(dp->flags & ADP_PLAYING))
+ return 0;
+ sptr = get_audio_stream_buffer(dp->stream);
-int al_poll_duh(AL_DUH_PLAYER *dp)
-{
- unsigned short *sptr;
- long n;
- long size;
- int n_channels;
+ if (!sptr)
+ return 0;
- if (!dp || !dp->sigrenderer)
- return 1;
+ n = duh_render(dp->sigrenderer, 16, 1, dp->volume, 65536.0 / dp->freq,
+ dp->bufsize, sptr);
- if (!(dp->flags & ADP_PLAYING))
- return 0;
+ if (n == 0) {
+ if (++dp->silentcount >= 2) {
+ duh_end_sigrenderer(dp->sigrenderer);
+ free_audio_stream_buffer(dp->stream);
+ stop_audio_stream(dp->stream);
+ dp->sigrenderer = NULL;
+ return 1;
+ }
+ }
- sptr = get_audio_stream_buffer(dp->stream);
+ n_channels = duh_sigrenderer_get_n_channels(dp->sigrenderer);
+ n *= n_channels;
+ size = dp->bufsize * n_channels;
+ for (; n < size; n++)
+ sptr[n] = 0x8000;
- if (!sptr)
- return 0;
+ free_audio_stream_buffer(dp->stream);
- n = duh_render(dp->sigrenderer, 16, 1, dp->volume, 65536.0 / dp->freq, dp->bufsize, sptr);
-
- if (n == 0) {
- if (++dp->silentcount >= 2) {
- duh_end_sigrenderer(dp->sigrenderer);
- free_audio_stream_buffer(dp->stream);
- stop_audio_stream(dp->stream);
- dp->sigrenderer = NULL;
- return 1;
- }
- }
-
- n_channels = duh_sigrenderer_get_n_channels(dp->sigrenderer);
- n *= n_channels;
- size = dp->bufsize * n_channels;
- for (; n < size; n++)
- sptr[n] = 0x8000;
-
- free_audio_stream_buffer(dp->stream);
-
- return 0;
+ return 0;
}
-
-
-long al_duh_get_position(AL_DUH_PLAYER *dp)
-{
- return dp ? duh_sigrenderer_get_position(dp->sigrenderer) : -1;
+long al_duh_get_position(AL_DUH_PLAYER *dp) {
+ return dp ? duh_sigrenderer_get_position(dp->sigrenderer) : -1;
}
+AL_DUH_PLAYER *al_duh_encapsulate_sigrenderer(DUH_SIGRENDERER *sigrenderer,
+ float volume, long bufsize,
+ int freq) {
+ AL_DUH_PLAYER *dp;
+ int n_channels;
+ if (!sigrenderer)
+ return NULL;
-AL_DUH_PLAYER *al_duh_encapsulate_sigrenderer(DUH_SIGRENDERER *sigrenderer, float volume, long bufsize, int freq)
-{
- AL_DUH_PLAYER *dp;
- int n_channels;
+ dp = malloc(sizeof(*dp));
+ if (!dp)
+ return NULL;
- if (!sigrenderer)
- return NULL;
+ n_channels = duh_sigrenderer_get_n_channels(sigrenderer);
- dp = malloc(sizeof(*dp));
- if (!dp)
- return NULL;
+ /* This restriction is imposed by Allegro. */
+ ASSERT(n_channels > 0);
+ ASSERT(n_channels <= 2);
- n_channels = duh_sigrenderer_get_n_channels(sigrenderer);
+ dp->flags = ADP_PLAYING;
+ dp->bufsize = bufsize;
+ dp->freq = freq;
- /* This restriction is imposed by Allegro. */
- ASSERT(n_channels > 0);
- ASSERT(n_channels <= 2);
+ dp->stream = play_audio_stream(bufsize, 16, n_channels - 1, freq, 255, 128);
- dp->flags = ADP_PLAYING;
- dp->bufsize = bufsize;
- dp->freq = freq;
+ if (!dp->stream) {
+ free(dp);
+ return NULL;
+ }
- dp->stream = play_audio_stream(bufsize, 16, n_channels - 1, freq, 255, 128);
+ voice_set_priority(dp->stream->voice, 255);
- if (!dp->stream) {
- free(dp);
- return NULL;
- }
+ dp->sigrenderer = sigrenderer;
- voice_set_priority(dp->stream->voice, 255);
+ dp->volume = volume;
+ dp->silentcount = 0;
- dp->sigrenderer = sigrenderer;
-
- dp->volume = volume;
- dp->silentcount = 0;
-
- return dp;
+ return dp;
}
-
-
-DUH_SIGRENDERER *al_duh_get_sigrenderer(AL_DUH_PLAYER *dp)
-{
- return dp ? dp->sigrenderer : NULL;
+DUH_SIGRENDERER *al_duh_get_sigrenderer(AL_DUH_PLAYER *dp) {
+ return dp ? dp->sigrenderer : NULL;
}
-
-
/* IMPORTANT: This function will return NULL if the music has ended. */
// Should this be changed? User might want to hack the underlying SIGRENDERER
// and resurrect it (e.g. change pattern number), before it gets destroyed...
-DUH_SIGRENDERER *al_duh_decompose_to_sigrenderer(AL_DUH_PLAYER *dp)
-{
- if (dp) {
- DUH_SIGRENDERER *sigrenderer = dp->sigrenderer;
- if (sigrenderer) stop_audio_stream(dp->stream);
- free(dp);
- return sigrenderer;
- }
- return NULL;
+DUH_SIGRENDERER *al_duh_decompose_to_sigrenderer(AL_DUH_PLAYER *dp) {
+ if (dp) {
+ DUH_SIGRENDERER *sigrenderer = dp->sigrenderer;
+ if (sigrenderer)
+ stop_audio_stream(dp->stream);
+ free(dp);
+ return sigrenderer;
+ }
+ return NULL;
}
--- a/src/allegro/datduh.c
+++ b/src/allegro/datduh.c
@@ -22,39 +22,29 @@
#include "aldumb.h"
#include "internal/aldumb.h"
+static void *dat_read_duh(PACKFILE *f, long size) {
+ DUMBFILE *df;
+ DUH *duh;
+ (void)size;
-static void *dat_read_duh(PACKFILE *f, long size)
-{
- DUMBFILE *df;
- DUH *duh;
+ df = dumbfile_open_packfile(f);
- (void)size;
+ if (!df)
+ return NULL;
- df = dumbfile_open_packfile(f);
+ duh = read_duh(df);
- if (!df)
- return NULL;
+ dumbfile_close(df);
- duh = read_duh(df);
-
- dumbfile_close(df);
-
- return duh;
+ return duh;
}
-
-
/* dumb_register_dat_duh(): tells Allegro about the DUH datafile object. If
* you intend to load a datafile containing a DUH object, you must call this
* function first. It is recommended you pass DAT_DUH, but you may have a
* reason to use a different type (apart from pride, that doesn't count).
*/
-void dumb_register_dat_duh(long type)
-{
- register_datafile_object(
- type,
- &dat_read_duh,
- &_dat_unload_duh
- );
+void dumb_register_dat_duh(long type) {
+ register_datafile_object(type, &dat_read_duh, &_dat_unload_duh);
}
--- a/src/allegro/datit.c
+++ b/src/allegro/datit.c
@@ -22,29 +22,24 @@
#include "aldumb.h"
#include "internal/aldumb.h"
+static void *dat_read_it(PACKFILE *f, long size) {
+ DUMBFILE *df;
+ DUH *duh;
+ (void)size;
-static void *dat_read_it(PACKFILE *f, long size)
-{
- DUMBFILE *df;
- DUH *duh;
+ df = dumbfile_open_packfile(f);
- (void)size;
+ if (!df)
+ return NULL;
- df = dumbfile_open_packfile(f);
+ duh = dumb_read_it(df);
- if (!df)
- return NULL;
+ dumbfile_close(df);
- duh = dumb_read_it(df);
-
- dumbfile_close(df);
-
- return duh;
+ return duh;
}
-
-
/* dumb_register_dat_it(): tells Allegro about the IT datafile object. If you
* intend to load a datafile containing an IT object, you must call this
* function first. It is recommended you pass DUMB_DAT_IT, but you may have a
@@ -51,12 +46,6 @@
* reason to use a different type (perhaps you already have a datafile with
* IT files in and they use a different type).
*/
-void dumb_register_dat_it(long type)
-{
- register_datafile_object(
- type,
- &dat_read_it,
- &_dat_unload_duh
- );
+void dumb_register_dat_it(long type) {
+ register_datafile_object(type, &dat_read_it, &_dat_unload_duh);
}
-
--- a/src/allegro/datitq.c
+++ b/src/allegro/datitq.c
@@ -22,29 +22,24 @@
#include "aldumb.h"
#include "internal/aldumb.h"
+static void *dat_read_it_quick(PACKFILE *f, long size) {
+ DUMBFILE *df;
+ DUH *duh;
+ (void)size;
-static void *dat_read_it_quick(PACKFILE *f, long size)
-{
- DUMBFILE *df;
- DUH *duh;
+ df = dumbfile_open_packfile(f);
- (void)size;
+ if (!df)
+ return NULL;
- df = dumbfile_open_packfile(f);
+ duh = dumb_read_it_quick(df);
- if (!df)
- return NULL;
+ dumbfile_close(df);
- duh = dumb_read_it_quick(df);
-
- dumbfile_close(df);
-
- return duh;
+ return duh;
}
-
-
/* dumb_register_dat_it_quick(): tells Allegro about the IT datafile object.
* If you intend to load a datafile containing an IT object, you must call
* this function first. It is recommended you pass DUMB_DAT_IT, but you may
@@ -54,11 +49,6 @@
* This installs the quick loader: the song length and fast seek points are
* not calculated.
*/
-void dumb_register_dat_it_quick(long type)
-{
- register_datafile_object(
- type,
- &dat_read_it_quick,
- &_dat_unload_duh
- );
+void dumb_register_dat_it_quick(long type) {
+ register_datafile_object(type, &dat_read_it_quick, &_dat_unload_duh);
}
--- a/src/allegro/datmod.c
+++ b/src/allegro/datmod.c
@@ -22,29 +22,24 @@
#include "aldumb.h"
#include "internal/aldumb.h"
+static void *dat_read_mod(PACKFILE *f, long size) {
+ DUMBFILE *df;
+ DUH *duh;
+ (void)size;
-static void *dat_read_mod(PACKFILE *f, long size)
-{
- DUMBFILE *df;
- DUH *duh;
+ df = dumbfile_open_packfile(f);
- (void)size;
+ if (!df)
+ return NULL;
- df = dumbfile_open_packfile(f);
+ duh = dumb_read_mod(df, 2);
- if (!df)
- return NULL;
+ dumbfile_close(df);
- duh = dumb_read_mod(df, 2);
-
- dumbfile_close(df);
-
- return duh;
+ return duh;
}
-
-
/* dumb_register_dat_mod(): tells Allegro about the MOD datafile object. If
* you intend to load a datafile containing a MOD object, you must call this
* function first. It is recommended you pass DUMB_DAT_MOD, but you may have
@@ -51,11 +46,6 @@
* a reason to use a different type (perhaps you already have a datafile with
* MOD files in and they use a different type).
*/
-void dumb_register_dat_mod(long type)
-{
- register_datafile_object(
- type,
- &dat_read_mod,
- &_dat_unload_duh
- );
+void dumb_register_dat_mod(long type) {
+ register_datafile_object(type, &dat_read_mod, &_dat_unload_duh);
}
--- a/src/allegro/datmodq.c
+++ b/src/allegro/datmodq.c
@@ -22,29 +22,24 @@
#include "aldumb.h"
#include "internal/aldumb.h"
+static void *dat_read_mod_quick(PACKFILE *f, long size) {
+ DUMBFILE *df;
+ DUH *duh;
+ (void)size;
-static void *dat_read_mod_quick(PACKFILE *f, long size)
-{
- DUMBFILE *df;
- DUH *duh;
+ df = dumbfile_open_packfile(f);
- (void)size;
+ if (!df)
+ return NULL;
- df = dumbfile_open_packfile(f);
+ duh = dumb_read_mod_quick(df, 2);
- if (!df)
- return NULL;
+ dumbfile_close(df);
- duh = dumb_read_mod_quick(df, 2);
-
- dumbfile_close(df);
-
- return duh;
+ return duh;
}
-
-
/* dumb_register_dat_mod_quick(): tells Allegro about the MOD datafile object.
* If you intend to load a datafile containing a MOD object, you must call this
* function first. It is recommended you pass DUMB_DAT_MOD, but you may have
@@ -54,11 +49,6 @@
* This installs the quick loader: the song length and fast seek points are
* not calculated.
*/
-void dumb_register_dat_mod_quick(long type)
-{
- register_datafile_object(
- type,
- &dat_read_mod_quick,
- &_dat_unload_duh
- );
+void dumb_register_dat_mod_quick(long type) {
+ register_datafile_object(type, &dat_read_mod_quick, &_dat_unload_duh);
}
--- a/src/allegro/dats3m.c
+++ b/src/allegro/dats3m.c
@@ -22,29 +22,24 @@
#include "aldumb.h"
#include "internal/aldumb.h"
+static void *dat_read_s3m(PACKFILE *f, long size) {
+ DUMBFILE *df;
+ DUH *duh;
+ (void)size;
-static void *dat_read_s3m(PACKFILE *f, long size)
-{
- DUMBFILE *df;
- DUH *duh;
+ df = dumbfile_open_packfile(f);
- (void)size;
+ if (!df)
+ return NULL;
- df = dumbfile_open_packfile(f);
+ duh = dumb_read_s3m(df);
- if (!df)
- return NULL;
+ dumbfile_close(df);
- duh = dumb_read_s3m(df);
-
- dumbfile_close(df);
-
- return duh;
+ return duh;
}
-
-
/* dumb_register_dat_s3m(): tells Allegro about the S3M datafile object. If
* you intend to load a datafile containing an S3M object, you must call this
* function first. It is recommended you pass DUMB_DAT_S3M, but you may have
@@ -51,11 +46,6 @@
* a reason to use a different type (perhaps you already have a datafile with
* S3M files in and they use a different type).
*/
-void dumb_register_dat_s3m(long type)
-{
- register_datafile_object(
- type,
- &dat_read_s3m,
- &_dat_unload_duh
- );
+void dumb_register_dat_s3m(long type) {
+ register_datafile_object(type, &dat_read_s3m, &_dat_unload_duh);
}
--- a/src/allegro/dats3mq.c
+++ b/src/allegro/dats3mq.c
@@ -22,29 +22,24 @@
#include "aldumb.h"
#include "internal/aldumb.h"
+static void *dat_read_s3m_quick(PACKFILE *f, long size) {
+ DUMBFILE *df;
+ DUH *duh;
+ (void)size;
-static void *dat_read_s3m_quick(PACKFILE *f, long size)
-{
- DUMBFILE *df;
- DUH *duh;
+ df = dumbfile_open_packfile(f);
- (void)size;
+ if (!df)
+ return NULL;
- df = dumbfile_open_packfile(f);
+ duh = dumb_read_s3m_quick(df);
- if (!df)
- return NULL;
+ dumbfile_close(df);
- duh = dumb_read_s3m_quick(df);
-
- dumbfile_close(df);
-
- return duh;
+ return duh;
}
-
-
/* dumb_register_dat_s3m_quick(): tells Allegro about the S3M datafile object.
* If you intend to load a datafile containing an S3M object, you must call this
* function first. It is recommended you pass DUMB_DAT_S3M, but you may have
@@ -54,11 +49,6 @@
* This installs the quick loader: the song length and fast seek points are
* not calculated.
*/
-void dumb_register_dat_s3m_quick(long type)
-{
- register_datafile_object(
- type,
- &dat_read_s3m_quick,
- &_dat_unload_duh
- );
+void dumb_register_dat_s3m_quick(long type) {
+ register_datafile_object(type, &dat_read_s3m_quick, &_dat_unload_duh);
}
--- a/src/allegro/datunld.c
+++ b/src/allegro/datunld.c
@@ -22,10 +22,4 @@
#include "aldumb.h"
#include "internal/aldumb.h"
-
-
-void _dat_unload_duh(void *duh)
-{
- unload_duh(duh);
-}
-
+void _dat_unload_duh(void *duh) { unload_duh(duh); }
--- a/src/allegro/datxm.c
+++ b/src/allegro/datxm.c
@@ -22,29 +22,24 @@
#include "aldumb.h"
#include "internal/aldumb.h"
+static void *dat_read_xm(PACKFILE *f, long size) {
+ DUMBFILE *df;
+ DUH *duh;
+ (void)size;
-static void *dat_read_xm(PACKFILE *f, long size)
-{
- DUMBFILE *df;
- DUH *duh;
+ df = dumbfile_open_packfile(f);
- (void)size;
+ if (!df)
+ return NULL;
- df = dumbfile_open_packfile(f);
+ duh = dumb_read_xm(df);
- if (!df)
- return NULL;
+ dumbfile_close(df);
- duh = dumb_read_xm(df);
-
- dumbfile_close(df);
-
- return duh;
+ return duh;
}
-
-
/* dumb_register_dat_xm(): tells Allegro about the XM datafile object. If you
* intend to load a datafile containing an XM object, you must call this
* function first. It is recommended you pass DUMB_DAT_XM, but you may have a
@@ -51,12 +46,6 @@
* reason to use a different type (perhaps you already have a datafile with
* XM files in and they use a different type).
*/
-void dumb_register_dat_xm(long type)
-{
- register_datafile_object(
- type,
- &dat_read_xm,
- &_dat_unload_duh
- );
+void dumb_register_dat_xm(long type) {
+ register_datafile_object(type, &dat_read_xm, &_dat_unload_duh);
}
-
--- a/src/allegro/datxmq.c
+++ b/src/allegro/datxmq.c
@@ -22,29 +22,24 @@
#include "aldumb.h"
#include "internal/aldumb.h"
+static void *dat_read_xm_quick(PACKFILE *f, long size) {
+ DUMBFILE *df;
+ DUH *duh;
+ (void)size;
-static void *dat_read_xm_quick(PACKFILE *f, long size)
-{
- DUMBFILE *df;
- DUH *duh;
+ df = dumbfile_open_packfile(f);
- (void)size;
+ if (!df)
+ return NULL;
- df = dumbfile_open_packfile(f);
+ duh = dumb_read_xm_quick(df);
- if (!df)
- return NULL;
+ dumbfile_close(df);
- duh = dumb_read_xm_quick(df);
-
- dumbfile_close(df);
-
- return duh;
+ return duh;
}
-
-
/* dumb_register_dat_xm_quick(): tells Allegro about the XM datafile object.
* If you intend to load a datafile containing an XM object, you must call this
* function first. It is recommended you pass DUMB_DAT_XM, but you may have a
@@ -54,11 +49,6 @@
* This installs the quick loader: the song length and fast seek points are
* not calculated.
*/
-void dumb_register_dat_xm_quick(long type)
-{
- register_datafile_object(
- type,
- &dat_read_xm_quick,
- &_dat_unload_duh
- );
+void dumb_register_dat_xm_quick(long type) {
+ register_datafile_object(type, &dat_read_xm_quick, &_dat_unload_duh);
}
--- a/src/allegro/packfile.c
+++ b/src/allegro/packfile.c
@@ -21,127 +21,96 @@
#include "aldumb.h"
-
-typedef struct dumb_packfile
-{
- PACKFILE *p;
- long size;
- long pos;
+typedef struct dumb_packfile {
+ PACKFILE *p;
+ long size;
+ long pos;
} dumb_packfile;
-
-static void *dumb_packfile_open_ex(PACKFILE *p, long size)
-{
- dumb_packfile * file = ( dumb_packfile * ) malloc( sizeof(dumb_packfile) );
- if ( !file ) return 0;
- file->p = p;
- file->size = size;
- file->pos = 0;
- return file;
+static void *dumb_packfile_open_ex(PACKFILE *p, long size) {
+ dumb_packfile *file = (dumb_packfile *)malloc(sizeof(dumb_packfile));
+ if (!file)
+ return 0;
+ file->p = p;
+ file->size = size;
+ file->pos = 0;
+ return file;
}
-static void *dumb_packfile_open(const char *filename)
-{
- PACKFILE *p = pack_fopen(filename, F_READ);
- if (p) return dumb_packfile_open_ex(p, file_size_ex(filename));
- else return 0;
+static void *dumb_packfile_open(const char *filename) {
+ PACKFILE *p = pack_fopen(filename, F_READ);
+ if (p)
+ return dumb_packfile_open_ex(p, file_size_ex(filename));
+ else
+ return 0;
}
-
-static int dumb_packfile_skip(void *f, dumb_off_t n)
-{
- dumb_packfile * file = ( dumb_packfile * ) f;
- file->pos += n;
- return pack_fseek(file->p, file->pos);
+static int dumb_packfile_skip(void *f, dumb_off_t n) {
+ dumb_packfile *file = (dumb_packfile *)f;
+ file->pos += n;
+ return pack_fseek(file->p, file->pos);
}
-
-
-static int dumb_packfile_getc(void *f)
-{
- dumb_packfile * file = ( dumb_packfile * ) f;
- int c = pack_getc(file->p);
- if ( c != EOF ) file->pos++;
- return c;
+static int dumb_packfile_getc(void *f) {
+ dumb_packfile *file = (dumb_packfile *)f;
+ int c = pack_getc(file->p);
+ if (c != EOF)
+ file->pos++;
+ return c;
}
-
-
-static size_t dumb_packfile_getnc(char *ptr, size_t n, void *f)
-{
- dumb_packfile * file = ( dumb_packfile * ) f;
- int nr = pack_fread(ptr, n, file->p);
- if ( nr > 0 ) file->pos += nr;
- return nr;
+static size_t dumb_packfile_getnc(char *ptr, size_t n, void *f) {
+ dumb_packfile *file = (dumb_packfile *)f;
+ int nr = pack_fread(ptr, n, file->p);
+ if (nr > 0)
+ file->pos += nr;
+ return nr;
}
-
-
-static void dumb_packfile_close(void *f)
-{
- dumb_packfile * file = ( dumb_packfile * ) f;
- pack_fclose(file->p);
- free(f);
+static void dumb_packfile_close(void *f) {
+ dumb_packfile *file = (dumb_packfile *)f;
+ pack_fclose(file->p);
+ free(f);
}
-static void dumb_packfile_noclose(void *f)
-{
- free(f);
-}
+static void dumb_packfile_noclose(void *f) { free(f); }
-static int dumb_packfile_seek(void *f, dumb_off_t n)
-{
- dumb_packfile * file = ( dumb_packfile * ) f;
- file->pos = n;
- return pack_fseek(file->p, n);
+static int dumb_packfile_seek(void *f, dumb_off_t n) {
+ dumb_packfile *file = (dumb_packfile *)f;
+ file->pos = n;
+ return pack_fseek(file->p, n);
}
-static dumb_off_t dumb_packfile_get_size(void *f)
-{
- dumb_packfile * file = ( dumb_packfile * ) f;
- return file->size;
+static dumb_off_t dumb_packfile_get_size(void *f) {
+ dumb_packfile *file = (dumb_packfile *)f;
+ return file->size;
}
static DUMBFILE_SYSTEM packfile_dfs = {
- &dumb_packfile_open,
- &dumb_packfile_skip,
- &dumb_packfile_getc,
- &dumb_packfile_getnc,
- &dumb_packfile_close,
- &dumb_packfile_seek,
- &dumb_packfile_get_size
-};
+ &dumb_packfile_open, &dumb_packfile_skip, &dumb_packfile_getc,
+ &dumb_packfile_getnc, &dumb_packfile_close, &dumb_packfile_seek,
+ &dumb_packfile_get_size};
+void dumb_register_packfiles(void) { register_dumbfile_system(&packfile_dfs); }
+static DUMBFILE_SYSTEM packfile_dfs_leave_open = {NULL,
+ &dumb_packfile_skip,
+ &dumb_packfile_getc,
+ &dumb_packfile_getnc,
+ &dumb_packfile_noclose,
+ &dumb_packfile_seek,
+ &dumb_packfile_get_size};
-void dumb_register_packfiles(void)
-{
- register_dumbfile_system(&packfile_dfs);
-}
+/* XXX no way to get the file size from an existing PACKFILE without reading the
+ * entire contents first */
-
-
-static DUMBFILE_SYSTEM packfile_dfs_leave_open = {
- NULL,
- &dumb_packfile_skip,
- &dumb_packfile_getc,
- &dumb_packfile_getnc,
- &dumb_packfile_noclose,
- &dumb_packfile_seek,
- &dumb_packfile_get_size
-};
-
-
-/* XXX no way to get the file size from an existing PACKFILE without reading the entire contents first */
-
-DUMBFILE *dumbfile_open_packfile(PACKFILE *p)
-{
- return dumbfile_open_ex(dumb_packfile_open_ex(p, 0x7fffffff), &packfile_dfs_leave_open);
+DUMBFILE *dumbfile_open_packfile(PACKFILE *p) {
+ return dumbfile_open_ex(dumb_packfile_open_ex(p, 0x7fffffff),
+ &packfile_dfs_leave_open);
}
-
-
-DUMBFILE *dumbfile_from_packfile(PACKFILE *p)
-{
- return p ? dumbfile_open_ex(dumb_packfile_open_ex(p, 0x7fffffff), &packfile_dfs) : NULL;
+DUMBFILE *dumbfile_from_packfile(PACKFILE *p) {
+ return p ? dumbfile_open_ex(dumb_packfile_open_ex(p, 0x7fffffff),
+ &packfile_dfs)
+ : NULL;
}
--- a/src/core/atexit.c
+++ b/src/core/atexit.c
@@ -22,50 +22,39 @@
#include "dumb.h"
#include "internal/dumb.h"
+typedef struct DUMB_ATEXIT_PROC {
+ struct DUMB_ATEXIT_PROC *next;
+ void (*proc)(void);
+} DUMB_ATEXIT_PROC;
-
-typedef struct DUMB_ATEXIT_PROC
-{
- struct DUMB_ATEXIT_PROC *next;
- void (*proc)(void);
-}
-DUMB_ATEXIT_PROC;
-
-
-
static DUMB_ATEXIT_PROC *dumb_atexit_proc = NULL;
+int dumb_atexit(void (*proc)(void)) {
+ DUMB_ATEXIT_PROC *dap = dumb_atexit_proc;
+ while (dap) {
+ if (dap->proc == proc)
+ return 0;
+ dap = dap->next;
+ }
-int dumb_atexit(void (*proc)(void))
-{
- DUMB_ATEXIT_PROC *dap = dumb_atexit_proc;
+ dap = malloc(sizeof(*dap));
- while (dap) {
- if (dap->proc == proc) return 0;
- dap = dap->next;
- }
+ if (!dap)
+ return -1;
- dap = malloc(sizeof(*dap));
+ dap->next = dumb_atexit_proc;
+ dap->proc = proc;
+ dumb_atexit_proc = dap;
- if (!dap)
- return -1;
-
- dap->next = dumb_atexit_proc;
- dap->proc = proc;
- dumb_atexit_proc = dap;
-
- return 0;
+ return 0;
}
-
-
-void dumb_exit(void)
-{
- while (dumb_atexit_proc) {
- DUMB_ATEXIT_PROC *next = dumb_atexit_proc->next;
- (*dumb_atexit_proc->proc)();
- free(dumb_atexit_proc);
- dumb_atexit_proc = next;
- }
+void dumb_exit(void) {
+ while (dumb_atexit_proc) {
+ DUMB_ATEXIT_PROC *next = dumb_atexit_proc->next;
+ (*dumb_atexit_proc->proc)();
+ free(dumb_atexit_proc);
+ dumb_atexit_proc = next;
+ }
}
--- a/src/core/duhlen.c
+++ b/src/core/duhlen.c
@@ -26,17 +26,9 @@
#include "dumb.h"
#include "internal/dumb.h"
+dumb_off_t duh_get_length(DUH *duh) { return duh ? duh->length : 0; }
-
-dumb_off_t duh_get_length(DUH *duh)
-{
- return duh ? duh->length : 0;
-}
-
-
-
-void duh_set_length(DUH *duh, dumb_off_t length)
-{
- if (duh)
- duh->length = length;
+void duh_set_length(DUH *duh, dumb_off_t length) {
+ if (duh)
+ duh->length = length;
}
--- a/src/core/duhtag.c
+++ b/src/core/duhtag.c
@@ -22,37 +22,32 @@
#include "dumb.h"
#include "internal/dumb.h"
+const char *duh_get_tag(DUH *duh, const char *key) {
+ int i;
+ ASSERT(key);
+ if (!duh || !duh->tag)
+ return NULL;
+ for (i = 0; i < duh->n_tags; i++)
+ if (strcmp(key, duh->tag[i][0]) == 0)
+ return duh->tag[i][1];
-const char *duh_get_tag(DUH *duh, const char *key)
-{
- int i;
- ASSERT(key);
- if (!duh || !duh->tag) return NULL;
-
- for (i = 0; i < duh->n_tags; i++)
- if (strcmp(key, duh->tag[i][0]) == 0)
- return duh->tag[i][1];
-
- return NULL;
+ return NULL;
}
-
-
-int duh_get_tag_iterator_size(DUH *duh)
-{
- return (duh && duh->tag ? duh->n_tags : 0);
+int duh_get_tag_iterator_size(DUH *duh) {
+ return (duh && duh->tag ? duh->n_tags : 0);
}
+int duh_get_tag_iterator_get(DUH *duh, const char **key, const char **tag,
+ int i) {
+ ASSERT(key);
+ ASSERT(tag);
+ if (!duh || !duh->tag || i >= duh->n_tags)
+ return -1;
-int duh_get_tag_iterator_get(DUH *duh, const char **key, const char **tag, int i)
-{
- ASSERT(key);
- ASSERT(tag);
- if (!duh || !duh->tag || i >= duh->n_tags) return -1;
+ *key = duh->tag[i][0];
+ *tag = duh->tag[i][1];
- *key = duh->tag[i][0];
- *tag = duh->tag[i][1];
-
- return 0;
+ return 0;
}
--- a/src/core/dumbfile.c
+++ b/src/core/dumbfile.c
@@ -22,403 +22,352 @@
#include "dumb.h"
#include "internal/dumb.h"
-
-
static const DUMBFILE_SYSTEM *the_dfs = NULL;
-
-
-void register_dumbfile_system(const DUMBFILE_SYSTEM *dfs)
-{
- ASSERT(dfs);
- ASSERT(dfs->open);
- ASSERT(dfs->getc);
- ASSERT(dfs->close);
+void register_dumbfile_system(const DUMBFILE_SYSTEM *dfs) {
+ ASSERT(dfs);
+ ASSERT(dfs->open);
+ ASSERT(dfs->getc);
+ ASSERT(dfs->close);
ASSERT(dfs->seek);
ASSERT(dfs->get_size);
- the_dfs = dfs;
+ the_dfs = dfs;
}
-
-
#include "internal/dumbfile.h"
+DUMBFILE *dumbfile_open(const char *filename) {
+ DUMBFILE *f;
+ ASSERT(the_dfs);
-DUMBFILE *dumbfile_open(const char *filename)
-{
- DUMBFILE *f;
+ f = (DUMBFILE *)malloc(sizeof(*f));
- ASSERT(the_dfs);
+ if (!f)
+ return NULL;
- f = (DUMBFILE *) malloc(sizeof(*f));
+ f->dfs = the_dfs;
- if (!f)
- return NULL;
+ f->file = (*the_dfs->open)(filename);
- f->dfs = the_dfs;
+ if (!f->file) {
+ free(f);
+ return NULL;
+ }
- f->file = (*the_dfs->open)(filename);
+ f->pos = 0;
- if (!f->file) {
- free(f);
- return NULL;
- }
-
- f->pos = 0;
-
- return f;
+ return f;
}
+DUMBFILE *dumbfile_open_ex(void *file, const DUMBFILE_SYSTEM *dfs) {
+ DUMBFILE *f;
+ ASSERT(dfs);
+ ASSERT(dfs->getc);
+ ASSERT(file);
-DUMBFILE *dumbfile_open_ex(void *file, const DUMBFILE_SYSTEM *dfs)
-{
- DUMBFILE *f;
+ f = (DUMBFILE *)malloc(sizeof(*f));
- ASSERT(dfs);
- ASSERT(dfs->getc);
- ASSERT(file);
+ if (!f) {
+ if (dfs->close)
+ (*dfs->close)(file);
+ return NULL;
+ }
- f = (DUMBFILE *) malloc(sizeof(*f));
+ f->dfs = dfs;
+ f->file = file;
- if (!f) {
- if (dfs->close)
- (*dfs->close)(file);
- return NULL;
- }
+ f->pos = 0;
- f->dfs = dfs;
- f->file = file;
-
- f->pos = 0;
-
- return f;
+ return f;
}
+dumb_off_t dumbfile_pos(DUMBFILE *f) {
+ ASSERT(f);
-
-dumb_off_t dumbfile_pos(DUMBFILE *f)
-{
- ASSERT(f);
-
- return f->pos;
+ return f->pos;
}
-
-
/* Move forward in the file from the current position by n bytes. */
-int dumbfile_skip(DUMBFILE *f, dumb_off_t n)
-{
- int rv;
+int dumbfile_skip(DUMBFILE *f, dumb_off_t n) {
+ int rv;
- ASSERT(f);
- ASSERT(n >= 0);
+ ASSERT(f);
+ ASSERT(n >= 0);
- if (f->pos < 0)
- return -1;
+ if (f->pos < 0)
+ return -1;
- f->pos += n;
+ f->pos += n;
- if (f->dfs->skip) {
- rv = (*f->dfs->skip)(f->file, n);
- if (rv) {
- f->pos = -1;
- return rv;
- }
- } else {
- while (n) {
- rv = (*f->dfs->getc)(f->file);
- if (rv < 0) {
- f->pos = -1;
- return rv;
- }
- n--;
- }
- }
+ if (f->dfs->skip) {
+ rv = (*f->dfs->skip)(f->file, n);
+ if (rv) {
+ f->pos = -1;
+ return rv;
+ }
+ } else {
+ while (n) {
+ rv = (*f->dfs->getc)(f->file);
+ if (rv < 0) {
+ f->pos = -1;
+ return rv;
+ }
+ n--;
+ }
+ }
- return 0;
+ return 0;
}
+int dumbfile_getc(DUMBFILE *f) {
+ int rv;
+ ASSERT(f);
-int dumbfile_getc(DUMBFILE *f)
-{
- int rv;
+ if (f->pos < 0)
+ return -1;
- ASSERT(f);
+ rv = (*f->dfs->getc)(f->file);
- if (f->pos < 0)
- return -1;
+ if (rv < 0) {
+ f->pos = -1;
+ return rv;
+ }
- rv = (*f->dfs->getc)(f->file);
+ f->pos++;
- if (rv < 0) {
- f->pos = -1;
- return rv;
- }
-
- f->pos++;
-
- return rv;
+ return rv;
}
+int dumbfile_igetw(DUMBFILE *f) {
+ int l, h;
+ ASSERT(f);
-int dumbfile_igetw(DUMBFILE *f)
-{
- int l, h;
+ if (f->pos < 0)
+ return -1;
- ASSERT(f);
+ l = (*f->dfs->getc)(f->file);
+ if (l < 0) {
+ f->pos = -1;
+ return l;
+ }
- if (f->pos < 0)
- return -1;
+ h = (*f->dfs->getc)(f->file);
+ if (h < 0) {
+ f->pos = -1;
+ return h;
+ }
- l = (*f->dfs->getc)(f->file);
- if (l < 0) {
- f->pos = -1;
- return l;
- }
+ f->pos += 2;
- h = (*f->dfs->getc)(f->file);
- if (h < 0) {
- f->pos = -1;
- return h;
- }
-
- f->pos += 2;
-
- return l | (h << 8);
+ return l | (h << 8);
}
+int dumbfile_mgetw(DUMBFILE *f) {
+ int l, h;
+ ASSERT(f);
-int dumbfile_mgetw(DUMBFILE *f)
-{
- int l, h;
+ if (f->pos < 0)
+ return -1;
- ASSERT(f);
+ h = (*f->dfs->getc)(f->file);
+ if (h < 0) {
+ f->pos = -1;
+ return h;
+ }
- if (f->pos < 0)
- return -1;
+ l = (*f->dfs->getc)(f->file);
+ if (l < 0) {
+ f->pos = -1;
+ return l;
+ }
- h = (*f->dfs->getc)(f->file);
- if (h < 0) {
- f->pos = -1;
- return h;
- }
+ f->pos += 2;
- l = (*f->dfs->getc)(f->file);
- if (l < 0) {
- f->pos = -1;
- return l;
- }
-
- f->pos += 2;
-
- return l | (h << 8);
+ return l | (h << 8);
}
+long dumbfile_igetl(DUMBFILE *f) {
+ unsigned long rv, b;
+ ASSERT(f);
-long dumbfile_igetl(DUMBFILE *f)
-{
- unsigned long rv, b;
+ if (f->pos < 0)
+ return -1;
- ASSERT(f);
+ rv = (*f->dfs->getc)(f->file);
+ if ((signed long)rv < 0) {
+ f->pos = -1;
+ return rv;
+ }
- if (f->pos < 0)
- return -1;
+ b = (*f->dfs->getc)(f->file);
+ if ((signed long)b < 0) {
+ f->pos = -1;
+ return b;
+ }
+ rv |= b << 8;
- rv = (*f->dfs->getc)(f->file);
- if ((signed long)rv < 0) {
- f->pos = -1;
- return rv;
- }
+ b = (*f->dfs->getc)(f->file);
+ if ((signed long)b < 0) {
+ f->pos = -1;
+ return b;
+ }
+ rv |= b << 16;
- b = (*f->dfs->getc)(f->file);
- if ((signed long)b < 0) {
- f->pos = -1;
- return b;
- }
- rv |= b << 8;
+ b = (*f->dfs->getc)(f->file);
+ if ((signed long)b < 0) {
+ f->pos = -1;
+ return b;
+ }
+ rv |= b << 24;
- b = (*f->dfs->getc)(f->file);
- if ((signed long)b < 0) {
- f->pos = -1;
- return b;
- }
- rv |= b << 16;
+ f->pos += 4;
- b = (*f->dfs->getc)(f->file);
- if ((signed long)b < 0) {
- f->pos = -1;
- return b;
- }
- rv |= b << 24;
-
- f->pos += 4;
-
- return rv;
+ return rv;
}
+long dumbfile_mgetl(DUMBFILE *f) {
+ unsigned long rv, b;
+ ASSERT(f);
-long dumbfile_mgetl(DUMBFILE *f)
-{
- unsigned long rv, b;
+ if (f->pos < 0)
+ return -1;
- ASSERT(f);
+ rv = (*f->dfs->getc)(f->file);
+ if ((signed long)rv < 0) {
+ f->pos = -1;
+ return rv;
+ }
+ rv <<= 24;
- if (f->pos < 0)
- return -1;
+ b = (*f->dfs->getc)(f->file);
+ if ((signed long)b < 0) {
+ f->pos = -1;
+ return b;
+ }
+ rv |= b << 16;
- rv = (*f->dfs->getc)(f->file);
- if ((signed long)rv < 0) {
- f->pos = -1;
- return rv;
- }
- rv <<= 24;
+ b = (*f->dfs->getc)(f->file);
+ if ((signed long)b < 0) {
+ f->pos = -1;
+ return b;
+ }
+ rv |= b << 8;
- b = (*f->dfs->getc)(f->file);
- if ((signed long)b < 0) {
- f->pos = -1;
- return b;
- }
- rv |= b << 16;
+ b = (*f->dfs->getc)(f->file);
+ if ((signed long)b < 0) {
+ f->pos = -1;
+ return b;
+ }
+ rv |= b;
- b = (*f->dfs->getc)(f->file);
- if ((signed long)b < 0) {
- f->pos = -1;
- return b;
- }
- rv |= b << 8;
+ f->pos += 4;
- b = (*f->dfs->getc)(f->file);
- if ((signed long)b < 0) {
- f->pos = -1;
- return b;
- }
- rv |= b;
-
- f->pos += 4;
-
- return rv;
+ return rv;
}
+unsigned long dumbfile_cgetul(DUMBFILE *f) {
+ unsigned long rv = 0;
+ int v;
+ do {
+ v = dumbfile_getc(f);
-unsigned long dumbfile_cgetul(DUMBFILE *f)
-{
- unsigned long rv = 0;
- int v;
+ if (v < 0)
+ return v;
- do {
- v = dumbfile_getc(f);
+ rv <<= 7;
+ rv |= v & 0x7F;
+ } while (v & 0x80);
- if (v < 0)
- return v;
-
- rv <<= 7;
- rv |= v & 0x7F;
- } while (v & 0x80);
-
- return rv;
+ return rv;
}
+signed long dumbfile_cgetsl(DUMBFILE *f) {
+ unsigned long rv = dumbfile_cgetul(f);
+ if (f->pos < 0)
+ return rv;
-signed long dumbfile_cgetsl(DUMBFILE *f)
-{
- unsigned long rv = dumbfile_cgetul(f);
-
- if (f->pos < 0)
- return rv;
-
- return (rv >> 1) | (rv << 31);
+ return (rv >> 1) | (rv << 31);
}
+dumb_ssize_t dumbfile_getnc(char *ptr, size_t n, DUMBFILE *f) {
+ dumb_ssize_t rv;
+ ASSERT(f);
+ ASSERT(n >= 0);
-dumb_ssize_t dumbfile_getnc(char *ptr, size_t n, DUMBFILE *f)
-{
- dumb_ssize_t rv;
+ if (f->pos < 0)
+ return -1;
- ASSERT(f);
- ASSERT(n >= 0);
+ if (f->dfs->getnc) {
+ rv = (*f->dfs->getnc)(ptr, n, f->file);
+ if (rv < (dumb_ssize_t)n) {
+ f->pos = -1;
+ return MAX(rv, 0);
+ }
+ } else {
+ for (rv = 0; rv < (dumb_ssize_t)n; rv++) {
+ int c = (*f->dfs->getc)(f->file);
+ if (c < 0) {
+ f->pos = -1;
+ return rv;
+ }
+ *ptr++ = c;
+ }
+ }
- if (f->pos < 0)
- return -1;
+ f->pos += rv;
- if (f->dfs->getnc) {
- rv = (*f->dfs->getnc)(ptr, n, f->file);
- if (rv < (dumb_ssize_t) n) {
- f->pos = -1;
- return MAX(rv, 0);
- }
- } else {
- for (rv = 0; rv < (dumb_ssize_t) n; rv++) {
- int c = (*f->dfs->getc)(f->file);
- if (c < 0) {
- f->pos = -1;
- return rv;
- }
- *ptr++ = c;
- }
- }
-
- f->pos += rv;
-
- return rv;
+ return rv;
}
-
-
/* Move to an arbitrary position n in the file, specified relative to origin,
* where origin shall be one of the DFS_SEEK_* constants.
*/
-int dumbfile_seek(DUMBFILE *f, dumb_off_t n, int origin)
-{
- switch ( origin )
- {
- case DFS_SEEK_CUR: n += f->pos; break;
- case DFS_SEEK_END: n += (*f->dfs->get_size)(f->file); break;
- default: break; /* keep n, seek position from beginning of file */
+int dumbfile_seek(DUMBFILE *f, dumb_off_t n, int origin) {
+ switch (origin) {
+ case DFS_SEEK_CUR:
+ n += f->pos;
+ break;
+ case DFS_SEEK_END:
+ n += (*f->dfs->get_size)(f->file);
+ break;
+ default:
+ break; /* keep n, seek position from beginning of file */
}
f->pos = n;
return (*f->dfs->seek)(f->file, n);
}
-
-
-dumb_off_t dumbfile_get_size(DUMBFILE *f)
-{
+dumb_off_t dumbfile_get_size(DUMBFILE *f) {
return (*f->dfs->get_size)(f->file);
}
+int dumbfile_error(DUMBFILE *f) {
+ ASSERT(f);
-
-int dumbfile_error(DUMBFILE *f)
-{
- ASSERT(f);
-
- return f->pos < 0;
+ return f->pos < 0;
}
+int dumbfile_close(DUMBFILE *f) {
+ int rv;
+ ASSERT(f);
-int dumbfile_close(DUMBFILE *f)
-{
- int rv;
+ rv = f->pos < 0;
- ASSERT(f);
+ if (f->dfs->close)
+ (*f->dfs->close)(f->file);
- rv = f->pos < 0;
+ free(f);
- if (f->dfs->close)
- (*f->dfs->close)(f->file);
-
- free(f);
-
- return rv;
+ return rv;
}
--- a/src/core/loadduh.c
+++ b/src/core/loadduh.c
@@ -20,23 +20,20 @@
#include "dumb.h"
#include "internal/dumb.h"
-
-
/* load_duh(): loads a .duh file, returning a pointer to a DUH struct.
* When you have finished with it, you must pass the pointer to unload_duh()
* so that the memory can be freed.
*/
-DUH *load_duh(const char *filename)
-{
- DUH *duh;
- DUMBFILE *f = dumbfile_open(filename);
+DUH *load_duh(const char *filename) {
+ DUH *duh;
+ DUMBFILE *f = dumbfile_open(filename);
- if (!f)
- return NULL;
+ if (!f)
+ return NULL;
- duh = read_duh(f);
+ duh = read_duh(f);
- dumbfile_close(f);
+ dumbfile_close(f);
- return duh;
+ return duh;
}
--- a/src/core/makeduh.c
+++ b/src/core/makeduh.c
@@ -23,129 +23,124 @@
#include "dumb.h"
#include "internal/dumb.h"
+static DUH_SIGNAL *make_signal(DUH_SIGTYPE_DESC *desc, sigdata_t *sigdata) {
+ DUH_SIGNAL *signal;
+ ASSERT((desc->start_sigrenderer && desc->end_sigrenderer) ||
+ (!desc->start_sigrenderer && !desc->end_sigrenderer));
+ ASSERT(desc->sigrenderer_generate_samples &&
+ desc->sigrenderer_get_current_sample);
-static DUH_SIGNAL *make_signal(DUH_SIGTYPE_DESC *desc, sigdata_t *sigdata)
-{
- DUH_SIGNAL *signal;
+ signal = malloc(sizeof(*signal));
- ASSERT((desc->start_sigrenderer && desc->end_sigrenderer) || (!desc->start_sigrenderer && !desc->end_sigrenderer));
- ASSERT(desc->sigrenderer_generate_samples && desc->sigrenderer_get_current_sample);
+ if (!signal) {
+ if (desc->unload_sigdata)
+ if (sigdata)
+ (*desc->unload_sigdata)(sigdata);
+ return NULL;
+ }
- signal = malloc(sizeof(*signal));
+ signal->desc = desc;
+ signal->sigdata = sigdata;
- if (!signal) {
- if (desc->unload_sigdata)
- if (sigdata)
- (*desc->unload_sigdata)(sigdata);
- return NULL;
- }
-
- signal->desc = desc;
- signal->sigdata = sigdata;
-
- return signal;
+ return signal;
}
+DUH *make_duh(dumb_off_t length, int n_tags, const char *const tags[][2],
+ int n_signals, DUH_SIGTYPE_DESC *desc[], sigdata_t *sigdata[]) {
+ DUH *duh = malloc(sizeof(*duh));
+ int i;
+ int fail;
+ if (duh) {
+ duh->n_signals = n_signals;
-DUH *make_duh(
- dumb_off_t length,
- int n_tags,
- const char *const tags[][2],
- int n_signals,
- DUH_SIGTYPE_DESC *desc[],
- sigdata_t *sigdata[]
-)
-{
- DUH *duh = malloc(sizeof(*duh));
- int i;
- int fail;
+ duh->signal = malloc(n_signals * sizeof(*duh->signal));
- if (duh) {
- duh->n_signals = n_signals;
+ if (!duh->signal) {
+ free(duh);
+ duh = NULL;
+ }
+ }
- duh->signal = malloc(n_signals * sizeof(*duh->signal));
+ if (!duh) {
+ for (i = 0; i < n_signals; i++)
+ if (desc[i]->unload_sigdata)
+ if (sigdata[i])
+ (*desc[i]->unload_sigdata)(sigdata[i]);
+ return NULL;
+ }
- if (!duh->signal) {
- free(duh);
- duh = NULL;
- }
- }
+ duh->n_tags = 0;
+ duh->tag = NULL;
- if (!duh) {
- for (i = 0; i < n_signals; i++)
- if (desc[i]->unload_sigdata)
- if (sigdata[i])
- (*desc[i]->unload_sigdata)(sigdata[i]);
- return NULL;
- }
+ fail = 0;
- duh->n_tags = 0;
- duh->tag = NULL;
+ for (i = 0; i < n_signals; i++) {
+ duh->signal[i] = make_signal(desc[i], sigdata[i]);
+ if (!duh->signal[i])
+ fail = 1;
+ }
- fail = 0;
+ if (fail) {
+ unload_duh(duh);
+ return NULL;
+ }
- for (i = 0; i < n_signals; i++) {
- duh->signal[i] = make_signal(desc[i], sigdata[i]);
- if (!duh->signal[i])
- fail = 1;
- }
+ duh->length = length;
- if (fail) {
- unload_duh(duh);
- return NULL;
- }
+ {
+ int mem = n_tags * 2; /* account for NUL terminators here */
+ char *ptr;
- duh->length = length;
+ for (i = 0; i < n_tags; i++)
+ mem += strlen(tags[i][0]) + strlen(tags[i][1]);
- {
- int mem = n_tags * 2; /* account for NUL terminators here */
- char *ptr;
+ if (mem <= 0)
+ return duh;
- for (i = 0; i < n_tags; i++)
- mem += strlen(tags[i][0]) + strlen(tags[i][1]);
+ duh->tag = malloc(n_tags * sizeof(*duh->tag));
+ if (!duh->tag)
+ return duh;
+ duh->tag[0][0] = malloc(mem);
+ if (!duh->tag[0][0]) {
+ free(duh->tag);
+ duh->tag = NULL;
+ return duh;
+ }
+ duh->n_tags = n_tags;
+ ptr = duh->tag[0][0];
+ for (i = 0; i < n_tags; i++) {
+ duh->tag[i][0] = ptr;
+ strcpy(ptr, tags[i][0]);
+ ptr += strlen(tags[i][0]) + 1;
+ duh->tag[i][1] = ptr;
+ strcpy(ptr, tags[i][1]);
+ ptr += strlen(tags[i][1]) + 1;
+ }
+ }
- if (mem <= 0) return duh;
-
- duh->tag = malloc(n_tags * sizeof(*duh->tag));
- if (!duh->tag) return duh;
- duh->tag[0][0] = malloc(mem);
- if (!duh->tag[0][0]) {
- free(duh->tag);
- duh->tag = NULL;
- return duh;
- }
- duh->n_tags = n_tags;
- ptr = duh->tag[0][0];
- for (i = 0; i < n_tags; i++) {
- duh->tag[i][0] = ptr;
- strcpy(ptr, tags[i][0]);
- ptr += strlen(tags[i][0]) + 1;
- duh->tag[i][1] = ptr;
- strcpy(ptr, tags[i][1]);
- ptr += strlen(tags[i][1]) + 1;
- }
- }
-
- return duh;
+ return duh;
}
-int duh_add_signal(DUH *duh, DUH_SIGTYPE_DESC *desc, sigdata_t *sigdata)
-{
- DUH_SIGNAL **signal;
+int duh_add_signal(DUH *duh, DUH_SIGTYPE_DESC *desc, sigdata_t *sigdata) {
+ DUH_SIGNAL **signal;
- if ( !duh || !desc || !sigdata ) return -1;
+ if (!duh || !desc || !sigdata)
+ return -1;
- signal = ( DUH_SIGNAL ** ) realloc( duh->signal, ( duh->n_signals + 1 ) * sizeof( *duh->signal ) );
- if ( !signal ) return -1;
- duh->signal = signal;
+ signal = (DUH_SIGNAL **)realloc(duh->signal, (duh->n_signals + 1) *
+ sizeof(*duh->signal));
+ if (!signal)
+ return -1;
+ duh->signal = signal;
- memmove( signal + 1, signal, duh->n_signals * sizeof( *signal ) );
- duh->n_signals++;
+ memmove(signal + 1, signal, duh->n_signals * sizeof(*signal));
+ duh->n_signals++;
- signal[ 0 ] = make_signal( desc, sigdata );
- if ( !signal[ 0 ] ) return -1;
+ signal[0] = make_signal(desc, sigdata);
+ if (!signal[0])
+ return -1;
- return 0;
+ return 0;
}
--- a/src/core/rawsig.c
+++ b/src/core/rawsig.c
@@ -22,37 +22,32 @@
#include "dumb.h"
#include "internal/dumb.h"
-
-
/* You have to specify the type of sigdata, proving you know what to do with
* the pointer. If you get it wrong, you can expect NULL back.
*/
-sigdata_t *duh_get_raw_sigdata(DUH *duh, int sig, long type)
-{
- int i;
- DUH_SIGNAL *signal;
+sigdata_t *duh_get_raw_sigdata(DUH *duh, int sig, long type) {
+ int i;
+ DUH_SIGNAL *signal;
- if (!duh) return NULL;
+ if (!duh)
+ return NULL;
- if ( sig >= 0 )
- {
- if ((unsigned int)sig >= (unsigned int)duh->n_signals) return NULL;
+ if (sig >= 0) {
+ if ((unsigned int)sig >= (unsigned int)duh->n_signals)
+ return NULL;
- signal = duh->signal[sig];
+ signal = duh->signal[sig];
- if (signal && signal->desc->type == type)
- return signal->sigdata;
- }
- else
- {
- for ( i = 0; i < duh->n_signals; i++ )
- {
- signal = duh->signal[i];
+ if (signal && signal->desc->type == type)
+ return signal->sigdata;
+ } else {
+ for (i = 0; i < duh->n_signals; i++) {
+ signal = duh->signal[i];
- if (signal && signal->desc->type == type)
- return signal->sigdata;
- }
- }
+ if (signal && signal->desc->type == type)
+ return signal->sigdata;
+ }
+ }
- return NULL;
+ return NULL;
}
--- a/src/core/readduh.c
+++ b/src/core/readduh.c
@@ -22,86 +22,80 @@
#include "dumb.h"
#include "internal/dumb.h"
+static DUH_SIGNAL *read_signal(DUH *duh, DUMBFILE *f) {
+ DUH_SIGNAL *signal;
+ long type;
+ signal = malloc(sizeof(*signal));
-static DUH_SIGNAL *read_signal(DUH *duh, DUMBFILE *f)
-{
- DUH_SIGNAL *signal;
- long type;
+ if (!signal)
+ return NULL;
- signal = malloc(sizeof(*signal));
+ type = dumbfile_mgetl(f);
+ if (dumbfile_error(f)) {
+ free(signal);
+ return NULL;
+ }
- if (!signal)
- return NULL;
+ signal->desc = _dumb_get_sigtype_desc(type);
+ if (!signal->desc) {
+ free(signal);
+ return NULL;
+ }
- type = dumbfile_mgetl(f);
- if (dumbfile_error(f)) {
- free(signal);
- return NULL;
- }
+ if (signal->desc->load_sigdata) {
+ signal->sigdata = (*signal->desc->load_sigdata)(duh, f);
+ if (!signal->sigdata) {
+ free(signal);
+ return NULL;
+ }
+ } else
+ signal->sigdata = NULL;
- signal->desc = _dumb_get_sigtype_desc(type);
- if (!signal->desc) {
- free(signal);
- return NULL;
- }
-
- if (signal->desc->load_sigdata) {
- signal->sigdata = (*signal->desc->load_sigdata)(duh, f);
- if (!signal->sigdata) {
- free(signal);
- return NULL;
- }
- } else
- signal->sigdata = NULL;
-
- return signal;
+ return signal;
}
-
-
/* read_duh(): reads a DUH from an already open DUMBFILE, and returns its
* pointer, or null on error. The file is not closed.
*/
-DUH *read_duh(DUMBFILE *f)
-{
- DUH *duh;
- int i;
+DUH *read_duh(DUMBFILE *f) {
+ DUH *duh;
+ int i;
- if (dumbfile_mgetl(f) != DUH_SIGNATURE)
- return NULL;
+ if (dumbfile_mgetl(f) != DUH_SIGNATURE)
+ return NULL;
- duh = malloc(sizeof(*duh));
- if (!duh)
- return NULL;
+ duh = malloc(sizeof(*duh));
+ if (!duh)
+ return NULL;
- duh->length = dumbfile_igetl(f);
- if (dumbfile_error(f) || duh->length <= 0) {
- free(duh);
- return NULL;
- }
+ duh->length = dumbfile_igetl(f);
+ if (dumbfile_error(f) || duh->length <= 0) {
+ free(duh);
+ return NULL;
+ }
- duh->n_signals = (int) dumbfile_igetl(f);
- if (dumbfile_error(f) || duh->n_signals <= 0) {
- free(duh);
- return NULL;
- }
+ duh->n_signals = (int)dumbfile_igetl(f);
+ if (dumbfile_error(f) || duh->n_signals <= 0) {
+ free(duh);
+ return NULL;
+ }
- duh->signal = malloc(sizeof(*duh->signal) * duh->n_signals);
- if (!duh->signal) {
- free(duh);
- return NULL;
- }
+ duh->signal = malloc(sizeof(*duh->signal) * duh->n_signals);
+ if (!duh->signal) {
+ free(duh);
+ return NULL;
+ }
- for (i = 0; i < duh->n_signals; i++)
- duh->signal[i] = NULL;
+ for (i = 0; i < duh->n_signals; i++)
+ duh->signal[i] = NULL;
- for (i = 0; i < duh->n_signals; i++) {
- if (!(duh->signal[i] = read_signal(duh, f))) {
- unload_duh(duh);
- return NULL;
- }
- }
+ for (i = 0; i < duh->n_signals; i++) {
+ if (!(duh->signal[i] = read_signal(duh, f))) {
+ unload_duh(duh);
+ return NULL;
+ }
+ }
- return duh;
+ return duh;
}
--- a/src/core/register.c
+++ b/src/core/register.c
@@ -22,31 +22,24 @@
#include "dumb.h"
#include "internal/dumb.h"
-
-
static DUH_SIGTYPE_DESC_LINK *sigtype_desc = NULL;
static DUH_SIGTYPE_DESC_LINK **sigtype_desc_tail = &sigtype_desc;
-
-
/* destroy_sigtypes(): frees all memory allocated while registering signal
* types. This function is set up to be called by dumb_exit().
*/
-static void destroy_sigtypes(void)
-{
- DUH_SIGTYPE_DESC_LINK *desc_link = sigtype_desc, *next;
- sigtype_desc = NULL;
- sigtype_desc_tail = &sigtype_desc;
+static void destroy_sigtypes(void) {
+ DUH_SIGTYPE_DESC_LINK *desc_link = sigtype_desc, *next;
+ sigtype_desc = NULL;
+ sigtype_desc_tail = &sigtype_desc;
- while (desc_link) {
- next = desc_link->next;
- free(desc_link);
- desc_link = next;
- }
+ while (desc_link) {
+ next = desc_link->next;
+ free(desc_link);
+ desc_link = next;
+ }
}
-
-
/* dumb_register_sigtype(): registers a new signal type with DUMB. The signal
* type is identified by a four-character string (e.g. "WAVE"), which you can
* encode using the the DUMB_ID() macro (e.g. DUMB_ID('W','A','V','E')). The
@@ -56,49 +49,48 @@
* If a DUH tries to use a signal that has not been registered using this
* function, then the library will fail to load the DUH.
*/
-void dumb_register_sigtype(DUH_SIGTYPE_DESC *desc)
-{
- DUH_SIGTYPE_DESC_LINK *desc_link = sigtype_desc;
+void dumb_register_sigtype(DUH_SIGTYPE_DESC *desc) {
+ DUH_SIGTYPE_DESC_LINK *desc_link = sigtype_desc;
- ASSERT((desc->load_sigdata && desc->unload_sigdata) || (!desc->load_sigdata && !desc->unload_sigdata));
- ASSERT((desc->start_sigrenderer && desc->end_sigrenderer) || (!desc->start_sigrenderer && !desc->end_sigrenderer));
- ASSERT(desc->sigrenderer_generate_samples && desc->sigrenderer_get_current_sample);
+ ASSERT((desc->load_sigdata && desc->unload_sigdata) ||
+ (!desc->load_sigdata && !desc->unload_sigdata));
+ ASSERT((desc->start_sigrenderer && desc->end_sigrenderer) ||
+ (!desc->start_sigrenderer && !desc->end_sigrenderer));
+ ASSERT(desc->sigrenderer_generate_samples &&
+ desc->sigrenderer_get_current_sample);
- if (desc_link) {
- do {
- if (desc_link->desc->type == desc->type) {
- desc_link->desc = desc;
- return;
- }
- desc_link = desc_link->next;
- } while (desc_link);
- } else
- dumb_atexit(&destroy_sigtypes);
+ if (desc_link) {
+ do {
+ if (desc_link->desc->type == desc->type) {
+ desc_link->desc = desc;
+ return;
+ }
+ desc_link = desc_link->next;
+ } while (desc_link);
+ } else
+ dumb_atexit(&destroy_sigtypes);
- desc_link = *sigtype_desc_tail = malloc(sizeof(DUH_SIGTYPE_DESC_LINK));
+ desc_link = *sigtype_desc_tail = malloc(sizeof(DUH_SIGTYPE_DESC_LINK));
- if (!desc_link)
- return;
+ if (!desc_link)
+ return;
- desc_link->next = NULL;
- sigtype_desc_tail = &desc_link->next;
+ desc_link->next = NULL;
+ sigtype_desc_tail = &desc_link->next;
- desc_link->desc = desc;
+ desc_link->desc = desc;
}
-
-
/* _dumb_get_sigtype_desc(): searches the registered functions for a signal
* type matching the parameter. If such a sigtype is found, it returns a
* pointer to a sigtype descriptor containing the necessary functions to
* manage the signal. If none is found, it returns NULL.
*/
-DUH_SIGTYPE_DESC *_dumb_get_sigtype_desc(long type)
-{
- DUH_SIGTYPE_DESC_LINK *desc_link = sigtype_desc;
+DUH_SIGTYPE_DESC *_dumb_get_sigtype_desc(long type) {
+ DUH_SIGTYPE_DESC_LINK *desc_link = sigtype_desc;
- while (desc_link && desc_link->desc->type != type)
- desc_link = desc_link->next;
+ while (desc_link && desc_link->desc->type != type)
+ desc_link = desc_link->next;
- return desc_link ? desc_link->desc : NULL;
+ return desc_link ? desc_link->desc : NULL;
}
--- a/src/core/rendduh.c
+++ b/src/core/rendduh.c
@@ -23,257 +23,239 @@
#include "dumb.h"
#include "internal/dumb.h"
-
-
/* On the x86, we can use some tricks to speed stuff up */
#if (defined _MSC_VER) || (defined __DJGPP__) || (defined __MINGW__)
// Can't we detect Linux and other x86 platforms here? :/
-#define FAST_MID(var, min, max) { \
- var -= (min); \
- var &= (~var) >> (sizeof(var) * CHAR_BIT - 1); \
- var += (min); \
- var -= (max); \
- var &= var >> (sizeof(var) * CHAR_BIT - 1); \
- var += (max); \
-}
+#define FAST_MID(var, min, max) \
+ { \
+ var -= (min); \
+ var &= (~var) >> (sizeof(var) * CHAR_BIT - 1); \
+ var += (min); \
+ var -= (max); \
+ var &= var >> (sizeof(var) * CHAR_BIT - 1); \
+ var += (max); \
+ }
-#define CONVERT8(src, pos, signconv) { \
- signed int f = (src + 0x8000) >> 16; \
- FAST_MID(f, -128, 127); \
- ((char*)sptr)[pos] = (char)f ^ signconv; \
-}
+#define CONVERT8(src, pos, signconv) \
+ { \
+ signed int f = (src + 0x8000) >> 16; \
+ FAST_MID(f, -128, 127); \
+ ((char *)sptr)[pos] = (char)f ^ signconv; \
+ }
-#define CONVERT16(src, pos, signconv) { \
- signed int f = (src + 0x80) >> 8; \
- FAST_MID(f, -32768, 32767); \
- ((short*)sptr)[pos] = (short)(f ^ signconv); \
-}
+#define CONVERT16(src, pos, signconv) \
+ { \
+ signed int f = (src + 0x80) >> 8; \
+ FAST_MID(f, -32768, 32767); \
+ ((short *)sptr)[pos] = (short)(f ^ signconv); \
+ }
#else
-#define CONVERT8(src, pos, signconv) \
-{ \
- signed int f = (src + 0x8000) >> 16; \
- f = MID(-128, f, 127); \
- ((char *)sptr)[pos] = (char)f ^ signconv; \
-}
+#define CONVERT8(src, pos, signconv) \
+ { \
+ signed int f = (src + 0x8000) >> 16; \
+ f = MID(-128, f, 127); \
+ ((char *)sptr)[pos] = (char)f ^ signconv; \
+ }
+#define CONVERT16(src, pos, signconv) \
+ { \
+ signed int f = (src + 0x80) >> 8; \
+ f = MID(-32768, f, 32767); \
+ ((short *)sptr)[pos] = (short)(f ^ signconv); \
+ }
-
-#define CONVERT16(src, pos, signconv) \
-{ \
- signed int f = (src + 0x80) >> 8; \
- f = MID(-32768, f, 32767); \
- ((short *)sptr)[pos] = (short)(f ^ signconv); \
-}
-
#endif
-#define CONVERT24(src, pos) { \
- signed int f = src; \
- f = MID(-8388608, f, 8388607); \
- ((unsigned char*)sptr)[pos ] = (f) & 0xFF; \
- ((unsigned char*)sptr)[pos+1] = (f >> 8) & 0xFF; \
- ((unsigned char*)sptr)[pos+2] = (f >> 16) & 0xFF; \
-}
+#define CONVERT24(src, pos) \
+ { \
+ signed int f = src; \
+ f = MID(-8388608, f, 8388607); \
+ ((unsigned char *)sptr)[pos] = (f)&0xFF; \
+ ((unsigned char *)sptr)[pos + 1] = (f >> 8) & 0xFF; \
+ ((unsigned char *)sptr)[pos + 2] = (f >> 16) & 0xFF; \
+ }
-#define CONVERT32F(src, pos) { \
- ((float*)sptr)[pos] = (float)((signed int)src) * (1.0f/(float)(0xffffff/2+1)); \
-}
+#define CONVERT32F(src, pos) \
+ { \
+ ((float *)sptr)[pos] = \
+ (float)((signed int)src) * (1.0f / (float)(0xffffff / 2 + 1)); \
+ }
-#define CONVERT64F(src, pos) { \
- ((double*)sptr)[pos] = (double)((signed int)src) * (1.0/(double)(0xffffff/2+1)); \
-}
+#define CONVERT64F(src, pos) \
+ { \
+ ((double *)sptr)[pos] = \
+ (double)((signed int)src) * (1.0 / (double)(0xffffff / 2 + 1)); \
+ }
-
-
/* This is the only deprecated function in 2.0.0. */
/* DEPRECATED */
-long duh_render(
- DUH_SIGRENDERER *sigrenderer,
- int bits, int unsign,
- float volume, float delta,
- long size, void *sptr
-)
-{
- long n;
+long duh_render(DUH_SIGRENDERER *sigrenderer, int bits, int unsign,
+ float volume, float delta, long size, void *sptr) {
+ long n;
- sample_t **sampptr;
+ sample_t **sampptr;
- int n_channels;
+ int n_channels;
- ASSERT(bits == 8 || bits == 16);
- ASSERT(sptr);
+ ASSERT(bits == 8 || bits == 16);
+ ASSERT(sptr);
- if (!sigrenderer)
- return 0;
+ if (!sigrenderer)
+ return 0;
- n_channels = duh_sigrenderer_get_n_channels(sigrenderer);
+ n_channels = duh_sigrenderer_get_n_channels(sigrenderer);
- ASSERT(n_channels > 0);
- /* This restriction will be removed when need be. At the moment, tightly
- * optimised loops exist for exactly one or two channels.
- */
- ASSERT(n_channels <= 2);
+ ASSERT(n_channels > 0);
+ /* This restriction will be removed when need be. At the moment, tightly
+ * optimised loops exist for exactly one or two channels.
+ */
+ ASSERT(n_channels <= 2);
- sampptr = allocate_sample_buffer(n_channels, size);
+ sampptr = allocate_sample_buffer(n_channels, size);
- if (!sampptr)
- return 0;
+ if (!sampptr)
+ return 0;
- dumb_silence(sampptr[0], n_channels * size);
+ dumb_silence(sampptr[0], n_channels * size);
- size = duh_sigrenderer_generate_samples(sigrenderer, volume, delta, size, sampptr);
+ size = duh_sigrenderer_generate_samples(sigrenderer, volume, delta, size,
+ sampptr);
- if (bits == 16) {
- int signconv = unsign ? 0x8000 : 0x0000;
+ if (bits == 16) {
+ int signconv = unsign ? 0x8000 : 0x0000;
- for (n = 0; n < size * n_channels; n++) {
- CONVERT16(sampptr[0][n], n, signconv);
- }
- } else {
- char signconv = unsign ? 0x80 : 0x00;
+ for (n = 0; n < size * n_channels; n++) {
+ CONVERT16(sampptr[0][n], n, signconv);
+ }
+ } else {
+ char signconv = unsign ? 0x80 : 0x00;
- for (n = 0; n < size * n_channels; n++) {
- CONVERT8(sampptr[0][n], n, signconv);
- }
- }
+ for (n = 0; n < size * n_channels; n++) {
+ CONVERT8(sampptr[0][n], n, signconv);
+ }
+ }
- destroy_sample_buffer(sampptr);
+ destroy_sample_buffer(sampptr);
- return size;
+ return size;
}
+long duh_render_int(DUH_SIGRENDERER *sigrenderer, sample_t ***sig_samples,
+ long *sig_samples_size, int bits, int unsign, float volume,
+ float delta, long size, void *sptr) {
+ long n;
-long duh_render_int(
- DUH_SIGRENDERER *sigrenderer,
- sample_t ***sig_samples,
- long *sig_samples_size,
- int bits, int unsign,
- float volume, float delta,
- long size, void *sptr
-)
-{
- long n;
+ sample_t **sampptr;
- sample_t **sampptr;
+ int n_channels;
- int n_channels;
+ ASSERT(bits == 8 || bits == 16 || bits == 24);
+ ASSERT(sptr);
+ ASSERT(sig_samples);
+ ASSERT(sig_samples_size);
- ASSERT(bits == 8 || bits == 16 || bits == 24);
- ASSERT(sptr);
- ASSERT(sig_samples);
- ASSERT(sig_samples_size);
+ if (!sigrenderer)
+ return 0;
- if (!sigrenderer)
- return 0;
+ n_channels = duh_sigrenderer_get_n_channels(sigrenderer);
- n_channels = duh_sigrenderer_get_n_channels(sigrenderer);
+ ASSERT(n_channels > 0);
+ /* This restriction will be removed when need be. At the moment, tightly
+ * optimised loops exist for exactly one or two channels.
+ */
+ ASSERT(n_channels <= 2);
- ASSERT(n_channels > 0);
- /* This restriction will be removed when need be. At the moment, tightly
- * optimised loops exist for exactly one or two channels.
- */
- ASSERT(n_channels <= 2);
+ if ((*sig_samples == NULL) || (*sig_samples_size != size)) {
+ destroy_sample_buffer(*sig_samples);
+ *sig_samples = allocate_sample_buffer(n_channels, size);
+ *sig_samples_size = size;
+ }
+ sampptr = *sig_samples;
- if ((*sig_samples == NULL) || (*sig_samples_size != size))
- {
- destroy_sample_buffer(*sig_samples);
- *sig_samples = allocate_sample_buffer(n_channels, size);
- *sig_samples_size = size;
- }
- sampptr = *sig_samples;
+ if (!sampptr)
+ return 0;
- if (!sampptr)
- return 0;
+ dumb_silence(sampptr[0], n_channels * size);
- dumb_silence(sampptr[0], n_channels * size);
+ size = duh_sigrenderer_generate_samples(sigrenderer, volume, delta, size,
+ sampptr);
- size = duh_sigrenderer_generate_samples(sigrenderer, volume, delta, size, sampptr);
+ if (bits == 24) {
+ long i = 0;
+ ASSERT(unsign == 0);
- if (bits == 24) {
- long i = 0;
- ASSERT(unsign == 0);
+ for (n = 0; n < size * n_channels; n++, i += 3) {
+ CONVERT24(sampptr[0][n], i);
+ }
+ } else if (bits == 16) {
+ int signconv = unsign ? 0x8000 : 0x0000;
- for (n = 0; n < size * n_channels; n++, i += 3) {
- CONVERT24(sampptr[0][n], i);
- }
- } else
- if (bits == 16) {
- int signconv = unsign ? 0x8000 : 0x0000;
+ for (n = 0; n < size * n_channels; n++) {
+ CONVERT16(sampptr[0][n], n, signconv);
+ }
+ } else {
+ char signconv = unsign ? 0x80 : 0x00;
- for (n = 0; n < size * n_channels; n++) {
- CONVERT16(sampptr[0][n], n, signconv);
- }
- } else {
- char signconv = unsign ? 0x80 : 0x00;
+ for (n = 0; n < size * n_channels; n++) {
+ CONVERT8(sampptr[0][n], n, signconv);
+ }
+ }
- for (n = 0; n < size * n_channels; n++) {
- CONVERT8(sampptr[0][n], n, signconv);
- }
- }
-
- return size;
+ return size;
}
+long duh_render_float(DUH_SIGRENDERER *sigrenderer, sample_t ***sig_samples,
+ long *sig_samples_size, int bits, float volume,
+ float delta, long size, void *sptr) {
+ long n;
-long duh_render_float(
- DUH_SIGRENDERER *sigrenderer,
- sample_t ***sig_samples,
- long *sig_samples_size,
- int bits,
- float volume, float delta,
- long size, void *sptr
-)
-{
- long n;
+ sample_t **sampptr;
- sample_t **sampptr;
+ int n_channels;
- int n_channels;
+ ASSERT(bits == 32 || bits == 64);
+ ASSERT(sptr);
+ ASSERT(sig_samples);
+ ASSERT(sig_samples_size);
- ASSERT(bits == 32 || bits == 64);
- ASSERT(sptr);
- ASSERT(sig_samples);
- ASSERT(sig_samples_size);
+ if (!sigrenderer)
+ return 0;
- if (!sigrenderer)
- return 0;
+ n_channels = duh_sigrenderer_get_n_channels(sigrenderer);
- n_channels = duh_sigrenderer_get_n_channels(sigrenderer);
+ ASSERT(n_channels > 0);
+ /* This restriction will be removed when need be. At the moment, tightly
+ * optimised loops exist for exactly one or two channels.
+ */
+ ASSERT(n_channels <= 2);
- ASSERT(n_channels > 0);
- /* This restriction will be removed when need be. At the moment, tightly
- * optimised loops exist for exactly one or two channels.
- */
- ASSERT(n_channels <= 2);
+ if ((*sig_samples == NULL) || (*sig_samples_size != size)) {
+ destroy_sample_buffer(*sig_samples);
+ *sig_samples = allocate_sample_buffer(n_channels, size);
+ *sig_samples_size = size;
+ }
+ sampptr = *sig_samples;
- if ((*sig_samples == NULL) || (*sig_samples_size != size))
- {
- destroy_sample_buffer(*sig_samples);
- *sig_samples = allocate_sample_buffer(n_channels, size);
- *sig_samples_size = size;
- }
- sampptr = *sig_samples;
+ if (!sampptr)
+ return 0;
- if (!sampptr)
- return 0;
+ dumb_silence(sampptr[0], n_channels * size);
- dumb_silence(sampptr[0], n_channels * size);
+ size = duh_sigrenderer_generate_samples(sigrenderer, volume, delta, size,
+ sampptr);
- size = duh_sigrenderer_generate_samples(sigrenderer, volume, delta, size, sampptr);
+ if (bits == 64) {
+ for (n = 0; n < size * n_channels; n++) {
+ CONVERT64F(sampptr[0][n], n);
+ }
+ } else if (bits == 32) {
+ for (n = 0; n < size * n_channels; n++) {
+ CONVERT32F(sampptr[0][n], n);
+ }
+ }
- if (bits == 64) {
- for (n = 0; n < size * n_channels; n++) {
- CONVERT64F(sampptr[0][n], n);
- }
- } else
- if (bits == 32) {
- for (n = 0; n < size * n_channels; n++) {
- CONVERT32F(sampptr[0][n], n);
- }
- }
-
- return size;
+ return size;
}
--- a/src/core/rendsig.c
+++ b/src/core/rendsig.c
@@ -22,222 +22,193 @@
#include "dumb.h"
#include "internal/dumb.h"
+struct DUH_SIGRENDERER {
+ DUH_SIGTYPE_DESC *desc;
+ sigrenderer_t *sigrenderer;
-struct DUH_SIGRENDERER
-{
- DUH_SIGTYPE_DESC *desc;
+ int n_channels;
- sigrenderer_t *sigrenderer;
+ long pos;
+ int subpos;
- int n_channels;
-
- long pos;
- int subpos;
-
- DUH_SIGRENDERER_SAMPLE_ANALYSER_CALLBACK callback;
- void *callback_data;
+ DUH_SIGRENDERER_SAMPLE_ANALYSER_CALLBACK callback;
+ void *callback_data;
};
+DUH_SIGRENDERER *duh_start_sigrenderer(DUH *duh, int sig, int n_channels,
+ long pos) {
+ DUH_SIGRENDERER *sigrenderer;
+ DUH_SIGNAL *signal;
+ DUH_START_SIGRENDERER proc;
-DUH_SIGRENDERER *duh_start_sigrenderer(DUH *duh, int sig, int n_channels, long pos)
-{
- DUH_SIGRENDERER *sigrenderer;
+ if (!duh)
+ return NULL;
- DUH_SIGNAL *signal;
- DUH_START_SIGRENDERER proc;
+ if ((unsigned int)sig >= (unsigned int)duh->n_signals)
+ return NULL;
- if (!duh)
- return NULL;
+ signal = duh->signal[sig];
+ if (!signal)
+ return NULL;
- if ((unsigned int)sig >= (unsigned int)duh->n_signals)
- return NULL;
+ sigrenderer = malloc(sizeof(*sigrenderer));
+ if (!sigrenderer)
+ return NULL;
- signal = duh->signal[sig];
- if (!signal)
- return NULL;
+ sigrenderer->desc = signal->desc;
- sigrenderer = malloc(sizeof(*sigrenderer));
- if (!sigrenderer)
- return NULL;
+ proc = sigrenderer->desc->start_sigrenderer;
- sigrenderer->desc = signal->desc;
+ if (proc) {
+ duh->signal[sig] = NULL;
+ sigrenderer->sigrenderer =
+ (*proc)(duh, signal->sigdata, n_channels, pos);
+ duh->signal[sig] = signal;
- proc = sigrenderer->desc->start_sigrenderer;
+ if (!sigrenderer->sigrenderer) {
+ free(sigrenderer);
+ return NULL;
+ }
+ } else
+ sigrenderer->sigrenderer = NULL;
- if (proc) {
- duh->signal[sig] = NULL;
- sigrenderer->sigrenderer = (*proc)(duh, signal->sigdata, n_channels, pos);
- duh->signal[sig] = signal;
+ sigrenderer->n_channels = n_channels;
- if (!sigrenderer->sigrenderer) {
- free(sigrenderer);
- return NULL;
- }
- } else
- sigrenderer->sigrenderer = NULL;
+ sigrenderer->pos = pos;
+ sigrenderer->subpos = 0;
- sigrenderer->n_channels = n_channels;
+ sigrenderer->callback = NULL;
- sigrenderer->pos = pos;
- sigrenderer->subpos = 0;
-
- sigrenderer->callback = NULL;
-
- return sigrenderer;
+ return sigrenderer;
}
-
-
void duh_sigrenderer_set_sample_analyser_callback(
- DUH_SIGRENDERER *sigrenderer,
- DUH_SIGRENDERER_SAMPLE_ANALYSER_CALLBACK callback, void *data
-)
-{
- if (sigrenderer) {
- sigrenderer->callback = callback;
- sigrenderer->callback_data = data;
- }
+ DUH_SIGRENDERER *sigrenderer,
+ DUH_SIGRENDERER_SAMPLE_ANALYSER_CALLBACK callback, void *data) {
+ if (sigrenderer) {
+ sigrenderer->callback = callback;
+ sigrenderer->callback_data = data;
+ }
}
-
-
-int duh_sigrenderer_get_n_channels(DUH_SIGRENDERER *sigrenderer)
-{
- return sigrenderer ? sigrenderer->n_channels : 0;
+int duh_sigrenderer_get_n_channels(DUH_SIGRENDERER *sigrenderer) {
+ return sigrenderer ? sigrenderer->n_channels : 0;
}
+long duh_sigrenderer_get_position(DUH_SIGRENDERER *sigrenderer) {
+ DUH_SIGRENDERER_GET_POSITION proc;
+ if (!sigrenderer)
+ return -1;
-long duh_sigrenderer_get_position(DUH_SIGRENDERER *sigrenderer)
-{
- DUH_SIGRENDERER_GET_POSITION proc;
-
- if (!sigrenderer) return -1;
-
- proc = sigrenderer->desc->sigrenderer_get_position;
- if (proc)
- return (*proc)(sigrenderer->sigrenderer);
- else
- return sigrenderer->pos;
+ proc = sigrenderer->desc->sigrenderer_get_position;
+ if (proc)
+ return (*proc)(sigrenderer->sigrenderer);
+ else
+ return sigrenderer->pos;
}
+void duh_sigrenderer_set_sigparam(DUH_SIGRENDERER *sigrenderer,
+ unsigned char id, long value) {
+ DUH_SIGRENDERER_SET_SIGPARAM proc;
+ if (!sigrenderer)
+ return;
-void duh_sigrenderer_set_sigparam(
- DUH_SIGRENDERER *sigrenderer,
- unsigned char id, long value
-)
-{
- DUH_SIGRENDERER_SET_SIGPARAM proc;
-
- if (!sigrenderer) return;
-
- proc = sigrenderer->desc->sigrenderer_set_sigparam;
- if (proc)
- (*proc)(sigrenderer->sigrenderer, id, value);
- else
- TRACE("Parameter #%d = %ld for signal %c%c%c%c, which does not take parameters.\n",
- (int)id,
- value,
- (int)(sigrenderer->desc->type >> 24),
- (int)(sigrenderer->desc->type >> 16),
- (int)(sigrenderer->desc->type >> 8),
- (int)(sigrenderer->desc->type));
+ proc = sigrenderer->desc->sigrenderer_set_sigparam;
+ if (proc)
+ (*proc)(sigrenderer->sigrenderer, id, value);
+ else
+ TRACE("Parameter #%d = %ld for signal %c%c%c%c, which does not take "
+ "parameters.\n",
+ (int)id, value, (int)(sigrenderer->desc->type >> 24),
+ (int)(sigrenderer->desc->type >> 16),
+ (int)(sigrenderer->desc->type >> 8),
+ (int)(sigrenderer->desc->type));
}
+long duh_sigrenderer_generate_samples(DUH_SIGRENDERER *sigrenderer,
+ float volume, float delta, long size,
+ sample_t **samples) {
+ long rendered;
+ LONG_LONG t;
+ if (!sigrenderer)
+ return 0;
-long duh_sigrenderer_generate_samples(
- DUH_SIGRENDERER *sigrenderer,
- float volume, float delta,
- long size, sample_t **samples
-)
-{
- long rendered;
- LONG_LONG t;
+ rendered = (*sigrenderer->desc->sigrenderer_generate_samples)(
+ sigrenderer->sigrenderer, volume, delta, size, samples);
- if (!sigrenderer) return 0;
+ if (rendered) {
+ if (sigrenderer->callback)
+ (*sigrenderer->callback)(sigrenderer->callback_data,
+ (const sample_t *const *)samples,
+ sigrenderer->n_channels, rendered);
- rendered = (*sigrenderer->desc->sigrenderer_generate_samples)
- (sigrenderer->sigrenderer, volume, delta, size, samples);
+ t = sigrenderer->subpos + (LONG_LONG)(delta * 65536.0 + 0.5) * rendered;
- if (rendered) {
- if (sigrenderer->callback)
- (*sigrenderer->callback)(sigrenderer->callback_data,
- (const sample_t *const *)samples, sigrenderer->n_channels, rendered);
+ sigrenderer->pos += (long)(t >> 16);
+ sigrenderer->subpos = (int)t & 65535;
+ }
- t = sigrenderer->subpos + (LONG_LONG)(delta * 65536.0 + 0.5) * rendered;
-
- sigrenderer->pos += (long)(t >> 16);
- sigrenderer->subpos = (int)t & 65535;
- }
-
- return rendered;
+ return rendered;
}
-
-
-void duh_sigrenderer_get_current_sample(DUH_SIGRENDERER *sigrenderer, float volume, sample_t *samples)
-{
- if (sigrenderer)
- (*sigrenderer->desc->sigrenderer_get_current_sample)(sigrenderer->sigrenderer, volume, samples);
+void duh_sigrenderer_get_current_sample(DUH_SIGRENDERER *sigrenderer,
+ float volume, sample_t *samples) {
+ if (sigrenderer)
+ (*sigrenderer->desc->sigrenderer_get_current_sample)(
+ sigrenderer->sigrenderer, volume, samples);
}
+void duh_end_sigrenderer(DUH_SIGRENDERER *sigrenderer) {
+ if (sigrenderer) {
+ if (sigrenderer->desc->end_sigrenderer)
+ if (sigrenderer->sigrenderer)
+ (*sigrenderer->desc->end_sigrenderer)(sigrenderer->sigrenderer);
-
-void duh_end_sigrenderer(DUH_SIGRENDERER *sigrenderer)
-{
- if (sigrenderer) {
- if (sigrenderer->desc->end_sigrenderer)
- if (sigrenderer->sigrenderer)
- (*sigrenderer->desc->end_sigrenderer)(sigrenderer->sigrenderer);
-
- free(sigrenderer);
- }
+ free(sigrenderer);
+ }
}
+DUH_SIGRENDERER *duh_encapsulate_raw_sigrenderer(sigrenderer_t *vsigrenderer,
+ DUH_SIGTYPE_DESC *desc,
+ int n_channels, long pos) {
+ DUH_SIGRENDERER *sigrenderer;
+ if (desc->start_sigrenderer && !vsigrenderer)
+ return NULL;
-DUH_SIGRENDERER *duh_encapsulate_raw_sigrenderer(sigrenderer_t *vsigrenderer, DUH_SIGTYPE_DESC *desc, int n_channels, long pos)
-{
- DUH_SIGRENDERER *sigrenderer;
+ sigrenderer = malloc(sizeof(*sigrenderer));
+ if (!sigrenderer) {
+ if (desc->end_sigrenderer)
+ if (vsigrenderer)
+ (*desc->end_sigrenderer)(vsigrenderer);
+ return NULL;
+ }
- if (desc->start_sigrenderer && !vsigrenderer) return NULL;
+ sigrenderer->desc = desc;
+ sigrenderer->sigrenderer = vsigrenderer;
- sigrenderer = malloc(sizeof(*sigrenderer));
- if (!sigrenderer) {
- if (desc->end_sigrenderer)
- if (vsigrenderer)
- (*desc->end_sigrenderer)(vsigrenderer);
- return NULL;
- }
+ sigrenderer->n_channels = n_channels;
- sigrenderer->desc = desc;
- sigrenderer->sigrenderer = vsigrenderer;
+ sigrenderer->pos = pos;
+ sigrenderer->subpos = 0;
- sigrenderer->n_channels = n_channels;
+ sigrenderer->callback = NULL;
- sigrenderer->pos = pos;
- sigrenderer->subpos = 0;
-
- sigrenderer->callback = NULL;
-
- return sigrenderer;
+ return sigrenderer;
}
+sigrenderer_t *duh_get_raw_sigrenderer(DUH_SIGRENDERER *sigrenderer,
+ long type) {
+ if (sigrenderer && sigrenderer->desc->type == type)
+ return sigrenderer->sigrenderer;
-
-sigrenderer_t *duh_get_raw_sigrenderer(DUH_SIGRENDERER *sigrenderer, long type)
-{
- if (sigrenderer && sigrenderer->desc->type == type)
- return sigrenderer->sigrenderer;
-
- return NULL;
+ return NULL;
}
-
-
#if 0
// This function is disabled because we don't know whether we want to destroy
--- a/src/core/unload.c
+++ b/src/core/unload.c
@@ -22,43 +22,37 @@
#include "dumb.h"
#include "internal/dumb.h"
+static void destroy_signal(DUH_SIGNAL *signal) {
+ if (signal) {
+ if (signal->desc)
+ if (signal->desc->unload_sigdata)
+ if (signal->sigdata)
+ (*signal->desc->unload_sigdata)(signal->sigdata);
-
-static void destroy_signal(DUH_SIGNAL *signal)
-{
- if (signal) {
- if (signal->desc)
- if (signal->desc->unload_sigdata)
- if (signal->sigdata)
- (*signal->desc->unload_sigdata)(signal->sigdata);
-
- free(signal);
- }
+ free(signal);
+ }
}
-
-
/* unload_duh(): destroys a DUH struct. You must call this for every DUH
* struct created, when you've finished with it.
*/
-void unload_duh(DUH *duh)
-{
- int i;
+void unload_duh(DUH *duh) {
+ int i;
- if (duh) {
- if (duh->signal) {
- for (i = 0; i < duh->n_signals; i++)
- destroy_signal(duh->signal[i]);
+ if (duh) {
+ if (duh->signal) {
+ for (i = 0; i < duh->n_signals; i++)
+ destroy_signal(duh->signal[i]);
- free(duh->signal);
- }
+ free(duh->signal);
+ }
- if (duh->tag) {
- if (duh->tag[0][0])
- free(duh->tag[0][0]);
- free(duh->tag);
- }
+ if (duh->tag) {
+ if (duh->tag[0][0])
+ free(duh->tag[0][0]);
+ free(duh->tag);
+ }
- free(duh);
- }
+ free(duh);
+ }
}
--- a/src/helpers/barray.c
+++ b/src/helpers/barray.c
@@ -2,65 +2,54 @@
#include <string.h>
-
-void * bit_array_create(size_t size)
-{
- size_t bsize = ((size + 7) >> 3) + sizeof(size_t);
- void * ret = calloc(1, bsize);
- if (ret) *(size_t *)ret = size;
- return ret;
+void *bit_array_create(size_t size) {
+ size_t bsize = ((size + 7) >> 3) + sizeof(size_t);
+ void *ret = calloc(1, bsize);
+ if (ret)
+ *(size_t *)ret = size;
+ return ret;
}
-void bit_array_destroy(void * array)
-{
- if (array) free(array);
+void bit_array_destroy(void *array) {
+ if (array)
+ free(array);
}
-void * bit_array_dup(void * array)
-{
- if (array)
- {
- size_t * size = (size_t *) array;
- size_t bsize = ((*size + 7) >> 3) + sizeof(*size);
- void * ret = malloc(bsize);
- if (ret) memcpy(ret, array, bsize);
- return ret;
- }
- return NULL;
+void *bit_array_dup(void *array) {
+ if (array) {
+ size_t *size = (size_t *)array;
+ size_t bsize = ((*size + 7) >> 3) + sizeof(*size);
+ void *ret = malloc(bsize);
+ if (ret)
+ memcpy(ret, array, bsize);
+ return ret;
+ }
+ return NULL;
}
-void bit_array_reset(void * array)
-{
- if (array)
- {
- size_t * size = (size_t *) array;
- size_t bsize = (*size + 7) >> 3;
- memset(size + 1, 0, bsize);
- }
+void bit_array_reset(void *array) {
+ if (array) {
+ size_t *size = (size_t *)array;
+ size_t bsize = (*size + 7) >> 3;
+ memset(size + 1, 0, bsize);
+ }
}
-
-void bit_array_set(void * array, size_t bit)
-{
- if (array)
- {
- size_t * size = (size_t *) array;
- if (bit < *size)
- {
- unsigned char * ptr = (unsigned char *)(size + 1);
- ptr[bit >> 3] |= (1U << (bit & 7));
- }
- }
+void bit_array_set(void *array, size_t bit) {
+ if (array) {
+ size_t *size = (size_t *)array;
+ if (bit < *size) {
+ unsigned char *ptr = (unsigned char *)(size + 1);
+ ptr[bit >> 3] |= (1U << (bit & 7));
+ }
+ }
}
-void bit_array_set_range(void * array, size_t bit, size_t count)
-{
- if (array && count)
- {
- size_t * size = (size_t *) array;
- if (bit < *size)
- {
- unsigned char * ptr = (unsigned char *)(size + 1);
+void bit_array_set_range(void *array, size_t bit, size_t count) {
+ if (array && count) {
+ size_t *size = (size_t *)array;
+ if (bit < *size) {
+ unsigned char *ptr = (unsigned char *)(size + 1);
size_t i;
for (i = bit; i < *size && i < bit + count; ++i)
ptr[i >> 3] |= (1U << (i & 7));
@@ -68,81 +57,66 @@
}
}
-int bit_array_test(void * array, size_t bit)
-{
- if (array)
- {
- size_t * size = (size_t *) array;
- if (bit < *size)
- {
- unsigned char * ptr = (unsigned char *)(size + 1);
- if (ptr[bit >> 3] & (1U << (bit & 7)))
- {
- return 1;
- }
- }
- }
- return 0;
+int bit_array_test(void *array, size_t bit) {
+ if (array) {
+ size_t *size = (size_t *)array;
+ if (bit < *size) {
+ unsigned char *ptr = (unsigned char *)(size + 1);
+ if (ptr[bit >> 3] & (1U << (bit & 7))) {
+ return 1;
+ }
+ }
+ }
+ return 0;
}
-int bit_array_test_range(void * array, size_t bit, size_t count)
-{
- if (array)
- {
- size_t * size = (size_t *) array;
- if (bit < *size)
- {
- unsigned char * ptr = (unsigned char *)(size + 1);
- if ((bit & 7) && (count > 8))
- {
- while ((bit < *size) && count && (bit & 7))
- {
- if (ptr[bit >> 3] & (1U << (bit & 7))) return 1;
- bit++;
- count--;
- }
- }
- if (!(bit & 7))
- {
- while (((*size - bit) >= 8) && (count >= 8))
- {
- if (ptr[bit >> 3]) return 1;
- bit += 8;
- count -= 8;
- }
- }
- while ((bit < *size) && count)
- {
- if (ptr[bit >> 3] & (1U << (bit & 7))) return 1;
- bit++;
- count--;
- }
- }
- }
- return 0;
-}
+int bit_array_test_range(void *array, size_t bit, size_t count) {
+ if (array) {
+ size_t *size = (size_t *)array;
+ if (bit < *size) {
+ unsigned char *ptr = (unsigned char *)(size + 1);
+ if ((bit & 7) && (count > 8)) {
+ while ((bit < *size) && count && (bit & 7)) {
+ if (ptr[bit >> 3] & (1U << (bit & 7)))
+ return 1;
+ bit++;
+ count--;
+ }
+ }
+ if (!(bit & 7)) {
+ while (((*size - bit) >= 8) && (count >= 8)) {
+ if (ptr[bit >> 3])
+ return 1;
+ bit += 8;
+ count -= 8;
+ }
+ }
+ while ((bit < *size) && count) {
+ if (ptr[bit >> 3] & (1U << (bit & 7)))
+ return 1;
+ bit++;
+ count--;
+ }
+ }
+ }
+ return 0;
+}
-void bit_array_clear(void * array, size_t bit)
-{
- if (array)
- {
- size_t * size = (size_t *) array;
- if (bit < *size)
- {
- unsigned char * ptr = (unsigned char *)(size + 1);
- ptr[bit >> 3] &= ~(1U << (bit & 7));
- }
- }
+void bit_array_clear(void *array, size_t bit) {
+ if (array) {
+ size_t *size = (size_t *)array;
+ if (bit < *size) {
+ unsigned char *ptr = (unsigned char *)(size + 1);
+ ptr[bit >> 3] &= ~(1U << (bit & 7));
+ }
+ }
}
-void bit_array_clear_range(void * array, size_t bit, size_t count)
-{
- if (array && count)
- {
- size_t * size = (size_t *) array;
- if (bit < *size)
- {
- unsigned char * ptr = (unsigned char *)(size + 1);
+void bit_array_clear_range(void *array, size_t bit, size_t count) {
+ if (array && count) {
+ size_t *size = (size_t *)array;
+ if (bit < *size) {
+ unsigned char *ptr = (unsigned char *)(size + 1);
size_t i;
for (i = bit; i < *size && i < bit + count; ++i)
ptr[i >> 3] &= ~(1U << (i & 7));
@@ -150,40 +124,32 @@
}
}
-void bit_array_merge(void * dest, void * source, size_t offset)
-{
- if (dest && source)
- {
- size_t * dsize = (size_t *) dest;
- size_t * ssize = (size_t *) source;
- size_t soffset = 0;
- while (offset < *dsize && soffset < *ssize)
- {
- if (bit_array_test(source, soffset))
- {
- bit_array_set(dest, offset);
- }
- soffset++;
- offset++;
- }
- }
+void bit_array_merge(void *dest, void *source, size_t offset) {
+ if (dest && source) {
+ size_t *dsize = (size_t *)dest;
+ size_t *ssize = (size_t *)source;
+ size_t soffset = 0;
+ while (offset < *dsize && soffset < *ssize) {
+ if (bit_array_test(source, soffset)) {
+ bit_array_set(dest, offset);
+ }
+ soffset++;
+ offset++;
+ }
+ }
}
-void bit_array_mask(void * dest, void * source, size_t offset)
-{
- if (dest && source)
- {
- size_t * dsize = (size_t *) dest;
- size_t * ssize = (size_t *) source;
- size_t soffset = 0;
- while (offset < *dsize && soffset < *ssize)
- {
- if (bit_array_test(source, soffset))
- {
- bit_array_clear(dest, offset);
- }
- soffset++;
- offset++;
- }
- }
+void bit_array_mask(void *dest, void *source, size_t offset) {
+ if (dest && source) {
+ size_t *dsize = (size_t *)dest;
+ size_t *ssize = (size_t *)source;
+ size_t soffset = 0;
+ while (offset < *dsize && soffset < *ssize) {
+ if (bit_array_test(source, soffset)) {
+ bit_array_clear(dest, offset);
+ }
+ soffset++;
+ offset++;
+ }
+ }
}
--- a/src/helpers/clickrem.c
+++ b/src/helpers/clickrem.c
@@ -22,261 +22,236 @@
#include "dumb.h"
#include "internal/dumb.h"
-
-
typedef struct DUMB_CLICK DUMB_CLICK;
+struct DUMB_CLICK_REMOVER {
+ DUMB_CLICK *click;
+ int n_clicks;
-struct DUMB_CLICK_REMOVER
-{
- DUMB_CLICK *click;
- int n_clicks;
-
- int offset;
+ int offset;
};
-
-struct DUMB_CLICK
-{
- DUMB_CLICK *next;
- long pos;
- sample_t step;
+struct DUMB_CLICK {
+ DUMB_CLICK *next;
+ long pos;
+ sample_t step;
};
+DUMB_CLICK_REMOVER *dumb_create_click_remover(void) {
+ DUMB_CLICK_REMOVER *cr = malloc(sizeof(*cr));
+ if (!cr)
+ return NULL;
+ cr->click = NULL;
+ cr->n_clicks = 0;
-DUMB_CLICK_REMOVER *dumb_create_click_remover(void)
-{
- DUMB_CLICK_REMOVER *cr = malloc(sizeof(*cr));
- if (!cr) return NULL;
+ cr->offset = 0;
- cr->click = NULL;
- cr->n_clicks = 0;
-
- cr->offset = 0;
-
- return cr;
+ return cr;
}
+void dumb_record_click(DUMB_CLICK_REMOVER *cr, long pos, sample_t step) {
+ DUMB_CLICK *click;
+ ASSERT(pos >= 0);
-void dumb_record_click(DUMB_CLICK_REMOVER *cr, long pos, sample_t step)
-{
- DUMB_CLICK *click;
+ if (!cr || !step)
+ return;
- ASSERT(pos >= 0);
+ if (pos == 0) {
+ cr->offset -= step;
+ return;
+ }
- if (!cr || !step) return;
+ click = malloc(sizeof(*click));
+ if (!click)
+ return;
- if (pos == 0) {
- cr->offset -= step;
- return;
- }
+ click->pos = pos;
+ click->step = step;
- click = malloc(sizeof(*click));
- if (!click) return;
-
- click->pos = pos;
- click->step = step;
-
- click->next = cr->click;
- cr->click = click;
- cr->n_clicks++;
+ click->next = cr->click;
+ cr->click = click;
+ cr->n_clicks++;
}
+static DUMB_CLICK *dumb_click_mergesort(DUMB_CLICK *click, int n_clicks) {
+ int i;
+ DUMB_CLICK *c1, *c2, **cp;
+ if (n_clicks <= 1)
+ return click;
-static DUMB_CLICK *dumb_click_mergesort(DUMB_CLICK *click, int n_clicks)
-{
- int i;
- DUMB_CLICK *c1, *c2, **cp;
+ /* Split the list into two */
+ c1 = click;
+ cp = &c1;
+ for (i = 0; i < n_clicks; i += 2)
+ cp = &(*cp)->next;
+ c2 = *cp;
+ *cp = NULL;
- if (n_clicks <= 1) return click;
+ /* Sort the sublists */
+ c1 = dumb_click_mergesort(c1, (n_clicks + 1) >> 1);
+ c2 = dumb_click_mergesort(c2, n_clicks >> 1);
- /* Split the list into two */
- c1 = click;
- cp = &c1;
- for (i = 0; i < n_clicks; i += 2) cp = &(*cp)->next;
- c2 = *cp;
- *cp = NULL;
+ /* Merge them */
+ cp = &click;
+ while (c1 && c2) {
+ if (c1->pos > c2->pos) {
+ *cp = c2;
+ c2 = c2->next;
+ } else {
+ *cp = c1;
+ c1 = c1->next;
+ }
+ cp = &(*cp)->next;
+ }
+ if (c2)
+ *cp = c2;
+ else
+ *cp = c1;
- /* Sort the sublists */
- c1 = dumb_click_mergesort(c1, (n_clicks + 1) >> 1);
- c2 = dumb_click_mergesort(c2, n_clicks >> 1);
-
- /* Merge them */
- cp = &click;
- while (c1 && c2) {
- if (c1->pos > c2->pos) {
- *cp = c2;
- c2 = c2->next;
- } else {
- *cp = c1;
- c1 = c1->next;
- }
- cp = &(*cp)->next;
- }
- if (c2)
- *cp = c2;
- else
- *cp = c1;
-
- return click;
+ return click;
}
+void dumb_remove_clicks(DUMB_CLICK_REMOVER *cr, sample_t *samples, long length,
+ int step, float halflife) {
+ DUMB_CLICK *click;
+ long pos = 0;
+ int offset;
+ int factor;
+ if (!cr)
+ return;
-void dumb_remove_clicks(DUMB_CLICK_REMOVER *cr, sample_t *samples, long length, int step, float halflife)
-{
- DUMB_CLICK *click;
- long pos = 0;
- int offset;
- int factor;
+ factor = (int)floor(pow(0.5, 1.0 / halflife) * (1U << 31));
- if (!cr) return;
+ click = dumb_click_mergesort(cr->click, cr->n_clicks);
+ cr->click = NULL;
+ cr->n_clicks = 0;
- factor = (int)floor(pow(0.5, 1.0/halflife) * (1U << 31));
+ length *= step;
- click = dumb_click_mergesort(cr->click, cr->n_clicks);
- cr->click = NULL;
- cr->n_clicks = 0;
+ while (click) {
+ DUMB_CLICK *next = click->next;
+ long end = click->pos * step;
+ ASSERT(end <= length);
+ offset = cr->offset;
+ if (offset < 0) {
+ offset = -offset;
+ while (pos < end) {
+ samples[pos] -= offset;
+ offset = (int)(((LONG_LONG)(offset << 1) * factor) >> 32);
+ pos += step;
+ }
+ offset = -offset;
+ } else {
+ while (pos < end) {
+ samples[pos] += offset;
+ offset = (int)(((LONG_LONG)(offset << 1) * factor) >> 32);
+ pos += step;
+ }
+ }
+ cr->offset = offset - click->step;
+ free(click);
+ click = next;
+ }
- length *= step;
-
- while (click) {
- DUMB_CLICK *next = click->next;
- long end = click->pos * step;
- ASSERT(end <= length);
- offset = cr->offset;
- if (offset < 0) {
- offset = -offset;
- while (pos < end) {
- samples[pos] -= offset;
- offset = (int)(((LONG_LONG)(offset << 1) * factor) >> 32);
- pos += step;
- }
- offset = -offset;
- } else {
- while (pos < end) {
- samples[pos] += offset;
- offset = (int)(((LONG_LONG)(offset << 1) * factor) >> 32);
- pos += step;
- }
- }
- cr->offset = offset - click->step;
- free(click);
- click = next;
- }
-
- offset = cr->offset;
- if (offset < 0) {
- offset = -offset;
- while (pos < length) {
- samples[pos] -= offset;
- offset = (int)((LONG_LONG)(offset << 1) * factor >> 32);
- pos += step;
- }
- offset = -offset;
- } else {
- while (pos < length) {
- samples[pos] += offset;
- offset = (int)((LONG_LONG)(offset << 1) * factor >> 32);
- pos += step;
- }
- }
- cr->offset = offset;
+ offset = cr->offset;
+ if (offset < 0) {
+ offset = -offset;
+ while (pos < length) {
+ samples[pos] -= offset;
+ offset = (int)((LONG_LONG)(offset << 1) * factor >> 32);
+ pos += step;
+ }
+ offset = -offset;
+ } else {
+ while (pos < length) {
+ samples[pos] += offset;
+ offset = (int)((LONG_LONG)(offset << 1) * factor >> 32);
+ pos += step;
+ }
+ }
+ cr->offset = offset;
}
-
-
-sample_t dumb_click_remover_get_offset(DUMB_CLICK_REMOVER *cr)
-{
- return cr ? cr->offset : 0;
+sample_t dumb_click_remover_get_offset(DUMB_CLICK_REMOVER *cr) {
+ return cr ? cr->offset : 0;
}
-
-
-void dumb_destroy_click_remover(DUMB_CLICK_REMOVER *cr)
-{
- if (cr) {
- DUMB_CLICK *click = cr->click;
- while (click) {
- DUMB_CLICK *next = click->next;
- free(click);
- click = next;
- }
- free(cr);
- }
+void dumb_destroy_click_remover(DUMB_CLICK_REMOVER *cr) {
+ if (cr) {
+ DUMB_CLICK *click = cr->click;
+ while (click) {
+ DUMB_CLICK *next = click->next;
+ free(click);
+ click = next;
+ }
+ free(cr);
+ }
}
-
-
-DUMB_CLICK_REMOVER **dumb_create_click_remover_array(int n)
-{
- int i;
- DUMB_CLICK_REMOVER **cr;
- if (n <= 0) return NULL;
- cr = malloc(n * sizeof(*cr));
- if (!cr) return NULL;
- for (i = 0; i < n; i++) cr[i] = dumb_create_click_remover();
- return cr;
+DUMB_CLICK_REMOVER **dumb_create_click_remover_array(int n) {
+ int i;
+ DUMB_CLICK_REMOVER **cr;
+ if (n <= 0)
+ return NULL;
+ cr = malloc(n * sizeof(*cr));
+ if (!cr)
+ return NULL;
+ for (i = 0; i < n; i++)
+ cr[i] = dumb_create_click_remover();
+ return cr;
}
-
-
-void dumb_record_click_array(int n, DUMB_CLICK_REMOVER **cr, long pos, sample_t *step)
-{
- if (cr) {
- int i;
- for (i = 0; i < n; i++)
- dumb_record_click(cr[i], pos, step[i]);
- }
+void dumb_record_click_array(int n, DUMB_CLICK_REMOVER **cr, long pos,
+ sample_t *step) {
+ if (cr) {
+ int i;
+ for (i = 0; i < n; i++)
+ dumb_record_click(cr[i], pos, step[i]);
+ }
}
-
-
-void dumb_record_click_negative_array(int n, DUMB_CLICK_REMOVER **cr, long pos, sample_t *step)
-{
- if (cr) {
- int i;
- for (i = 0; i < n; i++)
- dumb_record_click(cr[i], pos, -step[i]);
- }
+void dumb_record_click_negative_array(int n, DUMB_CLICK_REMOVER **cr, long pos,
+ sample_t *step) {
+ if (cr) {
+ int i;
+ for (i = 0; i < n; i++)
+ dumb_record_click(cr[i], pos, -step[i]);
+ }
}
-
-
-void dumb_remove_clicks_array(int n, DUMB_CLICK_REMOVER **cr, sample_t **samples, long length, float halflife)
-{
- if (cr) {
- int i;
- for (i = 0; i < n >> 1; i++) {
- dumb_remove_clicks(cr[i << 1], samples[i], length, 2, halflife);
- dumb_remove_clicks(cr[(i << 1) + 1], samples[i] + 1, length, 2, halflife);
- }
- if (n & 1)
- dumb_remove_clicks(cr[i << 1], samples[i], length, 1, halflife);
- }
+void dumb_remove_clicks_array(int n, DUMB_CLICK_REMOVER **cr,
+ sample_t **samples, long length, float halflife) {
+ if (cr) {
+ int i;
+ for (i = 0; i<n>> 1; i++) {
+ dumb_remove_clicks(cr[i << 1], samples[i], length, 2, halflife);
+ dumb_remove_clicks(cr[(i << 1) + 1], samples[i] + 1, length, 2,
+ halflife);
+ }
+ if (n & 1)
+ dumb_remove_clicks(cr[i << 1], samples[i], length, 1, halflife);
+ }
}
-
-
-void dumb_click_remover_get_offset_array(int n, DUMB_CLICK_REMOVER **cr, sample_t *offset)
-{
- if (cr) {
- int i;
- for (i = 0; i < n; i++)
- if (cr[i]) offset[i] += cr[i]->offset;
- }
+void dumb_click_remover_get_offset_array(int n, DUMB_CLICK_REMOVER **cr,
+ sample_t *offset) {
+ if (cr) {
+ int i;
+ for (i = 0; i < n; i++)
+ if (cr[i])
+ offset[i] += cr[i]->offset;
+ }
}
-
-
-void dumb_destroy_click_remover_array(int n, DUMB_CLICK_REMOVER **cr)
-{
- if (cr) {
- int i;
- for (i = 0; i < n; i++) dumb_destroy_click_remover(cr[i]);
- free(cr);
- }
+void dumb_destroy_click_remover_array(int n, DUMB_CLICK_REMOVER **cr) {
+ if (cr) {
+ int i;
+ for (i = 0; i < n; i++)
+ dumb_destroy_click_remover(cr[i]);
+ free(cr);
+ }
}
--- a/src/helpers/fir_resampler.c
+++ b/src/helpers/fir_resampler.c
@@ -18,11 +18,9 @@
/* exp slope to 31/32 of ln(8) */
static const double fir_ratios[32] = {
- 1.000, 1.067, 1.139, 1.215, 1.297, 1.384, 1.477, 1.576,
- 1.682, 1.795, 1.915, 2.044, 2.181, 2.327, 2.484, 2.650,
- 2.828, 3.018, 3.221, 3.437, 3.668, 3.914, 4.177, 4.458,
- 4.757, 5.076, 5.417, 5.781, 6.169, 6.583, 7.025, 7.497
-};
+ 1.000, 1.067, 1.139, 1.215, 1.297, 1.384, 1.477, 1.576, 1.682, 1.795, 1.915,
+ 2.044, 2.181, 2.327, 2.484, 2.650, 2.828, 3.018, 3.221, 3.437, 3.668, 3.914,
+ 4.177, 4.458, 4.757, 5.076, 5.417, 5.781, 6.169, 6.583, 7.025, 7.497};
static fir_impulse fir_impulses[32][fir_max_res];
@@ -29,77 +27,69 @@
#undef PI
#define PI 3.1415926535897932384626433832795029
-static void gen_sinc( double rolloff, int width, double offset, double spacing, double scale,
- int count, short* out )
-{
- double const maxh = 256;
- double const step = PI / maxh * spacing;
- double const to_w = maxh * 2 / width;
- double const pow_a_n = pow( rolloff, maxh );
-
- double angle = (count / 2 - 1 + offset) * -step;
+static void gen_sinc(double rolloff, int width, double offset, double spacing,
+ double scale, int count, short *out) {
+ double const maxh = 256;
+ double const step = PI / maxh * spacing;
+ double const to_w = maxh * 2 / width;
+ double const pow_a_n = pow(rolloff, maxh);
- scale /= maxh * 2;
+ double angle = (count / 2 - 1 + offset) * -step;
- while ( count-- )
- {
- double w;
- *out++ = 0;
- w = angle * to_w;
- if ( fabs( w ) < PI )
- {
- double rolloff_cos_a = rolloff * cos( angle );
- double num = 1 - rolloff_cos_a -
- pow_a_n * cos( maxh * angle ) +
- pow_a_n * rolloff * cos( (maxh - 1) * angle );
- double den = 1 - rolloff_cos_a - rolloff_cos_a + rolloff * rolloff;
- double sinc = scale * num / den - scale;
-
- out [-1] = (short) (cos( w ) * sinc + sinc);
- }
- angle += step;
- }
+ scale /= maxh * 2;
+
+ while (count--) {
+ double w;
+ *out++ = 0;
+ w = angle * to_w;
+ if (fabs(w) < PI) {
+ double rolloff_cos_a = rolloff * cos(angle);
+ double num = 1 - rolloff_cos_a - pow_a_n * cos(maxh * angle) +
+ pow_a_n * rolloff * cos((maxh - 1) * angle);
+ double den = 1 - rolloff_cos_a - rolloff_cos_a + rolloff * rolloff;
+ double sinc = scale * num / den - scale;
+
+ out[-1] = (short)(cos(w) * sinc + sinc);
+ }
+ angle += step;
+ }
}
-typedef struct fir_resampler
-{
+typedef struct fir_resampler {
int write_pos, write_filled;
int read_pos, read_filled;
unsigned short phase;
unsigned int phase_inc;
- unsigned int ratio_set;
+ unsigned int ratio_set;
int buffer_in[fir_buffer_size * 2];
int buffer_out[fir_buffer_size];
} fir_resampler;
-void * fir_resampler_create()
-{
- fir_resampler * r = ( fir_resampler * ) malloc( sizeof(fir_resampler) );
- if ( !r ) return 0;
+void *fir_resampler_create() {
+ fir_resampler *r = (fir_resampler *)malloc(sizeof(fir_resampler));
+ if (!r)
+ return 0;
- r->write_pos = 0;
+ r->write_pos = 0;
r->write_filled = 0;
r->read_pos = 0;
r->read_filled = 0;
r->phase = 0;
r->phase_inc = 0;
- r->ratio_set = 0;
- memset( r->buffer_in, 0, sizeof(r->buffer_in) );
- memset( r->buffer_out, 0, sizeof(r->buffer_out) );
+ r->ratio_set = 0;
+ memset(r->buffer_in, 0, sizeof(r->buffer_in));
+ memset(r->buffer_out, 0, sizeof(r->buffer_out));
- return r;
+ return r;
}
-void fir_resampler_delete(void * _r)
-{
- free( _r );
-}
+void fir_resampler_delete(void *_r) { free(_r); }
-void * fir_resampler_dup(void * _r)
-{
- fir_resampler * r_in = ( fir_resampler * ) _r;
- fir_resampler * r_out = ( fir_resampler * ) malloc( sizeof(fir_resampler) );
- if ( !r_out ) return 0;
+void *fir_resampler_dup(void *_r) {
+ fir_resampler *r_in = (fir_resampler *)_r;
+ fir_resampler *r_out = (fir_resampler *)malloc(sizeof(fir_resampler));
+ if (!r_out)
+ return 0;
r_out->write_pos = r_in->write_pos;
r_out->write_filled = r_in->write_filled;
@@ -107,175 +97,160 @@
r_out->read_filled = r_in->read_filled;
r_out->phase = r_in->phase;
r_out->phase_inc = r_in->phase_inc;
- r_out->ratio_set = r_in->ratio_set;
- memcpy( r_out->buffer_in, r_in->buffer_in, sizeof(r_in->buffer_in) );
- memcpy( r_out->buffer_out, r_in->buffer_out, sizeof(r_in->buffer_out) );
+ r_out->ratio_set = r_in->ratio_set;
+ memcpy(r_out->buffer_in, r_in->buffer_in, sizeof(r_in->buffer_in));
+ memcpy(r_out->buffer_out, r_in->buffer_out, sizeof(r_in->buffer_out));
return r_out;
}
-int fir_resampler_get_free_count(void *_r)
-{
- fir_resampler * r = ( fir_resampler * ) _r;
+int fir_resampler_get_free_count(void *_r) {
+ fir_resampler *r = (fir_resampler *)_r;
return fir_buffer_size - r->write_filled;
}
-int fir_resampler_ready(void *_r)
-{
- fir_resampler * r = ( fir_resampler * ) _r;
+int fir_resampler_ready(void *_r) {
+ fir_resampler *r = (fir_resampler *)_r;
return r->write_filled > fir_adj_width;
}
-void fir_resampler_clear(void *_r)
-{
- fir_resampler * r = ( fir_resampler * ) _r;
+void fir_resampler_clear(void *_r) {
+ fir_resampler *r = (fir_resampler *)_r;
r->write_pos = 0;
r->write_filled = 0;
r->read_pos = 0;
r->read_filled = 0;
r->phase = 0;
- memset( r->buffer_in, 0, sizeof(r->buffer_in) );
+ memset(r->buffer_in, 0, sizeof(r->buffer_in));
}
-void fir_resampler_set_rate(void *_r, double new_factor)
-{
- fir_resampler * r = ( fir_resampler * ) _r;
- r->phase_inc = (int)( new_factor * 65536.0 );
- r->ratio_set = 0;
- while ( r->ratio_set < 31 && new_factor > fir_ratios[ r->ratio_set ] ) r->ratio_set++;
+void fir_resampler_set_rate(void *_r, double new_factor) {
+ fir_resampler *r = (fir_resampler *)_r;
+ r->phase_inc = (int)(new_factor * 65536.0);
+ r->ratio_set = 0;
+ while (r->ratio_set < 31 && new_factor > fir_ratios[r->ratio_set])
+ r->ratio_set++;
}
-void fir_resampler_write_sample(void *_r, short s)
-{
- fir_resampler * r = ( fir_resampler * ) _r;
+void fir_resampler_write_sample(void *_r, short s) {
+ fir_resampler *r = (fir_resampler *)_r;
- if ( r->write_filled < fir_buffer_size )
- {
+ if (r->write_filled < fir_buffer_size) {
int s32 = s;
- r->buffer_in[ r->write_pos ] = s32;
- r->buffer_in[ r->write_pos + fir_buffer_size ] = s32;
+ r->buffer_in[r->write_pos] = s32;
+ r->buffer_in[r->write_pos + fir_buffer_size] = s32;
++r->write_filled;
- r->write_pos = ( r->write_pos + 1 ) % fir_buffer_size;
- }
+ r->write_pos = (r->write_pos + 1) % fir_buffer_size;
+ }
}
-void fir_init()
-{
- double const rolloff = 0.999;
+void fir_init() {
+ double const rolloff = 0.999;
double const gain = 1.0;
int const res = fir_max_res;
- int i;
+ int i;
- for (i = 0; i < 32; i++)
- {
- double const ratio_ = fir_ratios[ i ];
-
- double fraction = 1.0 / (double)fir_max_res;
+ for (i = 0; i < 32; i++) {
+ double const ratio_ = fir_ratios[i];
- double const filter = (ratio_ < 1.0) ? 1.0 : 1.0 / ratio_;
- double pos = 0.0;
- short* out = (short*) fir_impulses[ i ];
- int n;
- for ( n = res; --n >= 0; )
- {
- gen_sinc( rolloff, (int) (fir_adj_width * filter + 1) & ~1, pos, filter,
- (double) (0x7FFF * gain * filter), (int) fir_adj_width, out );
- out += fir_adj_width;
+ double fraction = 1.0 / (double)fir_max_res;
- pos += fraction;
- }
- }
+ double const filter = (ratio_ < 1.0) ? 1.0 : 1.0 / ratio_;
+ double pos = 0.0;
+ short *out = (short *)fir_impulses[i];
+ int n;
+ for (n = res; --n >= 0;) {
+ gen_sinc(rolloff, (int)(fir_adj_width * filter + 1) & ~1, pos,
+ filter, (double)(0x7FFF * gain * filter),
+ (int)fir_adj_width, out);
+ out += fir_adj_width;
+
+ pos += fraction;
+ }
+ }
}
-int fir_resampler_run(void *_r, int ** out_, int * out_end)
-{
- fir_resampler * r = ( fir_resampler * ) _r;
+int fir_resampler_run(void *_r, int **out_, int *out_end) {
+ fir_resampler *r = (fir_resampler *)_r;
int in_size = r->write_filled;
- int const* in_ = r->buffer_in + fir_buffer_size + r->write_pos - r->write_filled;
- int used = 0;
- in_size -= fir_write_offset;
- if ( in_size > 0 )
- {
- int* out = *out_;
- int const* in = in_;
- int const* const in_end = in + in_size;
+ int const *in_ =
+ r->buffer_in + fir_buffer_size + r->write_pos - r->write_filled;
+ int used = 0;
+ in_size -= fir_write_offset;
+ if (in_size > 0) {
+ int *out = *out_;
+ int const *in = in_;
+ int const *const in_end = in + in_size;
int phase = r->phase;
int phase_inc = r->phase_inc;
- int ratio_set = r->ratio_set;
-
- do
- {
- // accumulate in extended precision
- short const* imp = fir_impulses[ratio_set][(phase & 0xFFC0) >> 6];
- int pt = imp [0];
- int s = pt * in [0];
+ int ratio_set = r->ratio_set;
+
+ do {
+ // accumulate in extended precision
+ short const *imp = fir_impulses[ratio_set][(phase & 0xFFC0) >> 6];
+ int pt = imp[0];
+ int s = pt * in[0];
int n;
- if ( out >= out_end )
- break;
- for ( n = (fir_adj_width - 2) / 2; n; --n )
- {
- pt = imp [1];
- s += pt * in [1];
-
- // pre-increment more efficient on some RISC processors
- imp += 2;
- pt = imp [0];
- in += 2;
- s += pt * in [0];
- }
- pt = imp [1];
- s += pt * in [1];
+ if (out >= out_end)
+ break;
+ for (n = (fir_adj_width - 2) / 2; n; --n) {
+ pt = imp[1];
+ s += pt * in[1];
+ // pre-increment more efficient on some RISC processors
+ imp += 2;
+ pt = imp[0];
+ in += 2;
+ s += pt * in[0];
+ }
+ pt = imp[1];
+ s += pt * in[1];
+
phase += phase_inc;
in += (phase >> 16) - fir_adj_width + 2;
phase &= 65535;
-
- *out++ = (int) (s >> 7);
- }
- while ( in < in_end );
-
+
+ *out++ = (int)(s >> 7);
+ } while (in < in_end);
+
r->phase = phase;
- *out_ = out;
+ *out_ = out;
- used = in - in_;
+ used = in - in_;
r->write_filled -= used;
- }
-
- return used;
+ }
+
+ return used;
}
-int fir_resampler_get_sample(void *_r)
-{
- fir_resampler * r = ( fir_resampler * ) _r;
- if ( r->read_filled < 1 )
- {
- int write_pos = ( r->read_pos + r->read_filled ) % fir_buffer_size;
+int fir_resampler_get_sample(void *_r) {
+ fir_resampler *r = (fir_resampler *)_r;
+ if (r->read_filled < 1) {
+ int write_pos = (r->read_pos + r->read_filled) % fir_buffer_size;
int write_size = fir_buffer_size - write_pos;
- int * out = r->buffer_out + write_pos;
- if ( write_size > ( fir_buffer_size - r->read_filled ) )
+ int *out = r->buffer_out + write_pos;
+ if (write_size > (fir_buffer_size - r->read_filled))
write_size = fir_buffer_size - r->read_filled;
- fir_resampler_run( r, &out, out + write_size );
+ fir_resampler_run(r, &out, out + write_size);
r->read_filled += out - r->buffer_out - write_pos;
}
- if ( r->read_filled < 1 )
+ if (r->read_filled < 1)
return 0;
- return r->buffer_out[ r->read_pos ];
+ return r->buffer_out[r->read_pos];
}
-void fir_resampler_remove_sample(void *_r)
-{
- fir_resampler * r = ( fir_resampler * ) _r;
- if ( r->read_filled > 0 )
- {
+void fir_resampler_remove_sample(void *_r) {
+ fir_resampler *r = (fir_resampler *)_r;
+ if (r->read_filled > 0) {
--r->read_filled;
- r->read_pos = ( r->read_pos + 1 ) % fir_buffer_size;
+ r->read_pos = (r->read_pos + 1) % fir_buffer_size;
}
}
--- a/src/helpers/lpc.c
+++ b/src/helpers/lpc.c
@@ -55,105 +55,108 @@
/* Input : n elements of time doamin data
Output: m lpc coefficients, excitation energy */
-static float vorbis_lpc_from_data(float *data,float *lpci,long n,long m){
- double *aut=alloca(sizeof(*aut)*(m+1));
- double *lpc=alloca(sizeof(*lpc)*(m));
- double error;
- double epsilon;
- long i,j;
+static float vorbis_lpc_from_data(float *data, float *lpci, long n, long m) {
+ double *aut = alloca(sizeof(*aut) * (m + 1));
+ double *lpc = alloca(sizeof(*lpc) * (m));
+ double error;
+ double epsilon;
+ long i, j;
- /* autocorrelation, p+1 lag coefficients */
- j=m+1;
- while(j--){
- double d=0; /* double needed for accumulator depth */
- for(i=j;i<n;i++)d+=(double)data[i]*data[(i-j)];
- aut[j]=d;
- }
+ /* autocorrelation, p+1 lag coefficients */
+ j = m + 1;
+ while (j--) {
+ double d = 0; /* double needed for accumulator depth */
+ for (i = j; i < n; i++)
+ d += (double)data[i] * data[(i - j)];
+ aut[j] = d;
+ }
- /* Generate lpc coefficients from autocorr values */
+ /* Generate lpc coefficients from autocorr values */
- /* set our noise floor to about -100dB */
- error=aut[0] * (1. + 1e-10);
- epsilon=1e-9*aut[0]+1e-10;
+ /* set our noise floor to about -100dB */
+ error = aut[0] * (1. + 1e-10);
+ epsilon = 1e-9 * aut[0] + 1e-10;
- for(i=0;i<m;i++){
- double r= -aut[i+1];
+ for (i = 0; i < m; i++) {
+ double r = -aut[i + 1];
- if(error<epsilon){
- memset(lpc+i,0,(m-i)*sizeof(*lpc));
- goto done;
- }
+ if (error < epsilon) {
+ memset(lpc + i, 0, (m - i) * sizeof(*lpc));
+ goto done;
+ }
- /* Sum up this iteration's reflection coefficient; note that in
- Vorbis we don't save it. If anyone wants to recycle this code
- and needs reflection coefficients, save the results of 'r' from
- each iteration. */
+ /* Sum up this iteration's reflection coefficient; note that in
+ Vorbis we don't save it. If anyone wants to recycle this code
+ and needs reflection coefficients, save the results of 'r' from
+ each iteration. */
- for(j=0;j<i;j++)r-=lpc[j]*aut[i-j];
- r/=error;
+ for (j = 0; j < i; j++)
+ r -= lpc[j] * aut[i - j];
+ r /= error;
- /* Update LPC coefficients and total error */
+ /* Update LPC coefficients and total error */
- lpc[i]=r;
- for(j=0;j<i/2;j++){
- double tmp=lpc[j];
+ lpc[i] = r;
+ for (j = 0; j < i / 2; j++) {
+ double tmp = lpc[j];
- lpc[j]+=r*lpc[i-1-j];
- lpc[i-1-j]+=r*tmp;
+ lpc[j] += r * lpc[i - 1 - j];
+ lpc[i - 1 - j] += r * tmp;
+ }
+ if (i & 1)
+ lpc[j] += lpc[j] * r;
+
+ error *= 1. - r * r;
}
- if(i&1)lpc[j]+=lpc[j]*r;
- error*=1.-r*r;
+done:
- }
-
- done:
-
- /* slightly damp the filter */
- {
- double g = .99;
- double damp = g;
- for(j=0;j<m;j++){
- lpc[j]*=damp;
- damp*=g;
+ /* slightly damp the filter */
+ {
+ double g = .99;
+ double damp = g;
+ for (j = 0; j < m; j++) {
+ lpc[j] *= damp;
+ damp *= g;
+ }
}
- }
- for(j=0;j<m;j++)lpci[j]=(float)lpc[j];
+ for (j = 0; j < m; j++)
+ lpci[j] = (float)lpc[j];
- /* we need the error value to know how big an impulse to hit the
- filter with later */
+ /* we need the error value to know how big an impulse to hit the
+ filter with later */
- return error;
+ return error;
}
-static void vorbis_lpc_predict(float *coeff,float *prime,long m,
- float *data,long n){
+static void vorbis_lpc_predict(float *coeff, float *prime, long m, float *data,
+ long n) {
- /* in: coeff[0...m-1] LPC coefficients
- prime[0...m-1] initial values (allocated size of n+m-1)
- out: data[0...n-1] data samples */
+ /* in: coeff[0...m-1] LPC coefficients
+ prime[0...m-1] initial values (allocated size of n+m-1)
+ out: data[0...n-1] data samples */
- long i,j,o,p;
- float y;
- float *work=alloca(sizeof(*work)*(m+n));
+ long i, j, o, p;
+ float y;
+ float *work = alloca(sizeof(*work) * (m + n));
- if(!prime)
- for(i=0;i<m;i++)
- work[i]=0.f;
- else
- for(i=0;i<m;i++)
- work[i]=prime[i];
+ if (!prime)
+ for (i = 0; i < m; i++)
+ work[i] = 0.f;
+ else
+ for (i = 0; i < m; i++)
+ work[i] = prime[i];
- for(i=0;i<n;i++){
- y=0;
- o=i;
- p=m;
- for(j=0;j<m;j++)
- y-=work[o++]*coeff[--p];
+ for (i = 0; i < n; i++) {
+ y = 0;
+ o = i;
+ p = m;
+ for (j = 0; j < m; j++)
+ y -= work[o++] * coeff[--p];
- data[i]=work[o]=y;
- }
+ data[i] = work[o] = y;
+ }
}
#include "dumb.h"
@@ -160,160 +163,155 @@
#include "internal/dumb.h"
#include "internal/it.h"
-enum { lpc_max = 256 }; /* Maximum number of input samples to train the function */
-enum { lpc_order = 32 }; /* Order of the filter */
-enum { lpc_extra = 64 }; /* How many samples of padding to predict or silence */
+enum {
+ lpc_max = 256
+}; /* Maximum number of input samples to train the function */
+enum { lpc_order = 32 }; /* Order of the filter */
+enum { lpc_extra = 64 }; /* How many samples of padding to predict or silence */
+/* This extra sample padding is really only needed by the FIR resampler, but it
+ * helps the other resamplers as well. */
-/* This extra sample padding is really only needed by the FIR resampler, but it helps the other resamplers as well. */
-
-int dumb_it_add_lpc(struct DUMB_IT_SIGDATA *sigdata){
+int dumb_it_add_lpc(struct DUMB_IT_SIGDATA *sigdata) {
float lpc[lpc_order * 2];
float lpc_input[lpc_max * 2];
float lpc_output[lpc_extra * 2];
- signed char * s8;
- signed short * s16;
+ signed char *s8;
+ signed short *s16;
long n, o, offset, lpc_samples;
- for ( n = 0; n < sigdata->n_samples; n++ ) {
- IT_SAMPLE * sample = sigdata->sample + n;
- if ( ( sample->flags & ( IT_SAMPLE_EXISTS | IT_SAMPLE_LOOP) ) == IT_SAMPLE_EXISTS &&
- sample->data != NULL ) {
- /* If we have enough sample data to train the filter, use the filter to generate the padding */
- if ( sample->length >= lpc_order ) {
+ for (n = 0; n < sigdata->n_samples; n++) {
+ IT_SAMPLE *sample = sigdata->sample + n;
+ if ((sample->flags & (IT_SAMPLE_EXISTS | IT_SAMPLE_LOOP)) ==
+ IT_SAMPLE_EXISTS &&
+ sample->data != NULL) {
+ /* If we have enough sample data to train the filter, use the filter
+ * to generate the padding */
+ if (sample->length >= lpc_order) {
lpc_samples = sample->length;
- if (lpc_samples > lpc_max) lpc_samples = lpc_max;
+ if (lpc_samples > lpc_max)
+ lpc_samples = lpc_max;
offset = sample->length - lpc_samples;
- if ( sample->flags & IT_SAMPLE_STEREO )
- {
- if ( sample->flags & IT_SAMPLE_16BIT )
- {
- s16 = ( signed short * ) sample->data;
+ if (sample->flags & IT_SAMPLE_STEREO) {
+ if (sample->flags & IT_SAMPLE_16BIT) {
+ s16 = (signed short *)sample->data;
s16 += offset * 2;
- for ( o = 0; o < lpc_samples; o++ )
- {
- lpc_input[ o ] = s16[ o * 2 + 0 ];
- lpc_input[ o + lpc_max ] = s16[ o * 2 + 1 ];
+ for (o = 0; o < lpc_samples; o++) {
+ lpc_input[o] = s16[o * 2 + 0];
+ lpc_input[o + lpc_max] = s16[o * 2 + 1];
}
- }
- else
- {
- s8 = ( signed char * ) sample->data;
+ } else {
+ s8 = (signed char *)sample->data;
s8 += offset * 2;
- for ( o = 0; o < lpc_samples; o++ )
- {
- lpc_input[ o ] = s8[ o * 2 + 0 ];
- lpc_input[ o + lpc_max ] = s8[ o * 2 + 1 ];
+ for (o = 0; o < lpc_samples; o++) {
+ lpc_input[o] = s8[o * 2 + 0];
+ lpc_input[o + lpc_max] = s8[o * 2 + 1];
}
}
- vorbis_lpc_from_data( lpc_input, lpc, lpc_samples, lpc_order );
- vorbis_lpc_from_data( lpc_input + lpc_max, lpc + lpc_order, lpc_samples, lpc_order );
+ vorbis_lpc_from_data(lpc_input, lpc, lpc_samples,
+ lpc_order);
+ vorbis_lpc_from_data(lpc_input + lpc_max, lpc + lpc_order,
+ lpc_samples, lpc_order);
- vorbis_lpc_predict( lpc, lpc_input + lpc_samples - lpc_order, lpc_order, lpc_output, lpc_extra );
- vorbis_lpc_predict( lpc + lpc_order, lpc_input + lpc_max + lpc_samples - lpc_order, lpc_order, lpc_output + lpc_extra, lpc_extra );
+ vorbis_lpc_predict(lpc, lpc_input + lpc_samples - lpc_order,
+ lpc_order, lpc_output, lpc_extra);
+ vorbis_lpc_predict(
+ lpc + lpc_order,
+ lpc_input + lpc_max + lpc_samples - lpc_order,
+ lpc_order, lpc_output + lpc_extra, lpc_extra);
- if ( sample->flags & IT_SAMPLE_16BIT )
- {
- s16 = ( signed short * ) realloc( sample->data, ( sample->length + lpc_extra ) * 2 * sizeof(short) );
- if ( !s16 )
- return -1;
-
+ if (sample->flags & IT_SAMPLE_16BIT) {
+ s16 = (signed short *)realloc(
+ sample->data,
+ (sample->length + lpc_extra) * 2 * sizeof(short));
+ if (!s16)
+ return -1;
+
sample->data = s16;
s16 += sample->length * 2;
sample->length += lpc_extra;
- for ( o = 0; o < lpc_extra; o++ )
- {
- s16[ o * 2 + 0 ] = lpc_output[ o ];
- s16[ o * 2 + 1 ] = lpc_output[ o + lpc_extra ];
+ for (o = 0; o < lpc_extra; o++) {
+ s16[o * 2 + 0] = lpc_output[o];
+ s16[o * 2 + 1] = lpc_output[o + lpc_extra];
}
- }
- else
- {
- s8 = ( signed char * ) realloc( sample->data, ( sample->length + lpc_extra ) * 2 );
- if ( !s8 )
- return -1;
-
+ } else {
+ s8 = (signed char *)realloc(
+ sample->data, (sample->length + lpc_extra) * 2);
+ if (!s8)
+ return -1;
+
sample->data = s8;
s8 += sample->length * 2;
sample->length += lpc_extra;
- for ( o = 0; o < lpc_extra; o++ )
- {
- s8[ o * 2 + 0 ] = lpc_output[ o ];
- s8[ o * 2 + 1 ] = lpc_output[ o + lpc_extra ];
+ for (o = 0; o < lpc_extra; o++) {
+ s8[o * 2 + 0] = lpc_output[o];
+ s8[o * 2 + 1] = lpc_output[o + lpc_extra];
}
}
- }
- else
- {
- if ( sample->flags & IT_SAMPLE_16BIT )
- {
- s16 = ( signed short * ) sample->data;
+ } else {
+ if (sample->flags & IT_SAMPLE_16BIT) {
+ s16 = (signed short *)sample->data;
s16 += offset;
- for ( o = 0; o < lpc_samples; o++ )
- {
- lpc_input[ o ] = s16[ o ];
+ for (o = 0; o < lpc_samples; o++) {
+ lpc_input[o] = s16[o];
}
- }
- else
- {
- s8 = ( signed char * ) sample->data;
+ } else {
+ s8 = (signed char *)sample->data;
s8 += offset;
- for ( o = 0; o < lpc_samples; o++ )
- {
- lpc_input[ o ] = s8[ o ];
+ for (o = 0; o < lpc_samples; o++) {
+ lpc_input[o] = s8[o];
}
}
- vorbis_lpc_from_data( lpc_input, lpc, lpc_samples, lpc_order );
+ vorbis_lpc_from_data(lpc_input, lpc, lpc_samples,
+ lpc_order);
- vorbis_lpc_predict( lpc, lpc_input + lpc_samples - lpc_order, lpc_order, lpc_output, lpc_extra );
+ vorbis_lpc_predict(lpc, lpc_input + lpc_samples - lpc_order,
+ lpc_order, lpc_output, lpc_extra);
- if ( sample->flags & IT_SAMPLE_16BIT )
- {
- s16 = ( signed short * ) realloc( sample->data, ( sample->length + lpc_extra ) * sizeof(short) );
- if (!s16)
- return -1;
-
+ if (sample->flags & IT_SAMPLE_16BIT) {
+ s16 = (signed short *)realloc(
+ sample->data,
+ (sample->length + lpc_extra) * sizeof(short));
+ if (!s16)
+ return -1;
+
sample->data = s16;
s16 += sample->length;
sample->length += lpc_extra;
- for ( o = 0; o < lpc_extra; o++ )
- {
- s16[ o ] = lpc_output[ o ];
+ for (o = 0; o < lpc_extra; o++) {
+ s16[o] = lpc_output[o];
}
- }
- else
- {
- s8 = ( signed char * ) realloc( sample->data, sample->length + lpc_extra );
- if ( !s8 )
- return -1;
-
+ } else {
+ s8 = (signed char *)realloc(sample->data,
+ sample->length + lpc_extra);
+ if (!s8)
+ return -1;
+
sample->data = s8;
s8 += sample->length;
sample->length += lpc_extra;
- for ( o = 0; o < lpc_extra; o++ )
- {
- s8[ o ] = lpc_output[ o ];
+ for (o = 0; o < lpc_extra; o++) {
+ s8[o] = lpc_output[o];
}
}
}
- }
- else
+ } else
/* Otherwise, pad with silence. */
{
- void *data;
+ void *data;
offset = sample->length;
lpc_samples = lpc_extra;
@@ -320,21 +318,23 @@
sample->length += lpc_samples;
n = 1;
- if ( sample->flags & IT_SAMPLE_STEREO ) n *= 2;
- if ( sample->flags & IT_SAMPLE_16BIT ) n *= 2;
+ if (sample->flags & IT_SAMPLE_STEREO)
+ n *= 2;
+ if (sample->flags & IT_SAMPLE_16BIT)
+ n *= 2;
offset *= n;
lpc_samples *= n;
- data = realloc( sample->data, offset + lpc_samples );
- if (!data)
- return -1;
- sample->data = data;
-
- memset( (char*)data + offset, 0, lpc_samples );
+ data = realloc(sample->data, offset + lpc_samples);
+ if (!data)
+ return -1;
+ sample->data = data;
+
+ memset((char *)data + offset, 0, lpc_samples);
}
}
}
-
- return 0;
+
+ return 0;
}
--- a/src/helpers/memfile.c
+++ b/src/helpers/memfile.c
@@ -22,96 +22,73 @@
#include "dumb.h"
-
-
typedef struct MEMFILE MEMFILE;
-struct MEMFILE
-{
- const char *ptr, *ptr_begin;
- size_t left, size;
+struct MEMFILE {
+ const char *ptr, *ptr_begin;
+ size_t left, size;
};
-
-
-static int dumb_memfile_skip(void *f, dumb_off_t n)
-{
- MEMFILE *m = f;
- if (n > (dumb_off_t)m->left) return -1;
- m->ptr += n;
- m->left -= n;
- return 0;
+static int dumb_memfile_skip(void *f, dumb_off_t n) {
+ MEMFILE *m = f;
+ if (n > (dumb_off_t)m->left)
+ return -1;
+ m->ptr += n;
+ m->left -= n;
+ return 0;
}
-
-
-static int dumb_memfile_getc(void *f)
-{
- MEMFILE *m = f;
- if (m->left <= 0) return -1;
- m->left--;
- return *(const unsigned char *)m->ptr++;
+static int dumb_memfile_getc(void *f) {
+ MEMFILE *m = f;
+ if (m->left <= 0)
+ return -1;
+ m->left--;
+ return *(const unsigned char *)m->ptr++;
}
-
-
-static dumb_ssize_t dumb_memfile_getnc(char *ptr, size_t n, void *f)
-{
- MEMFILE *m = f;
- if (n > m->left) n = m->left;
- memcpy(ptr, m->ptr, n);
- m->ptr += n;
- m->left -= n;
- return n;
+static dumb_ssize_t dumb_memfile_getnc(char *ptr, size_t n, void *f) {
+ MEMFILE *m = f;
+ if (n > m->left)
+ n = m->left;
+ memcpy(ptr, m->ptr, n);
+ m->ptr += n;
+ m->left -= n;
+ return n;
}
+static void dumb_memfile_close(void *f) { free(f); }
+static int dumb_memfile_seek(void *f, dumb_off_t n) {
+ MEMFILE *m = f;
-static void dumb_memfile_close(void *f)
-{
- free(f);
-}
+ m->ptr = m->ptr_begin + n;
+ m->left = m->size - n;
-
-static int dumb_memfile_seek(void *f, dumb_off_t n)
-{
- MEMFILE *m = f;
-
- m->ptr = m->ptr_begin + n;
- m->left = m->size - n;
-
- return 0;
+ return 0;
}
-
-static dumb_off_t dumb_memfile_get_size(void *f)
-{
- MEMFILE *m = f;
- return m->size;
+static dumb_off_t dumb_memfile_get_size(void *f) {
+ MEMFILE *m = f;
+ return m->size;
}
+static const DUMBFILE_SYSTEM memfile_dfs = {NULL,
+ &dumb_memfile_skip,
+ &dumb_memfile_getc,
+ &dumb_memfile_getnc,
+ &dumb_memfile_close,
+ &dumb_memfile_seek,
+ &dumb_memfile_get_size};
-static const DUMBFILE_SYSTEM memfile_dfs = {
- NULL,
- &dumb_memfile_skip,
- &dumb_memfile_getc,
- &dumb_memfile_getnc,
- &dumb_memfile_close,
- &dumb_memfile_seek,
- &dumb_memfile_get_size
-};
+DUMBFILE *dumbfile_open_memory(const char *data, size_t size) {
+ MEMFILE *m = malloc(sizeof(*m));
+ if (!m)
+ return NULL;
+ m->ptr_begin = data;
+ m->ptr = data;
+ m->left = size;
+ m->size = size;
-
-DUMBFILE *dumbfile_open_memory(const char *data, size_t size)
-{
- MEMFILE *m = malloc(sizeof(*m));
- if (!m) return NULL;
-
- m->ptr_begin = data;
- m->ptr = data;
- m->left = size;
- m->size = size;
-
- return dumbfile_open_ex(m, &memfile_dfs);
+ return dumbfile_open_ex(m, &memfile_dfs);
}
--- a/src/helpers/resamp2.inc
+++ b/src/helpers/resamp2.inc
@@ -42,51 +42,57 @@
* FIXME: these comments are somewhat out of date now.
*/
-
-
#define SUFFIX3 _1
/* For convenience, returns nonzero on stop. */
-static int process_pickup(DUMB_RESAMPLER *resampler)
-{
- if (resampler->overshot < 0) {
- resampler->overshot = 0;
- dumb_resample(resampler, NULL, 2, MONO_DEST_VOLUME_ZEROS, 1.0f); /* Doesn't matter which SUFFIX3. */
- COPYSRC(resampler->X, 0, resampler->X, 1);
- }
+static int process_pickup(DUMB_RESAMPLER *resampler) {
+ if (resampler->overshot < 0) {
+ resampler->overshot = 0;
+ dumb_resample(resampler, NULL, 2, MONO_DEST_VOLUME_ZEROS,
+ 1.0f); /* Doesn't matter which SUFFIX3. */
+ COPYSRC(resampler->X, 0, resampler->X, 1);
+ }
- for (;;) {
- SRCTYPE *src = resampler->src;
+ for (;;) {
+ SRCTYPE *src = resampler->src;
- if (resampler->dir < 0) {
- if (resampler->overshot >= 3 && resampler->pos+3 >= resampler->start) COPYSRC(resampler->X, 0, src, resampler->pos+3);
- if (resampler->overshot >= 2 && resampler->pos+2 >= resampler->start) COPYSRC(resampler->X, 1, src, resampler->pos+2);
- if (resampler->overshot >= 1 && resampler->pos+1 >= resampler->start) COPYSRC(resampler->X, 2, src, resampler->pos+1);
- resampler->overshot = (int)(resampler->start - resampler->pos - 1);
- } else {
- if (resampler->overshot >= 3 && resampler->pos-3 < resampler->end) COPYSRC(resampler->X, 0, src, resampler->pos-3);
- if (resampler->overshot >= 2 && resampler->pos-2 < resampler->end) COPYSRC(resampler->X, 1, src, resampler->pos-2);
- if (resampler->overshot >= 1 && resampler->pos-1 < resampler->end) COPYSRC(resampler->X, 2, src, resampler->pos-1);
- resampler->overshot = (int)(resampler->pos - resampler->end);
- }
+ if (resampler->dir < 0) {
+ if (resampler->overshot >= 3 &&
+ resampler->pos + 3 >= resampler->start)
+ COPYSRC(resampler->X, 0, src, resampler->pos + 3);
+ if (resampler->overshot >= 2 &&
+ resampler->pos + 2 >= resampler->start)
+ COPYSRC(resampler->X, 1, src, resampler->pos + 2);
+ if (resampler->overshot >= 1 &&
+ resampler->pos + 1 >= resampler->start)
+ COPYSRC(resampler->X, 2, src, resampler->pos + 1);
+ resampler->overshot = (int)(resampler->start - resampler->pos - 1);
+ } else {
+ if (resampler->overshot >= 3 && resampler->pos - 3 < resampler->end)
+ COPYSRC(resampler->X, 0, src, resampler->pos - 3);
+ if (resampler->overshot >= 2 && resampler->pos - 2 < resampler->end)
+ COPYSRC(resampler->X, 1, src, resampler->pos - 2);
+ if (resampler->overshot >= 1 && resampler->pos - 1 < resampler->end)
+ COPYSRC(resampler->X, 2, src, resampler->pos - 1);
+ resampler->overshot = (int)(resampler->pos - resampler->end);
+ }
- if (resampler->overshot < 0) {
- resampler->overshot = 0;
- return 0;
- }
+ if (resampler->overshot < 0) {
+ resampler->overshot = 0;
+ return 0;
+ }
- if (!resampler->pickup) {
- resampler->dir = 0;
- return 1;
- }
- (*resampler->pickup)(resampler, resampler->pickup_data);
- if (resampler->dir == 0) return 1;
- ASSERT(resampler->dir == -1 || resampler->dir == 1);
- }
+ if (!resampler->pickup) {
+ resampler->dir = 0;
+ return 1;
+ }
+ (*resampler->pickup)(resampler, resampler->pickup_data);
+ if (resampler->dir == 0)
+ return 1;
+ ASSERT(resampler->dir == -1 || resampler->dir == 1);
+ }
}
-
-
/* Create mono destination resampler. */
/* SUFFIX3 was set above. */
#define VOLUME_PARAMETERS MONO_DEST_VOLUME_PARAMETERS
@@ -101,47 +107,57 @@
/* Create stereo destination resampler. */
#define SUFFIX3 _2
-#define VOLUME_PARAMETERS DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right
-#define VOLUME_VARIABLES lvol, lvolr, lvold, lvolt, lvolm, rvol, rvolr, rvold, rvolt, rvolm
-#define SET_VOLUME_VARIABLES { \
- if ( volume_left ) { \
- lvolr = volume_left->volume; \
- lvold = volume_left->delta; \
- lvolt = volume_left->target; \
- lvolm = volume_left->mix; \
- lvol = lvolr * lvolm; \
- if ( lvolr == lvolt ) volume_left = NULL; \
- } else { \
- lvol = 0; \
- lvold = 0; \
- lvolt = 0; \
- lvolm = 0; \
- } \
- if ( volume_right ) { \
- rvolr = volume_right->volume; \
- rvold = volume_right->delta; \
- rvolt = volume_right->target; \
- rvolm = volume_right->mix; \
- rvol = rvolr * rvolm; \
- if ( rvolr == rvolt ) volume_right = NULL; \
- } else { \
- rvol = 0; \
- rvold = 0; \
- rvolt = 0; \
- rvolm = 0; \
- } \
-}
-#define RETURN_VOLUME_VARIABLES { \
- if ( volume_left ) volume_left->volume = lvolr; \
- if ( volume_right ) volume_right->volume = rvolr; \
-}
+#define VOLUME_PARAMETERS \
+ DUMB_VOLUME_RAMP_INFO *volume_left, DUMB_VOLUME_RAMP_INFO *volume_right
+#define VOLUME_VARIABLES \
+ lvol, lvolr, lvold, lvolt, lvolm, rvol, rvolr, rvold, rvolt, rvolm
+#define SET_VOLUME_VARIABLES \
+ { \
+ if (volume_left) { \
+ lvolr = volume_left->volume; \
+ lvold = volume_left->delta; \
+ lvolt = volume_left->target; \
+ lvolm = volume_left->mix; \
+ lvol = lvolr * lvolm; \
+ if (lvolr == lvolt) \
+ volume_left = NULL; \
+ } else { \
+ lvol = 0; \
+ lvold = 0; \
+ lvolt = 0; \
+ lvolm = 0; \
+ } \
+ if (volume_right) { \
+ rvolr = volume_right->volume; \
+ rvold = volume_right->delta; \
+ rvolt = volume_right->target; \
+ rvolm = volume_right->mix; \
+ rvol = rvolr * rvolm; \
+ if (rvolr == rvolt) \
+ volume_right = NULL; \
+ } else { \
+ rvol = 0; \
+ rvold = 0; \
+ rvolt = 0; \
+ rvolm = 0; \
+ } \
+ }
+#define RETURN_VOLUME_VARIABLES \
+ { \
+ if (volume_left) \
+ volume_left->volume = lvolr; \
+ if (volume_right) \
+ volume_right->volume = rvolr; \
+ }
#define VOLUMES_ARE_ZERO (lvol == 0 && lvolt == 0 && rvol == 0 && rvolt == 0)
#define PEEK_FIR STEREO_DEST_PEEK_FIR
#define MIX_FIR STEREO_DEST_MIX_FIR
-#define MIX_ZEROS(op) { *dst++ op 0; *dst++ op 0; }
+#define MIX_ZEROS(op) \
+ { \
+ *dst++ op 0; \
+ *dst++ op 0; \
+ }
#include "resamp3.inc"
-
-
#undef MONO_DEST_VOLUMES_ARE_ZERO
#undef SET_MONO_DEST_VOLUME_VARIABLES
--- a/src/helpers/resamp3.inc
+++ b/src/helpers/resamp3.inc
@@ -42,210 +42,230 @@
* FIXME: these comments are somewhat out of date now.
*/
+long dumb_resample(DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size,
+ VOLUME_PARAMETERS, float delta) {
+ int dt, inv_dt;
+ float VOLUME_VARIABLES;
+ long done;
+ long todo;
+ LONG_LONG todo64;
+ int quality;
+ if (!resampler || resampler->dir == 0)
+ return 0;
+ ASSERT(resampler->dir == -1 || resampler->dir == 1);
-long dumb_resample(DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size, VOLUME_PARAMETERS, float delta)
-{
- int dt, inv_dt;
- float VOLUME_VARIABLES;
- long done;
- long todo;
- LONG_LONG todo64;
- int quality;
+ done = 0;
+ dt = (int)(delta * 65536.0 + 0.5);
+ if (dt == 0 || dt == (int)-0x80000000)
+ return 0;
+ inv_dt = (int)(1.0 / delta * 65536.0 + 0.5);
+ SET_VOLUME_VARIABLES;
- if (!resampler || resampler->dir == 0) return 0;
- ASSERT(resampler->dir == -1 || resampler->dir == 1);
+ if (VOLUMES_ARE_ZERO)
+ dst = NULL;
- done = 0;
- dt = (int)(delta * 65536.0 + 0.5);
- if (dt == 0 || dt == (int)-0x80000000) return 0;
- inv_dt = (int)(1.0 / delta * 65536.0 + 0.5);
- SET_VOLUME_VARIABLES;
+ _dumb_init_cubic();
- if (VOLUMES_ARE_ZERO) dst = NULL;
+ quality = resampler->quality;
- _dumb_init_cubic();
+ while (done < dst_size) {
+ if (process_pickup(resampler)) {
+ RETURN_VOLUME_VARIABLES;
+ return done;
+ }
- quality = resampler->quality;
+ if ((resampler->dir ^ dt) < 0)
+ dt = -dt;
- while (done < dst_size) {
- if (process_pickup(resampler)) {
- RETURN_VOLUME_VARIABLES;
- return done;
- }
+ if (resampler->dir < 0)
+ todo64 = ((((LONG_LONG)(resampler->pos - resampler->start) << 16) +
+ resampler->subpos - dt) /
+ -dt);
+ else
+ todo64 = ((((LONG_LONG)(resampler->end - resampler->pos) << 16) -
+ resampler->subpos - 1 + dt) /
+ dt);
- if ((resampler->dir ^ dt) < 0)
- dt = -dt;
+ if (todo64 < 0)
+ todo = 0;
+ else if (todo64 > dst_size - done)
+ todo = dst_size - done;
+ else
+ todo = (long)todo64;
- if (resampler->dir < 0)
- todo64 = ((((LONG_LONG)(resampler->pos - resampler->start) << 16) + resampler->subpos - dt) / -dt);
- else
- todo64 = ((((LONG_LONG)(resampler->end - resampler->pos) << 16) - resampler->subpos - 1 + dt) / dt);
+ done += todo;
- if (todo64 < 0)
- todo = 0;
- else if (todo64 > dst_size - done)
- todo = dst_size - done;
- else
- todo = (long) todo64;
-
- done += todo;
-
- {
- SRCTYPE *src = resampler->src;
- long pos = resampler->pos;
- int subpos = resampler->subpos;
- long diff = pos;
- long overshot;
- if (resampler->dir < 0) {
- if (!dst) {
- /* Silence or simulation */
- LONG_LONG new_subpos = subpos + (LONG_LONG)dt * todo;
- pos += (long)(new_subpos >> 16);
- subpos = (long)new_subpos & 65535;
- } else {
- /* FIR resampling, backwards */
- SRCTYPE *x;
- if ( resampler->fir_resampler_ratio != delta ) {
- resampler_set_rate( resampler->fir_resampler[0], delta );
- resampler_set_rate( resampler->fir_resampler[1], delta );
- resampler->fir_resampler_ratio = delta;
- }
- x = &src[pos*SRC_CHANNELS];
- while ( todo ) {
- while ( ( resampler_get_free_count( resampler->fir_resampler[0] ) ||
- (!resampler_get_sample_count( resampler->fir_resampler[0] )
+ {
+ SRCTYPE *src = resampler->src;
+ long pos = resampler->pos;
+ int subpos = resampler->subpos;
+ long diff = pos;
+ long overshot;
+ if (resampler->dir < 0) {
+ if (!dst) {
+ /* Silence or simulation */
+ LONG_LONG new_subpos = subpos + (LONG_LONG)dt * todo;
+ pos += (long)(new_subpos >> 16);
+ subpos = (long)new_subpos & 65535;
+ } else {
+ /* FIR resampling, backwards */
+ SRCTYPE *x;
+ if (resampler->fir_resampler_ratio != delta) {
+ resampler_set_rate(resampler->fir_resampler[0], delta);
+ resampler_set_rate(resampler->fir_resampler[1], delta);
+ resampler->fir_resampler_ratio = delta;
+ }
+ x = &src[pos * SRC_CHANNELS];
+ while (todo) {
+ while ((resampler_get_free_count(
+ resampler->fir_resampler[0]) ||
+ (!resampler_get_sample_count(
+ resampler->fir_resampler[0])
#if SRC_CHANNELS == 2
- && !resampler_get_sample_count( resampler->fir_resampler[1] )
+ && !resampler_get_sample_count(
+ resampler->fir_resampler[1])
#endif
- ) ) && pos >= resampler->start )
- {
- POKE_FIR(0);
- pos--;
- x -= SRC_CHANNELS;
- }
- if ( !resampler_get_sample_count( resampler->fir_resampler[0] ) ) break;
- MIX_FIR;
- ADVANCE_FIR;
- --todo;
- }
- done -= todo;
- }
- diff = diff - pos;
- overshot = resampler->start - pos - 1;
- if (diff >= 3) {
- COPYSRC2(resampler->X, 0, overshot < 3, src, pos+3);
- COPYSRC2(resampler->X, 1, overshot < 2, src, pos+2);
- COPYSRC2(resampler->X, 2, overshot < 1, src, pos+1);
- } else if (diff >= 2) {
- COPYSRC(resampler->X, 0, resampler->X, 2);
- COPYSRC2(resampler->X, 1, overshot < 2, src, pos+2);
- COPYSRC2(resampler->X, 2, overshot < 1, src, pos+1);
- } else if (diff >= 1) {
- COPYSRC(resampler->X, 0, resampler->X, 1);
- COPYSRC(resampler->X, 1, resampler->X, 2);
- COPYSRC2(resampler->X, 2, overshot < 1, src, pos+1);
- }
- } else {
- if (!dst) {
- /* Silence or simulation */
- LONG_LONG new_subpos = subpos + (LONG_LONG)dt * todo;
- pos += (long)(new_subpos >> 16);
- subpos = (long)new_subpos & 65535;
- } else {
- /* FIR resampling, forwards */
- SRCTYPE *x;
- if ( resampler->fir_resampler_ratio != delta ) {
- resampler_set_rate( resampler->fir_resampler[0], delta );
- resampler_set_rate( resampler->fir_resampler[1], delta );
- resampler->fir_resampler_ratio = delta;
- }
- x = &src[pos*SRC_CHANNELS];
- while ( todo ) {
- while ( ( resampler_get_free_count( resampler->fir_resampler[0] ) ||
- (!resampler_get_sample_count( resampler->fir_resampler[0] )
+ )) &&
+ pos >= resampler->start) {
+ POKE_FIR(0);
+ pos--;
+ x -= SRC_CHANNELS;
+ }
+ if (!resampler_get_sample_count(
+ resampler->fir_resampler[0]))
+ break;
+ MIX_FIR;
+ ADVANCE_FIR;
+ --todo;
+ }
+ done -= todo;
+ }
+ diff = diff - pos;
+ overshot = resampler->start - pos - 1;
+ if (diff >= 3) {
+ COPYSRC2(resampler->X, 0, overshot < 3, src, pos + 3);
+ COPYSRC2(resampler->X, 1, overshot < 2, src, pos + 2);
+ COPYSRC2(resampler->X, 2, overshot < 1, src, pos + 1);
+ } else if (diff >= 2) {
+ COPYSRC(resampler->X, 0, resampler->X, 2);
+ COPYSRC2(resampler->X, 1, overshot < 2, src, pos + 2);
+ COPYSRC2(resampler->X, 2, overshot < 1, src, pos + 1);
+ } else if (diff >= 1) {
+ COPYSRC(resampler->X, 0, resampler->X, 1);
+ COPYSRC(resampler->X, 1, resampler->X, 2);
+ COPYSRC2(resampler->X, 2, overshot < 1, src, pos + 1);
+ }
+ } else {
+ if (!dst) {
+ /* Silence or simulation */
+ LONG_LONG new_subpos = subpos + (LONG_LONG)dt * todo;
+ pos += (long)(new_subpos >> 16);
+ subpos = (long)new_subpos & 65535;
+ } else {
+ /* FIR resampling, forwards */
+ SRCTYPE *x;
+ if (resampler->fir_resampler_ratio != delta) {
+ resampler_set_rate(resampler->fir_resampler[0], delta);
+ resampler_set_rate(resampler->fir_resampler[1], delta);
+ resampler->fir_resampler_ratio = delta;
+ }
+ x = &src[pos * SRC_CHANNELS];
+ while (todo) {
+ while ((resampler_get_free_count(
+ resampler->fir_resampler[0]) ||
+ (!resampler_get_sample_count(
+ resampler->fir_resampler[0])
#if SRC_CHANNELS == 2
- && !resampler_get_sample_count( resampler->fir_resampler[1] )
+ && !resampler_get_sample_count(
+ resampler->fir_resampler[1])
#endif
- ) ) && pos < resampler->end )
- {
- POKE_FIR(0);
- pos++;
- x += SRC_CHANNELS;
- }
- if ( !resampler_get_sample_count( resampler->fir_resampler[0] ) ) break;
- MIX_FIR;
- ADVANCE_FIR;
- --todo;
- }
- done -= todo;
- }
- diff = pos - diff;
- overshot = pos - resampler->end;
- if (diff >= 3) {
- COPYSRC2(resampler->X, 0, overshot < 3, src, pos-3);
- COPYSRC2(resampler->X, 1, overshot < 2, src, pos-2);
- COPYSRC2(resampler->X, 2, overshot < 1, src, pos-1);
- } else if (diff >= 2) {
- COPYSRC(resampler->X, 0, resampler->X, 2);
- COPYSRC2(resampler->X, 1, overshot < 2, src, pos-2);
- COPYSRC2(resampler->X, 2, overshot < 1, src, pos-1);
- } else if (diff >= 1) {
- COPYSRC(resampler->X, 0, resampler->X, 1);
- COPYSRC(resampler->X, 1, resampler->X, 2);
- COPYSRC2(resampler->X, 2, overshot < 1, src, pos-1);
- }
- }
- resampler->pos = pos;
- resampler->subpos = subpos;
- }
- }
+ )) &&
+ pos < resampler->end) {
+ POKE_FIR(0);
+ pos++;
+ x += SRC_CHANNELS;
+ }
+ if (!resampler_get_sample_count(
+ resampler->fir_resampler[0]))
+ break;
+ MIX_FIR;
+ ADVANCE_FIR;
+ --todo;
+ }
+ done -= todo;
+ }
+ diff = pos - diff;
+ overshot = pos - resampler->end;
+ if (diff >= 3) {
+ COPYSRC2(resampler->X, 0, overshot < 3, src, pos - 3);
+ COPYSRC2(resampler->X, 1, overshot < 2, src, pos - 2);
+ COPYSRC2(resampler->X, 2, overshot < 1, src, pos - 1);
+ } else if (diff >= 2) {
+ COPYSRC(resampler->X, 0, resampler->X, 2);
+ COPYSRC2(resampler->X, 1, overshot < 2, src, pos - 2);
+ COPYSRC2(resampler->X, 2, overshot < 1, src, pos - 1);
+ } else if (diff >= 1) {
+ COPYSRC(resampler->X, 0, resampler->X, 1);
+ COPYSRC(resampler->X, 1, resampler->X, 2);
+ COPYSRC2(resampler->X, 2, overshot < 1, src, pos - 1);
+ }
+ }
+ resampler->pos = pos;
+ resampler->subpos = subpos;
+ }
+ }
- RETURN_VOLUME_VARIABLES;
- return done;
+ RETURN_VOLUME_VARIABLES;
+ return done;
}
+void dumb_resample_get_current_sample(DUMB_RESAMPLER *resampler,
+ VOLUME_PARAMETERS, sample_t *dst) {
+ float VOLUME_VARIABLES;
+ SRCTYPE *src;
+ long pos;
+ int subpos;
+ int quality;
+ SRCTYPE *x;
+ if (!resampler || resampler->dir == 0) {
+ MIX_ZEROS(=);
+ return;
+ }
+ ASSERT(resampler->dir == -1 || resampler->dir == 1);
-void dumb_resample_get_current_sample(DUMB_RESAMPLER *resampler, VOLUME_PARAMETERS, sample_t *dst)
-{
- float VOLUME_VARIABLES;
- SRCTYPE *src;
- long pos;
- int subpos;
- int quality;
- SRCTYPE *x;
+ if (process_pickup(resampler)) {
+ MIX_ZEROS(=);
+ return;
+ }
- if (!resampler || resampler->dir == 0) { MIX_ZEROS(=); return; }
- ASSERT(resampler->dir == -1 || resampler->dir == 1);
+ SET_VOLUME_VARIABLES;
- if (process_pickup(resampler)) { MIX_ZEROS(=); return; }
+ if (VOLUMES_ARE_ZERO) {
+ MIX_ZEROS(=);
+ return;
+ }
- SET_VOLUME_VARIABLES;
+ _dumb_init_cubic();
- if (VOLUMES_ARE_ZERO) { MIX_ZEROS(=); return; }
+ quality = resampler->quality;
- _dumb_init_cubic();
+ src = resampler->src;
+ pos = resampler->pos;
+ subpos = resampler->subpos;
+ x = resampler->X;
- quality = resampler->quality;
-
- src = resampler->src;
- pos = resampler->pos;
- subpos = resampler->subpos;
- x = resampler->X;
-
- if (resampler->dir < 0) {
- HEAVYASSERT(pos >= resampler->start);
- /* FIR resampling, backwards */
- PEEK_FIR;
- } else {
- HEAVYASSERT(pos < resampler->end);
- /* FIR resampling, forwards */
- PEEK_FIR;
- }
+ if (resampler->dir < 0) {
+ HEAVYASSERT(pos >= resampler->start);
+ /* FIR resampling, backwards */
+ PEEK_FIR;
+ } else {
+ HEAVYASSERT(pos < resampler->end);
+ /* FIR resampling, forwards */
+ PEEK_FIR;
+ }
}
-
-
#undef MIX_ZEROS
#undef MIX_FIR
--- a/src/helpers/resample.c
+++ b/src/helpers/resample.c
@@ -46,8 +46,6 @@
#include "internal/resampler.h"
#include "internal/dumb.h"
-
-
/* Compile with -DHEAVYDEBUG if you want to make sure the pick-up function is
* called when it should be. There will be a considerable performance hit,
* since at least one condition has to be tested for every sample generated.
@@ -58,15 +56,12 @@
#define HEAVYASSERT(cond)
#endif
-
-
-/* Make MSVC shut the hell up about if ( upd ) UPDATE_VOLUME() conditions being constant */
+/* Make MSVC shut the hell up about if ( upd ) UPDATE_VOLUME() conditions being
+ * constant */
#ifdef _MSC_VER
-#pragma warning(disable:4127 4701)
+#pragma warning(disable : 4127 4701)
#endif
-
-
/* A global variable for controlling resampling quality wherever a local
* specification doesn't override it. The following values are valid:
*
@@ -82,8 +77,6 @@
*/
int dumb_resampling_quality = DUMB_RQ_CUBIC;
-
-
//#define MULSC(a, b) ((int)((LONG_LONG)(a) * (b) >> 16))
//#define MULSC(a, b) ((a) * ((b) >> 2) >> 14)
#define MULSCV(a, b) ((int)((LONG_LONG)(a) * (b) >> 32))
@@ -90,60 +83,54 @@
#define MULSC(a, b) ((int)((LONG_LONG)((a) << 4) * ((b) << 12) >> 32))
#define MULSC16(a, b) ((int)((LONG_LONG)((a) << 12) * ((b) << 12) >> 32))
-
-
/* Executes the content 'iterator' times.
* Clobbers the 'iterator' variable.
* The loop is unrolled by four.
*/
#if 0
-#define LOOP4(iterator, CONTENT) \
-{ \
- if ((iterator) & 2) { \
- CONTENT; \
- CONTENT; \
- } \
- if ((iterator) & 1) { \
- CONTENT; \
- } \
- (iterator) >>= 2; \
- while (iterator) { \
- CONTENT; \
- CONTENT; \
- CONTENT; \
- CONTENT; \
- (iterator)--; \
- } \
-}
+#define LOOP4(iterator, CONTENT) \
+ { \
+ if ((iterator)&2) { \
+ CONTENT; \
+ CONTENT; \
+ } \
+ if ((iterator)&1) { \
+ CONTENT; \
+ } \
+ (iterator) >>= 2; \
+ while (iterator) { \
+ CONTENT; \
+ CONTENT; \
+ CONTENT; \
+ CONTENT; \
+ (iterator)--; \
+ } \
+ }
#else
-#define LOOP4(iterator, CONTENT) \
-{ \
- while ( (iterator)-- ) \
- { \
- CONTENT; \
- } \
-}
+#define LOOP4(iterator, CONTENT) \
+ { \
+ while ((iterator)--) { \
+ CONTENT; \
+ } \
+ }
#endif
-#define PASTERAW(a, b) a ## b /* This does not expand macros in b ... */
-#define PASTE(a, b) PASTERAW(a, b) /* ... but b is expanded during this substitution. */
+#define PASTERAW(a, b) a##b /* This does not expand macros in b ... */
+#define PASTE(a, b) \
+ PASTERAW(a, b) /* ... but b is expanded during this substitution. */
#define X PASTE(x.x, SRCBITS)
+void _dumb_init_cubic(void) {
+ static int done = 0;
+ if (done)
+ return;
+ resampler_init();
-void _dumb_init_cubic(void)
-{
- static int done = 0;
- if (done) return;
-
- resampler_init();
-
- done = 1;
+ done = 1;
}
-
-
/* Create resamplers for 24-in-32-bit source samples. */
/* #define SUFFIX
@@ -153,7 +140,8 @@
*/
#define process_pickup PASTE(process_pickup, SUFFIX2)
#define dumb_resample PASTE(PASTE(dumb_resample, SUFFIX2), SUFFIX3)
-#define dumb_resample_get_current_sample PASTE(PASTE(dumb_resample_get_current_sample, SUFFIX2), SUFFIX3)
+#define dumb_resample_get_current_sample \
+ PASTE(PASTE(dumb_resample_get_current_sample, SUFFIX2), SUFFIX3)
#define SRCTYPE sample_t
#define SRCBITS 24
@@ -165,13 +153,15 @@
#undef dumb_resample
#undef process_pickup
-
/* Now define the proper ones that use SUFFIX. */
#define dumb_reset_resampler PASTE(dumb_reset_resampler, SUFFIX)
#define dumb_start_resampler PASTE(dumb_start_resampler, SUFFIX)
#define process_pickup PASTE(PASTE(process_pickup, SUFFIX), SUFFIX2)
-#define dumb_resample PASTE(PASTE(PASTE(dumb_resample, SUFFIX), SUFFIX2), SUFFIX3)
-#define dumb_resample_get_current_sample PASTE(PASTE(PASTE(dumb_resample_get_current_sample, SUFFIX), SUFFIX2), SUFFIX3)
+#define dumb_resample \
+ PASTE(PASTE(PASTE(dumb_resample, SUFFIX), SUFFIX2), SUFFIX3)
+#define dumb_resample_get_current_sample \
+ PASTE(PASTE(PASTE(dumb_resample_get_current_sample, SUFFIX), SUFFIX2), \
+ SUFFIX3)
#define dumb_end_resampler PASTE(dumb_end_resampler, SUFFIX)
/* Create resamplers for 16-bit source samples. */
@@ -188,7 +178,6 @@
#define FIR(x) (x * (1.0f / 256.0f))
#include "resample.inc"
-
#undef dumb_reset_resampler
#undef dumb_start_resampler
#undef process_pickup
@@ -196,134 +185,148 @@
#undef dumb_resample_get_current_sample
#undef dumb_end_resampler
-
-
-void dumb_reset_resampler_n(int n, DUMB_RESAMPLER *resampler, void *src, int src_channels, long pos, long start, long end, int quality)
-{
- if (n == 8)
- dumb_reset_resampler_8(resampler, src, src_channels, pos, start, end, quality);
- else if (n == 16)
- dumb_reset_resampler_16(resampler, src, src_channels, pos, start, end, quality);
- else
- dumb_reset_resampler(resampler, src, src_channels, pos, start, end, quality);
+void dumb_reset_resampler_n(int n, DUMB_RESAMPLER *resampler, void *src,
+ int src_channels, long pos, long start, long end,
+ int quality) {
+ if (n == 8)
+ dumb_reset_resampler_8(resampler, src, src_channels, pos, start, end,
+ quality);
+ else if (n == 16)
+ dumb_reset_resampler_16(resampler, src, src_channels, pos, start, end,
+ quality);
+ else
+ dumb_reset_resampler(resampler, src, src_channels, pos, start, end,
+ quality);
}
-
-
-DUMB_RESAMPLER *dumb_start_resampler_n(int n, void *src, int src_channels, long pos, long start, long end, int quality)
-{
- if (n == 8)
- return dumb_start_resampler_8(src, src_channels, pos, start, end, quality);
- else if (n == 16)
- return dumb_start_resampler_16(src, src_channels, pos, start, end, quality);
- else
- return dumb_start_resampler(src, src_channels, pos, start, end, quality);
+DUMB_RESAMPLER *dumb_start_resampler_n(int n, void *src, int src_channels,
+ long pos, long start, long end,
+ int quality) {
+ if (n == 8)
+ return dumb_start_resampler_8(src, src_channels, pos, start, end,
+ quality);
+ else if (n == 16)
+ return dumb_start_resampler_16(src, src_channels, pos, start, end,
+ quality);
+ else
+ return dumb_start_resampler(src, src_channels, pos, start, end,
+ quality);
}
-
-
-long dumb_resample_n_1_1(int n, DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size, DUMB_VOLUME_RAMP_INFO * volume, float delta)
-{
- if (n == 8)
- return dumb_resample_8_1_1(resampler, dst, dst_size, volume, delta);
- else if (n == 16)
- return dumb_resample_16_1_1(resampler, dst, dst_size, volume, delta);
- else
- return dumb_resample_1_1(resampler, dst, dst_size, volume, delta);
+long dumb_resample_n_1_1(int n, DUMB_RESAMPLER *resampler, sample_t *dst,
+ long dst_size, DUMB_VOLUME_RAMP_INFO *volume,
+ float delta) {
+ if (n == 8)
+ return dumb_resample_8_1_1(resampler, dst, dst_size, volume, delta);
+ else if (n == 16)
+ return dumb_resample_16_1_1(resampler, dst, dst_size, volume, delta);
+ else
+ return dumb_resample_1_1(resampler, dst, dst_size, volume, delta);
}
-
-
-long dumb_resample_n_1_2(int n, DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, float delta)
-{
- if (n == 8)
- return dumb_resample_8_1_2(resampler, dst, dst_size, volume_left, volume_right, delta);
- else if (n == 16)
- return dumb_resample_16_1_2(resampler, dst, dst_size, volume_left, volume_right, delta);
- else
- return dumb_resample_1_2(resampler, dst, dst_size, volume_left, volume_right, delta);
+long dumb_resample_n_1_2(int n, DUMB_RESAMPLER *resampler, sample_t *dst,
+ long dst_size, DUMB_VOLUME_RAMP_INFO *volume_left,
+ DUMB_VOLUME_RAMP_INFO *volume_right, float delta) {
+ if (n == 8)
+ return dumb_resample_8_1_2(resampler, dst, dst_size, volume_left,
+ volume_right, delta);
+ else if (n == 16)
+ return dumb_resample_16_1_2(resampler, dst, dst_size, volume_left,
+ volume_right, delta);
+ else
+ return dumb_resample_1_2(resampler, dst, dst_size, volume_left,
+ volume_right, delta);
}
-
-
-long dumb_resample_n_2_1(int n, DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, float delta)
-{
- if (n == 8)
- return dumb_resample_8_2_1(resampler, dst, dst_size, volume_left, volume_right, delta);
- else if (n == 16)
- return dumb_resample_16_2_1(resampler, dst, dst_size, volume_left, volume_right, delta);
- else
- return dumb_resample_2_1(resampler, dst, dst_size, volume_left, volume_right, delta);
+long dumb_resample_n_2_1(int n, DUMB_RESAMPLER *resampler, sample_t *dst,
+ long dst_size, DUMB_VOLUME_RAMP_INFO *volume_left,
+ DUMB_VOLUME_RAMP_INFO *volume_right, float delta) {
+ if (n == 8)
+ return dumb_resample_8_2_1(resampler, dst, dst_size, volume_left,
+ volume_right, delta);
+ else if (n == 16)
+ return dumb_resample_16_2_1(resampler, dst, dst_size, volume_left,
+ volume_right, delta);
+ else
+ return dumb_resample_2_1(resampler, dst, dst_size, volume_left,
+ volume_right, delta);
}
-
-
-long dumb_resample_n_2_2(int n, DUMB_RESAMPLER *resampler, sample_t *dst, long dst_size, DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right, float delta)
-{
- if (n == 8)
- return dumb_resample_8_2_2(resampler, dst, dst_size, volume_left, volume_right, delta);
- else if (n == 16)
- return dumb_resample_16_2_2(resampler, dst, dst_size, volume_left, volume_right, delta);
- else
- return dumb_resample_2_2(resampler, dst, dst_size, volume_left, volume_right, delta);
+long dumb_resample_n_2_2(int n, DUMB_RESAMPLER *resampler, sample_t *dst,
+ long dst_size, DUMB_VOLUME_RAMP_INFO *volume_left,
+ DUMB_VOLUME_RAMP_INFO *volume_right, float delta) {
+ if (n == 8)
+ return dumb_resample_8_2_2(resampler, dst, dst_size, volume_left,
+ volume_right, delta);
+ else if (n == 16)
+ return dumb_resample_16_2_2(resampler, dst, dst_size, volume_left,
+ volume_right, delta);
+ else
+ return dumb_resample_2_2(resampler, dst, dst_size, volume_left,
+ volume_right, delta);
}
-
-
-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)
- dumb_resample_get_current_sample_8_1_1(resampler, volume, dst);
- else if (n == 16)
- dumb_resample_get_current_sample_16_1_1(resampler, volume, dst);
- else
- dumb_resample_get_current_sample_1_1(resampler, volume, dst);
+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)
+ dumb_resample_get_current_sample_8_1_1(resampler, volume, dst);
+ else if (n == 16)
+ dumb_resample_get_current_sample_16_1_1(resampler, volume, dst);
+ else
+ dumb_resample_get_current_sample_1_1(resampler, volume, 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)
-{
- if (n == 8)
- dumb_resample_get_current_sample_8_1_2(resampler, volume_left, volume_right, dst);
- else if (n == 16)
- dumb_resample_get_current_sample_16_1_2(resampler, volume_left, volume_right, dst);
- else
- dumb_resample_get_current_sample_1_2(resampler, volume_left, volume_right, 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) {
+ if (n == 8)
+ dumb_resample_get_current_sample_8_1_2(resampler, volume_left,
+ volume_right, dst);
+ else if (n == 16)
+ dumb_resample_get_current_sample_16_1_2(resampler, volume_left,
+ volume_right, dst);
+ else
+ dumb_resample_get_current_sample_1_2(resampler, volume_left,
+ volume_right, 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)
-{
- if (n == 8)
- dumb_resample_get_current_sample_8_2_1(resampler, volume_left, volume_right, dst);
- else if (n == 16)
- dumb_resample_get_current_sample_16_2_1(resampler, volume_left, volume_right, dst);
- else
- dumb_resample_get_current_sample_2_1(resampler, volume_left, volume_right, 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) {
+ if (n == 8)
+ dumb_resample_get_current_sample_8_2_1(resampler, volume_left,
+ volume_right, dst);
+ else if (n == 16)
+ dumb_resample_get_current_sample_16_2_1(resampler, volume_left,
+ volume_right, dst);
+ else
+ dumb_resample_get_current_sample_2_1(resampler, volume_left,
+ volume_right, 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)
-{
- if (n == 8)
- dumb_resample_get_current_sample_8_2_2(resampler, volume_left, volume_right, dst);
- else if (n == 16)
- dumb_resample_get_current_sample_16_2_2(resampler, volume_left, volume_right, dst);
- else
- dumb_resample_get_current_sample_2_2(resampler, volume_left, volume_right, 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) {
+ if (n == 8)
+ dumb_resample_get_current_sample_8_2_2(resampler, volume_left,
+ volume_right, dst);
+ else if (n == 16)
+ dumb_resample_get_current_sample_16_2_2(resampler, volume_left,
+ volume_right, dst);
+ else
+ dumb_resample_get_current_sample_2_2(resampler, volume_left,
+ volume_right, dst);
}
-
-
-void dumb_end_resampler_n(int n, DUMB_RESAMPLER *resampler)
-{
- if (n == 8)
- dumb_end_resampler_8(resampler);
- else if (n == 16)
- dumb_end_resampler_16(resampler);
- else
- dumb_end_resampler(resampler);
+void dumb_end_resampler_n(int n, DUMB_RESAMPLER *resampler) {
+ if (n == 8)
+ dumb_end_resampler_8(resampler);
+ else if (n == 16)
+ dumb_end_resampler_16(resampler);
+ else
+ dumb_end_resampler(resampler);
}
--- a/src/helpers/resample.inc
+++ b/src/helpers/resample.inc
@@ -42,119 +42,126 @@
* FIXME: these comments are somewhat out of date now.
*/
-
-
-void dumb_reset_resampler(DUMB_RESAMPLER *resampler, SRCTYPE *src, int src_channels, long pos, long start, long end, int quality)
-{
- int i;
- resampler->src = src;
- resampler->pos = pos;
- resampler->subpos = 0;
- resampler->start = start;
- resampler->end = end;
- resampler->dir = 1;
- resampler->pickup = NULL;
- resampler->pickup_data = NULL;
- if (quality < 0)
- {
- resampler->quality = 0;
- }
- else if (quality > DUMB_RQ_N_LEVELS - 1)
- {
- resampler->quality = DUMB_RQ_N_LEVELS - 1;
- }
- else
- {
- resampler->quality = quality;
- }
- for (i = 0; i < src_channels*3; i++) resampler->X[i] = 0;
- resampler->overshot = -1;
- resampler->fir_resampler_ratio = 0;
- resampler_clear(resampler->fir_resampler[0]);
- resampler_clear(resampler->fir_resampler[1]);
- resampler_set_quality(resampler->fir_resampler[0], resampler->quality);
- resampler_set_quality(resampler->fir_resampler[1], resampler->quality);
+void dumb_reset_resampler(DUMB_RESAMPLER *resampler, SRCTYPE *src,
+ int src_channels, long pos, long start, long end,
+ int quality) {
+ int i;
+ resampler->src = src;
+ resampler->pos = pos;
+ resampler->subpos = 0;
+ resampler->start = start;
+ resampler->end = end;
+ resampler->dir = 1;
+ resampler->pickup = NULL;
+ resampler->pickup_data = NULL;
+ if (quality < 0) {
+ resampler->quality = 0;
+ } else if (quality > DUMB_RQ_N_LEVELS - 1) {
+ resampler->quality = DUMB_RQ_N_LEVELS - 1;
+ } else {
+ resampler->quality = quality;
+ }
+ for (i = 0; i < src_channels * 3; i++)
+ resampler->X[i] = 0;
+ resampler->overshot = -1;
+ resampler->fir_resampler_ratio = 0;
+ resampler_clear(resampler->fir_resampler[0]);
+ resampler_clear(resampler->fir_resampler[1]);
+ resampler_set_quality(resampler->fir_resampler[0], resampler->quality);
+ resampler_set_quality(resampler->fir_resampler[1], resampler->quality);
}
-
-
-DUMB_RESAMPLER *dumb_start_resampler(SRCTYPE *src, int src_channels, long pos, long start, long end, int quality)
-{
- DUMB_RESAMPLER *resampler = malloc(sizeof(*resampler));
- if (!resampler) return NULL;
- dumb_reset_resampler(resampler, src, src_channels, pos, start, end, quality);
- return resampler;
+DUMB_RESAMPLER *dumb_start_resampler(SRCTYPE *src, int src_channels, long pos,
+ long start, long end, int quality) {
+ DUMB_RESAMPLER *resampler = malloc(sizeof(*resampler));
+ if (!resampler)
+ return NULL;
+ dumb_reset_resampler(resampler, src, src_channels, pos, start, end,
+ quality);
+ return resampler;
}
+#define UPDATE_VOLUME(pvol, vol) \
+ { \
+ if (pvol) { \
+ vol##r += vol##d; \
+ if ((vol##d < 0 && vol##r <= vol##t) || \
+ (vol##d > 0 && vol##r >= vol##t)) { \
+ pvol->volume = pvol->target; \
+ if (pvol->declick_stage == 0 || pvol->declick_stage >= 3) \
+ pvol->declick_stage++; \
+ pvol = NULL; \
+ vol = vol##t * vol##m; \
+ } else { \
+ vol = vol##r * vol##m; \
+ } \
+ } \
+ }
-
-#define UPDATE_VOLUME( pvol, vol ) { \
- if (pvol) { \
- vol##r += vol##d; \
- if ((vol##d < 0 && vol##r <= vol##t) || \
- (vol##d > 0 && vol##r >= vol##t)) { \
- pvol->volume = pvol->target; \
- if ( pvol->declick_stage == 0 || \
- pvol->declick_stage >= 3) \
- pvol->declick_stage++; \
- pvol = NULL; \
- vol = vol##t * vol##m; \
- } else { \
- vol = vol##r * vol##m; \
- } \
- } \
-}
-
-
-
/* Create mono source resampler. */
#define SUFFIX2 _1
#define SRC_CHANNELS 1
#define DIVIDE_BY_SRC_CHANNELS(x) (x)
-#define COPYSRC(dstarray, dstindex, srcarray, srcindex) (dstarray)[dstindex] = (srcarray)[srcindex]
-#define COPYSRC2(dstarray, dstindex, condition, srcarray, srcindex) (dstarray)[dstindex] = condition ? (srcarray)[srcindex] : 0
-#define MONO_DEST_VOLUME_PARAMETERS DUMB_VOLUME_RAMP_INFO * volume
+#define COPYSRC(dstarray, dstindex, srcarray, srcindex) \
+ (dstarray)[dstindex] = (srcarray)[srcindex]
+#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 SET_MONO_DEST_VOLUME_VARIABLES { \
- if ( volume ) { \
- volr = volume->volume; \
- vold = volume->delta; \
- volt = volume->target; \
- volm = volume->mix; \
- vol = volr * volm; \
- if ( volr == volt ) volume = NULL; \
- } else { \
- vol = 0; \
- volr = 0; \
- vold = 0; \
- volt = 0; \
- volm = 0; \
- } \
-}
-#define RETURN_MONO_DEST_VOLUME_VARIABLES if ( volume ) volume->volume = volr
+#define SET_MONO_DEST_VOLUME_VARIABLES \
+ { \
+ if (volume) { \
+ volr = volume->volume; \
+ vold = volume->delta; \
+ volt = volume->target; \
+ volm = volume->mix; \
+ vol = volr * volm; \
+ if (volr == volt) \
+ volume = NULL; \
+ } else { \
+ vol = 0; \
+ volr = 0; \
+ vold = 0; \
+ volt = 0; \
+ volm = 0; \
+ } \
+ }
+#define RETURN_MONO_DEST_VOLUME_VARIABLES \
+ if (volume) \
+ volume->volume = volr
#define MONO_DEST_VOLUMES_ARE_ZERO (vol == 0 && volt == 0)
-#define POKE_FIR(offset) { \
- resampler_write_sample_float( resampler->fir_resampler[0], FIR(x[offset]) ); \
-}
-#define MONO_DEST_PEEK_FIR *dst = resampler_get_sample_float( resampler->fir_resampler[0] ) * vol * 16777216.0f
-#define MONO_DEST_MIX_FIR { \
- *dst++ += resampler_get_sample_float( resampler->fir_resampler[0] ) * vol * 16777216.0f; \
- UPDATE_VOLUME( volume, vol ); \
-}
-#define ADVANCE_FIR resampler_remove_sample( resampler->fir_resampler[0], 1 )
-#define STEREO_DEST_PEEK_FIR { \
- float sample = resampler_get_sample_float( resampler->fir_resampler[0] ); \
- *dst++ = sample * lvol * 16777216.0f; \
- *dst++ = sample * rvol * 16777216.0f; \
-}
-#define STEREO_DEST_MIX_FIR { \
- float sample = resampler_get_sample_float( resampler->fir_resampler[0] ); \
- *dst++ += sample * lvol * 16777216.0f; \
- *dst++ += sample * rvol * 16777216.0f; \
- UPDATE_VOLUME( volume_left, lvol ); \
- UPDATE_VOLUME( volume_right, rvol ); \
-}
+#define POKE_FIR(offset) \
+ { \
+ resampler_write_sample_float(resampler->fir_resampler[0], \
+ FIR(x[offset])); \
+ }
+#define MONO_DEST_PEEK_FIR \
+ *dst = resampler_get_sample_float(resampler->fir_resampler[0]) * vol * \
+ 16777216.0f
+#define MONO_DEST_MIX_FIR \
+ { \
+ *dst++ += resampler_get_sample_float(resampler->fir_resampler[0]) * \
+ vol * 16777216.0f; \
+ UPDATE_VOLUME(volume, vol); \
+ }
+#define ADVANCE_FIR resampler_remove_sample(resampler->fir_resampler[0], 1)
+#define STEREO_DEST_PEEK_FIR \
+ { \
+ float sample = \
+ resampler_get_sample_float(resampler->fir_resampler[0]); \
+ *dst++ = sample * lvol * 16777216.0f; \
+ *dst++ = sample * rvol * 16777216.0f; \
+ }
+#define STEREO_DEST_MIX_FIR \
+ { \
+ float sample = \
+ resampler_get_sample_float(resampler->fir_resampler[0]); \
+ *dst++ += sample * lvol * 16777216.0f; \
+ *dst++ += sample * rvol * 16777216.0f; \
+ UPDATE_VOLUME(volume_left, lvol); \
+ UPDATE_VOLUME(volume_right, rvol); \
+ }
#include "resamp2.inc"
/* Create stereo source resampler. */
@@ -161,97 +168,119 @@
#define SUFFIX2 _2
#define SRC_CHANNELS 2
#define DIVIDE_BY_SRC_CHANNELS(x) ((x) >> 1)
-#define COPYSRC(dstarray, dstindex, srcarray, srcindex) { \
- (dstarray)[(dstindex)*2] = (srcarray)[(srcindex)*2]; \
- (dstarray)[(dstindex)*2+1] = (srcarray)[(srcindex)*2+1]; \
-}
-#define COPYSRC2(dstarray, dstindex, condition, srcarray, srcindex) { \
- if (condition) { \
- (dstarray)[(dstindex)*2] = (srcarray)[(srcindex)*2]; \
- (dstarray)[(dstindex)*2+1] = (srcarray)[(srcindex)*2+1]; \
- } else { \
- (dstarray)[(dstindex)*2] = 0; \
- (dstarray)[(dstindex)*2+1] = 0; \
- } \
-}
+#define COPYSRC(dstarray, dstindex, srcarray, srcindex) \
+ { \
+ (dstarray)[(dstindex)*2] = (srcarray)[(srcindex)*2]; \
+ (dstarray)[(dstindex)*2 + 1] = (srcarray)[(srcindex)*2 + 1]; \
+ }
+#define COPYSRC2(dstarray, dstindex, condition, srcarray, srcindex) \
+ { \
+ if (condition) { \
+ (dstarray)[(dstindex)*2] = (srcarray)[(srcindex)*2]; \
+ (dstarray)[(dstindex)*2 + 1] = (srcarray)[(srcindex)*2 + 1]; \
+ } else { \
+ (dstarray)[(dstindex)*2] = 0; \
+ (dstarray)[(dstindex)*2 + 1] = 0; \
+ } \
+ }
-#define MONO_DEST_VOLUME_PARAMETERS DUMB_VOLUME_RAMP_INFO * volume_left, DUMB_VOLUME_RAMP_INFO * volume_right
-#define MONO_DEST_VOLUME_VARIABLES lvol, lvolr, lvold, lvolt, lvolm, rvol, rvolr, rvold, rvolt, rvolm
+#define MONO_DEST_VOLUME_PARAMETERS \
+ DUMB_VOLUME_RAMP_INFO *volume_left, DUMB_VOLUME_RAMP_INFO *volume_right
+#define MONO_DEST_VOLUME_VARIABLES \
+ lvol, lvolr, lvold, lvolt, lvolm, rvol, rvolr, rvold, rvolt, rvolm
#define MONO_DEST_VOLUME_ZEROS 0, 0
-#define SET_MONO_DEST_VOLUME_VARIABLES { \
- if ( volume_left ) { \
- lvolr = volume_left->volume; \
- lvold = volume_left->delta; \
- lvolt = volume_left->target; \
- lvolm = volume_left->mix; \
- lvol = lvolr * lvolm; \
- if ( lvolr == lvolt ) volume_left = NULL; \
- } else { \
- lvol = 0; \
- lvolr = 0; \
- lvold = 0; \
- lvolt = 0; \
- lvolm = 0; \
- } \
- if ( volume_right ) { \
- rvolr = volume_right->volume; \
- rvold = volume_right->delta; \
- rvolt = volume_right->target; \
- rvolm = volume_right->mix; \
- rvol = rvolr * rvolm; \
- if ( rvolr == rvolt ) volume_right = NULL; \
- } else { \
- rvol = 0; \
- rvolr = 0; \
- rvold = 0; \
- rvolt = 0; \
- rvolm = 0; \
- } \
-}
-#define RETURN_MONO_DEST_VOLUME_VARIABLES { \
- if ( volume_left ) volume_left->volume = lvolr; \
- if ( volume_right ) volume_right->volume = rvolr; \
-}
-#define MONO_DEST_VOLUMES_ARE_ZERO (lvol == 0 && lvolt == 0 && rvol == 0 && rvolt == 0)
-#define POKE_FIR(offset) { \
- resampler_write_sample_float( resampler->fir_resampler[0], FIR(x[(offset)*2+0]) ); \
- resampler_write_sample_float( resampler->fir_resampler[1], FIR(x[(offset)*2+1]) ); \
-}
-#define MONO_DEST_PEEK_FIR { \
- *dst = (resampler_get_sample_float( resampler->fir_resampler[0] ) * lvol + \
- resampler_get_sample_float( resampler->fir_resampler[1] ) * rvol) * 16777216.0f; \
-}
-#define MONO_DEST_MIX_FIR { \
- *dst++ += (resampler_get_sample_float( resampler->fir_resampler[0] ) * lvol + \
- resampler_get_sample_float( resampler->fir_resampler[1] ) * rvol) * 16777216.0f; \
- UPDATE_VOLUME( volume_left, lvol ); \
- UPDATE_VOLUME( volume_right, rvol ); \
-}
-#define ADVANCE_FIR { \
- resampler_remove_sample( resampler->fir_resampler[0], 1 ); \
- resampler_remove_sample( resampler->fir_resampler[1], 1 ); \
-}
-#define STEREO_DEST_PEEK_FIR { \
- *dst++ = resampler_get_sample_float( resampler->fir_resampler[0] ) * lvol * 16777216.0f; \
- *dst++ = resampler_get_sample_float( resampler->fir_resampler[1] ) * rvol * 16777216.0f; \
-}
-#define STEREO_DEST_MIX_FIR { \
- *dst++ += resampler_get_sample_float( resampler->fir_resampler[0] ) * lvol * 16777216.0f; \
- *dst++ += resampler_get_sample_float( resampler->fir_resampler[1] ) * rvol * 16777216.0f; \
- UPDATE_VOLUME( volume_left, lvol ); \
- UPDATE_VOLUME( volume_right, rvol ); \
-}
+#define SET_MONO_DEST_VOLUME_VARIABLES \
+ { \
+ if (volume_left) { \
+ lvolr = volume_left->volume; \
+ lvold = volume_left->delta; \
+ lvolt = volume_left->target; \
+ lvolm = volume_left->mix; \
+ lvol = lvolr * lvolm; \
+ if (lvolr == lvolt) \
+ volume_left = NULL; \
+ } else { \
+ lvol = 0; \
+ lvolr = 0; \
+ lvold = 0; \
+ lvolt = 0; \
+ lvolm = 0; \
+ } \
+ if (volume_right) { \
+ rvolr = volume_right->volume; \
+ rvold = volume_right->delta; \
+ rvolt = volume_right->target; \
+ rvolm = volume_right->mix; \
+ rvol = rvolr * rvolm; \
+ if (rvolr == rvolt) \
+ volume_right = NULL; \
+ } else { \
+ rvol = 0; \
+ rvolr = 0; \
+ rvold = 0; \
+ rvolt = 0; \
+ rvolm = 0; \
+ } \
+ }
+#define RETURN_MONO_DEST_VOLUME_VARIABLES \
+ { \
+ if (volume_left) \
+ volume_left->volume = lvolr; \
+ if (volume_right) \
+ volume_right->volume = rvolr; \
+ }
+#define MONO_DEST_VOLUMES_ARE_ZERO \
+ (lvol == 0 && lvolt == 0 && rvol == 0 && rvolt == 0)
+#define POKE_FIR(offset) \
+ { \
+ resampler_write_sample_float(resampler->fir_resampler[0], \
+ FIR(x[(offset)*2 + 0])); \
+ resampler_write_sample_float(resampler->fir_resampler[1], \
+ FIR(x[(offset)*2 + 1])); \
+ }
+#define MONO_DEST_PEEK_FIR \
+ { \
+ *dst = \
+ (resampler_get_sample_float(resampler->fir_resampler[0]) * lvol + \
+ resampler_get_sample_float(resampler->fir_resampler[1]) * rvol) * \
+ 16777216.0f; \
+ }
+#define MONO_DEST_MIX_FIR \
+ { \
+ *dst++ += \
+ (resampler_get_sample_float(resampler->fir_resampler[0]) * lvol + \
+ resampler_get_sample_float(resampler->fir_resampler[1]) * rvol) * \
+ 16777216.0f; \
+ UPDATE_VOLUME(volume_left, lvol); \
+ UPDATE_VOLUME(volume_right, rvol); \
+ }
+#define ADVANCE_FIR \
+ { \
+ resampler_remove_sample(resampler->fir_resampler[0], 1); \
+ resampler_remove_sample(resampler->fir_resampler[1], 1); \
+ }
+#define STEREO_DEST_PEEK_FIR \
+ { \
+ *dst++ = resampler_get_sample_float(resampler->fir_resampler[0]) * \
+ lvol * 16777216.0f; \
+ *dst++ = resampler_get_sample_float(resampler->fir_resampler[1]) * \
+ rvol * 16777216.0f; \
+ }
+#define STEREO_DEST_MIX_FIR \
+ { \
+ *dst++ += resampler_get_sample_float(resampler->fir_resampler[0]) * \
+ lvol * 16777216.0f; \
+ *dst++ += resampler_get_sample_float(resampler->fir_resampler[1]) * \
+ rvol * 16777216.0f; \
+ UPDATE_VOLUME(volume_left, lvol); \
+ UPDATE_VOLUME(volume_right, rvol); \
+ }
#include "resamp2.inc"
-
-
-void dumb_end_resampler(DUMB_RESAMPLER *resampler)
-{
- if (resampler)
- free(resampler);
+void dumb_end_resampler(DUMB_RESAMPLER *resampler) {
+ if (resampler)
+ free(resampler);
}
-
-
#undef FIR
#undef SRCBITS
--- a/src/helpers/resampler.c
+++ b/src/helpers/resampler.c
@@ -2,7 +2,8 @@
#include <string.h>
#define _USE_MATH_DEFINES
#include <math.h>
-#if defined(_USE_SSE) && (defined(_M_IX86) || defined(__i386__) || defined(_M_X64) || defined(__amd64__))
+#if defined(_USE_SSE) && (defined(_M_IX86) || defined(__i386__) || \
+ defined(_M_X64) || defined(__amd64__))
#include <xmmintrin.h>
#define RESAMPLER_SSE
#endif
@@ -19,9 +20,9 @@
#endif
#ifdef _MSC_VER
-#define ALIGNED _declspec(align(16))
+#define ALIGNED _declspec(align(16))
#else
-#define ALIGNED __attribute__((aligned(16)))
+#define ALIGNED __attribute__((aligned(16)))
#endif
#ifndef M_PI
@@ -33,7 +34,9 @@
enum { RESAMPLER_SHIFT = 10 };
enum { RESAMPLER_SHIFT_EXTRA = 8 };
enum { RESAMPLER_RESOLUTION = 1 << RESAMPLER_SHIFT };
-enum { RESAMPLER_RESOLUTION_EXTRA = 1 << (RESAMPLER_SHIFT + RESAMPLER_SHIFT_EXTRA) };
+enum {
+ RESAMPLER_RESOLUTION_EXTRA = 1 << (RESAMPLER_SHIFT + RESAMPLER_SHIFT_EXTRA)
+};
enum { SINC_WIDTH = 16 };
enum { SINC_SAMPLES = RESAMPLER_RESOLUTION * SINC_WIDTH };
enum { CUBIC_SAMPLES = RESAMPLER_RESOLUTION * 4 };
@@ -49,13 +52,9 @@
enum { resampler_buffer_size = SINC_WIDTH * 4 };
-static int fEqual(const float b, const float a)
-{
- return fabs(a - b) < 1.0e-6;
-}
+static int fEqual(const float b, const float a) { return fabs(a - b) < 1.0e-6; }
-static float sinc(float x)
-{
+static float sinc(float x) {
return fEqual(x, 0.0) ? 1.0 : sin(x * M_PI) / (x * M_PI);
}
@@ -63,40 +62,30 @@
#ifdef _MSC_VER
#include <intrin.h>
#elif defined(__clang__) || defined(__GNUC__)
-static inline void
-__cpuid(int *data, int selector)
-{
+static inline void __cpuid(int *data, int selector) {
#if defined(__PIC__) && defined(__i386__)
__asm("xchgl %%ebx, %%esi; cpuid; xchgl %%ebx, %%esi"
- : "=a" (data[0]),
- "=S" (data[1]),
- "=c" (data[2]),
- "=d" (data[3])
- : "0" (selector));
+ : "=a"(data[0]), "=S"(data[1]), "=c"(data[2]), "=d"(data[3])
+ : "0"(selector));
#elif defined(__PIC__) && defined(__amd64__)
__asm("xchg{q} {%%}rbx, %q1; cpuid; xchg{q} {%%}rbx, %q1"
- : "=a" (data[0]),
- "=&r" (data[1]),
- "=c" (data[2]),
- "=d" (data[3])
- : "0" (selector));
+ : "=a"(data[0]), "=&r"(data[1]), "=c"(data[2]), "=d"(data[3])
+ : "0"(selector));
#else
__asm("cpuid"
- : "=a" (data[0]),
- "=b" (data[1]),
- "=c" (data[2]),
- "=d" (data[3])
- : "0" (selector));
+ : "=a"(data[0]), "=b"(data[1]), "=c"(data[2]), "=d"(data[3])
+ : "0"(selector));
#endif
}
#else
-#define __cpuid(a,b) memset((a), 0, sizeof(int) * 4)
+#define __cpuid(a, b) memset((a), 0, sizeof(int) * 4)
#endif
static int query_cpu_feature_sse() {
int buffer[4];
- __cpuid(buffer,1);
- if ((buffer[3]&(1<<25)) == 0) return 0;
+ __cpuid(buffer, 1);
+ if ((buffer[3] & (1 << 25)) == 0)
+ return 0;
return 1;
}
@@ -103,12 +92,10 @@
static int resampler_has_sse = 0;
#endif
-void resampler_init(void)
-{
+void resampler_init(void) {
unsigned i;
double dx = (float)(SINC_WIDTH) / SINC_SAMPLES, x = 0.0;
- for (i = 0; i < SINC_SAMPLES + 1; ++i, x += dx)
- {
+ for (i = 0; i < SINC_SAMPLES + 1; ++i, x += dx) {
float y = x / SINC_WIDTH;
#if 0
// Blackman
@@ -115,10 +102,12 @@
float window = 0.42659 - 0.49656 * cos(M_PI + M_PI * y) + 0.076849 * cos(2.0 * M_PI * y);
#elif 1
// Nuttal 3 term
- float window = 0.40897 + 0.5 * cos(M_PI * y) + 0.09103 * cos(2.0 * M_PI * y);
+ float window =
+ 0.40897 + 0.5 * cos(M_PI * y) + 0.09103 * cos(2.0 * M_PI * y);
#elif 0
// C.R.Helmrich's 2 term window
- float window = 0.79445 * cos(0.5 * M_PI * y) + 0.20555 * cos(1.5 * M_PI * y);
+ float window =
+ 0.79445 * cos(0.5 * M_PI * y) + 0.20555 * cos(1.5 * M_PI * y);
#elif 0
// Lanczos
float window = sinc(y);
@@ -128,12 +117,12 @@
}
dx = 1.0 / (float)(RESAMPLER_RESOLUTION);
x = 0.0;
- for (i = 0; i < RESAMPLER_RESOLUTION; ++i, x += dx)
- {
- cubic_lut[i*4] = (float)(-0.5 * x * x * x + x * x - 0.5 * x);
- cubic_lut[i*4+1] = (float)( 1.5 * x * x * x - 2.5 * x * x + 1.0);
- cubic_lut[i*4+2] = (float)(-1.5 * x * x * x + 2.0 * x * x + 0.5 * x);
- cubic_lut[i*4+3] = (float)( 0.5 * x * x * x - 0.5 * x * x);
+ for (i = 0; i < RESAMPLER_RESOLUTION; ++i, x += dx) {
+ cubic_lut[i * 4] = (float)(-0.5 * x * x * x + x * x - 0.5 * x);
+ cubic_lut[i * 4 + 1] = (float)(1.5 * x * x * x - 2.5 * x * x + 1.0);
+ cubic_lut[i * 4 + 2] =
+ (float)(-1.5 * x * x * x + 2.0 * x * x + 0.5 * x);
+ cubic_lut[i * 4 + 3] = (float)(0.5 * x * x * x - 0.5 * x * x);
}
#ifdef RESAMPLER_SSE
resampler_has_sse = query_cpu_feature_sse();
@@ -140,8 +129,7 @@
#endif
}
-typedef struct resampler
-{
+typedef struct resampler {
int write_pos, write_filled;
int read_pos, read_filled;
float phase;
@@ -157,10 +145,10 @@
float buffer_out[resampler_buffer_size + SINC_WIDTH * 2 - 1];
} resampler;
-void * resampler_create(void)
-{
- resampler * r = ( resampler * ) malloc( sizeof(resampler) );
- if ( !r ) return 0;
+void *resampler_create(void) {
+ resampler *r = (resampler *)malloc(sizeof(resampler));
+ if (!r)
+ return 0;
r->write_pos = SINC_WIDTH - 1;
r->write_filled = 0;
@@ -175,21 +163,18 @@
r->delay_removed = -1;
r->last_amp = 0;
r->accumulator = 0;
- memset( r->buffer_in, 0, sizeof(r->buffer_in) );
- memset( r->buffer_out, 0, sizeof(r->buffer_out) );
+ memset(r->buffer_in, 0, sizeof(r->buffer_in));
+ memset(r->buffer_out, 0, sizeof(r->buffer_out));
return r;
}
-void resampler_delete(void * _r)
-{
- free( _r );
-}
+void resampler_delete(void *_r) { free(_r); }
-void * resampler_dup(const void * _r)
-{
- void * r_out = malloc( sizeof(resampler) );
- if ( !r_out ) return 0;
+void *resampler_dup(const void *_r) {
+ void *r_out = malloc(sizeof(resampler));
+ if (!r_out)
+ return 0;
resampler_dup_inplace(r_out, _r);
@@ -196,10 +181,9 @@
return r_out;
}
-void resampler_dup_inplace(void *_d, const void *_s)
-{
- const resampler * r_in = ( const resampler * ) _s;
- resampler * r_out = ( resampler * ) _d;
+void resampler_dup_inplace(void *_d, const void *_s) {
+ const resampler *r_in = (const resampler *)_s;
+ resampler *r_out = (resampler *)_d;
r_out->write_pos = r_in->write_pos;
r_out->write_filled = r_in->write_filled;
@@ -214,27 +198,26 @@
r_out->delay_removed = r_in->delay_removed;
r_out->last_amp = r_in->last_amp;
r_out->accumulator = r_in->accumulator;
- memcpy( r_out->buffer_in, r_in->buffer_in, sizeof(r_in->buffer_in) );
- memcpy( r_out->buffer_out, r_in->buffer_out, sizeof(r_in->buffer_out) );
+ memcpy(r_out->buffer_in, r_in->buffer_in, sizeof(r_in->buffer_in));
+ memcpy(r_out->buffer_out, r_in->buffer_out, sizeof(r_in->buffer_out));
}
-void resampler_set_quality(void *_r, int quality)
-{
- resampler * r = ( resampler * ) _r;
+void resampler_set_quality(void *_r, int quality) {
+ resampler *r = (resampler *)_r;
if (quality < RESAMPLER_QUALITY_MIN)
quality = RESAMPLER_QUALITY_MIN;
else if (quality > RESAMPLER_QUALITY_MAX)
quality = RESAMPLER_QUALITY_MAX;
- if ( r->quality != quality )
- {
- if ( quality == RESAMPLER_QUALITY_BLEP || r->quality == RESAMPLER_QUALITY_BLEP ||
- quality == RESAMPLER_QUALITY_BLAM || r->quality == RESAMPLER_QUALITY_BLAM )
- {
+ if (r->quality != quality) {
+ if (quality == RESAMPLER_QUALITY_BLEP ||
+ r->quality == RESAMPLER_QUALITY_BLEP ||
+ quality == RESAMPLER_QUALITY_BLAM ||
+ r->quality == RESAMPLER_QUALITY_BLAM) {
r->read_pos = 0;
r->read_filled = 0;
r->last_amp = 0;
r->accumulator = 0;
- memset( r->buffer_out, 0, sizeof(r->buffer_out) );
+ memset(r->buffer_out, 0, sizeof(r->buffer_out));
}
r->delay_added = -1;
r->delay_removed = -1;
@@ -242,37 +225,32 @@
r->quality = (unsigned char)quality;
}
-int resampler_get_free_count(void *_r)
-{
- resampler * r = ( resampler * ) _r;
+int resampler_get_free_count(void *_r) {
+ resampler *r = (resampler *)_r;
return resampler_buffer_size - r->write_filled;
}
-static int resampler_min_filled(resampler *r)
-{
- switch (r->quality)
- {
+static int resampler_min_filled(resampler *r) {
+ switch (r->quality) {
default:
case RESAMPLER_QUALITY_ZOH:
case RESAMPLER_QUALITY_BLEP:
return 1;
-
+
case RESAMPLER_QUALITY_LINEAR:
case RESAMPLER_QUALITY_BLAM:
return 2;
-
+
case RESAMPLER_QUALITY_CUBIC:
return 4;
-
+
case RESAMPLER_QUALITY_SINC:
return SINC_WIDTH * 2;
}
}
-static int resampler_input_delay(resampler *r)
-{
- switch (r->quality)
- {
+static int resampler_input_delay(resampler *r) {
+ switch (r->quality) {
default:
case RESAMPLER_QUALITY_ZOH:
case RESAMPLER_QUALITY_BLEP:
@@ -279,19 +257,17 @@
case RESAMPLER_QUALITY_LINEAR:
case RESAMPLER_QUALITY_BLAM:
return 0;
-
+
case RESAMPLER_QUALITY_CUBIC:
return 1;
-
+
case RESAMPLER_QUALITY_SINC:
return SINC_WIDTH - 1;
}
}
-static int resampler_output_delay(resampler *r)
-{
- switch (r->quality)
- {
+static int resampler_output_delay(resampler *r) {
+ switch (r->quality) {
default:
case RESAMPLER_QUALITY_ZOH:
case RESAMPLER_QUALITY_LINEAR:
@@ -298,7 +274,7 @@
case RESAMPLER_QUALITY_CUBIC:
case RESAMPLER_QUALITY_SINC:
return 0;
-
+
case RESAMPLER_QUALITY_BLEP:
case RESAMPLER_QUALITY_BLAM:
return SINC_WIDTH - 1;
@@ -305,15 +281,13 @@
}
}
-int resampler_ready(void *_r)
-{
- resampler * r = ( resampler * ) _r;
+int resampler_ready(void *_r) {
+ resampler *r = (resampler *)_r;
return r->write_filled > resampler_min_filled(r);
}
-void resampler_clear(void *_r)
-{
- resampler * r = ( resampler * ) _r;
+void resampler_clear(void *_r) {
+ resampler *r = (resampler *)_r;
r->write_pos = SINC_WIDTH - 1;
r->write_filled = 0;
r->read_pos = 0;
@@ -322,9 +296,10 @@
r->delay_added = -1;
r->delay_removed = -1;
memset(r->buffer_in, 0, (SINC_WIDTH - 1) * sizeof(r->buffer_in[0]));
- memset(r->buffer_in + resampler_buffer_size, 0, (SINC_WIDTH - 1) * sizeof(r->buffer_in[0]));
- if (r->quality == RESAMPLER_QUALITY_BLEP || r->quality == RESAMPLER_QUALITY_BLAM)
- {
+ memset(r->buffer_in + resampler_buffer_size, 0,
+ (SINC_WIDTH - 1) * sizeof(r->buffer_in[0]));
+ if (r->quality == RESAMPLER_QUALITY_BLEP ||
+ r->quality == RESAMPLER_QUALITY_BLAM) {
r->inv_phase = 0;
r->last_amp = 0;
r->accumulator = 0;
@@ -332,166 +307,151 @@
}
}
-void resampler_set_rate(void *_r, double new_factor)
-{
- resampler * r = ( resampler * ) _r;
+void resampler_set_rate(void *_r, double new_factor) {
+ resampler *r = (resampler *)_r;
r->phase_inc = new_factor;
new_factor = 1.0 / new_factor;
r->inv_phase_inc = new_factor;
}
-void resampler_write_sample(void *_r, short s)
-{
- resampler * r = ( resampler * ) _r;
+void resampler_write_sample(void *_r, short s) {
+ resampler *r = (resampler *)_r;
- if ( r->delay_added < 0 )
- {
+ if (r->delay_added < 0) {
r->delay_added = 0;
- r->write_filled = resampler_input_delay( r );
+ r->write_filled = resampler_input_delay(r);
}
-
- if ( r->write_filled < resampler_buffer_size )
- {
+
+ if (r->write_filled < resampler_buffer_size) {
float s32 = s;
s32 *= 256.0;
- r->buffer_in[ r->write_pos ] = s32;
- r->buffer_in[ r->write_pos + resampler_buffer_size ] = s32;
+ r->buffer_in[r->write_pos] = s32;
+ r->buffer_in[r->write_pos + resampler_buffer_size] = s32;
++r->write_filled;
- r->write_pos = ( r->write_pos + 1 ) % resampler_buffer_size;
+ r->write_pos = (r->write_pos + 1) % resampler_buffer_size;
}
}
-void resampler_write_sample_fixed(void *_r, int s, unsigned char depth)
-{
- resampler * r = ( resampler * ) _r;
-
- if ( r->delay_added < 0 )
- {
+void resampler_write_sample_fixed(void *_r, int s, unsigned char depth) {
+ resampler *r = (resampler *)_r;
+
+ if (r->delay_added < 0) {
r->delay_added = 0;
- r->write_filled = resampler_input_delay( r );
+ r->write_filled = resampler_input_delay(r);
}
-
- if ( r->write_filled < resampler_buffer_size )
- {
+
+ if (r->write_filled < resampler_buffer_size) {
float s32 = s;
s32 /= (double)(1 << (depth - 1));
-
- r->buffer_in[ r->write_pos ] = s32;
- r->buffer_in[ r->write_pos + resampler_buffer_size ] = s32;
-
+
+ r->buffer_in[r->write_pos] = s32;
+ r->buffer_in[r->write_pos + resampler_buffer_size] = s32;
+
++r->write_filled;
-
- r->write_pos = ( r->write_pos + 1 ) % resampler_buffer_size;
+
+ r->write_pos = (r->write_pos + 1) % resampler_buffer_size;
}
}
-void resampler_write_sample_float(void *_r, float s)
-{
- resampler * r = ( resampler * ) _r;
-
- if ( r->delay_added < 0 )
- {
- r->delay_added = 0;
- r->write_filled = resampler_input_delay( r );
- }
-
- if ( r->write_filled < resampler_buffer_size )
- {
- r->buffer_in[ r->write_pos ] = s;
- r->buffer_in[ r->write_pos + resampler_buffer_size ] = s;
-
- ++r->write_filled;
-
- r->write_pos = ( r->write_pos + 1 ) % resampler_buffer_size;
- }
+void resampler_write_sample_float(void *_r, float s) {
+ resampler *r = (resampler *)_r;
+
+ if (r->delay_added < 0) {
+ r->delay_added = 0;
+ r->write_filled = resampler_input_delay(r);
+ }
+
+ if (r->write_filled < resampler_buffer_size) {
+ r->buffer_in[r->write_pos] = s;
+ r->buffer_in[r->write_pos + resampler_buffer_size] = s;
+
+ ++r->write_filled;
+
+ r->write_pos = (r->write_pos + 1) % resampler_buffer_size;
+ }
}
-static int resampler_run_zoh(resampler * r, float ** out_, float * out_end)
-{
+static int resampler_run_zoh(resampler *r, float **out_, float *out_end) {
int in_size = r->write_filled;
- float const* in_ = r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
+ float const *in_ =
+ r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
int used = 0;
in_size -= 1;
- if ( in_size > 0 )
- {
- float* out = *out_;
- float const* in = in_;
- float const* const in_end = in + in_size;
+ if (in_size > 0) {
+ float *out = *out_;
+ float const *in = in_;
+ float const *const in_end = in + in_size;
float phase = r->phase;
float phase_inc = r->phase_inc;
-
- do
- {
+
+ do {
float sample;
-
- if ( out >= out_end )
+
+ if (out >= out_end)
break;
sample = *in;
*out++ = sample;
-
+
phase += phase_inc;
-
+
in += (int)phase;
-
+
phase = fmod(phase, 1.0f);
- }
- while ( in < in_end );
-
+ } while (in < in_end);
+
r->phase = phase;
*out_ = out;
-
+
used = (int)(in - in_);
-
+
r->write_filled -= used;
}
-
+
return used;
}
#ifndef RESAMPLER_NEON
-static int resampler_run_blep(resampler * r, float ** out_, float * out_end)
-{
+static int resampler_run_blep(resampler *r, float **out_, float *out_end) {
int in_size = r->write_filled;
- float const* in_ = r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
+ float const *in_ =
+ r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
int used = 0;
in_size -= 1;
- if ( in_size > 0 )
- {
- float* out = *out_;
- float const* in = in_;
- float const* const in_end = in + in_size;
+ if (in_size > 0) {
+ float *out = *out_;
+ float const *in = in_;
+ float const *const in_end = in + in_size;
float last_amp = r->last_amp;
float inv_phase = r->inv_phase;
float inv_phase_inc = r->inv_phase_inc;
-
+
const int step = RESAMPLER_BLEP_CUTOFF * RESAMPLER_RESOLUTION;
const int window_step = RESAMPLER_RESOLUTION;
-
- do
- {
+
+ do {
float sample;
-
- if ( out + SINC_WIDTH * 2 > out_end )
+
+ if (out + SINC_WIDTH * 2 > out_end)
break;
-
+
sample = *in++ - last_amp;
-
- if (sample)
- {
+
+ if (sample) {
float kernel[SINC_WIDTH * 2], kernel_sum = 0.0f;
int phase_reduced = (int)(inv_phase * RESAMPLER_RESOLUTION);
int phase_adj = phase_reduced * step / RESAMPLER_RESOLUTION;
int i = SINC_WIDTH;
- for (; i >= -SINC_WIDTH + 1; --i)
- {
+ for (; i >= -SINC_WIDTH + 1; --i) {
int pos = i * step;
int window_pos = i * window_step;
- kernel_sum += kernel[i + SINC_WIDTH - 1] = sinc_lut[abs(phase_adj - pos)] * window_lut[abs(phase_reduced - window_pos)];
+ kernel_sum += kernel[i + SINC_WIDTH - 1] =
+ sinc_lut[abs(phase_adj - pos)] *
+ window_lut[abs(phase_reduced - window_pos)];
}
last_amp += sample;
sample /= kernel_sum;
@@ -498,273 +458,259 @@
for (i = 0; i < SINC_WIDTH * 2; ++i)
out[i] += sample * kernel[i];
}
-
+
inv_phase += inv_phase_inc;
-
+
out += (int)inv_phase;
-
+
inv_phase = fmod(inv_phase, 1.0f);
- }
- while ( in < in_end );
-
+ } while (in < in_end);
+
r->inv_phase = inv_phase;
r->last_amp = last_amp;
*out_ = out;
-
+
used = (int)(in - in_);
-
+
r->write_filled -= used;
}
-
+
return used;
}
#endif
#ifdef RESAMPLER_SSE
-static int resampler_run_blep_sse(resampler * r, float ** out_, float * out_end)
-{
+static int resampler_run_blep_sse(resampler *r, float **out_, float *out_end) {
int in_size = r->write_filled;
- float const* in_ = r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
+ float const *in_ =
+ r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
int used = 0;
in_size -= 1;
- if ( in_size > 0 )
- {
- float* out = *out_;
- float const* in = in_;
- float const* const in_end = in + in_size;
+ if (in_size > 0) {
+ float *out = *out_;
+ float const *in = in_;
+ float const *const in_end = in + in_size;
float last_amp = r->last_amp;
float inv_phase = r->inv_phase;
float inv_phase_inc = r->inv_phase_inc;
-
+
const int step = RESAMPLER_BLEP_CUTOFF * RESAMPLER_RESOLUTION;
const int window_step = RESAMPLER_RESOLUTION;
-
- do
- {
+
+ do {
float sample;
-
- if ( out + SINC_WIDTH * 2 > out_end )
+
+ if (out + SINC_WIDTH * 2 > out_end)
break;
-
+
sample = *in++ - last_amp;
-
- if (sample)
- {
+
+ if (sample) {
float kernel_sum = 0.0f;
__m128 kernel[SINC_WIDTH / 2];
__m128 temp1, temp2;
__m128 samplex;
- float *kernelf = (float*)(&kernel);
+ float *kernelf = (float *)(&kernel);
int phase_reduced = (int)(inv_phase * RESAMPLER_RESOLUTION);
int phase_adj = phase_reduced * step / RESAMPLER_RESOLUTION;
int i = SINC_WIDTH;
- for (; i >= -SINC_WIDTH + 1; --i)
- {
+ for (; i >= -SINC_WIDTH + 1; --i) {
int pos = i * step;
int window_pos = i * window_step;
- kernel_sum += kernelf[i + SINC_WIDTH - 1] = sinc_lut[abs(phase_adj - pos)] * window_lut[abs(phase_reduced - window_pos)];
+ kernel_sum += kernelf[i + SINC_WIDTH - 1] =
+ sinc_lut[abs(phase_adj - pos)] *
+ window_lut[abs(phase_reduced - window_pos)];
}
last_amp += sample;
sample /= kernel_sum;
- samplex = _mm_set1_ps( sample );
- for (i = 0; i < SINC_WIDTH / 2; ++i)
- {
- temp1 = _mm_load_ps( (const float *)( kernel + i ) );
- temp1 = _mm_mul_ps( temp1, samplex );
- temp2 = _mm_loadu_ps( (const float *) out + i * 4 );
- temp1 = _mm_add_ps( temp1, temp2 );
- _mm_storeu_ps( (float *) out + i * 4, temp1 );
+ samplex = _mm_set1_ps(sample);
+ for (i = 0; i < SINC_WIDTH / 2; ++i) {
+ temp1 = _mm_load_ps((const float *)(kernel + i));
+ temp1 = _mm_mul_ps(temp1, samplex);
+ temp2 = _mm_loadu_ps((const float *)out + i * 4);
+ temp1 = _mm_add_ps(temp1, temp2);
+ _mm_storeu_ps((float *)out + i * 4, temp1);
}
}
-
+
inv_phase += inv_phase_inc;
-
+
out += (int)inv_phase;
-
+
inv_phase = fmod(inv_phase, 1.0f);
- }
- while ( in < in_end );
-
+ } while (in < in_end);
+
r->inv_phase = inv_phase;
r->last_amp = last_amp;
*out_ = out;
-
+
used = (int)(in - in_);
-
+
r->write_filled -= used;
}
-
+
return used;
}
#endif
#ifdef RESAMPLER_NEON
-static int resampler_run_blep(resampler * r, float ** out_, float * out_end)
-{
+static int resampler_run_blep(resampler *r, float **out_, float *out_end) {
int in_size = r->write_filled;
- float const* in_ = r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
+ float const *in_ =
+ r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
int used = 0;
in_size -= 1;
- if ( in_size > 0 )
- {
- float* out = *out_;
- float const* in = in_;
- float const* const in_end = in + in_size;
+ if (in_size > 0) {
+ float *out = *out_;
+ float const *in = in_;
+ float const *const in_end = in + in_size;
float last_amp = r->last_amp;
float inv_phase = r->inv_phase;
float inv_phase_inc = r->inv_phase_inc;
-
+
const int step = RESAMPLER_BLEP_CUTOFF * RESAMPLER_RESOLUTION;
const int window_step = RESAMPLER_RESOLUTION;
-
- do
- {
+
+ do {
float sample;
-
- if ( out + SINC_WIDTH * 2 > out_end )
+
+ if (out + SINC_WIDTH * 2 > out_end)
break;
-
+
sample = *in++ - last_amp;
-
- if (sample)
- {
+
+ if (sample) {
float kernel_sum = 0.0f;
float32x4_t kernel[SINC_WIDTH / 2];
float32x4_t temp1, temp2;
float32x4_t samplex;
- float *kernelf = (float*)(&kernel);
+ float *kernelf = (float *)(&kernel);
int phase_reduced = (int)(inv_phase * RESAMPLER_RESOLUTION);
int phase_adj = phase_reduced * step / RESAMPLER_RESOLUTION;
int i = SINC_WIDTH;
- for (; i >= -SINC_WIDTH + 1; --i)
- {
+ for (; i >= -SINC_WIDTH + 1; --i) {
int pos = i * step;
int window_pos = i * window_step;
- kernel_sum += kernelf[i + SINC_WIDTH - 1] = sinc_lut[abs(phase_adj - pos)] * window_lut[abs(phase_reduced - window_pos)];
+ kernel_sum += kernelf[i + SINC_WIDTH - 1] =
+ sinc_lut[abs(phase_adj - pos)] *
+ window_lut[abs(phase_reduced - window_pos)];
}
last_amp += sample;
sample /= kernel_sum;
samplex = vdupq_n_f32(sample);
- for (i = 0; i < SINC_WIDTH / 2; ++i)
- {
- temp1 = vld1q_f32( (const float32_t *)( kernel + i ) );
- temp2 = vld1q_f32( (const float32_t *) out + i * 4 );
- temp2 = vmlaq_f32( temp2, temp1, samplex );
- vst1q_f32( (float32_t *) out + i * 4, temp2 );
+ for (i = 0; i < SINC_WIDTH / 2; ++i) {
+ temp1 = vld1q_f32((const float32_t *)(kernel + i));
+ temp2 = vld1q_f32((const float32_t *)out + i * 4);
+ temp2 = vmlaq_f32(temp2, temp1, samplex);
+ vst1q_f32((float32_t *)out + i * 4, temp2);
}
}
-
+
inv_phase += inv_phase_inc;
-
+
out += (int)inv_phase;
-
+
inv_phase = fmod(inv_phase, 1.0f);
- }
- while ( in < in_end );
-
+ } while (in < in_end);
+
r->inv_phase = inv_phase;
r->last_amp = last_amp;
*out_ = out;
-
+
used = (int)(in - in_);
-
+
r->write_filled -= used;
}
-
+
return used;
}
#endif
-static int resampler_run_linear(resampler * r, float ** out_, float * out_end)
-{
+static int resampler_run_linear(resampler *r, float **out_, float *out_end) {
int in_size = r->write_filled;
- float const* in_ = r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
+ float const *in_ =
+ r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
int used = 0;
in_size -= 2;
- if ( in_size > 0 )
- {
- float* out = *out_;
- float const* in = in_;
- float const* const in_end = in + in_size;
+ if (in_size > 0) {
+ float *out = *out_;
+ float const *in = in_;
+ float const *const in_end = in + in_size;
float phase = r->phase;
float phase_inc = r->phase_inc;
-
- do
- {
+
+ do {
float sample;
-
- if ( out >= out_end )
+
+ if (out >= out_end)
break;
-
+
sample = in[0] + (in[1] - in[0]) * phase;
*out++ = sample;
-
+
phase += phase_inc;
-
+
in += (int)phase;
-
+
phase = fmod(phase, 1.0f);
- }
- while ( in < in_end );
-
+ } while (in < in_end);
+
r->phase = phase;
*out_ = out;
-
+
used = (int)(in - in_);
-
+
r->write_filled -= used;
}
-
+
return used;
}
#ifndef RESAMPLER_NEON
-static int resampler_run_blam(resampler * r, float ** out_, float * out_end)
-{
+static int resampler_run_blam(resampler *r, float **out_, float *out_end) {
int in_size = r->write_filled;
- float const* in_ = r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
+ float const *in_ =
+ r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
int used = 0;
in_size -= 2;
- if ( in_size > 0 )
- {
- float* out = *out_;
- float const* in = in_;
- float const* const in_end = in + in_size;
+ if (in_size > 0) {
+ float *out = *out_;
+ float const *in = in_;
+ float const *const in_end = in + in_size;
float last_amp = r->last_amp;
float phase = r->phase;
float phase_inc = r->phase_inc;
float inv_phase = r->inv_phase;
float inv_phase_inc = r->inv_phase_inc;
-
+
const int step = RESAMPLER_BLAM_CUTOFF * RESAMPLER_RESOLUTION;
const int window_step = RESAMPLER_RESOLUTION;
- do
- {
+ do {
float sample;
-
- if ( out + SINC_WIDTH * 2 > out_end )
+
+ if (out + SINC_WIDTH * 2 > out_end)
break;
-
+
sample = in[0];
if (phase_inc < 1.0f)
sample += (in[1] - in[0]) * phase;
sample -= last_amp;
-
- if (sample)
- {
+
+ if (sample) {
float kernel[SINC_WIDTH * 2], kernel_sum = 0.0f;
int phase_reduced = (int)(inv_phase * RESAMPLER_RESOLUTION);
int phase_adj = phase_reduced * step / RESAMPLER_RESOLUTION;
int i = SINC_WIDTH;
- for (; i >= -SINC_WIDTH + 1; --i)
- {
+ for (; i >= -SINC_WIDTH + 1; --i) {
int pos = i * step;
int window_pos = i * window_step;
- kernel_sum += kernel[i + SINC_WIDTH - 1] = sinc_lut[abs(phase_adj - pos)] * window_lut[abs(phase_reduced - window_pos)];
+ kernel_sum += kernel[i + SINC_WIDTH - 1] =
+ sinc_lut[abs(phase_adj - pos)] *
+ window_lut[abs(phase_reduced - window_pos)];
}
last_amp += sample;
sample /= kernel_sum;
@@ -771,409 +717,384 @@
for (i = 0; i < SINC_WIDTH * 2; ++i)
out[i] += sample * kernel[i];
}
-
- if (inv_phase_inc < 1.0f)
- {
+
+ if (inv_phase_inc < 1.0f) {
++in;
inv_phase += inv_phase_inc;
out += (int)inv_phase;
inv_phase = fmod(inv_phase, 1.0f);
- }
- else
- {
+ } else {
phase += phase_inc;
++out;
in += (int)phase;
phase = fmod(phase, 1.0f);
}
- }
- while ( in < in_end );
-
+ } while (in < in_end);
+
r->phase = phase;
r->inv_phase = inv_phase;
r->last_amp = last_amp;
*out_ = out;
-
+
used = (int)(in - in_);
-
+
r->write_filled -= used;
}
-
+
return used;
}
#endif
#ifdef RESAMPLER_SSE
-static int resampler_run_blam_sse(resampler * r, float ** out_, float * out_end)
-{
+static int resampler_run_blam_sse(resampler *r, float **out_, float *out_end) {
int in_size = r->write_filled;
- float const* in_ = r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
+ float const *in_ =
+ r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
int used = 0;
in_size -= 2;
- if ( in_size > 0 )
- {
- float* out = *out_;
- float const* in = in_;
- float const* const in_end = in + in_size;
+ if (in_size > 0) {
+ float *out = *out_;
+ float const *in = in_;
+ float const *const in_end = in + in_size;
float last_amp = r->last_amp;
float phase = r->phase;
float phase_inc = r->phase_inc;
float inv_phase = r->inv_phase;
float inv_phase_inc = r->inv_phase_inc;
-
+
const int step = RESAMPLER_BLAM_CUTOFF * RESAMPLER_RESOLUTION;
const int window_step = RESAMPLER_RESOLUTION;
- do
- {
+ do {
float sample;
-
- if ( out + SINC_WIDTH * 2 > out_end )
+
+ if (out + SINC_WIDTH * 2 > out_end)
break;
sample = in[0];
- if (phase_inc < 1.0f)
- {
+ if (phase_inc < 1.0f) {
sample += (in[1] - in[0]) * phase;
}
sample -= last_amp;
-
- if (sample)
- {
+
+ if (sample) {
float kernel_sum = 0.0f;
__m128 kernel[SINC_WIDTH / 2];
__m128 temp1, temp2;
__m128 samplex;
- float *kernelf = (float*)(&kernel);
+ float *kernelf = (float *)(&kernel);
int phase_reduced = (int)(inv_phase * RESAMPLER_RESOLUTION);
int phase_adj = phase_reduced * step / RESAMPLER_RESOLUTION;
int i = SINC_WIDTH;
- for (; i >= -SINC_WIDTH + 1; --i)
- {
+ for (; i >= -SINC_WIDTH + 1; --i) {
int pos = i * step;
int window_pos = i * window_step;
- kernel_sum += kernelf[i + SINC_WIDTH - 1] = sinc_lut[abs(phase_adj - pos)] * window_lut[abs(phase_reduced - window_pos)];
+ kernel_sum += kernelf[i + SINC_WIDTH - 1] =
+ sinc_lut[abs(phase_adj - pos)] *
+ window_lut[abs(phase_reduced - window_pos)];
}
last_amp += sample;
sample /= kernel_sum;
- samplex = _mm_set1_ps( sample );
- for (i = 0; i < SINC_WIDTH / 2; ++i)
- {
- temp1 = _mm_load_ps( (const float *)( kernel + i ) );
- temp1 = _mm_mul_ps( temp1, samplex );
- temp2 = _mm_loadu_ps( (const float *) out + i * 4 );
- temp1 = _mm_add_ps( temp1, temp2 );
- _mm_storeu_ps( (float *) out + i * 4, temp1 );
+ samplex = _mm_set1_ps(sample);
+ for (i = 0; i < SINC_WIDTH / 2; ++i) {
+ temp1 = _mm_load_ps((const float *)(kernel + i));
+ temp1 = _mm_mul_ps(temp1, samplex);
+ temp2 = _mm_loadu_ps((const float *)out + i * 4);
+ temp1 = _mm_add_ps(temp1, temp2);
+ _mm_storeu_ps((float *)out + i * 4, temp1);
}
}
-
- if (inv_phase_inc < 1.0f)
- {
+
+ if (inv_phase_inc < 1.0f) {
++in;
inv_phase += inv_phase_inc;
out += (int)inv_phase;
inv_phase = fmod(inv_phase, 1.0f);
- }
- else
- {
+ } else {
phase += phase_inc;
++out;
-
- if (phase >= 1.0f)
- {
+
+ if (phase >= 1.0f) {
++in;
phase = fmod(phase, 1.0f);
}
}
- }
- while ( in < in_end );
+ } while (in < in_end);
r->phase = phase;
r->inv_phase = inv_phase;
r->last_amp = last_amp;
*out_ = out;
-
+
used = (int)(in - in_);
-
+
r->write_filled -= used;
}
-
+
return used;
}
#endif
#ifdef RESAMPLER_NEON
-static int resampler_run_blam(resampler * r, float ** out_, float * out_end)
-{
+static int resampler_run_blam(resampler *r, float **out_, float *out_end) {
int in_size = r->write_filled;
- float const* in_ = r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
+ float const *in_ =
+ r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
int used = 0;
in_size -= 2;
- if ( in_size > 0 )
- {
- float* out = *out_;
- float const* in = in_;
- float const* const in_end = in + in_size;
+ if (in_size > 0) {
+ float *out = *out_;
+ float const *in = in_;
+ float const *const in_end = in + in_size;
float last_amp = r->last_amp;
float phase = r->phase;
float phase_inc = r->phase_inc;
float inv_phase = r->inv_phase;
float inv_phase_inc = r->inv_phase_inc;
-
+
const int step = RESAMPLER_BLAM_CUTOFF * RESAMPLER_RESOLUTION;
const int window_step = RESAMPLER_RESOLUTION;
- do
- {
+ do {
float sample;
-
- if ( out + SINC_WIDTH * 2 > out_end )
+
+ if (out + SINC_WIDTH * 2 > out_end)
break;
-
+
sample = in[0];
if (phase_inc < 1.0f)
sample += (in[1] - in[0]) * phase;
sample -= last_amp;
-
- if (sample)
- {
+
+ if (sample) {
float kernel_sum = 0.0;
float32x4_t kernel[SINC_WIDTH / 2];
float32x4_t temp1, temp2;
float32x4_t samplex;
- float *kernelf = (float*)(&kernel);
+ float *kernelf = (float *)(&kernel);
int phase_reduced = (int)(inv_phase * RESAMPLER_RESOLUTION);
int phase_adj = phase_reduced * step / RESAMPLER_RESOLUTION;
int i = SINC_WIDTH;
- for (; i >= -SINC_WIDTH + 1; --i)
- {
+ for (; i >= -SINC_WIDTH + 1; --i) {
int pos = i * step;
int window_pos = i * window_step;
- kernel_sum += kernelf[i + SINC_WIDTH - 1] = sinc_lut[abs(phase_adj - pos)] * window_lut[abs(phase_reduced - window_pos)];
+ kernel_sum += kernelf[i + SINC_WIDTH - 1] =
+ sinc_lut[abs(phase_adj - pos)] *
+ window_lut[abs(phase_reduced - window_pos)];
}
last_amp += sample;
sample /= kernel_sum;
samplex = vdupq_n_f32(sample);
- for (i = 0; i < SINC_WIDTH / 2; ++i)
- {
- temp1 = vld1q_f32( (const float32_t *)( kernel + i ) );
- temp2 = vld1q_f32( (const float32_t *) out + i * 4 );
- temp2 = vmlaq_f32( temp2, temp1, samplex );
- vst1q_f32( (float32_t *) out + i * 4, temp2 );
+ for (i = 0; i < SINC_WIDTH / 2; ++i) {
+ temp1 = vld1q_f32((const float32_t *)(kernel + i));
+ temp2 = vld1q_f32((const float32_t *)out + i * 4);
+ temp2 = vmlaq_f32(temp2, temp1, samplex);
+ vst1q_f32((float32_t *)out + i * 4, temp2);
}
}
- if (inv_phase_inc < 1.0f)
- {
+ if (inv_phase_inc < 1.0f) {
++in;
inv_phase += inv_phase_inc;
out += (int)inv_phase;
inv_phase = fmod(inv_phase, 1.0f);
- }
- else
- {
+ } else {
phase += phase_inc;
++out;
-
- if (phase >= 1.0f)
- {
+
+ if (phase >= 1.0f) {
++in;
phase = fmod(phase, 1.0f);
}
}
- }
- while ( in < in_end );
-
+ } while (in < in_end);
+
r->phase = phase;
r->inv_phase = inv_phase;
r->last_amp = last_amp;
*out_ = out;
-
+
used = (int)(in - in_);
-
+
r->write_filled -= used;
}
-
+
return used;
}
#endif
#ifndef RESAMPLER_NEON
-static int resampler_run_cubic(resampler * r, float ** out_, float * out_end)
-{
+static int resampler_run_cubic(resampler *r, float **out_, float *out_end) {
int in_size = r->write_filled;
- float const* in_ = r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
+ float const *in_ =
+ r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
int used = 0;
in_size -= 4;
- if ( in_size > 0 )
- {
- float* out = *out_;
- float const* in = in_;
- float const* const in_end = in + in_size;
+ if (in_size > 0) {
+ float *out = *out_;
+ float const *in = in_;
+ float const *const in_end = in + in_size;
float phase = r->phase;
float phase_inc = r->phase_inc;
-
- do
- {
- float * kernel;
+
+ do {
+ float *kernel;
int i;
float sample;
-
- if ( out >= out_end )
+
+ if (out >= out_end)
break;
-
+
kernel = cubic_lut + (int)(phase * RESAMPLER_RESOLUTION) * 4;
-
+
for (sample = 0, i = 0; i < 4; ++i)
sample += in[i] * kernel[i];
*out++ = sample;
-
+
phase += phase_inc;
-
+
in += (int)phase;
-
+
phase = fmod(phase, 1.0f);
- }
- while ( in < in_end );
-
+ } while (in < in_end);
+
r->phase = phase;
*out_ = out;
-
+
used = (int)(in - in_);
-
+
r->write_filled -= used;
}
-
+
return used;
}
#endif
#ifdef RESAMPLER_SSE
-static int resampler_run_cubic_sse(resampler * r, float ** out_, float * out_end)
-{
+static int resampler_run_cubic_sse(resampler *r, float **out_, float *out_end) {
int in_size = r->write_filled;
- float const* in_ = r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
+ float const *in_ =
+ r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
int used = 0;
in_size -= 4;
- if ( in_size > 0 )
- {
- float* out = *out_;
- float const* in = in_;
- float const* const in_end = in + in_size;
+ if (in_size > 0) {
+ float *out = *out_;
+ float const *in = in_;
+ float const *const in_end = in + in_size;
float phase = r->phase;
float phase_inc = r->phase_inc;
-
- do
- {
+
+ do {
__m128 temp1, temp2;
__m128 samplex = _mm_setzero_ps();
-
- if ( out >= out_end )
+
+ if (out >= out_end)
break;
-
- temp1 = _mm_loadu_ps( (const float *)( in ) );
- temp2 = _mm_load_ps( (const float *)( cubic_lut + (int)(phase * RESAMPLER_RESOLUTION) * 4 ) );
- temp1 = _mm_mul_ps( temp1, temp2 );
- samplex = _mm_add_ps( samplex, temp1 );
- temp1 = _mm_movehl_ps( temp1, samplex );
- samplex = _mm_add_ps( samplex, temp1 );
+
+ temp1 = _mm_loadu_ps((const float *)(in));
+ temp2 = _mm_load_ps(
+ (const float *)(cubic_lut +
+ (int)(phase * RESAMPLER_RESOLUTION) * 4));
+ temp1 = _mm_mul_ps(temp1, temp2);
+ samplex = _mm_add_ps(samplex, temp1);
+ temp1 = _mm_movehl_ps(temp1, samplex);
+ samplex = _mm_add_ps(samplex, temp1);
temp1 = samplex;
- temp1 = _mm_shuffle_ps( temp1, samplex, _MM_SHUFFLE(0, 0, 0, 1) );
- samplex = _mm_add_ps( samplex, temp1 );
- _mm_store_ss( out, samplex );
+ temp1 = _mm_shuffle_ps(temp1, samplex, _MM_SHUFFLE(0, 0, 0, 1));
+ samplex = _mm_add_ps(samplex, temp1);
+ _mm_store_ss(out, samplex);
++out;
-
+
phase += phase_inc;
-
+
in += (int)phase;
-
+
phase = fmod(phase, 1.0f);
- }
- while ( in < in_end );
-
+ } while (in < in_end);
+
r->phase = phase;
*out_ = out;
-
+
used = (int)(in - in_);
-
+
r->write_filled -= used;
}
-
+
return used;
}
#endif
#ifdef RESAMPLER_NEON
-static int resampler_run_cubic(resampler * r, float ** out_, float * out_end)
-{
+static int resampler_run_cubic(resampler *r, float **out_, float *out_end) {
int in_size = r->write_filled;
- float const* in_ = r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
+ float const *in_ =
+ r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
int used = 0;
in_size -= 4;
- if ( in_size > 0 )
- {
- float* out = *out_;
- float const* in = in_;
- float const* const in_end = in + in_size;
+ if (in_size > 0) {
+ float *out = *out_;
+ float const *in = in_;
+ float const *const in_end = in + in_size;
float phase = r->phase;
float phase_inc = r->phase_inc;
-
- do
- {
+
+ do {
float32x4_t temp1, temp2;
float32x2_t half;
-
- if ( out >= out_end )
+
+ if (out >= out_end)
break;
-
- temp1 = vld1q_f32( (const float32_t *)( in ) );
- temp2 = vld1q_f32( (const float32_t *)( cubic_lut + (int)(phase * RESAMPLER_RESOLUTION) * 4 ) );
- temp1 = vmulq_f32( temp1, temp2 );
+
+ temp1 = vld1q_f32((const float32_t *)(in));
+ temp2 = vld1q_f32(
+ (const float32_t *)(cubic_lut +
+ (int)(phase * RESAMPLER_RESOLUTION) * 4));
+ temp1 = vmulq_f32(temp1, temp2);
half = vadd_f32(vget_high_f32(temp1), vget_low_f32(temp1));
*out++ = vget_lane_f32(vpadd_f32(half, half), 0);
-
+
phase += phase_inc;
-
+
in += (int)phase;
-
+
phase = fmod(phase, 1.0f);
- }
- while ( in < in_end );
-
+ } while (in < in_end);
+
r->phase = phase;
*out_ = out;
-
+
used = (int)(in - in_);
-
+
r->write_filled -= used;
}
-
+
return used;
}
#endif
#ifndef RESAMPLER_NEON
-static int resampler_run_sinc(resampler * r, float ** out_, float * out_end)
-{
+static int resampler_run_sinc(resampler *r, float **out_, float *out_end) {
int in_size = r->write_filled;
- float const* in_ = r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
+ float const *in_ =
+ r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
int used = 0;
in_size -= SINC_WIDTH * 2;
- if ( in_size > 0 )
- {
- float* out = *out_;
- float const* in = in_;
- float const* const in_end = in + in_size;
+ if (in_size > 0) {
+ float *out = *out_;
+ float const *in = in_;
+ float const *const in_end = in + in_size;
float phase = r->phase;
float phase_inc = r->phase_inc;
- int step = phase_inc > 1.0f ? (int)(RESAMPLER_RESOLUTION / phase_inc * RESAMPLER_SINC_CUTOFF) : (int)(RESAMPLER_RESOLUTION * RESAMPLER_SINC_CUTOFF);
+ int step = phase_inc > 1.0f
+ ? (int)(RESAMPLER_RESOLUTION / phase_inc *
+ RESAMPLER_SINC_CUTOFF)
+ : (int)(RESAMPLER_RESOLUTION * RESAMPLER_SINC_CUTOFF);
int window_step = RESAMPLER_RESOLUTION;
- do
- {
+ do {
float kernel[SINC_WIDTH * 2], kernel_sum = 0.0;
int i = SINC_WIDTH;
int phase_reduced = (int)(phase * RESAMPLER_RESOLUTION);
@@ -1180,14 +1101,15 @@
int phase_adj = phase_reduced * step / RESAMPLER_RESOLUTION;
float sample;
- if ( out >= out_end )
+ if (out >= out_end)
break;
- for (; i >= -SINC_WIDTH + 1; --i)
- {
+ for (; i >= -SINC_WIDTH + 1; --i) {
int pos = i * step;
int window_pos = i * window_step;
- kernel_sum += kernel[i + SINC_WIDTH - 1] = sinc_lut[abs(phase_adj - pos)] * window_lut[abs(phase_reduced - window_pos)];
+ kernel_sum += kernel[i + SINC_WIDTH - 1] =
+ sinc_lut[abs(phase_adj - pos)] *
+ window_lut[abs(phase_reduced - window_pos)];
}
for (sample = 0, i = 0; i < SINC_WIDTH * 2; ++i)
sample += in[i] * kernel[i];
@@ -1198,8 +1120,7 @@
in += (int)phase;
phase = fmod(phase, 1.0f);
- }
- while ( in < in_end );
+ } while (in < in_end);
r->phase = phase;
*out_ = out;
@@ -1214,102 +1135,103 @@
#endif
#ifdef RESAMPLER_SSE
-static int resampler_run_sinc_sse(resampler * r, float ** out_, float * out_end)
-{
+static int resampler_run_sinc_sse(resampler *r, float **out_, float *out_end) {
int in_size = r->write_filled;
- float const* in_ = r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
+ float const *in_ =
+ r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
int used = 0;
in_size -= SINC_WIDTH * 2;
- if ( in_size > 0 )
- {
- float* out = *out_;
- float const* in = in_;
- float const* const in_end = in + in_size;
+ if (in_size > 0) {
+ float *out = *out_;
+ float const *in = in_;
+ float const *const in_end = in + in_size;
float phase = r->phase;
float phase_inc = r->phase_inc;
-
- int step = phase_inc > 1.0f ? (int)(RESAMPLER_RESOLUTION / phase_inc * RESAMPLER_SINC_CUTOFF) : (int)(RESAMPLER_RESOLUTION * RESAMPLER_SINC_CUTOFF);
+
+ int step = phase_inc > 1.0f
+ ? (int)(RESAMPLER_RESOLUTION / phase_inc *
+ RESAMPLER_SINC_CUTOFF)
+ : (int)(RESAMPLER_RESOLUTION * RESAMPLER_SINC_CUTOFF);
int window_step = RESAMPLER_RESOLUTION;
-
- do
- {
+
+ do {
// accumulate in extended precision
float kernel_sum = 0.0;
__m128 kernel[SINC_WIDTH / 2];
__m128 temp1, temp2;
__m128 samplex = _mm_setzero_ps();
- float *kernelf = (float*)(&kernel);
+ float *kernelf = (float *)(&kernel);
int i = SINC_WIDTH;
int phase_reduced = (int)(phase * RESAMPLER_RESOLUTION);
int phase_adj = phase_reduced * step / RESAMPLER_RESOLUTION;
-
- if ( out >= out_end )
+
+ if (out >= out_end)
break;
-
- for (; i >= -SINC_WIDTH + 1; --i)
- {
+
+ for (; i >= -SINC_WIDTH + 1; --i) {
int pos = i * step;
int window_pos = i * window_step;
- kernel_sum += kernelf[i + SINC_WIDTH - 1] = sinc_lut[abs(phase_adj - pos)] * window_lut[abs(phase_reduced - window_pos)];
+ kernel_sum += kernelf[i + SINC_WIDTH - 1] =
+ sinc_lut[abs(phase_adj - pos)] *
+ window_lut[abs(phase_reduced - window_pos)];
}
- for (i = 0; i < SINC_WIDTH / 2; ++i)
- {
- temp1 = _mm_loadu_ps( (const float *)( in + i * 4 ) );
- temp2 = _mm_load_ps( (const float *)( kernel + i ) );
- temp1 = _mm_mul_ps( temp1, temp2 );
- samplex = _mm_add_ps( samplex, temp1 );
+ for (i = 0; i < SINC_WIDTH / 2; ++i) {
+ temp1 = _mm_loadu_ps((const float *)(in + i * 4));
+ temp2 = _mm_load_ps((const float *)(kernel + i));
+ temp1 = _mm_mul_ps(temp1, temp2);
+ samplex = _mm_add_ps(samplex, temp1);
}
kernel_sum = 1.0 / kernel_sum;
- temp1 = _mm_movehl_ps( temp1, samplex );
- samplex = _mm_add_ps( samplex, temp1 );
+ temp1 = _mm_movehl_ps(temp1, samplex);
+ samplex = _mm_add_ps(samplex, temp1);
temp1 = samplex;
- temp1 = _mm_shuffle_ps( temp1, samplex, _MM_SHUFFLE(0, 0, 0, 1) );
- samplex = _mm_add_ps( samplex, temp1 );
- temp1 = _mm_set_ss( kernel_sum );
- samplex = _mm_mul_ps( samplex, temp1 );
- _mm_store_ss( out, samplex );
+ temp1 = _mm_shuffle_ps(temp1, samplex, _MM_SHUFFLE(0, 0, 0, 1));
+ samplex = _mm_add_ps(samplex, temp1);
+ temp1 = _mm_set_ss(kernel_sum);
+ samplex = _mm_mul_ps(samplex, temp1);
+ _mm_store_ss(out, samplex);
++out;
-
+
phase += phase_inc;
-
+
in += (int)phase;
-
+
phase = fmod(phase, 1.0f);
- }
- while ( in < in_end );
-
+ } while (in < in_end);
+
r->phase = phase;
*out_ = out;
-
+
used = (int)(in - in_);
-
+
r->write_filled -= used;
}
-
+
return used;
}
#endif
#ifdef RESAMPLER_NEON
-static int resampler_run_sinc(resampler * r, float ** out_, float * out_end)
-{
+static int resampler_run_sinc(resampler *r, float **out_, float *out_end) {
int in_size = r->write_filled;
- float const* in_ = r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
+ float const *in_ =
+ r->buffer_in + resampler_buffer_size + r->write_pos - r->write_filled;
int used = 0;
in_size -= SINC_WIDTH * 2;
- if ( in_size > 0 )
- {
- float* out = *out_;
- float const* in = in_;
- float const* const in_end = in + in_size;
+ if (in_size > 0) {
+ float *out = *out_;
+ float const *in = in_;
+ float const *const in_end = in + in_size;
float phase = r->phase;
float phase_inc = r->phase_inc;
-
- int step = phase_inc > 1.0f ? (int)(RESAMPLER_RESOLUTION / phase_inc * RESAMPLER_SINC_CUTOFF) : (int)(RESAMPLER_RESOLUTION * RESAMPLER_SINC_CUTOFF);
+
+ int step = phase_inc > 1.0f
+ ? (int)(RESAMPLER_RESOLUTION / phase_inc *
+ RESAMPLER_SINC_CUTOFF)
+ : (int)(RESAMPLER_RESOLUTION * RESAMPLER_SINC_CUTOFF);
int window_step = RESAMPLER_RESOLUTION;
-
- do
- {
+
+ do {
// accumulate in extended precision
float kernel_sum = 0.0;
float32x4_t kernel[SINC_WIDTH / 2];
@@ -1316,111 +1238,111 @@
float32x4_t temp1, temp2;
float32x4_t samplex = {0};
float32x2_t half;
- float *kernelf = (float*)(&kernel);
+ float *kernelf = (float *)(&kernel);
int i = SINC_WIDTH;
int phase_reduced = (int)(phase * RESAMPLER_RESOLUTION);
int phase_adj = phase_reduced * step / RESAMPLER_RESOLUTION;
-
- if ( out >= out_end )
+
+ if (out >= out_end)
break;
-
- for (; i >= -SINC_WIDTH + 1; --i)
- {
+
+ for (; i >= -SINC_WIDTH + 1; --i) {
int pos = i * step;
int window_pos = i * window_step;
- kernel_sum += kernelf[i + SINC_WIDTH - 1] = sinc_lut[abs(phase_adj - pos)] * window_lut[abs(phase_reduced - window_pos)];
+ kernel_sum += kernelf[i + SINC_WIDTH - 1] =
+ sinc_lut[abs(phase_adj - pos)] *
+ window_lut[abs(phase_reduced - window_pos)];
}
- for (i = 0; i < SINC_WIDTH / 2; ++i)
- {
- temp1 = vld1q_f32( (const float32_t *)( in + i * 4 ) );
- temp2 = vld1q_f32( (const float32_t *)( kernel + i ) );
- samplex = vmlaq_f32( samplex, temp1, temp2 );
+ for (i = 0; i < SINC_WIDTH / 2; ++i) {
+ temp1 = vld1q_f32((const float32_t *)(in + i * 4));
+ temp2 = vld1q_f32((const float32_t *)(kernel + i));
+ samplex = vmlaq_f32(samplex, temp1, temp2);
}
kernel_sum = 1.0 / kernel_sum;
samplex = vmulq_f32(samplex, vmovq_n_f32(kernel_sum));
half = vadd_f32(vget_high_f32(samplex), vget_low_f32(samplex));
*out++ = vget_lane_f32(vpadd_f32(half, half), 0);
-
+
phase += phase_inc;
-
+
in += (int)phase;
-
+
phase = fmod(phase, 1.0f);
- }
- while ( in < in_end );
-
+ } while (in < in_end);
+
r->phase = phase;
*out_ = out;
-
+
used = (int)(in - in_);
-
+
r->write_filled -= used;
}
-
+
return used;
}
#endif
-static void resampler_fill(resampler * r)
-{
+static void resampler_fill(resampler *r) {
int min_filled = resampler_min_filled(r);
int quality = r->quality;
- while ( r->write_filled > min_filled &&
- r->read_filled < resampler_buffer_size )
- {
- int write_pos = ( r->read_pos + r->read_filled ) % resampler_buffer_size;
+ while (r->write_filled > min_filled &&
+ r->read_filled < resampler_buffer_size) {
+ int write_pos = (r->read_pos + r->read_filled) % resampler_buffer_size;
int write_size = resampler_buffer_size - write_pos;
- float * out = r->buffer_out + write_pos;
- if ( write_size > ( resampler_buffer_size - r->read_filled ) )
+ float *out = r->buffer_out + write_pos;
+ if (write_size > (resampler_buffer_size - r->read_filled))
write_size = resampler_buffer_size - r->read_filled;
- switch (quality)
- {
+ switch (quality) {
case RESAMPLER_QUALITY_ZOH:
- resampler_run_zoh( r, &out, out + write_size );
+ resampler_run_zoh(r, &out, out + write_size);
break;
-
- case RESAMPLER_QUALITY_BLEP:
- {
+
+ case RESAMPLER_QUALITY_BLEP: {
int used;
int write_extra = 0;
- if ( write_pos >= r->read_pos )
+ if (write_pos >= r->read_pos)
write_extra = r->read_pos;
- if ( write_extra > SINC_WIDTH * 2 - 1 )
+ if (write_extra > SINC_WIDTH * 2 - 1)
write_extra = SINC_WIDTH * 2 - 1;
- memcpy( r->buffer_out + resampler_buffer_size, r->buffer_out, write_extra * sizeof(r->buffer_out[0]) );
+ memcpy(r->buffer_out + resampler_buffer_size, r->buffer_out,
+ write_extra * sizeof(r->buffer_out[0]));
#ifdef RESAMPLER_SSE
- if ( resampler_has_sse )
- used = resampler_run_blep_sse( r, &out, out + write_size + write_extra );
+ if (resampler_has_sse)
+ used = resampler_run_blep_sse(r, &out,
+ out + write_size + write_extra);
else
#endif
- used = resampler_run_blep( r, &out, out + write_size + write_extra );
- memcpy( r->buffer_out, r->buffer_out + resampler_buffer_size, write_extra * sizeof(r->buffer_out[0]) );
+ used =
+ resampler_run_blep(r, &out, out + write_size + write_extra);
+ memcpy(r->buffer_out, r->buffer_out + resampler_buffer_size,
+ write_extra * sizeof(r->buffer_out[0]));
if (!used)
return;
break;
}
-
+
case RESAMPLER_QUALITY_LINEAR:
- resampler_run_linear( r, &out, out + write_size );
+ resampler_run_linear(r, &out, out + write_size);
break;
-
- case RESAMPLER_QUALITY_BLAM:
- {
- float * out_ = out;
+
+ case RESAMPLER_QUALITY_BLAM: {
+ float *out_ = out;
int write_extra = 0;
- if ( write_pos >= r->read_pos )
+ if (write_pos >= r->read_pos)
write_extra = r->read_pos;
- if ( write_extra > SINC_WIDTH * 2 - 1 )
+ if (write_extra > SINC_WIDTH * 2 - 1)
write_extra = SINC_WIDTH * 2 - 1;
- memcpy( r->buffer_out + resampler_buffer_size, r->buffer_out, write_extra * sizeof(r->buffer_out[0]) );
+ memcpy(r->buffer_out + resampler_buffer_size, r->buffer_out,
+ write_extra * sizeof(r->buffer_out[0]));
#ifdef RESAMPLER_SSE
- if ( resampler_has_sse )
- resampler_run_blam_sse( r, &out, out + write_size + write_extra );
+ if (resampler_has_sse)
+ resampler_run_blam_sse(r, &out, out + write_size + write_extra);
else
#endif
- resampler_run_blam( r, &out, out + write_size + write_extra );
- memcpy( r->buffer_out, r->buffer_out + resampler_buffer_size, write_extra * sizeof(r->buffer_out[0]) );
- if ( out == out_ )
+ resampler_run_blam(r, &out, out + write_size + write_extra);
+ memcpy(r->buffer_out, r->buffer_out + resampler_buffer_size,
+ write_extra * sizeof(r->buffer_out[0]));
+ if (out == out_)
return;
break;
}
@@ -1427,20 +1349,20 @@
case RESAMPLER_QUALITY_CUBIC:
#ifdef RESAMPLER_SSE
- if ( resampler_has_sse )
- resampler_run_cubic_sse( r, &out, out + write_size );
+ if (resampler_has_sse)
+ resampler_run_cubic_sse(r, &out, out + write_size);
else
#endif
- resampler_run_cubic( r, &out, out + write_size );
+ resampler_run_cubic(r, &out, out + write_size);
break;
-
+
case RESAMPLER_QUALITY_SINC:
#ifdef RESAMPLER_SSE
- if ( resampler_has_sse )
- resampler_run_sinc_sse( r, &out, out + write_size );
+ if (resampler_has_sse)
+ resampler_run_sinc_sse(r, &out, out + write_size);
else
#endif
- resampler_run_sinc( r, &out, out + write_size );
+ resampler_run_sinc(r, &out, out + write_size);
break;
}
r->read_filled += out - r->buffer_out - write_pos;
@@ -1447,63 +1369,59 @@
}
}
-static void resampler_fill_and_remove_delay(resampler * r)
-{
- resampler_fill( r );
- if ( r->delay_removed < 0 )
- {
- int delay = resampler_output_delay( r );
+static void resampler_fill_and_remove_delay(resampler *r) {
+ resampler_fill(r);
+ if (r->delay_removed < 0) {
+ int delay = resampler_output_delay(r);
r->delay_removed = 0;
- while ( delay-- )
- resampler_remove_sample( r, 1 );
+ while (delay--)
+ resampler_remove_sample(r, 1);
}
}
-int resampler_get_sample_count(void *_r)
-{
- resampler * r = ( resampler * ) _r;
- if ( r->read_filled < 1 && ((r->quality != RESAMPLER_QUALITY_BLEP && r->quality != RESAMPLER_QUALITY_BLAM) || r->inv_phase_inc))
- resampler_fill_and_remove_delay( r );
+int resampler_get_sample_count(void *_r) {
+ resampler *r = (resampler *)_r;
+ if (r->read_filled < 1 && ((r->quality != RESAMPLER_QUALITY_BLEP &&
+ r->quality != RESAMPLER_QUALITY_BLAM) ||
+ r->inv_phase_inc))
+ resampler_fill_and_remove_delay(r);
return r->read_filled;
}
-int resampler_get_sample(void *_r)
-{
- resampler * r = ( resampler * ) _r;
- if ( r->read_filled < 1 && r->phase_inc)
- resampler_fill_and_remove_delay( r );
- if ( r->read_filled < 1 )
+int resampler_get_sample(void *_r) {
+ resampler *r = (resampler *)_r;
+ if (r->read_filled < 1 && r->phase_inc)
+ resampler_fill_and_remove_delay(r);
+ if (r->read_filled < 1)
return 0;
- if ( r->quality == RESAMPLER_QUALITY_BLEP || r->quality == RESAMPLER_QUALITY_BLAM )
- return (int)(r->buffer_out[ r->read_pos ] + r->accumulator);
+ if (r->quality == RESAMPLER_QUALITY_BLEP ||
+ r->quality == RESAMPLER_QUALITY_BLAM)
+ return (int)(r->buffer_out[r->read_pos] + r->accumulator);
else
- return (int)r->buffer_out[ r->read_pos ];
+ return (int)r->buffer_out[r->read_pos];
}
-float resampler_get_sample_float(void *_r)
-{
- resampler * r = ( resampler * ) _r;
- if ( r->read_filled < 1 && r->phase_inc)
- resampler_fill_and_remove_delay( r );
- if ( r->read_filled < 1 )
+float resampler_get_sample_float(void *_r) {
+ resampler *r = (resampler *)_r;
+ if (r->read_filled < 1 && r->phase_inc)
+ resampler_fill_and_remove_delay(r);
+ if (r->read_filled < 1)
return 0;
- if ( r->quality == RESAMPLER_QUALITY_BLEP || r->quality == RESAMPLER_QUALITY_BLAM )
- return r->buffer_out[ r->read_pos ] + r->accumulator;
+ if (r->quality == RESAMPLER_QUALITY_BLEP ||
+ r->quality == RESAMPLER_QUALITY_BLAM)
+ return r->buffer_out[r->read_pos] + r->accumulator;
else
- return r->buffer_out[ r->read_pos ];
+ return r->buffer_out[r->read_pos];
}
-void resampler_remove_sample(void *_r, int decay)
-{
- resampler * r = ( resampler * ) _r;
- if ( r->read_filled > 0 )
- {
- if ( r->quality == RESAMPLER_QUALITY_BLEP || r->quality == RESAMPLER_QUALITY_BLAM )
- {
- r->accumulator += r->buffer_out[ r->read_pos ];
- r->buffer_out[ r->read_pos ] = 0;
- if (decay)
- {
+void resampler_remove_sample(void *_r, int decay) {
+ resampler *r = (resampler *)_r;
+ if (r->read_filled > 0) {
+ if (r->quality == RESAMPLER_QUALITY_BLEP ||
+ r->quality == RESAMPLER_QUALITY_BLAM) {
+ r->accumulator += r->buffer_out[r->read_pos];
+ r->buffer_out[r->read_pos] = 0;
+ if (decay) {
r->accumulator -= r->accumulator * (1.0f / 8192.0f);
if (fabs(r->accumulator) < 1e-20f)
r->accumulator = 0;
@@ -1510,6 +1428,6 @@
}
}
--r->read_filled;
- r->read_pos = ( r->read_pos + 1 ) % resampler_buffer_size;
+ r->read_pos = (r->read_pos + 1) % resampler_buffer_size;
}
}
--- a/src/helpers/riff.c
+++ b/src/helpers/riff.c
@@ -3,83 +3,86 @@
#include <stdlib.h>
-struct riff * riff_parse( DUMBFILE * f, long offset, long size, unsigned proper )
-{
- unsigned stream_size;
- struct riff * stream;
+struct riff *riff_parse(DUMBFILE *f, long offset, long size, unsigned proper) {
+ unsigned stream_size;
+ struct riff *stream;
- if ( size < 8 ) return 0;
+ if (size < 8)
+ return 0;
- if ( dumbfile_seek(f, offset, DFS_SEEK_SET) ) return 0;
- if ( dumbfile_mgetl(f) != DUMB_ID('R','I','F','F') ) return 0;
+ if (dumbfile_seek(f, offset, DFS_SEEK_SET))
+ return 0;
+ if (dumbfile_mgetl(f) != DUMB_ID('R', 'I', 'F', 'F'))
+ return 0;
- stream_size = (int) dumbfile_igetl(f);
- if ( stream_size + 8 > size ) return 0;
- if ( stream_size < 4 ) return 0;
+ stream_size = (int)dumbfile_igetl(f);
+ if (stream_size + 8 > size)
+ return 0;
+ if (stream_size < 4)
+ return 0;
- stream = (struct riff *) malloc( sizeof( struct riff ) );
- if ( ! stream ) return 0;
+ stream = (struct riff *)malloc(sizeof(struct riff));
+ if (!stream)
+ return 0;
- stream->type = (int) dumbfile_mgetl(f);
- stream->chunk_count = 0;
- stream->chunks = 0;
+ stream->type = (int)dumbfile_mgetl(f);
+ stream->chunk_count = 0;
+ stream->chunks = 0;
- stream_size -= 4;
+ stream_size -= 4;
- while ( stream_size && !dumbfile_error(f) )
- {
- struct riff_chunk * chunk;
- if ( stream_size < 8 ) break;
- stream->chunks = ( struct riff_chunk * ) realloc( stream->chunks, ( stream->chunk_count + 1 ) * sizeof( struct riff_chunk ) );
- if ( ! stream->chunks ) break;
- chunk = stream->chunks + stream->chunk_count;
- chunk->type = (int) dumbfile_mgetl(f);
- chunk->size = (int) dumbfile_igetl(f);
+ while (stream_size && !dumbfile_error(f)) {
+ struct riff_chunk *chunk;
+ if (stream_size < 8)
+ break;
+ stream->chunks = (struct riff_chunk *)realloc(
+ stream->chunks,
+ (stream->chunk_count + 1) * sizeof(struct riff_chunk));
+ if (!stream->chunks)
+ break;
+ chunk = stream->chunks + stream->chunk_count;
+ chunk->type = (int)dumbfile_mgetl(f);
+ chunk->size = (int)dumbfile_igetl(f);
chunk->offset = dumbfile_pos(f);
- stream_size -= 8;
- if ( stream_size < chunk->size ) break;
- if ( chunk->type == DUMB_ID('R','I','F','F') )
- {
- chunk->nested = riff_parse( f, chunk->offset - 8, chunk->size + 8, proper );
- if ( ! chunk->nested ) break;
- }
- else
- {
+ stream_size -= 8;
+ if (stream_size < chunk->size)
+ break;
+ if (chunk->type == DUMB_ID('R', 'I', 'F', 'F')) {
+ chunk->nested =
+ riff_parse(f, chunk->offset - 8, chunk->size + 8, proper);
+ if (!chunk->nested)
+ break;
+ } else {
chunk->nested = 0;
- }
+ }
dumbfile_seek(f, chunk->offset + chunk->size, DFS_SEEK_SET);
- stream_size -= chunk->size;
- if ( proper && ( chunk->size & 1 ) )
- {
+ stream_size -= chunk->size;
+ if (proper && (chunk->size & 1)) {
dumbfile_skip(f, 1);
- -- stream_size;
- }
- ++stream->chunk_count;
- }
-
- if ( stream_size )
- {
- riff_free( stream );
- stream = 0;
- }
+ --stream_size;
+ }
+ ++stream->chunk_count;
+ }
- return stream;
+ if (stream_size) {
+ riff_free(stream);
+ stream = 0;
+ }
+
+ return stream;
}
-void riff_free( struct riff * stream )
-{
- if ( stream )
- {
- if ( stream->chunks )
- {
- unsigned i;
- for ( i = 0; i < stream->chunk_count; ++i )
- {
- struct riff_chunk * chunk = stream->chunks + i;
- if ( chunk->nested ) riff_free( chunk->nested );
- }
- free( stream->chunks );
- }
- free( stream );
- }
+void riff_free(struct riff *stream) {
+ if (stream) {
+ if (stream->chunks) {
+ unsigned i;
+ for (i = 0; i < stream->chunk_count; ++i) {
+ struct riff_chunk *chunk = stream->chunks + i;
+ if (chunk->nested)
+ riff_free(chunk->nested);
+ }
+ free(stream->chunks);
+ }
+ free(stream);
+ }
}
--- a/src/helpers/sampbuf.c
+++ b/src/helpers/sampbuf.c
@@ -20,28 +20,24 @@
#include <stdlib.h>
#include "dumb.h"
-
-
-sample_t **allocate_sample_buffer(int n_channels, long length)
-{
- int i;
- sample_t **samples = malloc(((n_channels + 1) >> 1) * sizeof(*samples));
- if (!samples) return NULL;
- samples[0] = malloc(n_channels * length * sizeof(*samples[0]));
- if (!samples[0]) {
- free(samples);
- return NULL;
- }
- for (i = 1; i < (n_channels + 1) >> 1; i++) samples[i] = samples[i-1] + length*2;
- return samples;
+sample_t **allocate_sample_buffer(int n_channels, long length) {
+ int i;
+ sample_t **samples = malloc(((n_channels + 1) >> 1) * sizeof(*samples));
+ if (!samples)
+ return NULL;
+ samples[0] = malloc(n_channels * length * sizeof(*samples[0]));
+ if (!samples[0]) {
+ free(samples);
+ return NULL;
+ }
+ for (i = 1; i<(n_channels + 1)>> 1; i++)
+ samples[i] = samples[i - 1] + length * 2;
+ return samples;
}
-
-
-void destroy_sample_buffer(sample_t **samples)
-{
- if (samples) {
- free(samples[0]);
- free(samples);
- }
+void destroy_sample_buffer(sample_t **samples) {
+ if (samples) {
+ free(samples[0]);
+ free(samples);
+ }
}
--- a/src/helpers/silence.c
+++ b/src/helpers/silence.c
@@ -20,10 +20,6 @@
#include <string.h>
#include "dumb.h"
-
-
-void dumb_silence(sample_t *samples, long length)
-{
- memset(samples, 0, length * sizeof(*samples));
+void dumb_silence(sample_t *samples, long length) {
+ memset(samples, 0, length * sizeof(*samples));
}
-
--- a/src/helpers/stdfile.c
+++ b/src/helpers/stdfile.c
@@ -21,24 +21,18 @@
#include "dumb.h"
-
-
-typedef struct dumb_stdfile
-{
- FILE * file;
+typedef struct dumb_stdfile {
+ FILE *file;
dumb_off_t size;
} dumb_stdfile;
-
-
-static void *dumb_stdfile_open(const char *filename)
-{
- dumb_stdfile * file = ( dumb_stdfile * ) malloc( sizeof(dumb_stdfile) );
- if ( !file ) return 0;
+static void *dumb_stdfile_open(const char *filename) {
+ dumb_stdfile *file = (dumb_stdfile *)malloc(sizeof(dumb_stdfile));
+ if (!file)
+ return 0;
file->file = fopen(filename, "rb");
- if ( !file->file )
- {
- free( file );
+ if (!file->file) {
+ free(file);
return 0;
}
fseek(file->file, 0, SEEK_END);
@@ -52,100 +46,59 @@
return file;
}
-
-
-static int dumb_stdfile_skip(void *f, dumb_off_t n)
-{
- dumb_stdfile * file = ( dumb_stdfile * ) f;
+static int dumb_stdfile_skip(void *f, dumb_off_t n) {
+ dumb_stdfile *file = (dumb_stdfile *)f;
return fseek(file->file, n, SEEK_CUR);
}
-
-
-static int dumb_stdfile_getc(void *f)
-{
- dumb_stdfile * file = ( dumb_stdfile * ) f;
+static int dumb_stdfile_getc(void *f) {
+ dumb_stdfile *file = (dumb_stdfile *)f;
return fgetc(file->file);
}
-
-
-static dumb_ssize_t dumb_stdfile_getnc(char *ptr, size_t n, void *f)
-{
- dumb_stdfile * file = ( dumb_stdfile * ) f;
+static dumb_ssize_t dumb_stdfile_getnc(char *ptr, size_t n, void *f) {
+ dumb_stdfile *file = (dumb_stdfile *)f;
return fread(ptr, 1, n, file->file);
}
-
-
-static void dumb_stdfile_close(void *f)
-{
- dumb_stdfile * file = ( dumb_stdfile * ) f;
+static void dumb_stdfile_close(void *f) {
+ dumb_stdfile *file = (dumb_stdfile *)f;
fclose(file->file);
free(f);
}
+static void dumb_stdfile_noclose(void *f) { free(f); }
-
-static void dumb_stdfile_noclose(void *f)
-{
- free(f);
-}
-
-
-
-static int dumb_stdfile_seek(void *f, dumb_off_t n)
-{
- dumb_stdfile * file = ( dumb_stdfile * ) f;
+static int dumb_stdfile_seek(void *f, dumb_off_t n) {
+ dumb_stdfile *file = (dumb_stdfile *)f;
return fseek(file->file, n, SEEK_SET);
}
-
-
-static dumb_off_t dumb_stdfile_get_size(void *f)
-{
- dumb_stdfile * file = ( dumb_stdfile * ) f;
+static dumb_off_t dumb_stdfile_get_size(void *f) {
+ dumb_stdfile *file = (dumb_stdfile *)f;
return file->size;
}
-
-
static const DUMBFILE_SYSTEM stdfile_dfs = {
- &dumb_stdfile_open,
- &dumb_stdfile_skip,
- &dumb_stdfile_getc,
- &dumb_stdfile_getnc,
- &dumb_stdfile_close,
- &dumb_stdfile_seek,
- &dumb_stdfile_get_size
-};
+ &dumb_stdfile_open, &dumb_stdfile_skip, &dumb_stdfile_getc,
+ &dumb_stdfile_getnc, &dumb_stdfile_close, &dumb_stdfile_seek,
+ &dumb_stdfile_get_size};
+void dumb_register_stdfiles(void) { register_dumbfile_system(&stdfile_dfs); }
+static const DUMBFILE_SYSTEM stdfile_dfs_leave_open = {NULL,
+ &dumb_stdfile_skip,
+ &dumb_stdfile_getc,
+ &dumb_stdfile_getnc,
+ &dumb_stdfile_noclose,
+ &dumb_stdfile_seek,
+ &dumb_stdfile_get_size};
-void dumb_register_stdfiles(void)
-{
- register_dumbfile_system(&stdfile_dfs);
-}
-
-
-
-static const DUMBFILE_SYSTEM stdfile_dfs_leave_open = {
- NULL,
- &dumb_stdfile_skip,
- &dumb_stdfile_getc,
- &dumb_stdfile_getnc,
- &dumb_stdfile_noclose,
- &dumb_stdfile_seek,
- &dumb_stdfile_get_size
-};
-
-
-
-DUMBFILE *dumbfile_open_stdfile(FILE *p)
-{
- dumb_stdfile * file = ( dumb_stdfile * ) malloc( sizeof(dumb_stdfile) );
- DUMBFILE *d;
- if ( !file ) return 0;
+DUMBFILE *dumbfile_open_stdfile(FILE *p) {
+ dumb_stdfile *file = (dumb_stdfile *)malloc(sizeof(dumb_stdfile));
+ DUMBFILE *d;
+ if (!file)
+ return 0;
file->file = p;
fseek(p, 0, SEEK_END);
file->size = ftell(p);
@@ -156,5 +109,5 @@
fseek(p, 0, SEEK_SET);
d = dumbfile_open_ex(file, &stdfile_dfs_leave_open);
- return d;
+ return d;
}
--- a/src/helpers/tarray.c
+++ b/src/helpers/tarray.c
@@ -2,174 +2,179 @@
#include <string.h>
- /*
- Structures which contain the play times of each pattern and row combination in the song,
- not guaranteed to be valid for the whole song until the loop status is no longer zero.
- The initial count and restart count will both be zero on song start, then both will be
- incremented until the song loops. Restart count will be reset to zero on loop for all
- rows which have a time equal to or greater than the loop start point, so time keeping
- functions will know which timestamp the song is currently located at.
+/*
+ Structures which contain the play times of each pattern and row combination
+ in the song, not guaranteed to be valid for the whole song until the loop
+ status is no longer zero. The initial count and restart count will both be
+ zero on song start, then both will be incremented until the song loops.
+ Restart count will be reset to zero on loop for all rows which have a time
+ equal to or greater than the loop start point, so time keeping functions will
+ know which timestamp the song is currently located at.
- Timestamp lists are guaranteed to be allocated in blocks of 16 timestamps at a time.
- */
+ Timestamp lists are guaranteed to be allocated in blocks of 16 timestamps at
+ a time.
+*/
- /*
- We don't need full timekeeping because the player loop only wants the first play time
- of the loop start order/row. We also don't really want full timekeeping because it
- involves a lot of memory allocations, which is also slow.
- */
+/*
+ We don't need full timekeeping because the player loop only wants the first
+ play time of the loop start order/row. We also don't really want full
+ timekeeping because it involves a lot of memory allocations, which is also
+ slow.
+*/
#undef FULL_TIMEKEEPING
-typedef struct DUMB_IT_ROW_TIME
-{
- unsigned int count, restart_count;
+typedef struct DUMB_IT_ROW_TIME {
+ unsigned int count, restart_count;
#ifndef FULL_TIMEKEEPING
- LONG_LONG first_time;
+ LONG_LONG first_time;
#else
- LONG_LONG * times;
+ LONG_LONG *times;
#endif
} DUMB_IT_ROW_TIME;
-void * timekeeping_array_create(size_t size)
-{
- size_t * _size = (size_t *) calloc( 1, sizeof(size_t) + sizeof(DUMB_IT_ROW_TIME) * size );
- if ( _size ) {
- *_size = size;
- }
- return _size;
+void *timekeeping_array_create(size_t size) {
+ size_t *_size =
+ (size_t *)calloc(1, sizeof(size_t) + sizeof(DUMB_IT_ROW_TIME) * size);
+ if (_size) {
+ *_size = size;
+ }
+ return _size;
}
-void timekeeping_array_destroy(void * array)
-{
+void timekeeping_array_destroy(void *array) {
#ifdef FULL_TIMEKEEPING
- size_t i;
- size_t * size = (size_t *) array;
- DUMB_IT_ROW_TIME * s = (DUMB_IT_ROW_TIME *)(size + 1);
+ size_t i;
+ size_t *size = (size_t *)array;
+ DUMB_IT_ROW_TIME *s = (DUMB_IT_ROW_TIME *)(size + 1);
- for (i = 0; i < *size; i++) {
- if (s[i].times) free(s[i].times);
- }
+ for (i = 0; i < *size; i++) {
+ if (s[i].times)
+ free(s[i].times);
+ }
#endif
free(array);
}
-void * timekeeping_array_dup(void * array)
-{
- size_t i;
- size_t * size = (size_t *) array;
- DUMB_IT_ROW_TIME * s = (DUMB_IT_ROW_TIME *)(size + 1);
- size_t * new_size = (size_t *) calloc( 1, sizeof(size_t) + sizeof(DUMB_IT_ROW_TIME) * *size );
- if ( new_size ) {
- DUMB_IT_ROW_TIME * new_s = (DUMB_IT_ROW_TIME *)(new_size + 1);
+void *timekeeping_array_dup(void *array) {
+ size_t i;
+ size_t *size = (size_t *)array;
+ DUMB_IT_ROW_TIME *s = (DUMB_IT_ROW_TIME *)(size + 1);
+ size_t *new_size =
+ (size_t *)calloc(1, sizeof(size_t) + sizeof(DUMB_IT_ROW_TIME) * *size);
+ if (new_size) {
+ DUMB_IT_ROW_TIME *new_s = (DUMB_IT_ROW_TIME *)(new_size + 1);
- *new_size = *size;
+ *new_size = *size;
- for (i = 0; i < *size; i++) {
- new_s[i].count = s[i].count;
- new_s[i].restart_count = s[i].restart_count;
+ for (i = 0; i < *size; i++) {
+ new_s[i].count = s[i].count;
+ new_s[i].restart_count = s[i].restart_count;
#ifndef FULL_TIMEKEEPING
- new_s[i].first_time = s[i].first_time;
+ new_s[i].first_time = s[i].first_time;
#else
- if ( s[i].times ) {
- size_t time_count = ( s[i].count + 15 ) & ~15;
- new_s[i].times = (LONG_LONG *) malloc( sizeof(LONG_LONG) * time_count );
- if ( new_s[i].times == (void *)0 ) {
- timekeeping_array_destroy( new_size );
- return (void *) 0;
- }
- memcpy( new_s[i].times, s[i].times, sizeof(LONG_LONG) * s[i].count );
- }
+ if (s[i].times) {
+ size_t time_count = (s[i].count + 15) & ~15;
+ new_s[i].times =
+ (LONG_LONG *)malloc(sizeof(LONG_LONG) * time_count);
+ if (new_s[i].times == (void *)0) {
+ timekeeping_array_destroy(new_size);
+ return (void *)0;
+ }
+ memcpy(new_s[i].times, s[i].times,
+ sizeof(LONG_LONG) * s[i].count);
+ }
#endif
- }
- }
+ }
+ }
- return new_size;
+ return new_size;
}
-void timekeeping_array_reset(void * array, size_t loop_start)
-{
- size_t i;
- size_t * size = (size_t *) array;
- DUMB_IT_ROW_TIME * s = (DUMB_IT_ROW_TIME *)(size + 1);
+void timekeeping_array_reset(void *array, size_t loop_start) {
+ size_t i;
+ size_t *size = (size_t *)array;
+ DUMB_IT_ROW_TIME *s = (DUMB_IT_ROW_TIME *)(size + 1);
- DUMB_IT_ROW_TIME * s_loop_start = s + loop_start;
- LONG_LONG loop_start_time;
+ DUMB_IT_ROW_TIME *s_loop_start = s + loop_start;
+ LONG_LONG loop_start_time;
- if ( loop_start >= *size || s_loop_start->count < 1 ) return;
+ if (loop_start >= *size || s_loop_start->count < 1)
+ return;
#ifndef FULL_TIMEKEEPING
- loop_start_time = s_loop_start->first_time;
+ loop_start_time = s_loop_start->first_time;
#else
- loop_start_time = s_loop_start->times[0];
+ loop_start_time = s_loop_start->times[0];
#endif
- for ( i = 0; i < *size; i++ ) {
+ for (i = 0; i < *size; i++) {
#ifndef FULL_TIMEKEEPING
- if ( s[i].count && s[i].first_time >= loop_start_time ) {
+ if (s[i].count && s[i].first_time >= loop_start_time) {
#else
- if ( s[i].count && s[i].times[0] >= loop_start_time ) {
+ if (s[i].count && s[i].times[0] >= loop_start_time) {
#endif
- s[i].restart_count = 0;
- }
- }
+ s[i].restart_count = 0;
+ }
+ }
}
-void timekeeping_array_push(void * array, size_t index, LONG_LONG time)
-{
+void timekeeping_array_push(void *array, size_t index, LONG_LONG time) {
#ifdef FULL_TIMEKEEPING
- size_t i;
+ size_t i;
size_t time_count;
#endif
- size_t * size = (size_t *) array;
- DUMB_IT_ROW_TIME * s = (DUMB_IT_ROW_TIME *)(size + 1);
+ size_t *size = (size_t *)array;
+ DUMB_IT_ROW_TIME *s = (DUMB_IT_ROW_TIME *)(size + 1);
- if (index >= *size) return;
+ if (index >= *size)
+ return;
#ifndef FULL_TIMEKEEPING
- if ( !s[index].count++ )
- s[index].first_time = time;
+ if (!s[index].count++)
+ s[index].first_time = time;
#else
- time_count = ( s[index].count + 16 ) & ~15;
+ time_count = (s[index].count + 16) & ~15;
- s[index].times = (LONG_LONG *) realloc( s[index].times, sizeof(LONG_LONG) * time_count );
+ s[index].times =
+ (LONG_LONG *)realloc(s[index].times, sizeof(LONG_LONG) * time_count);
- s[index].times[s[index].count++] = time;
+ s[index].times[s[index].count++] = time;
#endif
}
-void timekeeping_array_bump(void * array, size_t index)
-{
- size_t * size = (size_t *) array;
- DUMB_IT_ROW_TIME * s = (DUMB_IT_ROW_TIME *)(size + 1);
+void timekeeping_array_bump(void *array, size_t index) {
+ size_t *size = (size_t *)array;
+ DUMB_IT_ROW_TIME *s = (DUMB_IT_ROW_TIME *)(size + 1);
- if (index >= *size) return;
+ if (index >= *size)
+ return;
- s[index].restart_count++;
+ s[index].restart_count++;
}
-unsigned int timekeeping_array_get_count(void * array, size_t index)
-{
- size_t * size = (size_t *) array;
- DUMB_IT_ROW_TIME * s = (DUMB_IT_ROW_TIME *)(size + 1);
+unsigned int timekeeping_array_get_count(void *array, size_t index) {
+ size_t *size = (size_t *)array;
+ DUMB_IT_ROW_TIME *s = (DUMB_IT_ROW_TIME *)(size + 1);
- if (index >= *size) return 0;
+ if (index >= *size)
+ return 0;
- return s[index].count;
+ return s[index].count;
}
-LONG_LONG timekeeping_array_get_item(void * array, size_t index)
-{
- size_t * size = (size_t *) array;
- DUMB_IT_ROW_TIME * s = (DUMB_IT_ROW_TIME *)(size + 1);
+LONG_LONG timekeeping_array_get_item(void *array, size_t index) {
+ size_t *size = (size_t *)array;
+ DUMB_IT_ROW_TIME *s = (DUMB_IT_ROW_TIME *)(size + 1);
- if (index >= *size || s[index].restart_count >= s[index].count) return 0;
+ if (index >= *size || s[index].restart_count >= s[index].count)
+ return 0;
#ifndef FULL_TIMEKEEPING
- return s[index].first_time;
+ return s[index].first_time;
#else
- return s[index].times[s[index].restart_count];
+ return s[index].times[s[index].restart_count];
#endif
}
--- a/src/it/itload.c
+++ b/src/it/itload.c
@@ -20,24 +20,20 @@
#include "dumb.h"
#include "internal/it.h"
-
-
/* dumb_load_it_quick(): loads an IT file into a DUH struct, returning a
* pointer to the DUH struct. When you have finished with it, you must pass
* the pointer to unload_duh() so that the memory can be freed.
*/
-DUH *dumb_load_it_quick(const char *filename)
-{
- DUH *duh;
- DUMBFILE *f = dumbfile_open(filename);
+DUH *dumb_load_it_quick(const char *filename) {
+ DUH *duh;
+ DUMBFILE *f = dumbfile_open(filename);
- if (!f)
- return NULL;
+ if (!f)
+ return NULL;
- duh = dumb_read_it_quick(f);
+ duh = dumb_read_it_quick(f);
- dumbfile_close(f);
+ dumbfile_close(f);
- return duh;
+ return duh;
}
-
--- a/src/it/itload2.c
+++ b/src/it/itload2.c
@@ -19,11 +19,8 @@
#include "dumb.h"
-
-
-DUH *dumb_load_it(const char *filename)
-{
- DUH *duh = dumb_load_it_quick(filename);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+DUH *dumb_load_it(const char *filename) {
+ DUH *duh = dumb_load_it_quick(filename);
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/itmisc.c
+++ b/src/it/itmisc.c
@@ -20,230 +20,150 @@
#include "dumb.h"
#include "internal/it.h"
-
int dumb_it_default_panning_separation = 25;
-
-DUMB_IT_SIGDATA *duh_get_it_sigdata(DUH *duh)
-{
- return duh_get_raw_sigdata(duh, -1, SIGTYPE_IT);
+DUMB_IT_SIGDATA *duh_get_it_sigdata(DUH *duh) {
+ return duh_get_raw_sigdata(duh, -1, SIGTYPE_IT);
}
-
-
-const unsigned char *dumb_it_sd_get_song_message(DUMB_IT_SIGDATA *sd)
-{
- return sd ? sd->song_message : NULL;
+const unsigned char *dumb_it_sd_get_song_message(DUMB_IT_SIGDATA *sd) {
+ return sd ? sd->song_message : NULL;
}
-
-
-int dumb_it_sd_get_n_orders(DUMB_IT_SIGDATA *sd)
-{
- return sd ? sd->n_orders : 0;
+int dumb_it_sd_get_n_orders(DUMB_IT_SIGDATA *sd) {
+ return sd ? sd->n_orders : 0;
}
-
-
-int dumb_it_sd_get_n_samples(DUMB_IT_SIGDATA *sd)
-{
- return sd ? sd->n_samples : 0;
+int dumb_it_sd_get_n_samples(DUMB_IT_SIGDATA *sd) {
+ return sd ? sd->n_samples : 0;
}
-
-
-int dumb_it_sd_get_n_instruments(DUMB_IT_SIGDATA *sd)
-{
- return sd ? sd->n_instruments : 0;
+int dumb_it_sd_get_n_instruments(DUMB_IT_SIGDATA *sd) {
+ return sd ? sd->n_instruments : 0;
}
-
-
-const unsigned char *dumb_it_sd_get_sample_name(DUMB_IT_SIGDATA *sd, int i)
-{
- ASSERT(sd && sd->sample && i >= 0 && i < sd->n_samples);
- return sd->sample[i].name;
+const unsigned char *dumb_it_sd_get_sample_name(DUMB_IT_SIGDATA *sd, int i) {
+ ASSERT(sd && sd->sample && i >= 0 && i < sd->n_samples);
+ return sd->sample[i].name;
}
-
-
-const unsigned char *dumb_it_sd_get_sample_filename(DUMB_IT_SIGDATA *sd, int i)
-{
- ASSERT(sd && sd->sample && i >= 0 && i < sd->n_samples);
- return sd->sample[i].filename;
+const unsigned char *dumb_it_sd_get_sample_filename(DUMB_IT_SIGDATA *sd,
+ int i) {
+ ASSERT(sd && sd->sample && i >= 0 && i < sd->n_samples);
+ return sd->sample[i].filename;
}
-
-
-const unsigned char *dumb_it_sd_get_instrument_name(DUMB_IT_SIGDATA *sd, int i)
-{
- ASSERT(sd && sd->instrument && i >= 0 && i < sd->n_instruments);
- return sd->instrument[i].name;
+const unsigned char *dumb_it_sd_get_instrument_name(DUMB_IT_SIGDATA *sd,
+ int i) {
+ ASSERT(sd && sd->instrument && i >= 0 && i < sd->n_instruments);
+ return sd->instrument[i].name;
}
-
-
-const unsigned char *dumb_it_sd_get_instrument_filename(DUMB_IT_SIGDATA *sd, int i)
-{
- ASSERT(sd && sd->instrument && i >= 0 && i < sd->n_instruments);
- return sd->instrument[i].filename;
+const unsigned char *dumb_it_sd_get_instrument_filename(DUMB_IT_SIGDATA *sd,
+ int i) {
+ ASSERT(sd && sd->instrument && i >= 0 && i < sd->n_instruments);
+ return sd->instrument[i].filename;
}
-
-
-int dumb_it_sd_get_initial_global_volume(DUMB_IT_SIGDATA *sd)
-{
- return sd ? sd->global_volume : 0;
+int dumb_it_sd_get_initial_global_volume(DUMB_IT_SIGDATA *sd) {
+ return sd ? sd->global_volume : 0;
}
-
-
-void dumb_it_sd_set_initial_global_volume(DUMB_IT_SIGDATA *sd, int gv)
-{
- if (sd) sd->global_volume = gv;
+void dumb_it_sd_set_initial_global_volume(DUMB_IT_SIGDATA *sd, int gv) {
+ if (sd)
+ sd->global_volume = gv;
}
-
-
-int dumb_it_sd_get_mixing_volume(DUMB_IT_SIGDATA *sd)
-{
- return sd ? sd->mixing_volume : 0;
+int dumb_it_sd_get_mixing_volume(DUMB_IT_SIGDATA *sd) {
+ return sd ? sd->mixing_volume : 0;
}
-
-
-void dumb_it_sd_set_mixing_volume(DUMB_IT_SIGDATA *sd, int mv)
-{
- if (sd) sd->mixing_volume = mv;
+void dumb_it_sd_set_mixing_volume(DUMB_IT_SIGDATA *sd, int mv) {
+ if (sd)
+ sd->mixing_volume = mv;
}
-
-
-int dumb_it_sd_get_initial_speed(DUMB_IT_SIGDATA *sd)
-{
- return sd ? sd->speed : 0;
+int dumb_it_sd_get_initial_speed(DUMB_IT_SIGDATA *sd) {
+ return sd ? sd->speed : 0;
}
-
-
-void dumb_it_sd_set_initial_speed(DUMB_IT_SIGDATA *sd, int speed)
-{
- if (sd) sd->speed = speed;
+void dumb_it_sd_set_initial_speed(DUMB_IT_SIGDATA *sd, int speed) {
+ if (sd)
+ sd->speed = speed;
}
-
-
-int dumb_it_sd_get_initial_tempo(DUMB_IT_SIGDATA *sd)
-{
- return sd ? sd->tempo : 0;
+int dumb_it_sd_get_initial_tempo(DUMB_IT_SIGDATA *sd) {
+ return sd ? sd->tempo : 0;
}
-
-
-void dumb_it_sd_set_initial_tempo(DUMB_IT_SIGDATA *sd, int tempo)
-{
- if (sd) sd->tempo = tempo;
+void dumb_it_sd_set_initial_tempo(DUMB_IT_SIGDATA *sd, int tempo) {
+ if (sd)
+ sd->tempo = tempo;
}
-
-
-int dumb_it_sd_get_initial_channel_volume(DUMB_IT_SIGDATA *sd, int channel)
-{
- ASSERT(channel >= 0 && channel < DUMB_IT_N_CHANNELS);
- return sd ? sd->channel_volume[channel] : 0;
+int dumb_it_sd_get_initial_channel_volume(DUMB_IT_SIGDATA *sd, int channel) {
+ ASSERT(channel >= 0 && channel < DUMB_IT_N_CHANNELS);
+ return sd ? sd->channel_volume[channel] : 0;
}
-void dumb_it_sd_set_initial_channel_volume(DUMB_IT_SIGDATA *sd, int channel, int volume)
-{
- ASSERT(channel >= 0 && channel < DUMB_IT_N_CHANNELS);
- if (sd) sd->channel_volume[channel] = volume;
+void dumb_it_sd_set_initial_channel_volume(DUMB_IT_SIGDATA *sd, int channel,
+ int volume) {
+ ASSERT(channel >= 0 && channel < DUMB_IT_N_CHANNELS);
+ if (sd)
+ sd->channel_volume[channel] = volume;
}
-
-
-int dumb_it_sr_get_current_order(DUMB_IT_SIGRENDERER *sr)
-{
- return sr ? sr->order : -1;
+int dumb_it_sr_get_current_order(DUMB_IT_SIGRENDERER *sr) {
+ return sr ? sr->order : -1;
}
-
-
-int dumb_it_sr_get_current_row(DUMB_IT_SIGRENDERER *sr)
-{
- return sr ? sr->row : -1;
+int dumb_it_sr_get_current_row(DUMB_IT_SIGRENDERER *sr) {
+ return sr ? sr->row : -1;
}
-
-
-int dumb_it_sr_get_global_volume(DUMB_IT_SIGRENDERER *sr)
-{
- return sr ? sr->globalvolume : 0;
+int dumb_it_sr_get_global_volume(DUMB_IT_SIGRENDERER *sr) {
+ return sr ? sr->globalvolume : 0;
}
-
-
-void dumb_it_sr_set_global_volume(DUMB_IT_SIGRENDERER *sr, int gv)
-{
- if (sr) sr->globalvolume = gv;
+void dumb_it_sr_set_global_volume(DUMB_IT_SIGRENDERER *sr, int gv) {
+ if (sr)
+ sr->globalvolume = gv;
}
+int dumb_it_sr_get_tempo(DUMB_IT_SIGRENDERER *sr) { return sr ? sr->tempo : 0; }
-
-int dumb_it_sr_get_tempo(DUMB_IT_SIGRENDERER *sr)
-{
- return sr ? sr->tempo : 0;
+void dumb_it_sr_set_tempo(DUMB_IT_SIGRENDERER *sr, int tempo) {
+ if (sr)
+ sr->tempo = tempo;
}
+int dumb_it_sr_get_speed(DUMB_IT_SIGRENDERER *sr) { return sr ? sr->speed : 0; }
-
-void dumb_it_sr_set_tempo(DUMB_IT_SIGRENDERER *sr, int tempo)
-{
- if (sr) sr->tempo = tempo;
+void dumb_it_sr_set_speed(DUMB_IT_SIGRENDERER *sr, int speed) {
+ if (sr)
+ sr->speed = speed;
}
-
-
-int dumb_it_sr_get_speed(DUMB_IT_SIGRENDERER *sr)
-{
- return sr ? sr->speed : 0;
+int dumb_it_sr_get_channel_volume(DUMB_IT_SIGRENDERER *sr, int channel) {
+ return sr ? sr->channel[channel].channelvolume : 0;
}
-
-
-void dumb_it_sr_set_speed(DUMB_IT_SIGRENDERER *sr, int speed)
-{
- if (sr) sr->speed = speed;
+void dumb_it_sr_set_channel_volume(DUMB_IT_SIGRENDERER *sr, int channel,
+ int volume) {
+ if (sr)
+ sr->channel[channel].channelvolume = volume;
}
-
-
-int dumb_it_sr_get_channel_volume(DUMB_IT_SIGRENDERER *sr, int channel)
-{
- return sr ? sr->channel[channel].channelvolume : 0;
+void dumb_it_sr_set_channel_muted(DUMB_IT_SIGRENDERER *sr, int channel,
+ int muted) {
+ if (sr) {
+ if (muted)
+ sr->channel[channel].flags |= IT_CHANNEL_MUTED;
+ else
+ sr->channel[channel].flags &= ~IT_CHANNEL_MUTED;
+ }
}
-
-
-void dumb_it_sr_set_channel_volume(DUMB_IT_SIGRENDERER *sr, int channel, int volume)
-{
- if (sr) sr->channel[channel].channelvolume = volume;
-}
-
-
-
-void dumb_it_sr_set_channel_muted(DUMB_IT_SIGRENDERER *sr, int channel, int muted)
-{
- if (sr) {
- if (muted)
- sr->channel[channel].flags |= IT_CHANNEL_MUTED;
- else
- sr->channel[channel].flags &= ~IT_CHANNEL_MUTED;
- }
-}
-
-
-
-int dumb_it_sr_get_channel_muted(DUMB_IT_SIGRENDERER *sr, int channel)
-{
- return sr ? (sr->channel[channel].flags & IT_CHANNEL_MUTED) != 0 : 0;
+int dumb_it_sr_get_channel_muted(DUMB_IT_SIGRENDERER *sr, int channel) {
+ return sr ? (sr->channel[channel].flags & IT_CHANNEL_MUTED) != 0 : 0;
}
--- a/src/it/itorder.c
+++ b/src/it/itorder.c
@@ -17,15 +17,11 @@
* \__/
*/
-
-
#include <stdlib.h>
#include "dumb.h"
#include "internal/it.h"
-
-
/* This function ensures that any pattern mentioned in the order table but
* not present in the pattern table is treated as an empty 64 rows pattern.
* This is done by adding such a dummy pattern at the end of the pattern
@@ -32,32 +28,34 @@
* table, and redirect invalid orders to it.
* Patterns 254 and 255 are left untouched, unless the signal is an XM.
*/
-int _dumb_it_fix_invalid_orders(DUMB_IT_SIGDATA *sigdata)
-{
- int i;
- int found_some = 0;
+int _dumb_it_fix_invalid_orders(DUMB_IT_SIGDATA *sigdata) {
+ int i;
+ int found_some = 0;
- int first_invalid = sigdata->n_patterns;
- int last_invalid = (sigdata->flags & IT_WAS_AN_XM) ? 255 : 253;
+ int first_invalid = sigdata->n_patterns;
+ int last_invalid = (sigdata->flags & IT_WAS_AN_XM) ? 255 : 253;
- for (i = 0; i < sigdata->n_orders; i++) {
- if (sigdata->order[i] >= first_invalid && sigdata->order[i] <= last_invalid) {
- sigdata->order[i] = sigdata->n_patterns;
- found_some = 1;
- }
- }
+ for (i = 0; i < sigdata->n_orders; i++) {
+ if (sigdata->order[i] >= first_invalid &&
+ sigdata->order[i] <= last_invalid) {
+ sigdata->order[i] = sigdata->n_patterns;
+ found_some = 1;
+ }
+ }
- if (found_some) {
- IT_PATTERN *new_pattern = realloc(sigdata->pattern, sizeof(*sigdata->pattern) * (sigdata->n_patterns + 1));
- if (!new_pattern)
- return -1;
-
- new_pattern[sigdata->n_patterns].n_rows = 64;
- new_pattern[sigdata->n_patterns].n_entries = 0;
- new_pattern[sigdata->n_patterns].entry = NULL;
- sigdata->pattern = new_pattern;
- sigdata->n_patterns++;
- }
+ if (found_some) {
+ IT_PATTERN *new_pattern =
+ realloc(sigdata->pattern,
+ sizeof(*sigdata->pattern) * (sigdata->n_patterns + 1));
+ if (!new_pattern)
+ return -1;
- return 0;
+ new_pattern[sigdata->n_patterns].n_rows = 64;
+ new_pattern[sigdata->n_patterns].n_entries = 0;
+ new_pattern[sigdata->n_patterns].entry = NULL;
+ sigdata->pattern = new_pattern;
+ sigdata->n_patterns++;
+ }
+
+ return 0;
}
--- a/src/it/itread.c
+++ b/src/it/itread.c
@@ -18,7 +18,7 @@
*/
#include <stdlib.h>
-#include <string.h>//might not be necessary later; required for memset
+#include <string.h> //might not be necessary later; required for memset
#include "dumb.h"
#include "internal/it.h"
@@ -27,11 +27,8 @@
#define min(a, b) (((a) < (b)) ? (a) : (b))
#endif
-
//#define INVESTIGATE_OLD_INSTRUMENTS
-
-
typedef unsigned char byte;
typedef unsigned short word;
typedef unsigned long dword;
@@ -39,886 +36,915 @@
typedef struct readblock_crap readblock_crap;
struct readblock_crap {
- unsigned char *sourcebuf;
- unsigned char *sourcepos;
- unsigned char *sourceend;
- int rembits;
+ unsigned char *sourcebuf;
+ unsigned char *sourcepos;
+ unsigned char *sourceend;
+ int rembits;
};
+static int readblock(DUMBFILE *f, readblock_crap *crap) {
+ long size;
+ int c;
-static int readblock(DUMBFILE *f, readblock_crap * crap)
-{
- long size;
- int c;
+ size = dumbfile_igetw(f);
+ if (size < 0)
+ return (int)size;
- size = dumbfile_igetw(f);
- if (size < 0)
- return (int)size;
+ crap->sourcebuf = malloc(size);
+ if (!crap->sourcebuf)
+ return -1;
- crap->sourcebuf = malloc(size);
- if (!crap->sourcebuf)
- return -1;
+ c = (int)dumbfile_getnc((char *)crap->sourcebuf, size, f);
+ if (c < size) {
+ free(crap->sourcebuf);
+ crap->sourcebuf = NULL;
+ return -1;
+ }
- c = (int)dumbfile_getnc((char *)crap->sourcebuf, size, f);
- if (c < size) {
- free(crap->sourcebuf);
- crap->sourcebuf = NULL;
- return -1;
- }
-
- crap->sourcepos = crap->sourcebuf;
- crap->sourceend = crap->sourcebuf + size;
- crap->rembits = 8;
- return 0;
+ crap->sourcepos = crap->sourcebuf;
+ crap->sourceend = crap->sourcebuf + size;
+ crap->rembits = 8;
+ return 0;
}
-
-
-static void freeblock(readblock_crap * crap)
-{
- free(crap->sourcebuf);
- crap->sourcebuf = NULL;
+static void freeblock(readblock_crap *crap) {
+ free(crap->sourcebuf);
+ crap->sourcebuf = NULL;
}
+static int readbits(int bitwidth, readblock_crap *crap) {
+ int val = 0;
+ int b = 0;
+ if (crap->sourcepos >= crap->sourceend)
+ return val;
-static int readbits(int bitwidth, readblock_crap * crap)
-{
- int val = 0;
- int b = 0;
+ while (bitwidth > crap->rembits) {
+ val |= *crap->sourcepos++ << b;
+ if (crap->sourcepos >= crap->sourceend)
+ return val;
+ b += crap->rembits;
+ bitwidth -= crap->rembits;
+ crap->rembits = 8;
+ }
- if (crap->sourcepos >= crap->sourceend) return val;
+ val |= (*crap->sourcepos & ((1 << bitwidth) - 1)) << b;
+ *crap->sourcepos >>= bitwidth;
+ crap->rembits -= bitwidth;
- while (bitwidth > crap->rembits) {
- val |= *crap->sourcepos++ << b;
- if (crap->sourcepos >= crap->sourceend) return val;
- b += crap->rembits;
- bitwidth -= crap->rembits;
- crap->rembits = 8;
- }
-
- val |= (*crap->sourcepos & ((1 << bitwidth) - 1)) << b;
- *crap->sourcepos >>= bitwidth;
- crap->rembits -= bitwidth;
-
- return val;
+ return val;
}
-
-
/** WARNING - do we even need to pass `right`? */
/** WARNING - why bother memsetting at all? The whole array is written... */
// if we do memset, dumb_silence() would be neater...
-static int decompress8(DUMBFILE *f, signed char *data, int len, int it215, int stereo)
-{
- int blocklen, blockpos;
- byte bitwidth;
- word val;
- signed char d1, d2;
- readblock_crap crap;
+static int decompress8(DUMBFILE *f, signed char *data, int len, int it215,
+ int stereo) {
+ int blocklen, blockpos;
+ byte bitwidth;
+ word val;
+ signed char d1, d2;
+ readblock_crap crap;
- memset(&crap, 0, sizeof(crap));
+ memset(&crap, 0, sizeof(crap));
- for (blocklen = 0, blockpos = 0; blocklen < len; blocklen++, blockpos += 1 + stereo)
- data[ blockpos ] = 0;
+ for (blocklen = 0, blockpos = 0; blocklen < len;
+ blocklen++, blockpos += 1 + stereo)
+ data[blockpos] = 0;
- while (len > 0) {
- //Read a block of compressed data:
- if (readblock(f, &crap))
- return -1;
- //Set up a few variables
- blocklen = (len < 0x8000) ? len : 0x8000; //Max block length is 0x8000 bytes
- blockpos = 0;
- bitwidth = 9;
- d1 = d2 = 0;
- //Start the decompression:
- while (blockpos < blocklen) {
- //Read a value:
- val = (word)readbits(bitwidth, &crap);
- //Check for bit width change:
+ while (len > 0) {
+ // Read a block of compressed data:
+ if (readblock(f, &crap))
+ return -1;
+ // Set up a few variables
+ blocklen =
+ (len < 0x8000) ? len : 0x8000; // Max block length is 0x8000 bytes
+ blockpos = 0;
+ bitwidth = 9;
+ d1 = d2 = 0;
+ // Start the decompression:
+ while (blockpos < blocklen) {
+ // Read a value:
+ val = (word)readbits(bitwidth, &crap);
+ // Check for bit width change:
- if (bitwidth < 7) { //Method 1:
- if (val == (1 << (bitwidth - 1))) {
- val = (word)readbits(3, &crap) + 1;
- bitwidth = (val < bitwidth) ? val : val + 1;
- continue;
- }
- }
- else if (bitwidth < 9) { //Method 2
- byte border = (0xFF >> (9 - bitwidth)) - 4;
+ if (bitwidth < 7) { // Method 1:
+ if (val == (1 << (bitwidth - 1))) {
+ val = (word)readbits(3, &crap) + 1;
+ bitwidth = (val < bitwidth) ? val : val + 1;
+ continue;
+ }
+ } else if (bitwidth < 9) { // Method 2
+ byte border = (0xFF >> (9 - bitwidth)) - 4;
- if (val > border && val <= (border + 8)) {
- val -= border;
- bitwidth = (val < bitwidth) ? val : val + 1;
- continue;
- }
- }
- else if (bitwidth == 9) { //Method 3
- if (val & 0x100) {
- bitwidth = (val + 1) & 0xFF;
- continue;
- }
- }
- else { //Illegal width, abort ?
- freeblock(&crap);
- return -1;
- }
+ if (val > border && val <= (border + 8)) {
+ val -= border;
+ bitwidth = (val < bitwidth) ? val : val + 1;
+ continue;
+ }
+ } else if (bitwidth == 9) { // Method 3
+ if (val & 0x100) {
+ bitwidth = (val + 1) & 0xFF;
+ continue;
+ }
+ } else { // Illegal width, abort ?
+ freeblock(&crap);
+ return -1;
+ }
- //Expand the value to signed byte:
- {
- signed char v; //The sample value:
- if (bitwidth < 8) {
- byte shift = 8 - bitwidth;
- v = (val << shift);
- v >>= shift;
- }
- else
- v = (signed char)val;
+ // Expand the value to signed byte:
+ {
+ signed char v; // The sample value:
+ if (bitwidth < 8) {
+ byte shift = 8 - bitwidth;
+ v = (val << shift);
+ v >>= shift;
+ } else
+ v = (signed char)val;
- //And integrate the sample value
- //(It always has to end with integration doesn't it ? ;-)
- d1 += v;
- d2 += d1;
- }
+ // And integrate the sample value
+ //(It always has to end with integration doesn't it ? ;-)
+ d1 += v;
+ d2 += d1;
+ }
- //Store !
- /* Version 2.15 was an unofficial version with hacked compression
- * code. Yay, better compression :D
- */
- *data++ = it215 ? d2 : d1;
- data += stereo;
- len--;
- blockpos++;
- }
- freeblock(&crap);
- }
- return 0;
+ // Store !
+ /* Version 2.15 was an unofficial version with hacked compression
+ * code. Yay, better compression :D
+ */
+ *data++ = it215 ? d2 : d1;
+ data += stereo;
+ len--;
+ blockpos++;
+ }
+ freeblock(&crap);
+ }
+ return 0;
}
+static int decompress16(DUMBFILE *f, short *data, int len, int it215,
+ int stereo) {
+ int blocklen, blockpos;
+ byte bitwidth;
+ long val;
+ signed short d1, d2;
+ readblock_crap crap;
+ memset(&crap, 0, sizeof(crap));
-static int decompress16(DUMBFILE *f, short *data, int len, int it215, int stereo)
-{
- int blocklen, blockpos;
- byte bitwidth;
- long val;
- signed short d1, d2;
- readblock_crap crap;
+ for (blocklen = 0, blockpos = 0; blocklen < len;
+ blocklen++, blockpos += 1 + stereo)
+ data[blockpos] = 0;
- memset(&crap, 0, sizeof(crap));
+ while (len > 0) {
+ // Read a block of compressed data:
+ if (readblock(f, &crap))
+ return -1;
+ // Set up a few variables
+ blocklen =
+ (len < 0x4000) ? len : 0x4000; // Max block length is 0x4000 bytes
+ blockpos = 0;
+ bitwidth = 17;
+ d1 = d2 = 0;
+ // Start the decompression:
+ while (blockpos < blocklen) {
+ val = readbits(bitwidth, &crap);
+ // Check for bit width change:
- for ( blocklen = 0, blockpos = 0; blocklen < len; blocklen++, blockpos += 1 + stereo )
- data[ blockpos ] = 0;
+ if (bitwidth < 7) { // Method 1:
+ if (val == (1 << (bitwidth - 1))) {
+ val = readbits(4, &crap) + 1;
+ bitwidth = (val < bitwidth) ? val : val + 1;
+ continue;
+ }
+ } else if (bitwidth < 17) { // Method 2
+ word border = (0xFFFF >> (17 - bitwidth)) - 8;
- while (len > 0) {
- //Read a block of compressed data:
- if (readblock(f, &crap))
- return -1;
- //Set up a few variables
- blocklen = (len < 0x4000) ? len : 0x4000; // Max block length is 0x4000 bytes
- blockpos = 0;
- bitwidth = 17;
- d1 = d2 = 0;
- //Start the decompression:
- while (blockpos < blocklen) {
- val = readbits(bitwidth, &crap);
- //Check for bit width change:
+ if (val > border && val <= (border + 16)) {
+ val -= border;
+ bitwidth = val < bitwidth ? val : val + 1;
+ continue;
+ }
+ } else if (bitwidth == 17) { // Method 3
+ if (val & 0x10000) {
+ bitwidth = (val + 1) & 0xFF;
+ continue;
+ }
+ } else { // Illegal width, abort ?
+ freeblock(&crap);
+ return -1;
+ }
- if (bitwidth < 7) { //Method 1:
- if (val == (1 << (bitwidth - 1))) {
- val = readbits(4, &crap) + 1;
- bitwidth = (val < bitwidth) ? val : val + 1;
- continue;
- }
- }
- else if (bitwidth < 17) { //Method 2
- word border = (0xFFFF >> (17 - bitwidth)) - 8;
+ // Expand the value to signed byte:
+ {
+ short v; // The sample value:
+ if (bitwidth < 16) {
+ byte shift = 16 - bitwidth;
+ v = (short)(val << shift);
+ v >>= shift;
+ } else
+ v = (short)val;
- if (val > border && val <= (border + 16)) {
- val -= border;
- bitwidth = val < bitwidth ? val : val + 1;
- continue;
- }
- }
- else if (bitwidth == 17) { //Method 3
- if (val & 0x10000) {
- bitwidth = (val + 1) & 0xFF;
- continue;
- }
- }
- else { //Illegal width, abort ?
- freeblock(&crap);
- return -1;
- }
+ // And integrate the sample value
+ //(It always has to end with integration doesn't it ? ;-)
+ d1 += v;
+ d2 += d1;
+ }
- //Expand the value to signed byte:
- {
- short v; //The sample value:
- if (bitwidth < 16) {
- byte shift = 16 - bitwidth;
- v = (short)(val << shift);
- v >>= shift;
- }
- else
- v = (short)val;
-
- //And integrate the sample value
- //(It always has to end with integration doesn't it ? ;-)
- d1 += v;
- d2 += d1;
- }
-
- //Store !
- /* Version 2.15 was an unofficial version with hacked compression
- * code. Yay, better compression :D
- */
- *data++ = it215 ? d2 : d1;
- data += stereo;
- len--;
- blockpos++;
- }
- freeblock(&crap);
- }
- return 0;
+ // Store !
+ /* Version 2.15 was an unofficial version with hacked compression
+ * code. Yay, better compression :D
+ */
+ *data++ = it215 ? d2 : d1;
+ data += stereo;
+ len--;
+ blockpos++;
+ }
+ freeblock(&crap);
+ }
+ return 0;
}
+static int it_read_envelope(IT_ENVELOPE *envelope, DUMBFILE *f) {
+ int n;
+ envelope->flags = dumbfile_getc(f);
+ envelope->n_nodes = dumbfile_getc(f);
+ if (envelope->n_nodes > 25) {
+ TRACE("IT error: wrong number of envelope nodes (%d)\n",
+ envelope->n_nodes);
+ envelope->n_nodes = 0;
+ return -1;
+ }
+ envelope->loop_start = dumbfile_getc(f);
+ envelope->loop_end = dumbfile_getc(f);
+ envelope->sus_loop_start = dumbfile_getc(f);
+ envelope->sus_loop_end = dumbfile_getc(f);
+ for (n = 0; n < envelope->n_nodes; n++) {
+ envelope->node_y[n] = dumbfile_getc(f);
+ envelope->node_t[n] = dumbfile_igetw(f);
+ }
+ dumbfile_skip(f, 75 - envelope->n_nodes * 3 + 1);
-static int it_read_envelope(IT_ENVELOPE *envelope, DUMBFILE *f)
-{
- int n;
+ if (envelope->n_nodes <= 0)
+ envelope->flags &= ~IT_ENVELOPE_ON;
+ else {
+ if (envelope->loop_end >= envelope->n_nodes ||
+ envelope->loop_start > envelope->loop_end)
+ envelope->flags &= ~IT_ENVELOPE_LOOP_ON;
+ if (envelope->sus_loop_end >= envelope->n_nodes ||
+ envelope->sus_loop_start > envelope->sus_loop_end)
+ envelope->flags &= ~IT_ENVELOPE_SUSTAIN_LOOP;
+ }
- envelope->flags = dumbfile_getc(f);
- envelope->n_nodes = dumbfile_getc(f);
- if(envelope->n_nodes > 25) {
- TRACE("IT error: wrong number of envelope nodes (%d)\n", envelope->n_nodes);
- envelope->n_nodes = 0;
- return -1;
- }
- envelope->loop_start = dumbfile_getc(f);
- envelope->loop_end = dumbfile_getc(f);
- envelope->sus_loop_start = dumbfile_getc(f);
- envelope->sus_loop_end = dumbfile_getc(f);
- for (n = 0; n < envelope->n_nodes; n++) {
- envelope->node_y[n] = dumbfile_getc(f);
- envelope->node_t[n] = dumbfile_igetw(f);
- }
- dumbfile_skip(f, 75 - envelope->n_nodes * 3 + 1);
-
- if (envelope->n_nodes <= 0)
- envelope->flags &= ~IT_ENVELOPE_ON;
- else {
- if (envelope->loop_end >= envelope->n_nodes || envelope->loop_start > envelope->loop_end) envelope->flags &= ~IT_ENVELOPE_LOOP_ON;
- if (envelope->sus_loop_end >= envelope->n_nodes || envelope->sus_loop_start > envelope->sus_loop_end) envelope->flags &= ~IT_ENVELOPE_SUSTAIN_LOOP;
- }
-
- return dumbfile_error(f);
+ return dumbfile_error(f);
}
+static int it_read_old_instrument(IT_INSTRUMENT *instrument, DUMBFILE *f) {
+ int n;
+ /*if (dumbfile_mgetl(f) != IT_INSTRUMENT_SIGNATURE)
+ return -1;*/
+ // XXX
+ dumbfile_skip(f, 4);
-static int it_read_old_instrument(IT_INSTRUMENT *instrument, DUMBFILE *f)
-{
- int n;
-
- /*if (dumbfile_mgetl(f) != IT_INSTRUMENT_SIGNATURE)
- return -1;*/
- // XXX
- dumbfile_skip(f, 4);
-
dumbfile_getnc((char *)instrument->filename, 13, f);
- instrument->filename[13] = 0;
+ instrument->filename[13] = 0;
- instrument->volume_envelope.flags = dumbfile_getc(f);
- instrument->volume_envelope.loop_start = dumbfile_getc(f);
- instrument->volume_envelope.loop_end = dumbfile_getc(f);
- instrument->volume_envelope.sus_loop_start = dumbfile_getc(f);
- instrument->volume_envelope.sus_loop_end = dumbfile_getc(f);
+ instrument->volume_envelope.flags = dumbfile_getc(f);
+ instrument->volume_envelope.loop_start = dumbfile_getc(f);
+ instrument->volume_envelope.loop_end = dumbfile_getc(f);
+ instrument->volume_envelope.sus_loop_start = dumbfile_getc(f);
+ instrument->volume_envelope.sus_loop_end = dumbfile_getc(f);
- /* Skip two unused bytes. */
- dumbfile_skip(f, 2);
+ /* Skip two unused bytes. */
+ dumbfile_skip(f, 2);
- /* In the old instrument format, fadeout ranges from 0 to 64, and is
- * subtracted at intervals from a value starting at 512. In the new
- * format, all these values are doubled. Therefore we double when loading
- * from the old instrument format - that way we don't have to think about
- * it later.
- */
- instrument->fadeout = dumbfile_igetw(f) << 1;
- instrument->new_note_action = dumbfile_getc(f);
- instrument->dup_check_type = dumbfile_getc(f);
- instrument->dup_check_action = DCA_NOTE_CUT; // This might be wrong!
- /** WARNING - what is the duplicate check action for old-style instruments? */
+ /* In the old instrument format, fadeout ranges from 0 to 64, and is
+ * subtracted at intervals from a value starting at 512. In the new
+ * format, all these values are doubled. Therefore we double when loading
+ * from the old instrument format - that way we don't have to think about
+ * it later.
+ */
+ instrument->fadeout = dumbfile_igetw(f) << 1;
+ instrument->new_note_action = dumbfile_getc(f);
+ instrument->dup_check_type = dumbfile_getc(f);
+ instrument->dup_check_action = DCA_NOTE_CUT; // This might be wrong!
+ /** WARNING - what is the duplicate check action for old-style instruments?
+ */
- /* Skip Tracker Version and Number of Samples. These are only used in
- * separate instrument files. Also skip unused byte.
- */
- dumbfile_skip(f, 4);
+ /* Skip Tracker Version and Number of Samples. These are only used in
+ * separate instrument files. Also skip unused byte.
+ */
+ dumbfile_skip(f, 4);
dumbfile_getnc((char *)instrument->name, 26, f);
- instrument->name[26] = 0;
+ instrument->name[26] = 0;
- /* Skip unused bytes following the Instrument Name. */
- dumbfile_skip(f, 6);
+ /* Skip unused bytes following the Instrument Name. */
+ dumbfile_skip(f, 6);
- instrument->pp_separation = 0;
- instrument->pp_centre = 60;
- instrument->global_volume = 128;
- /** WARNING - should global_volume be 64 or something? */
- instrument->default_pan = 32;
- /** WARNING - should default_pan be 128, meaning don`t use? */
- instrument->random_volume = 0;
- instrument->random_pan = 0;
+ instrument->pp_separation = 0;
+ instrument->pp_centre = 60;
+ instrument->global_volume = 128;
+ /** WARNING - should global_volume be 64 or something? */
+ instrument->default_pan = 32;
+ /** WARNING - should default_pan be 128, meaning don`t use? */
+ instrument->random_volume = 0;
+ instrument->random_pan = 0;
- for (n = 0; n < 120; n++) {
- instrument->map_note[n] = dumbfile_getc(f);
- instrument->map_sample[n] = dumbfile_getc(f);
- }
+ for (n = 0; n < 120; n++) {
+ instrument->map_note[n] = dumbfile_getc(f);
+ instrument->map_sample[n] = dumbfile_getc(f);
+ }
- /* Skip "Volume envelope (200 bytes)". */
- // - need to know better what this is for though.
- dumbfile_skip(f, 200);
+ /* Skip "Volume envelope (200 bytes)". */
+ // - need to know better what this is for though.
+ dumbfile_skip(f, 200);
#ifdef INVESTIGATE_OLD_INSTRUMENTS
- fprintf(stderr, "Inst %02d Env:", n);
+ fprintf(stderr, "Inst %02d Env:", n);
#endif
- for (n = 0; n < 25; n++)
- {
- instrument->volume_envelope.node_t[n] = dumbfile_getc(f);
- instrument->volume_envelope.node_y[n] = dumbfile_getc(f);
+ for (n = 0; n < 25; n++) {
+ instrument->volume_envelope.node_t[n] = dumbfile_getc(f);
+ instrument->volume_envelope.node_y[n] = dumbfile_getc(f);
#ifdef INVESTIGATE_OLD_INSTRUMENTS
- fprintf(stderr, " %d,%d",
- instrument->volume_envelope.node_t[n],
- instrument->volume_envelope.node_y[n]);
+ fprintf(stderr, " %d,%d", instrument->volume_envelope.node_t[n],
+ instrument->volume_envelope.node_y[n]);
#endif
- // This loop is unfinished, as we can probably escape from it before
- // the end if we want to. Hence the otherwise useless dumbfile_skip()
- // call below.
- }
- dumbfile_skip(f, 50 - (n << 1));
- instrument->volume_envelope.n_nodes = n;
+ // This loop is unfinished, as we can probably escape from it before
+ // the end if we want to. Hence the otherwise useless dumbfile_skip()
+ // call below.
+ }
+ dumbfile_skip(f, 50 - (n << 1));
+ instrument->volume_envelope.n_nodes = n;
#ifdef INVESTIGATE_OLD_INSTRUMENTS
- fprintf(stderr, "\n");
+ fprintf(stderr, "\n");
#endif
- if (dumbfile_error(f))
- return -1;
+ if (dumbfile_error(f))
+ return -1;
- {
- IT_ENVELOPE *envelope = &instrument->volume_envelope;
- if (envelope->n_nodes <= 0)
- envelope->flags &= ~IT_ENVELOPE_ON;
- else {
- if (envelope->loop_end >= envelope->n_nodes || envelope->loop_start > envelope->loop_end) envelope->flags &= ~IT_ENVELOPE_LOOP_ON;
- if (envelope->sus_loop_end >= envelope->n_nodes || envelope->sus_loop_start > envelope->sus_loop_end) envelope->flags &= ~IT_ENVELOPE_SUSTAIN_LOOP;
- }
- }
+ {
+ IT_ENVELOPE *envelope = &instrument->volume_envelope;
+ if (envelope->n_nodes <= 0)
+ envelope->flags &= ~IT_ENVELOPE_ON;
+ else {
+ if (envelope->loop_end >= envelope->n_nodes ||
+ envelope->loop_start > envelope->loop_end)
+ envelope->flags &= ~IT_ENVELOPE_LOOP_ON;
+ if (envelope->sus_loop_end >= envelope->n_nodes ||
+ envelope->sus_loop_start > envelope->sus_loop_end)
+ envelope->flags &= ~IT_ENVELOPE_SUSTAIN_LOOP;
+ }
+ }
- instrument->filter_cutoff = 127;
- instrument->filter_resonance = 0;
+ instrument->filter_cutoff = 127;
+ instrument->filter_resonance = 0;
- instrument->pan_envelope.flags = 0;
- instrument->pitch_envelope.flags = 0;
+ instrument->pan_envelope.flags = 0;
+ instrument->pitch_envelope.flags = 0;
- return 0;
+ return 0;
}
-
-
-static int it_read_instrument(IT_INSTRUMENT *instrument, DUMBFILE *f, int maxlen)
-{
+static int it_read_instrument(IT_INSTRUMENT *instrument, DUMBFILE *f,
+ int maxlen) {
int n;
long len;
- /*if (dumbfile_mgetl(f) != IT_INSTRUMENT_SIGNATURE)
- return -1;*/
- // XXX
+ /*if (dumbfile_mgetl(f) != IT_INSTRUMENT_SIGNATURE)
+ return -1;*/
+ // XXX
- if (maxlen) len = dumbfile_pos(f);
- else len = 0;
+ if (maxlen)
+ len = dumbfile_pos(f);
+ else
+ len = 0;
- dumbfile_skip(f, 4);
+ dumbfile_skip(f, 4);
dumbfile_getnc((char *)instrument->filename, 13, f);
- instrument->filename[13] = 0;
+ instrument->filename[13] = 0;
- instrument->new_note_action = dumbfile_getc(f);
- instrument->dup_check_type = dumbfile_getc(f);
- instrument->dup_check_action = dumbfile_getc(f);
- instrument->fadeout = dumbfile_igetw(f);
- instrument->pp_separation = dumbfile_getc(f);
- instrument->pp_centre = dumbfile_getc(f);
- instrument->global_volume = dumbfile_getc(f);
- instrument->default_pan = dumbfile_getc(f);
- instrument->random_volume = dumbfile_getc(f);
- instrument->random_pan = dumbfile_getc(f);
+ instrument->new_note_action = dumbfile_getc(f);
+ instrument->dup_check_type = dumbfile_getc(f);
+ instrument->dup_check_action = dumbfile_getc(f);
+ instrument->fadeout = dumbfile_igetw(f);
+ instrument->pp_separation = dumbfile_getc(f);
+ instrument->pp_centre = dumbfile_getc(f);
+ instrument->global_volume = dumbfile_getc(f);
+ instrument->default_pan = dumbfile_getc(f);
+ instrument->random_volume = dumbfile_getc(f);
+ instrument->random_pan = dumbfile_getc(f);
- /* Skip Tracker Version and Number of Samples. These are only used in
- * separate instrument files. Also skip unused byte.
- */
- dumbfile_skip(f, 4);
+ /* Skip Tracker Version and Number of Samples. These are only used in
+ * separate instrument files. Also skip unused byte.
+ */
+ dumbfile_skip(f, 4);
dumbfile_getnc((char *)instrument->name, 26, f);
- instrument->name[26] = 0;
+ instrument->name[26] = 0;
- instrument->filter_cutoff = dumbfile_getc(f);
- instrument->filter_resonance = dumbfile_getc(f);
+ instrument->filter_cutoff = dumbfile_getc(f);
+ instrument->filter_resonance = dumbfile_getc(f);
- /* Skip MIDI Channel, Program and Bank. */
- //dumbfile_skip(f, 4);
- /*instrument->output = dumbfile_getc(f);
- if ( instrument->output > 16 ) {
- instrument->output -= 128;
- } else {
- instrument->output = 0;
- }
- dumbfile_skip(f, 3);*/
- dumbfile_skip(f, 4);
+ /* Skip MIDI Channel, Program and Bank. */
+ // dumbfile_skip(f, 4);
+ /*instrument->output = dumbfile_getc(f);
+ if ( instrument->output > 16 ) {
+ instrument->output -= 128;
+ } else {
+ instrument->output = 0;
+ }
+ dumbfile_skip(f, 3);*/
+ dumbfile_skip(f, 4);
- for (n = 0; n < 120; n++) {
- instrument->map_note[n] = dumbfile_getc(f);
- instrument->map_sample[n] = dumbfile_getc(f);
- }
+ for (n = 0; n < 120; n++) {
+ instrument->map_note[n] = dumbfile_getc(f);
+ instrument->map_sample[n] = dumbfile_getc(f);
+ }
- if (dumbfile_error(f))
- return -1;
+ if (dumbfile_error(f))
+ return -1;
- if (it_read_envelope(&instrument->volume_envelope, f)) return -1;
- if (it_read_envelope(&instrument->pan_envelope, f)) return -1;
- if (it_read_envelope(&instrument->pitch_envelope, f)) return -1;
+ if (it_read_envelope(&instrument->volume_envelope, f))
+ return -1;
+ if (it_read_envelope(&instrument->pan_envelope, f))
+ return -1;
+ if (it_read_envelope(&instrument->pitch_envelope, f))
+ return -1;
- if (maxlen) {
- len = dumbfile_pos(f) - len;
- if ( maxlen - len < 124 ) return 0;
- }
+ if (maxlen) {
+ len = dumbfile_pos(f) - len;
+ if (maxlen - len < 124)
+ return 0;
+ }
- if ( dumbfile_mgetl(f) == IT_MPTX_SIGNATURE ) {
- for ( n = 0; n < 120; n++ ) {
- instrument->map_sample[ n ] += dumbfile_getc( f ) << 8;
- }
+ if (dumbfile_mgetl(f) == IT_MPTX_SIGNATURE) {
+ for (n = 0; n < 120; n++) {
+ instrument->map_sample[n] += dumbfile_getc(f) << 8;
+ }
- if (dumbfile_error(f))
- return -1;
- }
+ if (dumbfile_error(f))
+ return -1;
+ }
- /*if ( dumbfile_mgetl(f) == IT_INSM_SIGNATURE ) {
- long end = dumbfile_igetl(f);
- end += dumbfile_pos(f);
- while ( dumbfile_pos(f) < end ) {
- int chunkid = dumbfile_igetl(f);
- switch ( chunkid ) {
- case DUMB_ID('P','L','U','G'):
- instrument->output = dumbfile_getc(f);
- break;
- default:
- chunkid = chunkid / 0x100 + dumbfile_getc(f) * 0x1000000;
- break;
- }
- }
+ /*if ( dumbfile_mgetl(f) == IT_INSM_SIGNATURE ) {
+ long end = dumbfile_igetl(f);
+ end += dumbfile_pos(f);
+ while ( dumbfile_pos(f) < end ) {
+ int chunkid = dumbfile_igetl(f);
+ switch ( chunkid ) {
+ case DUMB_ID('P','L','U','G'):
+ instrument->output = dumbfile_getc(f);
+ break;
+ default:
+ chunkid = chunkid / 0x100 + dumbfile_getc(f)
+ * 0x1000000; break;
+ }
+ }
- if (dumbfile_error(f))
- return -1;
- }*/
+ if (dumbfile_error(f))
+ return -1;
+ }*/
- return 0;
+ return 0;
}
+static int it_read_sample_header(IT_SAMPLE *sample, unsigned char *convert,
+ long *offset, DUMBFILE *f) {
+ /* XXX
+ if (dumbfile_mgetl(f) != IT_SAMPLE_SIGNATURE)
+ return -1;*/
+ int hax = 0;
+ long s = dumbfile_mgetl(f);
+ if (s != IT_SAMPLE_SIGNATURE) {
+ if (s == (IT_SAMPLE_SIGNATURE >> 16)) {
+ s <<= 16;
+ s |= dumbfile_mgetw(f);
+ if (s != IT_SAMPLE_SIGNATURE)
+ return -1;
+ hax = 1;
+ }
+ }
-
-static int it_read_sample_header(IT_SAMPLE *sample, unsigned char *convert, long *offset, DUMBFILE *f)
-{
- /* XXX
- if (dumbfile_mgetl(f) != IT_SAMPLE_SIGNATURE)
- return -1;*/
- int hax = 0;
- long s = dumbfile_mgetl(f);
- if (s != IT_SAMPLE_SIGNATURE) {
- if ( s == ( IT_SAMPLE_SIGNATURE >> 16 ) ) {
- s <<= 16;
- s |= dumbfile_mgetw(f);
- if ( s != IT_SAMPLE_SIGNATURE )
- return -1;
- hax = 1;
- }
- }
-
dumbfile_getnc((char *)sample->filename, 13, f);
- sample->filename[13] = 0;
+ sample->filename[13] = 0;
- sample->global_volume = dumbfile_getc(f);
- sample->flags = dumbfile_getc(f);
- sample->default_volume = dumbfile_getc(f);
+ sample->global_volume = dumbfile_getc(f);
+ sample->flags = dumbfile_getc(f);
+ sample->default_volume = dumbfile_getc(f);
dumbfile_getnc((char *)sample->name, 26, f);
- sample->name[26] = 0;
+ sample->name[26] = 0;
- *convert = dumbfile_getc(f);
- sample->default_pan = dumbfile_getc(f);
- sample->length = dumbfile_igetl(f);
- sample->loop_start = dumbfile_igetl(f);
- sample->loop_end = dumbfile_igetl(f);
- sample->C5_speed = dumbfile_igetl(f);
- sample->sus_loop_start = dumbfile_igetl(f);
- sample->sus_loop_end = dumbfile_igetl(f);
+ *convert = dumbfile_getc(f);
+ sample->default_pan = dumbfile_getc(f);
+ sample->length = dumbfile_igetl(f);
+ sample->loop_start = dumbfile_igetl(f);
+ sample->loop_end = dumbfile_igetl(f);
+ sample->C5_speed = dumbfile_igetl(f);
+ sample->sus_loop_start = dumbfile_igetl(f);
+ sample->sus_loop_end = dumbfile_igetl(f);
#ifdef STEREO_SAMPLES_COUNT_AS_TWO
- if (sample->flags & IT_SAMPLE_STEREO) {
- sample->length >>= 1;
- sample->loop_start >>= 1;
- sample->loop_end >>= 1;
- sample->C5_speed >>= 1;
- sample->sus_loop_start >>= 1;
- sample->sus_loop_end >>= 1;
- }
+ if (sample->flags & IT_SAMPLE_STEREO) {
+ sample->length >>= 1;
+ sample->loop_start >>= 1;
+ sample->loop_end >>= 1;
+ sample->C5_speed >>= 1;
+ sample->sus_loop_start >>= 1;
+ sample->sus_loop_end >>= 1;
+ }
#endif
- if (sample->flags & IT_SAMPLE_EXISTS) {
- if (sample->length <= 0)
- sample->flags &= ~IT_SAMPLE_EXISTS;
- else {
- if ((unsigned int)sample->loop_end > (unsigned int)sample->length)
- sample->flags &= ~IT_SAMPLE_LOOP;
- else if ((unsigned int)sample->loop_start >= (unsigned int)sample->loop_end)
- sample->flags &= ~IT_SAMPLE_LOOP;
+ if (sample->flags & IT_SAMPLE_EXISTS) {
+ if (sample->length <= 0)
+ sample->flags &= ~IT_SAMPLE_EXISTS;
+ else {
+ if ((unsigned int)sample->loop_end > (unsigned int)sample->length)
+ sample->flags &= ~IT_SAMPLE_LOOP;
+ else if ((unsigned int)sample->loop_start >=
+ (unsigned int)sample->loop_end)
+ sample->flags &= ~IT_SAMPLE_LOOP;
- if ((unsigned int)sample->sus_loop_end > (unsigned int)sample->length)
- sample->flags &= ~IT_SAMPLE_SUS_LOOP;
- else if ((unsigned int)sample->sus_loop_start >= (unsigned int)sample->sus_loop_end)
- sample->flags &= ~IT_SAMPLE_SUS_LOOP;
+ if ((unsigned int)sample->sus_loop_end >
+ (unsigned int)sample->length)
+ sample->flags &= ~IT_SAMPLE_SUS_LOOP;
+ else if ((unsigned int)sample->sus_loop_start >=
+ (unsigned int)sample->sus_loop_end)
+ sample->flags &= ~IT_SAMPLE_SUS_LOOP;
- /* We may be able to truncate the sample to save memory. */
- if (sample->flags & IT_SAMPLE_LOOP &&
- *convert != 0xFF) { /* not truncating compressed samples, for now... */
- if ((sample->flags & IT_SAMPLE_SUS_LOOP) && sample->sus_loop_end >= sample->loop_end)
- sample->length = sample->sus_loop_end;
- else
- sample->length = sample->loop_end;
- }
- }
- }
+ /* We may be able to truncate the sample to save memory. */
+ if (sample->flags & IT_SAMPLE_LOOP &&
+ *convert !=
+ 0xFF) { /* not truncating compressed samples, for now... */
+ if ((sample->flags & IT_SAMPLE_SUS_LOOP) &&
+ sample->sus_loop_end >= sample->loop_end)
+ sample->length = sample->sus_loop_end;
+ else
+ sample->length = sample->loop_end;
+ }
+ }
+ }
- *offset = dumbfile_igetl(f);
+ *offset = dumbfile_igetl(f);
- sample->vibrato_speed = dumbfile_getc(f);
- sample->vibrato_depth = dumbfile_getc(f);
- if ( ! hax ) {
- sample->vibrato_rate = dumbfile_getc(f);
- sample->vibrato_waveform = dumbfile_getc(f);
- } else {
- sample->vibrato_rate = 0;
- sample->vibrato_waveform = 0;
- }
- sample->finetune = 0;
- sample->max_resampling_quality = -1;
+ sample->vibrato_speed = dumbfile_getc(f);
+ sample->vibrato_depth = dumbfile_getc(f);
+ if (!hax) {
+ sample->vibrato_rate = dumbfile_getc(f);
+ sample->vibrato_waveform = dumbfile_getc(f);
+ } else {
+ sample->vibrato_rate = 0;
+ sample->vibrato_waveform = 0;
+ }
+ sample->finetune = 0;
+ sample->max_resampling_quality = -1;
- return dumbfile_error(f);
+ return dumbfile_error(f);
}
-long _dumb_it_read_sample_data_adpcm4(IT_SAMPLE *sample, DUMBFILE *f)
-{
- long n, len, delta;
- signed char * ptr, * end;
- signed char compression_table[16];
- if (dumbfile_getnc((char *)compression_table, 16, f) != 16)
- return -1;
- ptr = (signed char *) sample->data;
- delta = 0;
+long _dumb_it_read_sample_data_adpcm4(IT_SAMPLE *sample, DUMBFILE *f) {
+ long n, len, delta;
+ signed char *ptr, *end;
+ signed char compression_table[16];
+ if (dumbfile_getnc((char *)compression_table, 16, f) != 16)
+ return -1;
+ ptr = (signed char *)sample->data;
+ delta = 0;
- end = ptr + sample->length;
- len = (sample->length + 1) / 2;
- for (n = 0; n < len; n++) {
- int b = dumbfile_getc(f);
- if (b < 0) return -1;
- delta += compression_table[b & 0x0F];
- *ptr++ = delta;
- if (ptr >= end) break;
- delta += compression_table[b >> 4];
- *ptr++ = delta;
- }
+ end = ptr + sample->length;
+ len = (sample->length + 1) / 2;
+ for (n = 0; n < len; n++) {
+ int b = dumbfile_getc(f);
+ if (b < 0)
+ return -1;
+ delta += compression_table[b & 0x0F];
+ *ptr++ = delta;
+ if (ptr >= end)
+ break;
+ delta += compression_table[b >> 4];
+ *ptr++ = delta;
+ }
- return 0;
+ return 0;
}
+static long it_read_sample_data(IT_SAMPLE *sample, unsigned char convert,
+ DUMBFILE *f) {
+ long n;
-static long it_read_sample_data(IT_SAMPLE *sample, unsigned char convert, DUMBFILE *f)
-{
- long n;
+ long datasize = sample->length;
+ if (sample->flags & IT_SAMPLE_STEREO)
+ datasize <<= 1;
- long datasize = sample->length;
- if (sample->flags & IT_SAMPLE_STEREO) datasize <<= 1;
+ sample->data = malloc(datasize * (sample->flags & IT_SAMPLE_16BIT ? 2 : 1));
+ if (!sample->data)
+ return -1;
- sample->data = malloc(datasize * (sample->flags & IT_SAMPLE_16BIT ? 2 : 1));
- if (!sample->data)
- return -1;
+ if (!(sample->flags & IT_SAMPLE_16BIT) && (convert == 0xFF)) {
+ if (_dumb_it_read_sample_data_adpcm4(sample, f) < 0)
+ return -1;
+ } else if (sample->flags & 8) {
+ /* If the sample is packed, then we must unpack it. */
- if (!(sample->flags & IT_SAMPLE_16BIT) && (convert == 0xFF)) {
- if (_dumb_it_read_sample_data_adpcm4(sample, f) < 0)
- return -1;
- } else if (sample->flags & 8) {
- /* If the sample is packed, then we must unpack it. */
+ /* Behavior as defined by greasemonkey's munch.py and observed by XMPlay
+ * and OpenMPT */
- /* Behavior as defined by greasemonkey's munch.py and observed by XMPlay and OpenMPT */
+ if (sample->flags & IT_SAMPLE_STEREO) {
+ if (sample->flags & IT_SAMPLE_16BIT) {
+ decompress16(f, (short *)sample->data, (int)(datasize >> 1),
+ convert & 4, 1);
+ decompress16(f, (short *)sample->data + 1, (int)(datasize >> 1),
+ convert & 4, 1);
+ } else {
+ decompress8(f, (signed char *)sample->data,
+ (int)(datasize >> 1), convert & 4, 1);
+ decompress8(f, (signed char *)sample->data + 1,
+ (int)(datasize >> 1), convert & 4, 1);
+ }
+ } else {
+ if (sample->flags & IT_SAMPLE_16BIT)
+ decompress16(f, (short *)sample->data, (int)datasize,
+ convert & 4, 0);
+ else
+ decompress8(f, (signed char *)sample->data, (int)datasize,
+ convert & 4, 0);
+ }
+ } else if (sample->flags & IT_SAMPLE_16BIT) {
+ if (sample->flags & IT_SAMPLE_STEREO) {
+ if (convert & 2) {
+ for (n = 0; n < datasize; n += 2)
+ ((short *)sample->data)[n] = dumbfile_mgetw(f);
+ for (n = 1; n < datasize; n += 2)
+ ((short *)sample->data)[n] = dumbfile_mgetw(f);
+ } else {
+ for (n = 0; n < datasize; n += 2)
+ ((short *)sample->data)[n] = dumbfile_igetw(f);
+ for (n = 1; n < datasize; n += 2)
+ ((short *)sample->data)[n] = dumbfile_igetw(f);
+ }
+ } else {
+ if (convert & 2)
+ for (n = 0; n < datasize; n++)
+ ((short *)sample->data)[n] = dumbfile_mgetw(f);
+ else
+ for (n = 0; n < datasize; n++)
+ ((short *)sample->data)[n] = dumbfile_igetw(f);
+ }
+ } else {
+ if (sample->flags & IT_SAMPLE_STEREO) {
+ for (n = 0; n < datasize; n += 2)
+ ((signed char *)sample->data)[n] = dumbfile_getc(f);
+ for (n = 1; n < datasize; n += 2)
+ ((signed char *)sample->data)[n] = dumbfile_getc(f);
+ } else
+ for (n = 0; n < datasize; n++)
+ ((signed char *)sample->data)[n] = dumbfile_getc(f);
+ }
- if (sample->flags & IT_SAMPLE_STEREO) {
- if (sample->flags & IT_SAMPLE_16BIT) {
- decompress16(f, (short *) sample->data, (int)(datasize >> 1), convert & 4, 1);
- decompress16(f, (short *) sample->data + 1, (int)(datasize >> 1), convert & 4, 1);
- } else {
- decompress8(f, (signed char *) sample->data, (int)(datasize >> 1), convert & 4, 1);
- decompress8(f, (signed char *) sample->data + 1, (int)(datasize >> 1), convert & 4, 1);
- }
- } else {
- if (sample->flags & IT_SAMPLE_16BIT)
- decompress16(f, (short *) sample->data, (int)datasize, convert & 4, 0);
- else
- decompress8(f, (signed char *) sample->data, (int)datasize, convert & 4, 0);
- }
- } else if (sample->flags & IT_SAMPLE_16BIT) {
- if (sample->flags & IT_SAMPLE_STEREO) {
- if (convert & 2) {
- for (n = 0; n < datasize; n += 2)
- ((short *)sample->data)[n] = dumbfile_mgetw(f);
- for (n = 1; n < datasize; n += 2)
- ((short *)sample->data)[n] = dumbfile_mgetw(f);
- } else {
- for (n = 0; n < datasize; n += 2)
- ((short *)sample->data)[n] = dumbfile_igetw(f);
- for (n = 1; n < datasize; n += 2)
- ((short *)sample->data)[n] = dumbfile_igetw(f);
- }
- } else {
- if (convert & 2)
- for (n = 0; n < datasize; n++)
- ((short *)sample->data)[n] = dumbfile_mgetw(f);
- else
- for (n = 0; n < datasize; n++)
- ((short *)sample->data)[n] = dumbfile_igetw(f);
- }
- } else {
- if (sample->flags & IT_SAMPLE_STEREO) {
- for (n = 0; n < datasize; n += 2)
- ((signed char *)sample->data)[n] = dumbfile_getc(f);
- for (n = 1; n < datasize; n += 2)
- ((signed char *)sample->data)[n] = dumbfile_getc(f);
- } else
- for (n = 0; n < datasize; n++)
- ((signed char *)sample->data)[n] = dumbfile_getc(f);
- }
+ if (dumbfile_error(f))
+ return -1;
- if (dumbfile_error(f))
- return -1;
+ if (!(convert & 1)) {
+ /* Convert to signed. */
+ if (sample->flags & IT_SAMPLE_16BIT)
+ for (n = 0; n < datasize; n++)
+ ((short *)sample->data)[n] ^= 0x8000;
+ else
+ for (n = 0; n < datasize; n++)
+ ((signed char *)sample->data)[n] ^= 0x80;
+ }
- if (!(convert & 1)) {
- /* Convert to signed. */
- if (sample->flags & IT_SAMPLE_16BIT)
- for (n = 0; n < datasize; n++)
- ((short *)sample->data)[n] ^= 0x8000;
- else
- for (n = 0; n < datasize; n++)
- ((signed char *)sample->data)[n] ^= 0x80;
- }
+ /* NOT SUPPORTED:
+ *
+ * convert & 4 - Samples stored as delta values
+ * convert & 16 - Samples stored as TX-Wave 12-bit values
+ * convert & 32 - Left/Right/All Stereo prompt
+ */
- /* NOT SUPPORTED:
- *
- * convert & 4 - Samples stored as delta values
- * convert & 16 - Samples stored as TX-Wave 12-bit values
- * convert & 32 - Left/Right/All Stereo prompt
- */
-
- return 0;
+ return 0;
}
-
-
//#define DETECT_DUPLICATE_CHANNELS
#ifdef DETECT_DUPLICATE_CHANNELS
#include <stdio.h>
#endif
-static int it_read_pattern(IT_PATTERN *pattern, DUMBFILE *f, unsigned char *buffer)
-{
- unsigned char cmask[DUMB_IT_N_CHANNELS];
- unsigned char cnote[DUMB_IT_N_CHANNELS];
- unsigned char cinstrument[DUMB_IT_N_CHANNELS];
- unsigned char cvolpan[DUMB_IT_N_CHANNELS];
- unsigned char ceffect[DUMB_IT_N_CHANNELS];
- unsigned char ceffectvalue[DUMB_IT_N_CHANNELS];
+static int it_read_pattern(IT_PATTERN *pattern, DUMBFILE *f,
+ unsigned char *buffer) {
+ unsigned char cmask[DUMB_IT_N_CHANNELS];
+ unsigned char cnote[DUMB_IT_N_CHANNELS];
+ unsigned char cinstrument[DUMB_IT_N_CHANNELS];
+ unsigned char cvolpan[DUMB_IT_N_CHANNELS];
+ unsigned char ceffect[DUMB_IT_N_CHANNELS];
+ unsigned char ceffectvalue[DUMB_IT_N_CHANNELS];
#ifdef DETECT_DUPLICATE_CHANNELS
- IT_ENTRY *dupentry[DUMB_IT_N_CHANNELS];
+ IT_ENTRY *dupentry[DUMB_IT_N_CHANNELS];
#endif
- int n_entries = 0;
- int buflen;
- int bufpos = 0;
+ int n_entries = 0;
+ int buflen;
+ int bufpos = 0;
- IT_ENTRY *entry;
+ IT_ENTRY *entry;
- unsigned char channel;
- unsigned char mask;
+ unsigned char channel;
+ unsigned char mask;
- memset(cmask, 0, sizeof(cmask));
- memset(cnote, 0, sizeof(cnote));
- memset(cinstrument, 0, sizeof(cinstrument));
- memset(cvolpan, 0, sizeof(cvolpan));
- memset(ceffect, 0, sizeof(ceffect));
- memset(ceffectvalue, 0, sizeof(ceffectvalue));
+ memset(cmask, 0, sizeof(cmask));
+ memset(cnote, 0, sizeof(cnote));
+ memset(cinstrument, 0, sizeof(cinstrument));
+ memset(cvolpan, 0, sizeof(cvolpan));
+ memset(ceffect, 0, sizeof(ceffect));
+ memset(ceffectvalue, 0, sizeof(ceffectvalue));
#ifdef DETECT_DUPLICATE_CHANNELS
- {
- int i;
- for (i = 0; i < DUMB_IT_N_CHANNELS; i++) dupentry[i] = NULL;
- }
+ {
+ int i;
+ for (i = 0; i < DUMB_IT_N_CHANNELS; i++)
+ dupentry[i] = NULL;
+ }
#endif
- buflen = dumbfile_igetw(f);
- pattern->n_rows = dumbfile_igetw(f);
+ buflen = dumbfile_igetw(f);
+ pattern->n_rows = dumbfile_igetw(f);
- /* Skip four unused bytes. */
- dumbfile_skip(f, 4);
+ /* Skip four unused bytes. */
+ dumbfile_skip(f, 4);
- if (dumbfile_error(f))
- return -1;
+ if (dumbfile_error(f))
+ return -1;
- /* Read in the pattern data. */
+ /* Read in the pattern data. */
dumbfile_getnc((char *)buffer, buflen, f);
- if (dumbfile_error(f))
- return -1;
+ if (dumbfile_error(f))
+ return -1;
- /* Scan the pattern data, and work out how many entries we need room for. */
- while (bufpos < buflen) {
- unsigned char b = buffer[bufpos++];
+ /* Scan the pattern data, and work out how many entries we need room for. */
+ while (bufpos < buflen) {
+ unsigned char b = buffer[bufpos++];
- if (b == 0) {
- /* End of row */
- n_entries++;
- continue;
- }
+ if (b == 0) {
+ /* End of row */
+ n_entries++;
+ continue;
+ }
- channel = (b - 1) & 63;
+ channel = (b - 1) & 63;
- if (b & 128)
- cmask[channel] = mask = buffer[bufpos++];
- else
- mask = cmask[channel];
+ if (b & 128)
+ cmask[channel] = mask = buffer[bufpos++];
+ else
+ mask = cmask[channel];
- {
- static const unsigned char used[16] = {0, 1, 1, 2, 1, 2, 2, 3, 2, 3, 3, 4, 3, 4, 4, 5};
- n_entries += (mask != 0);
- bufpos += used[mask & 15];
- }
- }
+ {
+ static const unsigned char used[16] = {0, 1, 1, 2, 1, 2, 2, 3,
+ 2, 3, 3, 4, 3, 4, 4, 5};
+ n_entries += (mask != 0);
+ bufpos += used[mask & 15];
+ }
+ }
- pattern->n_entries = n_entries;
+ pattern->n_entries = n_entries;
- pattern->entry = malloc(n_entries * sizeof(*pattern->entry));
+ pattern->entry = malloc(n_entries * sizeof(*pattern->entry));
- if (!pattern->entry)
- return -1;
+ if (!pattern->entry)
+ return -1;
- bufpos = 0;
- memset(cmask, 0, sizeof(cmask));
+ bufpos = 0;
+ memset(cmask, 0, sizeof(cmask));
- entry = pattern->entry;
+ entry = pattern->entry;
- while (bufpos < buflen) {
- unsigned char b = buffer[bufpos++];
-
- if (b == 0) {
- /* End of row */
- IT_SET_END_ROW(entry);
- entry++;
+ while (bufpos < buflen) {
+ unsigned char b = buffer[bufpos++];
+
+ if (b == 0) {
+ /* End of row */
+ IT_SET_END_ROW(entry);
+ entry++;
#ifdef DETECT_DUPLICATE_CHANNELS
- {
- int i;
- for (i = 0; i < DUMB_IT_N_CHANNELS; i++) dupentry[i] = NULL;
- }
+ {
+ int i;
+ for (i = 0; i < DUMB_IT_N_CHANNELS; i++)
+ dupentry[i] = NULL;
+ }
#endif
- continue;
- }
+ continue;
+ }
- channel = (b - 1) & 63;
+ channel = (b - 1) & 63;
- if (b & 128) {
- if (bufpos >= buflen)
- return -1;
-
- cmask[channel] = mask = buffer[bufpos++];
- } else
- mask = cmask[channel];
+ if (b & 128) {
+ if (bufpos >= buflen)
+ return -1;
- if (mask) {
- entry->mask = (mask & 15) | (mask >> 4);
- entry->channel = channel;
+ cmask[channel] = mask = buffer[bufpos++];
+ } else
+ mask = cmask[channel];
- if (mask & IT_ENTRY_NOTE) {
- if (bufpos >= buflen)
- return -1;
-
- cnote[channel] = entry->note = buffer[bufpos++];
- } else if (mask & (IT_ENTRY_NOTE << 4))
- entry->note = cnote[channel];
+ if (mask) {
+ entry->mask = (mask & 15) | (mask >> 4);
+ entry->channel = channel;
- if (mask & IT_ENTRY_INSTRUMENT) {
- if (bufpos >= buflen)
- return -1;
-
- cinstrument[channel] = entry->instrument = buffer[bufpos++];
- } else if (mask & (IT_ENTRY_INSTRUMENT << 4))
- entry->instrument = cinstrument[channel];
+ if (mask & IT_ENTRY_NOTE) {
+ if (bufpos >= buflen)
+ return -1;
- if (mask & IT_ENTRY_VOLPAN) {
- if (bufpos >= buflen)
- return -1;
-
- cvolpan[channel] = entry->volpan = buffer[bufpos++];
- } else if (mask & (IT_ENTRY_VOLPAN << 4))
- entry->volpan = cvolpan[channel];
+ cnote[channel] = entry->note = buffer[bufpos++];
+ } else if (mask & (IT_ENTRY_NOTE << 4))
+ entry->note = cnote[channel];
- if (mask & IT_ENTRY_EFFECT) {
- if (bufpos + 1 >= buflen)
- return -1;
-
- ceffect[channel] = entry->effect = buffer[bufpos++];
- ceffectvalue[channel] = entry->effectvalue = buffer[bufpos++];
- } else {
- entry->effect = ceffect[channel];
- entry->effectvalue = ceffectvalue[channel];
- }
+ if (mask & IT_ENTRY_INSTRUMENT) {
+ if (bufpos >= buflen)
+ return -1;
+ cinstrument[channel] = entry->instrument = buffer[bufpos++];
+ } else if (mask & (IT_ENTRY_INSTRUMENT << 4))
+ entry->instrument = cinstrument[channel];
+
+ if (mask & IT_ENTRY_VOLPAN) {
+ if (bufpos >= buflen)
+ return -1;
+
+ cvolpan[channel] = entry->volpan = buffer[bufpos++];
+ } else if (mask & (IT_ENTRY_VOLPAN << 4))
+ entry->volpan = cvolpan[channel];
+
+ if (mask & IT_ENTRY_EFFECT) {
+ if (bufpos + 1 >= buflen)
+ return -1;
+
+ ceffect[channel] = entry->effect = buffer[bufpos++];
+ ceffectvalue[channel] = entry->effectvalue = buffer[bufpos++];
+ } else {
+ entry->effect = ceffect[channel];
+ entry->effectvalue = ceffectvalue[channel];
+ }
+
#ifdef DETECT_DUPLICATE_CHANNELS
- if (dupentry[channel]) {
- FILE *f = fopen("dupentry.txt", "a");
- if (!f) abort();
- fprintf(f, "Two events on channel %d:", channel);
- fprintf(f, " Event #1:");
- if (dupentry[channel]->mask & IT_ENTRY_NOTE ) fprintf(f, " %03d", dupentry[channel]->note ); else fprintf(f, " ...");
- if (dupentry[channel]->mask & IT_ENTRY_INSTRUMENT) fprintf(f, " %03d", dupentry[channel]->instrument); else fprintf(f, " ...");
- if (dupentry[channel]->mask & IT_ENTRY_VOLPAN ) fprintf(f, " %03d", dupentry[channel]->volpan ); else fprintf(f, " ...");
- if (dupentry[channel]->mask & IT_ENTRY_EFFECT) fprintf(f, " %c%02X\n", 'A' - 1 + dupentry[channel]->effect, dupentry[channel]->effectvalue); else fprintf(f, " ...\n");
- fprintf(f, " Event #2:");
- if (entry->mask & IT_ENTRY_NOTE ) fprintf(f, " %03d", entry->note ); else fprintf(f, " ...");
- if (entry->mask & IT_ENTRY_INSTRUMENT) fprintf(f, " %03d", entry->instrument); else fprintf(f, " ...");
- if (entry->mask & IT_ENTRY_VOLPAN ) fprintf(f, " %03d", entry->volpan ); else fprintf(f, " ...");
- if (entry->mask & IT_ENTRY_EFFECT) fprintf(f, " %c%02X\n", 'A' - 1 + entry->effect, entry->effectvalue); else fprintf(f, " ...\n");
- fclose(f);
- }
- dupentry[channel] = entry;
+ if (dupentry[channel]) {
+ FILE *f = fopen("dupentry.txt", "a");
+ if (!f)
+ abort();
+ fprintf(f, "Two events on channel %d:", channel);
+ fprintf(f, " Event #1:");
+ if (dupentry[channel]->mask & IT_ENTRY_NOTE)
+ fprintf(f, " %03d", dupentry[channel]->note);
+ else
+ fprintf(f, " ...");
+ if (dupentry[channel]->mask & IT_ENTRY_INSTRUMENT)
+ fprintf(f, " %03d", dupentry[channel]->instrument);
+ else
+ fprintf(f, " ...");
+ if (dupentry[channel]->mask & IT_ENTRY_VOLPAN)
+ fprintf(f, " %03d", dupentry[channel]->volpan);
+ else
+ fprintf(f, " ...");
+ if (dupentry[channel]->mask & IT_ENTRY_EFFECT)
+ fprintf(f, " %c%02X\n", 'A' - 1 + dupentry[channel]->effect,
+ dupentry[channel]->effectvalue);
+ else
+ fprintf(f, " ...\n");
+ fprintf(f, " Event #2:");
+ if (entry->mask & IT_ENTRY_NOTE)
+ fprintf(f, " %03d", entry->note);
+ else
+ fprintf(f, " ...");
+ if (entry->mask & IT_ENTRY_INSTRUMENT)
+ fprintf(f, " %03d", entry->instrument);
+ else
+ fprintf(f, " ...");
+ if (entry->mask & IT_ENTRY_VOLPAN)
+ fprintf(f, " %03d", entry->volpan);
+ else
+ fprintf(f, " ...");
+ if (entry->mask & IT_ENTRY_EFFECT)
+ fprintf(f, " %c%02X\n", 'A' - 1 + entry->effect,
+ entry->effectvalue);
+ else
+ fprintf(f, " ...\n");
+ fclose(f);
+ }
+ dupentry[channel] = entry;
#endif
- entry++;
- }
- }
+ entry++;
+ }
+ }
- ASSERT(entry == pattern->entry + n_entries);
+ ASSERT(entry == pattern->entry + n_entries);
- return 0;
+ return 0;
}
-
-
/* Currently we assume the sample data are stored after the sample headers in
* module files. This assumption may be unjustified; let me know if you have
* trouble.
@@ -925,438 +951,446 @@
*/
#define IT_COMPONENT_SONG_MESSAGE 1
-#define IT_COMPONENT_INSTRUMENT 2
-#define IT_COMPONENT_PATTERN 3
-#define IT_COMPONENT_SAMPLE 4
+#define IT_COMPONENT_INSTRUMENT 2
+#define IT_COMPONENT_PATTERN 3
+#define IT_COMPONENT_SAMPLE 4
-typedef struct IT_COMPONENT
-{
- unsigned char type;
- unsigned short n;
- long offset;
- short sampfirst; /* component[sampfirst] = first sample data after this */
- short sampnext; /* sampnext is used to create linked lists of sample data */
-}
-IT_COMPONENT;
+typedef struct IT_COMPONENT {
+ unsigned char type;
+ unsigned short n;
+ long offset;
+ short sampfirst; /* component[sampfirst] = first sample data after this */
+ short sampnext; /* sampnext is used to create linked lists of sample data */
+} IT_COMPONENT;
-
-
-static int it_component_compare(const void *e1, const void *e2)
-{
- return (int)(((const IT_COMPONENT *)e1)->offset -
- ((const IT_COMPONENT *)e2)->offset);
+static int it_component_compare(const void *e1, const void *e2) {
+ return (int)(((const IT_COMPONENT *)e1)->offset -
+ ((const IT_COMPONENT *)e2)->offset);
}
+static sigdata_t *it_load_sigdata(DUMBFILE *f) {
+ DUMB_IT_SIGDATA *sigdata;
+ int cwt, cmwt;
+ int special;
+ int message_length, message_offset;
-static sigdata_t *it_load_sigdata(DUMBFILE *f)
-{
- DUMB_IT_SIGDATA *sigdata;
+ IT_COMPONENT *component;
+ int min_components;
+ int n_components = 0;
- int cwt, cmwt;
- int special;
- int message_length, message_offset;
+ unsigned char sample_convert[4096];
- IT_COMPONENT *component;
- int min_components;
- int n_components = 0;
+ int n;
- unsigned char sample_convert[4096];
+ unsigned char *buffer;
- int n;
-
- unsigned char *buffer;
-
- if (dumbfile_mgetl(f) != IT_SIGNATURE)
- {
- return NULL;
+ if (dumbfile_mgetl(f) != IT_SIGNATURE) {
+ return NULL;
}
- sigdata = malloc(sizeof(*sigdata));
+ sigdata = malloc(sizeof(*sigdata));
- if (!sigdata)
- {
- return NULL;
+ if (!sigdata) {
+ return NULL;
}
- sigdata->song_message = NULL;
- sigdata->order = NULL;
- sigdata->instrument = NULL;
- sigdata->sample = NULL;
- sigdata->pattern = NULL;
- sigdata->midi = NULL;
- sigdata->checkpoint = NULL;
+ sigdata->song_message = NULL;
+ sigdata->order = NULL;
+ sigdata->instrument = NULL;
+ sigdata->sample = NULL;
+ sigdata->pattern = NULL;
+ sigdata->midi = NULL;
+ sigdata->checkpoint = NULL;
dumbfile_getnc((char *)sigdata->name, 26, f);
- sigdata->name[26] = 0;
+ sigdata->name[26] = 0;
- /* Skip pattern row highlight info. */
- dumbfile_skip(f, 2);
+ /* Skip pattern row highlight info. */
+ dumbfile_skip(f, 2);
- sigdata->n_orders = dumbfile_igetw(f);
- sigdata->n_instruments = dumbfile_igetw(f);
- sigdata->n_samples = dumbfile_igetw(f);
- sigdata->n_patterns = dumbfile_igetw(f);
+ sigdata->n_orders = dumbfile_igetw(f);
+ sigdata->n_instruments = dumbfile_igetw(f);
+ sigdata->n_samples = dumbfile_igetw(f);
+ sigdata->n_patterns = dumbfile_igetw(f);
- cwt = dumbfile_igetw(f);
- cmwt = dumbfile_igetw(f);
+ cwt = dumbfile_igetw(f);
+ cmwt = dumbfile_igetw(f);
- sigdata->flags = dumbfile_igetw(f);
- special = dumbfile_igetw(f);
+ sigdata->flags = dumbfile_igetw(f);
+ special = dumbfile_igetw(f);
- sigdata->global_volume = dumbfile_getc(f);
- sigdata->mixing_volume = dumbfile_getc(f);
- sigdata->speed = dumbfile_getc(f);
- if (sigdata->speed == 0) sigdata->speed = 6; // Should we? What about tempo?
- sigdata->tempo = dumbfile_getc(f);
- sigdata->pan_separation = dumbfile_getc(f); /** WARNING: use this */
+ sigdata->global_volume = dumbfile_getc(f);
+ sigdata->mixing_volume = dumbfile_getc(f);
+ sigdata->speed = dumbfile_getc(f);
+ if (sigdata->speed == 0)
+ sigdata->speed = 6; // Should we? What about tempo?
+ sigdata->tempo = dumbfile_getc(f);
+ sigdata->pan_separation = dumbfile_getc(f); /** WARNING: use this */
- /* Skip Pitch Wheel Depth */
- dumbfile_skip(f, 1);
+ /* Skip Pitch Wheel Depth */
+ dumbfile_skip(f, 1);
- message_length = dumbfile_igetw(f);
- message_offset = (int)dumbfile_igetl(f);
+ message_length = dumbfile_igetw(f);
+ message_offset = (int)dumbfile_igetl(f);
- /* Skip Reserved. */
- dumbfile_skip(f, 4);
+ /* Skip Reserved. */
+ dumbfile_skip(f, 4);
dumbfile_getnc((char *)sigdata->channel_pan, DUMB_IT_N_CHANNELS, f);
dumbfile_getnc((char *)sigdata->channel_volume, DUMB_IT_N_CHANNELS, f);
- // XXX sample count
- if (dumbfile_error(f) || sigdata->n_orders <= 0 || sigdata->n_instruments > 256 || sigdata->n_samples > 4000 || sigdata->n_patterns > 256) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ // XXX sample count
+ if (dumbfile_error(f) || sigdata->n_orders <= 0 ||
+ sigdata->n_instruments > 256 || sigdata->n_samples > 4000 ||
+ sigdata->n_patterns > 256) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- sigdata->order = malloc(sigdata->n_orders);
- if (!sigdata->order) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ sigdata->order = malloc(sigdata->n_orders);
+ if (!sigdata->order) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- if (sigdata->n_instruments) {
- sigdata->instrument = malloc(sigdata->n_instruments * sizeof(*sigdata->instrument));
- if (!sigdata->instrument) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- }
+ if (sigdata->n_instruments) {
+ sigdata->instrument =
+ malloc(sigdata->n_instruments * sizeof(*sigdata->instrument));
+ if (!sigdata->instrument) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ }
- if (sigdata->n_samples) {
- sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
- if (!sigdata->sample) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- for (n = 0; n < sigdata->n_samples; n++)
- sigdata->sample[n].data = NULL;
- }
+ if (sigdata->n_samples) {
+ sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
+ if (!sigdata->sample) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (n = 0; n < sigdata->n_samples; n++)
+ sigdata->sample[n].data = NULL;
+ }
- if (sigdata->n_patterns) {
- sigdata->pattern = malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
- if (!sigdata->pattern) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- for (n = 0; n < sigdata->n_patterns; n++)
- sigdata->pattern[n].entry = NULL;
- }
+ if (sigdata->n_patterns) {
+ sigdata->pattern =
+ malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
+ if (!sigdata->pattern) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (n = 0; n < sigdata->n_patterns; n++)
+ sigdata->pattern[n].entry = NULL;
+ }
- if ( dumbfile_getnc((char *)sigdata->order, sigdata->n_orders, f) < sigdata->n_orders ) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- sigdata->restart_position = 0;
-
- min_components = (special & 1) + sigdata->n_instruments + sigdata->n_samples + sigdata->n_patterns;
+ if (dumbfile_getnc((char *)sigdata->order, sigdata->n_orders, f) <
+ sigdata->n_orders) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ sigdata->restart_position = 0;
- component = malloc(min_components * sizeof(*component));
- if (!component) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ min_components = (special & 1) + sigdata->n_instruments +
+ sigdata->n_samples + sigdata->n_patterns;
- if (special & 1) {
- component[n_components].type = IT_COMPONENT_SONG_MESSAGE;
- component[n_components].offset = message_offset;
- component[n_components].sampfirst = -1;
- n_components++;
- }
+ component = malloc(min_components * sizeof(*component));
+ if (!component) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- for (n = 0; n < sigdata->n_instruments; n++) {
- component[n_components].type = IT_COMPONENT_INSTRUMENT;
- component[n_components].n = n;
- component[n_components].offset = dumbfile_igetl(f);
- component[n_components].sampfirst = -1;
- n_components++;
- }
+ if (special & 1) {
+ component[n_components].type = IT_COMPONENT_SONG_MESSAGE;
+ component[n_components].offset = message_offset;
+ component[n_components].sampfirst = -1;
+ n_components++;
+ }
- for (n = 0; n < sigdata->n_samples; n++) {
- component[n_components].type = IT_COMPONENT_SAMPLE;
- component[n_components].n = n;
- component[n_components].offset = dumbfile_igetl(f);
- component[n_components].sampfirst = -1;
- n_components++;
- }
+ for (n = 0; n < sigdata->n_instruments; n++) {
+ component[n_components].type = IT_COMPONENT_INSTRUMENT;
+ component[n_components].n = n;
+ component[n_components].offset = dumbfile_igetl(f);
+ component[n_components].sampfirst = -1;
+ n_components++;
+ }
- for (n = 0; n < sigdata->n_patterns; n++) {
- long offset = dumbfile_igetl(f);
- if (offset) {
- component[n_components].type = IT_COMPONENT_PATTERN;
- component[n_components].n = n;
- component[n_components].offset = offset;
- component[n_components].sampfirst = -1;
- n_components++;
- } else {
- /* Empty 64-row pattern */
- sigdata->pattern[n].n_rows = 64;
- sigdata->pattern[n].n_entries = 0;
- }
- }
+ for (n = 0; n < sigdata->n_samples; n++) {
+ component[n_components].type = IT_COMPONENT_SAMPLE;
+ component[n_components].n = n;
+ component[n_components].offset = dumbfile_igetl(f);
+ component[n_components].sampfirst = -1;
+ n_components++;
+ }
- if (dumbfile_error(f)) {
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ for (n = 0; n < sigdata->n_patterns; n++) {
+ long offset = dumbfile_igetl(f);
+ if (offset) {
+ component[n_components].type = IT_COMPONENT_PATTERN;
+ component[n_components].n = n;
+ component[n_components].offset = offset;
+ component[n_components].sampfirst = -1;
+ n_components++;
+ } else {
+ /* Empty 64-row pattern */
+ sigdata->pattern[n].n_rows = 64;
+ sigdata->pattern[n].n_entries = 0;
+ }
+ }
- /*
- if (!(sigdata->flags & 128) != !(special & 8)) {
- fprintf(stderr, "Flags Bit 7 (\"Request embedded MIDI configuration\"): %s\n", sigdata->flags & 128 ? "=SET=" : "clear");
- fprintf(stderr, "Special Bit 3 (\"MIDI configuration embedded\") : %s\n", special & 8 ? "=SET=" : "clear");
- fprintf(stderr, "entheh would like to investigate this IT file.\n");
- fprintf(stderr, "Please contact him! entheh@users.sf.net\n");
- }
- */
+ if (dumbfile_error(f)) {
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- if (special & 8) {
- /* MIDI configuration is embedded. */
- unsigned char mididata[32];
- int i;
- sigdata->midi = malloc(sizeof(*sigdata->midi));
- if (!sigdata->midi) {
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- // Should we be happy with this outcome in some situations?
- }
- // What are we skipping?
- i = dumbfile_igetw(f);
- if (dumbfile_error(f) || dumbfile_skip(f, 8*i)) {
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- /* Read embedded MIDI configuration */
- // What are the first 9 commands for?
- if (dumbfile_skip(f, 32*9)) {
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- for (i = 0; i < 16; i++) {
- unsigned char len = 0;
- int j, leftdigit = -1;
+ /*
+ if (!(sigdata->flags & 128) != !(special & 8)) {
+ fprintf(stderr, "Flags Bit 7 (\"Request embedded MIDI
+ configuration\"): %s\n", sigdata->flags & 128 ? "=SET=" : "clear");
+ fprintf(stderr, "Special Bit 3 (\"MIDI configuration embedded\")
+ : %s\n", special & 8 ? "=SET=" : "clear"); fprintf(stderr, "entheh
+ would like to investigate this IT file.\n"); fprintf(stderr, "Please contact
+ him! entheh@users.sf.net\n");
+ }
+ */
+
+ if (special & 8) {
+ /* MIDI configuration is embedded. */
+ unsigned char mididata[32];
+ int i;
+ sigdata->midi = malloc(sizeof(*sigdata->midi));
+ if (!sigdata->midi) {
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ // Should we be happy with this outcome in some situations?
+ }
+ // What are we skipping?
+ i = dumbfile_igetw(f);
+ if (dumbfile_error(f) || dumbfile_skip(f, 8 * i)) {
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ /* Read embedded MIDI configuration */
+ // What are the first 9 commands for?
+ if (dumbfile_skip(f, 32 * 9)) {
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (i = 0; i < 16; i++) {
+ unsigned char len = 0;
+ int j, leftdigit = -1;
if (dumbfile_getnc((char *)mididata, 32, f) < 32) {
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- sigdata->midi->SFmacroz[i] = 0;
- for (j = 0; j < 32; j++) {
- if (leftdigit >= 0) {
- if (mididata[j] == 0) {
- sigdata->midi->SFmacro[i][len++] = leftdigit;
- break;
- } else if (mididata[j] == ' ')
- sigdata->midi->SFmacro[i][len++] = leftdigit;
- else if (mididata[j] >= '0' && mididata[j] <= '9')
- sigdata->midi->SFmacro[i][len++] = (leftdigit << 4) | (mididata[j] - '0');
- else if (mididata[j] >= 'A' && mididata[j] <= 'F')
- sigdata->midi->SFmacro[i][len++] = (leftdigit << 4) | (mididata[j] - 'A' + 0xA);
- leftdigit = -1;
- } else if (mididata[j] == 0)
- break;
- else if (mididata[j] == 'z')
- sigdata->midi->SFmacroz[i] |= 1 << len++;
- else if (mididata[j] >= '0' && mididata[j] <= '9')
- leftdigit = mididata[j] - '0';
- else if (mididata[j] >= 'A' && mididata[j] <= 'F')
- leftdigit = mididata[j] - 'A' + 0xA;
- }
- sigdata->midi->SFmacrolen[i] = len;
- }
- for (i = 0; i < 128; i++) {
- unsigned char len = 0;
- int j, leftdigit = -1;
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ sigdata->midi->SFmacroz[i] = 0;
+ for (j = 0; j < 32; j++) {
+ if (leftdigit >= 0) {
+ if (mididata[j] == 0) {
+ sigdata->midi->SFmacro[i][len++] = leftdigit;
+ break;
+ } else if (mididata[j] == ' ')
+ sigdata->midi->SFmacro[i][len++] = leftdigit;
+ else if (mididata[j] >= '0' && mididata[j] <= '9')
+ sigdata->midi->SFmacro[i][len++] =
+ (leftdigit << 4) | (mididata[j] - '0');
+ else if (mididata[j] >= 'A' && mididata[j] <= 'F')
+ sigdata->midi->SFmacro[i][len++] =
+ (leftdigit << 4) | (mididata[j] - 'A' + 0xA);
+ leftdigit = -1;
+ } else if (mididata[j] == 0)
+ break;
+ else if (mididata[j] == 'z')
+ sigdata->midi->SFmacroz[i] |= 1 << len++;
+ else if (mididata[j] >= '0' && mididata[j] <= '9')
+ leftdigit = mididata[j] - '0';
+ else if (mididata[j] >= 'A' && mididata[j] <= 'F')
+ leftdigit = mididata[j] - 'A' + 0xA;
+ }
+ sigdata->midi->SFmacrolen[i] = len;
+ }
+ for (i = 0; i < 128; i++) {
+ unsigned char len = 0;
+ int j, leftdigit = -1;
dumbfile_getnc((char *)mididata, 32, f);
- for (j = 0; j < 32; j++) {
- if (leftdigit >= 0) {
- if (mididata[j] == 0) {
- sigdata->midi->Zmacro[i][len++] = leftdigit;
- break;
- } else if (mididata[j] == ' ')
- sigdata->midi->Zmacro[i][len++] = leftdigit;
- else if (mididata[j] >= '0' && mididata[j] <= '9')
- sigdata->midi->Zmacro[i][len++] = (leftdigit << 4) | (mididata[j] - '0');
- else if (mididata[j] >= 'A' && mididata[j] <= 'F')
- sigdata->midi->Zmacro[i][len++] = (leftdigit << 4) | (mididata[j] - 'A' + 0xA);
- leftdigit = -1;
- } else if (mididata[j] == 0)
- break;
- else if (mididata[j] >= '0' && mididata[j] <= '9')
- leftdigit = mididata[j] - '0';
- else if (mididata[j] >= 'A' && mididata[j] <= 'F')
- leftdigit = mididata[j] - 'A' + 0xA;
- }
- sigdata->midi->Zmacrolen[i] = len;
- }
- }
+ for (j = 0; j < 32; j++) {
+ if (leftdigit >= 0) {
+ if (mididata[j] == 0) {
+ sigdata->midi->Zmacro[i][len++] = leftdigit;
+ break;
+ } else if (mididata[j] == ' ')
+ sigdata->midi->Zmacro[i][len++] = leftdigit;
+ else if (mididata[j] >= '0' && mididata[j] <= '9')
+ sigdata->midi->Zmacro[i][len++] =
+ (leftdigit << 4) | (mididata[j] - '0');
+ else if (mididata[j] >= 'A' && mididata[j] <= 'F')
+ sigdata->midi->Zmacro[i][len++] =
+ (leftdigit << 4) | (mididata[j] - 'A' + 0xA);
+ leftdigit = -1;
+ } else if (mididata[j] == 0)
+ break;
+ else if (mididata[j] >= '0' && mididata[j] <= '9')
+ leftdigit = mididata[j] - '0';
+ else if (mididata[j] >= 'A' && mididata[j] <= 'F')
+ leftdigit = mididata[j] - 'A' + 0xA;
+ }
+ sigdata->midi->Zmacrolen[i] = len;
+ }
+ }
- sigdata->flags &= IT_REAL_FLAGS;
+ sigdata->flags &= IT_REAL_FLAGS;
qsort(component, n_components, sizeof(IT_COMPONENT), &it_component_compare);
- buffer = malloc(65536);
- if (!buffer) {
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ buffer = malloc(65536);
+ if (!buffer) {
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- for (n = 0; n < n_components; n++) {
- long offset;
- int m;
+ for (n = 0; n < n_components; n++) {
+ long offset;
+ int m;
- /* XXX */
- if ( component[n].offset == 0 ) {
- switch (component[n].type) {
- case IT_COMPONENT_INSTRUMENT:
- memset( &sigdata->instrument[component[n].n], 0, sizeof(IT_INSTRUMENT) );
- break;
- case IT_COMPONENT_SAMPLE:
- memset( &sigdata->sample[component[n].n], 0, sizeof(IT_SAMPLE) );
- break;
- case IT_COMPONENT_PATTERN:
- {
- IT_PATTERN * p = &sigdata->pattern[component[n].n];
- p->entry = 0;
- p->n_rows = 64;
- p->n_entries = 0;
- }
- break;
- }
- continue;
- }
+ /* XXX */
+ if (component[n].offset == 0) {
+ switch (component[n].type) {
+ case IT_COMPONENT_INSTRUMENT:
+ memset(&sigdata->instrument[component[n].n], 0,
+ sizeof(IT_INSTRUMENT));
+ break;
+ case IT_COMPONENT_SAMPLE:
+ memset(&sigdata->sample[component[n].n], 0, sizeof(IT_SAMPLE));
+ break;
+ case IT_COMPONENT_PATTERN: {
+ IT_PATTERN *p = &sigdata->pattern[component[n].n];
+ p->entry = 0;
+ p->n_rows = 64;
+ p->n_entries = 0;
+ } break;
+ }
+ continue;
+ }
if (dumbfile_seek(f, component[n].offset, DFS_SEEK_SET)) {
- free(buffer);
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ free(buffer);
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- switch (component[n].type) {
+ switch (component[n].type) {
- case IT_COMPONENT_SONG_MESSAGE:
- if ( n+1 < n_components ) {
- message_length = min( message_length, (int)(component[n+1].offset - component[n].offset) );
- }
- sigdata->song_message = malloc(message_length + 1);
- if (sigdata->song_message) {
- if (dumbfile_getnc((char *)sigdata->song_message, message_length, f) < message_length) {
- free(buffer);
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- sigdata->song_message[message_length] = 0;
- }
- break;
+ case IT_COMPONENT_SONG_MESSAGE:
+ if (n + 1 < n_components) {
+ message_length =
+ min(message_length,
+ (int)(component[n + 1].offset - component[n].offset));
+ }
+ sigdata->song_message = malloc(message_length + 1);
+ if (sigdata->song_message) {
+ if (dumbfile_getnc((char *)sigdata->song_message,
+ message_length, f) < message_length) {
+ free(buffer);
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ sigdata->song_message[message_length] = 0;
+ }
+ break;
- case IT_COMPONENT_INSTRUMENT:
- if (cmwt < 0x200)
- m = it_read_old_instrument(&sigdata->instrument[component[n].n], f);
- else
- m = it_read_instrument(&sigdata->instrument[component[n].n], f, (n + 1 < n_components) ? (int)(component[n+1].offset - component[n].offset) : 0);
+ case IT_COMPONENT_INSTRUMENT:
+ if (cmwt < 0x200)
+ m = it_read_old_instrument(&sigdata->instrument[component[n].n],
+ f);
+ else
+ m = it_read_instrument(
+ &sigdata->instrument[component[n].n], f,
+ (n + 1 < n_components)
+ ? (int)(component[n + 1].offset - component[n].offset)
+ : 0);
- if (m) {
- free(buffer);
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- break;
+ if (m) {
+ free(buffer);
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ break;
- case IT_COMPONENT_PATTERN:
- if (it_read_pattern(&sigdata->pattern[component[n].n], f, buffer)) {
- free(buffer);
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- break;
+ case IT_COMPONENT_PATTERN:
+ if (it_read_pattern(&sigdata->pattern[component[n].n], f, buffer)) {
+ free(buffer);
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ break;
- case IT_COMPONENT_SAMPLE:
- if (it_read_sample_header(&sigdata->sample[component[n].n], &sample_convert[component[n].n], &offset, f)) {
- free(buffer);
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ case IT_COMPONENT_SAMPLE:
+ if (it_read_sample_header(&sigdata->sample[component[n].n],
+ &sample_convert[component[n].n], &offset,
+ f)) {
+ free(buffer);
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- if (sigdata->sample[component[n].n].flags & IT_SAMPLE_EXISTS) {
- short *sample;
+ if (sigdata->sample[component[n].n].flags & IT_SAMPLE_EXISTS) {
+ short *sample;
- for (m = n + 1; m < n_components; m++)
- if (component[m].offset > offset)
- break;
- m--;
+ for (m = n + 1; m < n_components; m++)
+ if (component[m].offset > offset)
+ break;
+ m--;
- sample = &component[m].sampfirst;
+ sample = &component[m].sampfirst;
- while (*sample >= 0 && component[*sample].offset <= offset)
- sample = &component[*sample].sampnext;
+ while (*sample >= 0 && component[*sample].offset <= offset)
+ sample = &component[*sample].sampnext;
- component[n].sampnext = *sample;
- *sample = n;
+ component[n].sampnext = *sample;
+ *sample = n;
- component[n].offset = offset;
- }
- }
+ component[n].offset = offset;
+ }
+ }
- m = component[n].sampfirst;
+ m = component[n].sampfirst;
- while (m >= 0) {
+ while (m >= 0) {
if (dumbfile_seek(f, component[m].offset, DFS_SEEK_SET)) {
- free(buffer);
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ free(buffer);
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- if (it_read_sample_data(&sigdata->sample[component[m].n], sample_convert[component[m].n], f)) {
- free(buffer);
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ if (it_read_sample_data(&sigdata->sample[component[m].n],
+ sample_convert[component[m].n], f)) {
+ free(buffer);
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- m = component[m].sampnext;
- }
+ m = component[m].sampnext;
+ }
}
- for ( n = 0; n < 10; n++ )
- {
- if ( dumbfile_getc( f ) == 'X' )
- {
- if ( dumbfile_getc( f ) == 'T' )
- {
- if ( dumbfile_getc( f ) == 'P' )
- {
- if ( dumbfile_getc( f ) == 'M' )
- {
+ for (n = 0; n < 10; n++) {
+ if (dumbfile_getc(f) == 'X') {
+ if (dumbfile_getc(f) == 'T') {
+ if (dumbfile_getc(f) == 'P') {
+ if (dumbfile_getc(f) == 'M') {
break;
}
}
@@ -1364,15 +1398,12 @@
}
}
- if ( !dumbfile_error( f ) && n < 10 )
- {
- unsigned int mptx_id = (unsigned int)dumbfile_igetl( f );
- while ( !dumbfile_error( f ) && mptx_id != DUMB_ID('M','P','T','S') )
- {
- unsigned int size = dumbfile_igetw( f );
- switch (mptx_id)
- {
- /* TODO: Add instrument extension readers */
+ if (!dumbfile_error(f) && n < 10) {
+ unsigned int mptx_id = (unsigned int)dumbfile_igetl(f);
+ while (!dumbfile_error(f) && mptx_id != DUMB_ID('M', 'P', 'T', 'S')) {
+ unsigned int size = dumbfile_igetw(f);
+ switch (mptx_id) {
+ /* TODO: Add instrument extension readers */
default:
dumbfile_skip(f, size * sigdata->n_instruments);
@@ -1379,22 +1410,20 @@
break;
}
- mptx_id = (unsigned int)dumbfile_igetl( f );
+ mptx_id = (unsigned int)dumbfile_igetl(f);
}
- mptx_id = (unsigned int)dumbfile_igetl( f );
- while ( !dumbfile_error(f) && dumbfile_pos(f) < dumbfile_get_size(f) )
- {
- unsigned int size = dumbfile_igetw( f );
- switch (mptx_id)
- {
- /* TODO: Add more song extension readers */
+ mptx_id = (unsigned int)dumbfile_igetl(f);
+ while (!dumbfile_error(f) && dumbfile_pos(f) < dumbfile_get_size(f)) {
+ unsigned int size = dumbfile_igetw(f);
+ switch (mptx_id) {
+ /* TODO: Add more song extension readers */
- case DUMB_ID('D','T','.','.'):
- if ( size == 2 )
- sigdata->tempo = dumbfile_igetw( f );
- else if ( size == 4 )
- sigdata->tempo = (int)dumbfile_igetl( f );
+ case DUMB_ID('D', 'T', '.', '.'):
+ if (size == 2)
+ sigdata->tempo = dumbfile_igetw(f);
+ else if (size == 4)
+ sigdata->tempo = (int)dumbfile_igetl(f);
break;
default:
@@ -1401,37 +1430,35 @@
dumbfile_skip(f, size);
break;
}
- mptx_id = (unsigned int)dumbfile_igetl( f );
+ mptx_id = (unsigned int)dumbfile_igetl(f);
}
}
free(buffer);
- free(component);
+ free(component);
- _dumb_it_fix_invalid_orders(sigdata);
+ _dumb_it_fix_invalid_orders(sigdata);
- return sigdata;
+ return sigdata;
}
+DUH *dumb_read_it_quick(DUMBFILE *f) {
+ sigdata_t *sigdata;
+ DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
-DUH *dumb_read_it_quick(DUMBFILE *f)
-{
- sigdata_t *sigdata;
+ sigdata = it_load_sigdata(f);
- DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
+ if (!sigdata)
+ return NULL;
- sigdata = it_load_sigdata(f);
-
- if (!sigdata)
- return NULL;
-
- {
- const char *tag[2][2];
- tag[0][0] = "TITLE";
+ {
+ const char *tag[2][2];
+ tag[0][0] = "TITLE";
tag[0][1] = (const char *)(((DUMB_IT_SIGDATA *)sigdata)->name);
- tag[1][0] = "FORMAT";
- tag[1][1] = "IT";
- return make_duh(-1, 2, (const char *const (*)[2])tag, 1, &descptr, &sigdata);
- }
+ tag[1][0] = "FORMAT";
+ tag[1][1] = "IT";
+ return make_duh(-1, 2, (const char *const(*)[2])tag, 1, &descptr,
+ &sigdata);
+ }
}
--- a/src/it/itread2.c
+++ b/src/it/itread2.c
@@ -19,11 +19,8 @@
#include "dumb.h"
-
-
-DUH *dumb_read_it(DUMBFILE *f)
-{
- DUH *duh = dumb_read_it_quick(f);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+DUH *dumb_read_it(DUMBFILE *f) {
+ DUH *duh = dumb_read_it_quick(f);
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/itrender.c
+++ b/src/it/itrender.c
@@ -28,7 +28,8 @@
#include "internal/resampler.h"
-// Keep this disabled, as it's actually slower than the original C/integer version
+// Keep this disabled, as it's actually slower than the original C/integer
+// version
//
//#ifdef __APPLE__
//#include <TargetConditionals.h>
@@ -40,517 +41,644 @@
// #define BIT_ARRAY_BULLSHIT
-static IT_PLAYING *new_playing()
-{
- IT_PLAYING * r = (IT_PLAYING*) malloc(sizeof(*r));
- if (r)
- {
- r->resampler.fir_resampler_ratio = 0.0;
- r->resampler.fir_resampler[0] = resampler_create();
- if ( !r->resampler.fir_resampler[0] ) {
- free( r );
- return NULL;
- }
- r->resampler.fir_resampler[1] = resampler_create();
- if ( !r->resampler.fir_resampler[1] ) {
- resampler_delete( r->resampler.fir_resampler[0] );
- free( r );
- return NULL;
- }
- }
- return r;
+static IT_PLAYING *new_playing() {
+ IT_PLAYING *r = (IT_PLAYING *)malloc(sizeof(*r));
+ if (r) {
+ r->resampler.fir_resampler_ratio = 0.0;
+ r->resampler.fir_resampler[0] = resampler_create();
+ if (!r->resampler.fir_resampler[0]) {
+ free(r);
+ return NULL;
+ }
+ r->resampler.fir_resampler[1] = resampler_create();
+ if (!r->resampler.fir_resampler[1]) {
+ resampler_delete(r->resampler.fir_resampler[0]);
+ free(r);
+ return NULL;
+ }
+ }
+ return r;
}
-static void free_playing(IT_PLAYING * r)
-{
- resampler_delete( r->resampler.fir_resampler[1] );
- resampler_delete( r->resampler.fir_resampler[0] );
- free( r );
+static void free_playing(IT_PLAYING *r) {
+ resampler_delete(r->resampler.fir_resampler[1]);
+ resampler_delete(r->resampler.fir_resampler[0]);
+ free(r);
}
-static IT_PLAYING *dup_playing(IT_PLAYING *src, IT_CHANNEL *dstchannel, IT_CHANNEL *srcchannel)
-{
- IT_PLAYING *dst;
+static IT_PLAYING *dup_playing(IT_PLAYING *src, IT_CHANNEL *dstchannel,
+ IT_CHANNEL *srcchannel) {
+ IT_PLAYING *dst;
- if (!src) return NULL;
+ if (!src)
+ return NULL;
- dst = malloc(sizeof(*dst));
- if (!dst) return NULL;
+ dst = malloc(sizeof(*dst));
+ if (!dst)
+ return NULL;
- dst->flags = src->flags;
- dst->resampling_quality = src->resampling_quality;
+ dst->flags = src->flags;
+ dst->resampling_quality = src->resampling_quality;
- ASSERT(src->channel);
- dst->channel = &dstchannel[src->channel - srcchannel];
- dst->sample = src->sample;
- dst->instrument = src->instrument;
- dst->env_instrument = src->env_instrument;
+ ASSERT(src->channel);
+ dst->channel = &dstchannel[src->channel - srcchannel];
+ dst->sample = src->sample;
+ dst->instrument = src->instrument;
+ dst->env_instrument = src->env_instrument;
- dst->sampnum = src->sampnum;
- dst->instnum = src->instnum;
+ dst->sampnum = src->sampnum;
+ dst->instnum = src->instnum;
- dst->declick_stage = src->declick_stage;
+ dst->declick_stage = src->declick_stage;
- dst->float_volume[0] = src->float_volume[0];
- dst->float_volume[1] = src->float_volume[1];
+ dst->float_volume[0] = src->float_volume[0];
+ dst->float_volume[1] = src->float_volume[1];
- dst->ramp_volume[0] = src->ramp_volume[0];
- dst->ramp_volume[1] = src->ramp_volume[1];
+ dst->ramp_volume[0] = src->ramp_volume[0];
+ dst->ramp_volume[1] = src->ramp_volume[1];
- dst->ramp_delta[0] = src->ramp_delta[0];
- dst->ramp_delta[1] = src->ramp_delta[1];
+ dst->ramp_delta[0] = src->ramp_delta[0];
+ dst->ramp_delta[1] = src->ramp_delta[1];
- dst->channel_volume = src->channel_volume;
+ dst->channel_volume = src->channel_volume;
- dst->volume = src->volume;
- dst->pan = src->pan;
+ dst->volume = src->volume;
+ dst->pan = src->pan;
- dst->volume_offset = src->volume_offset;
- dst->panning_offset = src->panning_offset;
+ dst->volume_offset = src->volume_offset;
+ dst->panning_offset = src->panning_offset;
- dst->note = src->note;
+ dst->note = src->note;
- dst->enabled_envelopes = src->enabled_envelopes;
+ dst->enabled_envelopes = src->enabled_envelopes;
- dst->filter_cutoff = src->filter_cutoff;
- dst->filter_resonance = src->filter_resonance;
+ dst->filter_cutoff = src->filter_cutoff;
+ dst->filter_resonance = src->filter_resonance;
- dst->true_filter_cutoff = src->true_filter_cutoff;
- dst->true_filter_resonance = src->true_filter_resonance;
+ dst->true_filter_cutoff = src->true_filter_cutoff;
+ dst->true_filter_resonance = src->true_filter_resonance;
- dst->vibrato_speed = src->vibrato_speed;
- dst->vibrato_depth = src->vibrato_depth;
- dst->vibrato_n = src->vibrato_n;
- dst->vibrato_time = src->vibrato_time;
- dst->vibrato_waveform = src->vibrato_waveform;
+ dst->vibrato_speed = src->vibrato_speed;
+ dst->vibrato_depth = src->vibrato_depth;
+ dst->vibrato_n = src->vibrato_n;
+ dst->vibrato_time = src->vibrato_time;
+ dst->vibrato_waveform = src->vibrato_waveform;
- dst->tremolo_speed = src->tremolo_speed;
- dst->tremolo_depth = src->tremolo_depth;
- dst->tremolo_time = src->tremolo_time;
- dst->tremolo_waveform = src->tremolo_waveform;
+ dst->tremolo_speed = src->tremolo_speed;
+ dst->tremolo_depth = src->tremolo_depth;
+ dst->tremolo_time = src->tremolo_time;
+ dst->tremolo_waveform = src->tremolo_waveform;
- dst->panbrello_speed = src->panbrello_speed;
- dst->panbrello_depth = src->panbrello_depth;
- dst->panbrello_time = src->panbrello_time;
- dst->panbrello_waveform = src->panbrello_waveform;
- dst->panbrello_random = src->panbrello_random;
+ dst->panbrello_speed = src->panbrello_speed;
+ dst->panbrello_depth = src->panbrello_depth;
+ dst->panbrello_time = src->panbrello_time;
+ dst->panbrello_waveform = src->panbrello_waveform;
+ dst->panbrello_random = src->panbrello_random;
- dst->sample_vibrato_time = src->sample_vibrato_time;
- dst->sample_vibrato_waveform = src->sample_vibrato_waveform;
- dst->sample_vibrato_depth = src->sample_vibrato_depth;
+ dst->sample_vibrato_time = src->sample_vibrato_time;
+ dst->sample_vibrato_waveform = src->sample_vibrato_waveform;
+ dst->sample_vibrato_depth = src->sample_vibrato_depth;
- dst->slide = src->slide;
- dst->delta = src->delta;
- dst->finetune = src->finetune;
+ dst->slide = src->slide;
+ dst->delta = src->delta;
+ dst->finetune = src->finetune;
- dst->volume_envelope = src->volume_envelope;
- dst->pan_envelope = src->pan_envelope;
- dst->pitch_envelope = src->pitch_envelope;
+ dst->volume_envelope = src->volume_envelope;
+ dst->pan_envelope = src->pan_envelope;
+ dst->pitch_envelope = src->pitch_envelope;
- dst->fadeoutcount = src->fadeoutcount;
+ dst->fadeoutcount = src->fadeoutcount;
- dst->filter_state[0] = src->filter_state[0];
- dst->filter_state[1] = src->filter_state[1];
+ dst->filter_state[0] = src->filter_state[0];
+ dst->filter_state[1] = src->filter_state[1];
- dst->resampler = src->resampler;
- dst->resampler.pickup_data = dst;
- dst->resampler.fir_resampler_ratio = src->resampler.fir_resampler_ratio;
- dst->resampler.fir_resampler[0] = resampler_dup( src->resampler.fir_resampler[0] );
- if ( !dst->resampler.fir_resampler[0] ) {
- free( dst );
- return NULL;
- }
- dst->resampler.fir_resampler[1] = resampler_dup( src->resampler.fir_resampler[1] );
- if ( !dst->resampler.fir_resampler[1] ) {
- resampler_delete( dst->resampler.fir_resampler[0] );
- free( dst );
- return NULL;
- }
- dst->time_lost = src->time_lost;
+ dst->resampler = src->resampler;
+ dst->resampler.pickup_data = dst;
+ dst->resampler.fir_resampler_ratio = src->resampler.fir_resampler_ratio;
+ dst->resampler.fir_resampler[0] =
+ resampler_dup(src->resampler.fir_resampler[0]);
+ if (!dst->resampler.fir_resampler[0]) {
+ free(dst);
+ return NULL;
+ }
+ dst->resampler.fir_resampler[1] =
+ resampler_dup(src->resampler.fir_resampler[1]);
+ if (!dst->resampler.fir_resampler[1]) {
+ resampler_delete(dst->resampler.fir_resampler[0]);
+ free(dst);
+ return NULL;
+ }
+ dst->time_lost = src->time_lost;
- //dst->output = src->output;
+ // dst->output = src->output;
- return dst;
+ return dst;
}
+static void dup_channel(IT_CHANNEL *dst, IT_CHANNEL *src) {
+ dst->flags = src->flags;
+ dst->volume = src->volume;
+ dst->volslide = src->volslide;
+ dst->xm_volslide = src->xm_volslide;
+ dst->panslide = src->panslide;
-static void dup_channel(IT_CHANNEL *dst, IT_CHANNEL *src)
-{
- dst->flags = src->flags;
+ dst->pan = src->pan;
+ dst->truepan = src->truepan;
- dst->volume = src->volume;
- dst->volslide = src->volslide;
- dst->xm_volslide = src->xm_volslide;
- dst->panslide = src->panslide;
+ dst->channelvolume = src->channelvolume;
+ dst->channelvolslide = src->channelvolslide;
- dst->pan = src->pan;
- dst->truepan = src->truepan;
+ dst->instrument = src->instrument;
+ dst->note = src->note;
- dst->channelvolume = src->channelvolume;
- dst->channelvolslide = src->channelvolslide;
+ dst->SFmacro = src->SFmacro;
- dst->instrument = src->instrument;
- dst->note = src->note;
+ dst->filter_cutoff = src->filter_cutoff;
+ dst->filter_resonance = src->filter_resonance;
- dst->SFmacro = src->SFmacro;
+ dst->key_off_count = src->key_off_count;
+ dst->note_cut_count = src->note_cut_count;
+ dst->note_delay_count = src->note_delay_count;
+ dst->note_delay_entry = src->note_delay_entry;
- dst->filter_cutoff = src->filter_cutoff;
- dst->filter_resonance = src->filter_resonance;
+ dst->new_note_action = src->new_note_action;
- dst->key_off_count = src->key_off_count;
- dst->note_cut_count = src->note_cut_count;
- dst->note_delay_count = src->note_delay_count;
- dst->note_delay_entry = src->note_delay_entry;
+ dst->arpeggio_table = src->arpeggio_table;
+ memcpy(dst->arpeggio_offsets, src->arpeggio_offsets,
+ sizeof(dst->arpeggio_offsets));
+ dst->retrig = src->retrig;
+ dst->xm_retrig = src->xm_retrig;
+ dst->retrig_tick = src->retrig_tick;
- dst->new_note_action = src->new_note_action;
+ dst->tremor_time = src->tremor_time;
- dst->arpeggio_table = src->arpeggio_table;
- memcpy(dst->arpeggio_offsets, src->arpeggio_offsets, sizeof(dst->arpeggio_offsets));
- dst->retrig = src->retrig;
- dst->xm_retrig = src->xm_retrig;
- dst->retrig_tick = src->retrig_tick;
+ dst->vibrato_waveform = src->vibrato_waveform;
+ dst->tremolo_waveform = src->tremolo_waveform;
+ dst->panbrello_waveform = src->panbrello_waveform;
- dst->tremor_time = src->tremor_time;
+ dst->portamento = src->portamento;
+ dst->toneporta = src->toneporta;
+ dst->toneslide = src->toneslide;
+ dst->toneslide_tick = src->toneslide_tick;
+ dst->last_toneslide_tick = src->last_toneslide_tick;
+ dst->ptm_toneslide = src->ptm_toneslide;
+ dst->ptm_last_toneslide = src->ptm_last_toneslide;
+ dst->okt_toneslide = src->okt_toneslide;
+ dst->destnote = src->destnote;
- dst->vibrato_waveform = src->vibrato_waveform;
- dst->tremolo_waveform = src->tremolo_waveform;
- dst->panbrello_waveform = src->panbrello_waveform;
+ dst->glissando = src->glissando;
- dst->portamento = src->portamento;
- dst->toneporta = src->toneporta;
- dst->toneslide = src->toneslide;
- dst->toneslide_tick = src->toneslide_tick;
- dst->last_toneslide_tick = src->last_toneslide_tick;
- dst->ptm_toneslide = src->ptm_toneslide;
- dst->ptm_last_toneslide = src->ptm_last_toneslide;
- dst->okt_toneslide = src->okt_toneslide;
- dst->destnote = src->destnote;
+ dst->sample = src->sample;
+ dst->truenote = src->truenote;
- dst->glissando = src->glissando;
+ dst->midi_state = src->midi_state;
- dst->sample = src->sample;
- dst->truenote = src->truenote;
+ dst->lastvolslide = src->lastvolslide;
+ dst->lastDKL = src->lastDKL;
+ dst->lastEF = src->lastEF;
+ dst->lastG = src->lastG;
+ dst->lastHspeed = src->lastHspeed;
+ dst->lastHdepth = src->lastHdepth;
+ dst->lastRspeed = src->lastRspeed;
+ dst->lastRdepth = src->lastRdepth;
+ dst->lastYspeed = src->lastYspeed;
+ dst->lastYdepth = src->lastYdepth;
+ dst->lastI = src->lastI;
+ dst->lastJ = src->lastJ;
+ dst->lastN = src->lastN;
+ dst->lastO = src->lastO;
+ dst->high_offset = src->high_offset;
+ dst->lastP = src->lastP;
+ dst->lastQ = src->lastQ;
+ dst->lastS = src->lastS;
+ dst->pat_loop_row = src->pat_loop_row;
+ dst->pat_loop_count = src->pat_loop_count;
+ dst->pat_loop_end_row = src->pat_loop_end_row;
+ dst->lastW = src->lastW;
- dst->midi_state = src->midi_state;
+ dst->xm_lastE1 = src->xm_lastE1;
+ dst->xm_lastE2 = src->xm_lastE2;
+ dst->xm_lastEA = src->xm_lastEA;
+ dst->xm_lastEB = src->xm_lastEB;
+ dst->xm_lastX1 = src->xm_lastX1;
+ dst->xm_lastX2 = src->xm_lastX2;
- dst->lastvolslide = src->lastvolslide;
- dst->lastDKL = src->lastDKL;
- dst->lastEF = src->lastEF;
- dst->lastG = src->lastG;
- dst->lastHspeed = src->lastHspeed;
- dst->lastHdepth = src->lastHdepth;
- dst->lastRspeed = src->lastRspeed;
- dst->lastRdepth = src->lastRdepth;
- dst->lastYspeed = src->lastYspeed;
- dst->lastYdepth = src->lastYdepth;
- dst->lastI = src->lastI;
- dst->lastJ = src->lastJ;
- dst->lastN = src->lastN;
- dst->lastO = src->lastO;
- dst->high_offset = src->high_offset;
- dst->lastP = src->lastP;
- dst->lastQ = src->lastQ;
- dst->lastS = src->lastS;
- dst->pat_loop_row = src->pat_loop_row;
- dst->pat_loop_count = src->pat_loop_count;
- dst->pat_loop_end_row = src->pat_loop_end_row;
- dst->lastW = src->lastW;
+ dst->inv_loop_delay = src->inv_loop_delay;
+ dst->inv_loop_speed = src->inv_loop_speed;
+ dst->inv_loop_offset = src->inv_loop_offset;
- dst->xm_lastE1 = src->xm_lastE1;
- dst->xm_lastE2 = src->xm_lastE2;
- dst->xm_lastEA = src->xm_lastEA;
- dst->xm_lastEB = src->xm_lastEB;
- dst->xm_lastX1 = src->xm_lastX1;
- dst->xm_lastX2 = src->xm_lastX2;
+ dst->playing = dup_playing(src->playing, dst, src);
- dst->inv_loop_delay = src->inv_loop_delay;
- dst->inv_loop_speed = src->inv_loop_speed;
- dst->inv_loop_offset = src->inv_loop_offset;
-
- dst->playing = dup_playing(src->playing, dst, src);
-
#ifdef BIT_ARRAY_BULLSHIT
- dst->played_patjump = bit_array_dup(src->played_patjump);
- dst->played_patjump_order = src->played_patjump_order;
+ dst->played_patjump = bit_array_dup(src->played_patjump);
+ dst->played_patjump_order = src->played_patjump_order;
#endif
- //dst->output = src->output;
+ // dst->output = src->output;
}
-
-
/* Allocate the new callbacks first, then pass them to this function!
* It will free them on failure.
*/
-static DUMB_IT_SIGRENDERER *dup_sigrenderer(DUMB_IT_SIGRENDERER *src, int n_channels, IT_CALLBACKS *callbacks)
-{
- DUMB_IT_SIGRENDERER *dst;
- int i;
+static DUMB_IT_SIGRENDERER *dup_sigrenderer(DUMB_IT_SIGRENDERER *src,
+ int n_channels,
+ IT_CALLBACKS *callbacks) {
+ DUMB_IT_SIGRENDERER *dst;
+ int i;
- if (!src) {
- if (callbacks) free(callbacks);
- return NULL;
- }
+ if (!src) {
+ if (callbacks)
+ free(callbacks);
+ return NULL;
+ }
- dst = malloc(sizeof(*dst));
- if (!dst) {
- if (callbacks) free(callbacks);
- return NULL;
- }
+ dst = malloc(sizeof(*dst));
+ if (!dst) {
+ if (callbacks)
+ free(callbacks);
+ return NULL;
+ }
- dst->sigdata = src->sigdata;
+ dst->sigdata = src->sigdata;
- dst->n_channels = n_channels;
+ dst->n_channels = n_channels;
- dst->resampling_quality = src->resampling_quality;
+ dst->resampling_quality = src->resampling_quality;
- dst->globalvolume = src->globalvolume;
- dst->globalvolslide = src->globalvolslide;
+ dst->globalvolume = src->globalvolume;
+ dst->globalvolslide = src->globalvolslide;
- dst->tempo = src->tempo;
- dst->temposlide = src->temposlide;
+ dst->tempo = src->tempo;
+ dst->temposlide = src->temposlide;
- for (i = 0; i < DUMB_IT_N_CHANNELS; i++)
- dup_channel(&dst->channel[i], &src->channel[i]);
+ for (i = 0; i < DUMB_IT_N_CHANNELS; i++)
+ dup_channel(&dst->channel[i], &src->channel[i]);
- for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++)
- dst->playing[i] = dup_playing(src->playing[i], dst->channel, src->channel);
+ for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++)
+ dst->playing[i] =
+ dup_playing(src->playing[i], dst->channel, src->channel);
- dst->tick = src->tick;
- dst->speed = src->speed;
- dst->rowcount = src->rowcount;
+ dst->tick = src->tick;
+ dst->speed = src->speed;
+ dst->rowcount = src->rowcount;
- dst->order = src->order;
- dst->row = src->row;
- dst->processorder = src->processorder;
- dst->processrow = src->processrow;
- dst->breakrow = src->breakrow;
+ dst->order = src->order;
+ dst->row = src->row;
+ dst->processorder = src->processorder;
+ dst->processrow = src->processrow;
+ dst->breakrow = src->breakrow;
- dst->restart_position = src->restart_position;
+ dst->restart_position = src->restart_position;
- dst->n_rows = src->n_rows;
+ dst->n_rows = src->n_rows;
- dst->entry_start = src->entry_start;
- dst->entry = src->entry;
- dst->entry_end = src->entry_end;
+ dst->entry_start = src->entry_start;
+ dst->entry = src->entry;
+ dst->entry_end = src->entry_end;
- dst->time_left = src->time_left;
- dst->sub_time_left = src->sub_time_left;
+ dst->time_left = src->time_left;
+ dst->sub_time_left = src->sub_time_left;
- dst->ramp_style = src->ramp_style;
+ dst->ramp_style = src->ramp_style;
- dst->click_remover = NULL;
+ dst->click_remover = NULL;
- dst->callbacks = callbacks;
+ dst->callbacks = callbacks;
#ifdef BIT_ARRAY_BULLSHIT
- dst->played = bit_array_dup(src->played);
+ dst->played = bit_array_dup(src->played);
- dst->looped = src->looped;
- dst->time_played = src->time_played;
- dst->row_timekeeper = timekeeping_array_dup(src->row_timekeeper);
+ dst->looped = src->looped;
+ dst->time_played = src->time_played;
+ dst->row_timekeeper = timekeeping_array_dup(src->row_timekeeper);
#endif
- dst->gvz_time = src->gvz_time;
- dst->gvz_sub_time = src->gvz_sub_time;
+ dst->gvz_time = src->gvz_time;
+ dst->gvz_sub_time = src->gvz_sub_time;
- //dst->max_output = src->max_output;
+ // dst->max_output = src->max_output;
- return dst;
+ return dst;
}
-
-
static const IT_MIDI default_midi = {
- /* unsigned char SFmacro[16][16]; */
- {
- {0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
- },
- /* unsigned char SFmacrolen[16]; */
- {4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
- /* unsigned short SFmacroz[16]; */
- /* Bitfield; bit 0 set = z in first position */
- {
- 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
- },
- /* unsigned char Zmacro[128][16]; */
- {
- {0xF0, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0xF0, 0xF0, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0xF0, 0xF0, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0xF0, 0xF0, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0xF0, 0xF0, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0xF0, 0xF0, 0x01, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0xF0, 0xF0, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0xF0, 0xF0, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0xF0, 0xF0, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0xF0, 0xF0, 0x01, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0xF0, 0xF0, 0x01, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0xF0, 0xF0, 0x01, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0xF0, 0xF0, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0xF0, 0xF0, 0x01, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0xF0, 0xF0, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0xF0, 0xF0, 0x01, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ /* unsigned char SFmacro[16][16]; */
+ {{0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00}},
+ /* unsigned char SFmacrolen[16]; */
+ {4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* unsigned short SFmacroz[16]; */
+ /* Bitfield; bit 0 set = z in first position */
+ {0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
+ /* unsigned char Zmacro[128][16]; */
+ {{0xF0, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0xF0, 0xF0, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0xF0, 0xF0, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0xF0, 0xF0, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0xF0, 0xF0, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0xF0, 0xF0, 0x01, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0xF0, 0xF0, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0xF0, 0xF0, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0xF0, 0xF0, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0xF0, 0xF0, 0x01, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0xF0, 0xF0, 0x01, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0xF0, 0xF0, 0x01, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0xF0, 0xF0, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0xF0, 0xF0, 0x01, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0xF0, 0xF0, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0xF0, 0xF0, 0x01, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
- },
- /* unsigned char Zmacrolen[128]; */
- {
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- }
-};
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00}},
+ /* unsigned char Zmacrolen[128]; */
+ {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
-
-
-static void it_reset_filter_state(IT_FILTER_STATE *state)
-{
- state->currsample = 0;
- state->prevsample = 0;
+static void it_reset_filter_state(IT_FILTER_STATE *state) {
+ state->currsample = 0;
+ state->prevsample = 0;
}
-
-
#define LOG10 2.30258509299
/* IMPORTANT: This function expects one extra sample in 'src' so it can apply
@@ -559,227 +687,259 @@
* click removal right.
*/
-static void it_filter_int(DUMB_CLICK_REMOVER *cr, IT_FILTER_STATE *state, sample_t *dst, long pos, sample_t *src, long size, int step, int sampfreq, int cutoff, int resonance)
-{
- sample_t currsample = state->currsample;
- sample_t prevsample = state->prevsample;
+static void it_filter_int(DUMB_CLICK_REMOVER *cr, IT_FILTER_STATE *state,
+ sample_t *dst, long pos, sample_t *src, long size,
+ int step, int sampfreq, int cutoff, int resonance) {
+ sample_t currsample = state->currsample;
+ sample_t prevsample = state->prevsample;
- float a, b, c;
+ float a, b, c;
- long datasize;
+ long datasize;
- {
- float inv_angle = (float)(sampfreq * pow(0.5, 0.25 + cutoff*(1.0/(24<<IT_ENVELOPE_SHIFT))) * (1.0/(2*3.14159265358979323846*110.0)));
- float loss = (float)exp(resonance*(-LOG10*1.2/128.0));
- float d, e;
+ {
+ float inv_angle =
+ (float)(sampfreq *
+ pow(0.5,
+ 0.25 + cutoff * (1.0 / (24 << IT_ENVELOPE_SHIFT))) *
+ (1.0 / (2 * 3.14159265358979323846 * 110.0)));
+ float loss = (float)exp(resonance * (-LOG10 * 1.2 / 128.0));
+ float d, e;
#if 0
loss *= 2; // This is the mistake most players seem to make!
#endif
#if 1
- d = (1.0f - loss) / inv_angle;
- if (d > 2.0f) d = 2.0f;
- d = (loss - d) * inv_angle;
- e = inv_angle * inv_angle;
- a = 1.0f / (1.0f + d + e);
- c = -e * a;
- b = 1.0f - a - c;
+ d = (1.0f - loss) / inv_angle;
+ if (d > 2.0f)
+ d = 2.0f;
+ d = (loss - d) * inv_angle;
+ e = inv_angle * inv_angle;
+ a = 1.0f / (1.0f + d + e);
+ c = -e * a;
+ b = 1.0f - a - c;
#else
- a = 1.0f / (inv_angle*inv_angle + inv_angle*loss + loss);
- c = -(inv_angle*inv_angle) * a;
- b = 1.0f - a - c;
+ a = 1.0f / (inv_angle * inv_angle + inv_angle * loss + loss);
+ c = -(inv_angle * inv_angle) * a;
+ b = 1.0f - a - c;
#endif
- }
+ }
- dst += pos * step;
- datasize = size * step;
+ dst += pos * step;
+ datasize = size * step;
#define INT_FILTERS
#ifdef INT_FILTERS
#define MULSCA(a, b) ((int)((LONG_LONG)((a) << 4) * (b) >> 32))
#define SCALEB 12
- {
- int ai = (int)(a * (1 << (16+SCALEB)));
- int bi = (int)(b * (1 << (16+SCALEB)));
- int ci = (int)(c * (1 << (16+SCALEB)));
- int i;
+ {
+ int ai = (int)(a * (1 << (16 + SCALEB)));
+ int bi = (int)(b * (1 << (16 + SCALEB)));
+ int ci = (int)(c * (1 << (16 + SCALEB)));
+ int i;
- if (cr) {
- sample_t startstep = MULSCA(src[0], ai) + MULSCA(currsample, bi) + MULSCA(prevsample, ci);
- dumb_record_click(cr, pos, startstep);
- }
+ if (cr) {
+ sample_t startstep = MULSCA(src[0], ai) + MULSCA(currsample, bi) +
+ MULSCA(prevsample, ci);
+ dumb_record_click(cr, pos, startstep);
+ }
- for (i = 0; i < datasize; i += step) {
- {
- sample_t newsample = MULSCA(src[i], ai) + MULSCA(currsample, bi) + MULSCA(prevsample, ci);
- prevsample = currsample;
- currsample = newsample;
- }
- dst[i] += currsample;
- }
+ for (i = 0; i < datasize; i += step) {
+ {
+ sample_t newsample = MULSCA(src[i], ai) +
+ MULSCA(currsample, bi) +
+ MULSCA(prevsample, ci);
+ prevsample = currsample;
+ currsample = newsample;
+ }
+ dst[i] += currsample;
+ }
- if (cr) {
- sample_t endstep = MULSCA(src[datasize], ai) + MULSCA(currsample, bi) + MULSCA(prevsample, ci);
- dumb_record_click(cr, pos + size, -endstep);
- }
- }
+ if (cr) {
+ sample_t endstep = MULSCA(src[datasize], ai) +
+ MULSCA(currsample, bi) + MULSCA(prevsample, ci);
+ dumb_record_click(cr, pos + size, -endstep);
+ }
+ }
#else
#error This version is broken - it does not use step, and state should contain floats for it
- if (cr) {
- float startstep = src[0]*a + currsample*b + prevsample*c;
- dumb_record_click(cr, pos, (sample_t)startstep);
- }
+ if (cr) {
+ float startstep = src[0] * a + currsample * b + prevsample * c;
+ dumb_record_click(cr, pos, (sample_t)startstep);
+ }
- {
- int i = size % 3;
- while (i > 0) {
- {
- float newsample = *src++*a + currsample*b + prevsample*c;
- prevsample = currsample;
- currsample = newsample;
- }
- *dst++ += (sample_t)currsample;
- i--;
- }
- i = size / 3;
- while (i > 0) {
- float newsample;
- /* Gotta love unrolled loops! */
- *dst++ += (sample_t)(newsample = *src++*a + currsample*b + prevsample*c);
- *dst++ += (sample_t)(prevsample = *src++*a + newsample*b + currsample*c);
- *dst++ += (sample_t)(currsample = *src++*a + prevsample*b + newsample*c);
- i--;
- }
- }
+ {
+ int i = size % 3;
+ while (i > 0) {
+ {
+ float newsample = *src++ * a + currsample * b + prevsample * c;
+ prevsample = currsample;
+ currsample = newsample;
+ }
+ *dst++ += (sample_t)currsample;
+ i--;
+ }
+ i = size / 3;
+ while (i > 0) {
+ float newsample;
+ /* Gotta love unrolled loops! */
+ *dst++ += (sample_t)(newsample = *src++ * a + currsample * b +
+ prevsample * c);
+ *dst++ += (sample_t)(prevsample = *src++ * a + newsample * b +
+ currsample * c);
+ *dst++ += (sample_t)(currsample = *src++ * a + prevsample * b +
+ newsample * c);
+ i--;
+ }
+ }
- if (cr) {
- float endstep = src[datasize]*a + currsample*b + prevsample*c;
- dumb_record_click(cr, pos + size, -(sample_t)endstep);
- }
+ if (cr) {
+ float endstep = src[datasize] * a + currsample * b + prevsample * c;
+ dumb_record_click(cr, pos + size, -(sample_t)endstep);
+ }
#endif
- state->currsample = currsample;
- state->prevsample = prevsample;
+ state->currsample = currsample;
+ state->prevsample = prevsample;
}
-#if defined(_USE_SSE) && (defined(_M_IX86) || defined(__i386__) || defined(_M_X64) || defined(__amd64__))
+#if defined(_USE_SSE) && (defined(_M_IX86) || defined(__i386__) || \
+ defined(_M_X64) || defined(__amd64__))
#include <xmmintrin.h>
-static void it_filter_sse(DUMB_CLICK_REMOVER *cr, IT_FILTER_STATE *state, sample_t *dst, long pos, sample_t *src, long size, int step, int sampfreq, int cutoff, int resonance)
-{
- __m128 data, impulse;
- __m128 temp1, temp2;
+static void it_filter_sse(DUMB_CLICK_REMOVER *cr, IT_FILTER_STATE *state,
+ sample_t *dst, long pos, sample_t *src, long size,
+ int step, int sampfreq, int cutoff, int resonance) {
+ __m128 data, impulse;
+ __m128 temp1, temp2;
- sample_t currsample = state->currsample;
- sample_t prevsample = state->prevsample;
+ sample_t currsample = state->currsample;
+ sample_t prevsample = state->prevsample;
- float imp[4];
+ float imp[4];
- //profiler( filter_sse ); On ClawHammer Athlon64 3200+, ~12000 cycles, ~500 for that x87 setup code (as opposed to ~25500 for the original integer code)
+ // profiler( filter_sse ); On ClawHammer Athlon64 3200+, ~12000 cycles, ~500
+ // for that x87 setup code (as opposed to ~25500 for the original integer
+ // code)
- long datasize;
+ long datasize;
- {
- float inv_angle = (float)(sampfreq * pow(0.5, 0.25 + cutoff*(1.0/(24<<IT_ENVELOPE_SHIFT))) * (1.0/(2*3.14159265358979323846*110.0)));
- float loss = (float)exp(resonance*(-LOG10*1.2/128.0));
- float d, e;
+ {
+ float inv_angle =
+ (float)(sampfreq *
+ pow(0.5,
+ 0.25 + cutoff * (1.0 / (24 << IT_ENVELOPE_SHIFT))) *
+ (1.0 / (2 * 3.14159265358979323846 * 110.0)));
+ float loss = (float)exp(resonance * (-LOG10 * 1.2 / 128.0));
+ float d, e;
#if 0
loss *= 2; // This is the mistake most players seem to make!
#endif
#if 1
- d = (1.0f - loss) / inv_angle;
- if (d > 2.0f) d = 2.0f;
- d = (loss - d) * inv_angle;
- e = inv_angle * inv_angle;
- imp[0] = 1.0f / (1.0f + d + e);
- imp[2] = -e * imp[0];
- imp[1] = 1.0f - imp[0] - imp[2];
+ d = (1.0f - loss) / inv_angle;
+ if (d > 2.0f)
+ d = 2.0f;
+ d = (loss - d) * inv_angle;
+ e = inv_angle * inv_angle;
+ imp[0] = 1.0f / (1.0f + d + e);
+ imp[2] = -e * imp[0];
+ imp[1] = 1.0f - imp[0] - imp[2];
#else
- imp[0] = 1.0f / (inv_angle*inv_angle + inv_angle*loss + loss);
- imp[2] = -(inv_angle*inv_angle) * imp[0];
- imp[1] = 1.0f - imp[0] - imp[2];
+ imp[0] = 1.0f / (inv_angle * inv_angle + inv_angle * loss + loss);
+ imp[2] = -(inv_angle * inv_angle) * imp[0];
+ imp[1] = 1.0f - imp[0] - imp[2];
#endif
- imp[3] = 0.0f;
- }
+ imp[3] = 0.0f;
+ }
- dst += pos * step;
- datasize = size * step;
+ dst += pos * step;
+ datasize = size * step;
- {
- int ai, bi, ci, i;
+ {
+ int ai, bi, ci, i;
- if (cr) {
- sample_t startstep;
- ai = (int)(imp[0] * (1 << (16+SCALEB)));
- bi = (int)(imp[1] * (1 << (16+SCALEB)));
- ci = (int)(imp[2] * (1 << (16+SCALEB)));
- startstep = MULSCA(src[0], ai) + MULSCA(currsample, bi) + MULSCA(prevsample, ci);
- dumb_record_click(cr, pos, startstep);
- }
+ if (cr) {
+ sample_t startstep;
+ ai = (int)(imp[0] * (1 << (16 + SCALEB)));
+ bi = (int)(imp[1] * (1 << (16 + SCALEB)));
+ ci = (int)(imp[2] * (1 << (16 + SCALEB)));
+ startstep = MULSCA(src[0], ai) + MULSCA(currsample, bi) +
+ MULSCA(prevsample, ci);
+ dumb_record_click(cr, pos, startstep);
+ }
- temp1 = _mm_setzero_ps();
- data = _mm_cvtsi32_ss( temp1, currsample );
- temp2 = _mm_cvtsi32_ss( temp1, prevsample );
- impulse = _mm_loadu_ps( (const float *) &imp );
- data = _mm_shuffle_ps( data, temp2, _MM_SHUFFLE(1, 0, 0, 1) );
+ temp1 = _mm_setzero_ps();
+ data = _mm_cvtsi32_ss(temp1, currsample);
+ temp2 = _mm_cvtsi32_ss(temp1, prevsample);
+ impulse = _mm_loadu_ps((const float *)&imp);
+ data = _mm_shuffle_ps(data, temp2, _MM_SHUFFLE(1, 0, 0, 1));
- for (i = 0; i < datasize; i += step) {
- temp1 = _mm_cvtsi32_ss( data, src [i] );
- temp1 = _mm_mul_ps( temp1, impulse );
- temp2 = _mm_movehl_ps( temp2, temp1 );
- temp1 = _mm_add_ps( temp1, temp2 );
- temp2 = temp1;
- temp2 = _mm_shuffle_ps( temp2, temp1, _MM_SHUFFLE(0, 0, 0, 1) );
- temp1 = _mm_add_ps( temp1, temp2 );
- temp1 = _mm_shuffle_ps( temp1, data, _MM_SHUFFLE(2, 1, 0, 0) );
- data = temp1;
- dst [i] += _mm_cvtss_si32( temp1 );
- }
+ for (i = 0; i < datasize; i += step) {
+ temp1 = _mm_cvtsi32_ss(data, src[i]);
+ temp1 = _mm_mul_ps(temp1, impulse);
+ temp2 = _mm_movehl_ps(temp2, temp1);
+ temp1 = _mm_add_ps(temp1, temp2);
+ temp2 = temp1;
+ temp2 = _mm_shuffle_ps(temp2, temp1, _MM_SHUFFLE(0, 0, 0, 1));
+ temp1 = _mm_add_ps(temp1, temp2);
+ temp1 = _mm_shuffle_ps(temp1, data, _MM_SHUFFLE(2, 1, 0, 0));
+ data = temp1;
+ dst[i] += _mm_cvtss_si32(temp1);
+ }
- currsample = _mm_cvtss_si32( temp1 );
- temp1 = _mm_shuffle_ps( temp1, data, _MM_SHUFFLE(0, 0, 0, 2) );
- prevsample = _mm_cvtss_si32( temp1 );
+ currsample = _mm_cvtss_si32(temp1);
+ temp1 = _mm_shuffle_ps(temp1, data, _MM_SHUFFLE(0, 0, 0, 2));
+ prevsample = _mm_cvtss_si32(temp1);
- if (cr) {
- sample_t endstep = MULSCA(src[datasize], ai) + MULSCA(currsample, bi) + MULSCA(prevsample, ci);
- dumb_record_click(cr, pos + size, -endstep);
- }
- }
+ if (cr) {
+ sample_t endstep = MULSCA(src[datasize], ai) +
+ MULSCA(currsample, bi) + MULSCA(prevsample, ci);
+ dumb_record_click(cr, pos + size, -endstep);
+ }
+ }
- state->currsample = currsample;
- state->prevsample = prevsample;
+ state->currsample = currsample;
+ state->prevsample = prevsample;
}
#endif
#ifdef FILTER_NEON
-static void it_filter_neon(DUMB_CLICK_REMOVER *cr, IT_FILTER_STATE *state, sample_t *dst, long pos, sample_t *src, long size, int step, int sampfreq, int cutoff, int resonance)
-{
+static void it_filter_neon(DUMB_CLICK_REMOVER *cr, IT_FILTER_STATE *state,
+ sample_t *dst, long pos, sample_t *src, long size,
+ int step, int sampfreq, int cutoff, int resonance) {
float32x4_t data, impulse;
float32x4_t temp1;
float32x2_t temp2;
float32_t temp3;
-
+
sample_t currsample = state->currsample;
sample_t prevsample = state->prevsample;
-
+
float imp[4];
-
- //profiler( filter_sse ); On ClawHammer Athlon64 3200+, ~12000 cycles, ~500 for that x87 setup code (as opposed to ~25500 for the original integer code)
-
+
+ // profiler( filter_sse ); On ClawHammer Athlon64 3200+, ~12000 cycles, ~500
+ // for that x87 setup code (as opposed to ~25500 for the original integer
+ // code)
+
long datasize;
-
+
{
- float inv_angle = (float)(sampfreq * pow(0.5, 0.25 + cutoff*(1.0/(24<<IT_ENVELOPE_SHIFT))) * (1.0/(2*3.14159265358979323846*110.0)));
- float loss = (float)exp(resonance*(-LOG10*1.2/128.0));
+ float inv_angle =
+ (float)(sampfreq *
+ pow(0.5,
+ 0.25 + cutoff * (1.0 / (24 << IT_ENVELOPE_SHIFT))) *
+ (1.0 / (2 * 3.14159265358979323846 * 110.0)));
+ float loss = (float)exp(resonance * (-LOG10 * 1.2 / 128.0));
float d, e;
#if 0
loss *= 2; // This is the mistake most players seem to make!
#endif
-
+
#if 1
d = (1.0f - loss) / inv_angle;
- if (d > 2.0f) d = 2.0f;
+ if (d > 2.0f)
+ d = 2.0f;
d = (loss - d) * inv_angle;
e = inv_angle * inv_angle;
imp[0] = 1.0f / (1.0f + d + e);
@@ -786,52 +946,54 @@
imp[2] = -e * imp[0];
imp[1] = 1.0f - imp[0] - imp[2];
#else
- imp[0] = 1.0f / (inv_angle*inv_angle + inv_angle*loss + loss);
- imp[2] = -(inv_angle*inv_angle) * imp[0];
+ imp[0] = 1.0f / (inv_angle * inv_angle + inv_angle * loss + loss);
+ imp[2] = -(inv_angle * inv_angle) * imp[0];
imp[1] = 1.0f - imp[0] - imp[2];
#endif
imp[3] = 0.0f;
}
-
+
dst += pos * step;
datasize = size * step;
-
+
{
int ai, bi, ci, i;
-
+
if (cr) {
sample_t startstep;
- ai = (int)(imp[0] * (1 << (16+SCALEB)));
- bi = (int)(imp[1] * (1 << (16+SCALEB)));
- ci = (int)(imp[2] * (1 << (16+SCALEB)));
- startstep = MULSCA(src[0], ai) + MULSCA(currsample, bi) + MULSCA(prevsample, ci);
+ ai = (int)(imp[0] * (1 << (16 + SCALEB)));
+ bi = (int)(imp[1] * (1 << (16 + SCALEB)));
+ ci = (int)(imp[2] * (1 << (16 + SCALEB)));
+ startstep = MULSCA(src[0], ai) + MULSCA(currsample, bi) +
+ MULSCA(prevsample, ci);
dumb_record_click(cr, pos, startstep);
}
-
+
data = vdupq_n_f32(0.0f);
- data = vsetq_lane_f32( currsample, data, 1 );
- data = vsetq_lane_f32( prevsample, data, 2 );
- impulse = vld1q_f32( (const float32_t *) &imp );
-
+ data = vsetq_lane_f32(currsample, data, 1);
+ data = vsetq_lane_f32(prevsample, data, 2);
+ impulse = vld1q_f32((const float32_t *)&imp);
+
for (i = 0; i < datasize; i += step) {
- data = vsetq_lane_f32( src [i], data, 0 );
+ data = vsetq_lane_f32(src[i], data, 0);
temp1 = vmulq_f32(data, impulse);
temp2 = vadd_f32(vget_high_f32(temp1), vget_low_f32(temp1));
temp3 = vget_lane_f32(vpadd_f32(temp2, temp2), 0);
data = vextq_f32(data, data, 3);
data = vsetq_lane_f32(temp3, data, 1);
- dst [i] += temp3;
+ dst[i] += temp3;
}
-
+
currsample = temp3;
prevsample = vgetq_lane_f32(data, 2);
-
+
if (cr) {
- sample_t endstep = MULSCA(src[datasize], ai) + MULSCA(currsample, bi) + MULSCA(prevsample, ci);
+ sample_t endstep = MULSCA(src[datasize], ai) +
+ MULSCA(currsample, bi) + MULSCA(prevsample, ci);
dumb_record_click(cr, pos + size, -endstep);
}
}
-
+
state->currsample = currsample;
state->prevsample = prevsample;
}
@@ -845,50 +1007,38 @@
#ifdef _MSC_VER
#include <intrin.h>
#elif defined(__clang__) || defined(__GNUC__)
-static inline void
-__cpuid(int *data, int selector)
-{
+static inline void __cpuid(int *data, int selector) {
#if defined(__PIC__) && defined(__i386__)
asm("xchgl %%ebx, %%esi; cpuid; xchgl %%ebx, %%esi"
- : "=a" (data[0]),
- "=S" (data[1]),
- "=c" (data[2]),
- "=d" (data[3])
- : "0" (selector));
+ : "=a"(data[0]), "=S"(data[1]), "=c"(data[2]), "=d"(data[3])
+ : "0"(selector));
#elif defined(__PIC__) && defined(__amd64__)
asm("xchg{q} {%%}rbx, %q1; cpuid; xchg{q} {%%}rbx, %q1"
- : "=a" (data[0]),
- "=&r" (data[1]),
- "=c" (data[2]),
- "=d" (data[3])
- : "0" (selector));
+ : "=a"(data[0]), "=&r"(data[1]), "=c"(data[2]), "=d"(data[3])
+ : "0"(selector));
#else
asm("cpuid"
- : "=a" (data[0]),
- "=b" (data[1]),
- "=c" (data[2]),
- "=d" (data[3])
+ : "=a"(data[0]), "=b"(data[1]), "=c"(data[2]), "=d"(data[3])
: "a"(selector));
#endif
}
#else
-#define __cpuid(a,b) memset((a), 0, sizeof(int) * 4)
+#define __cpuid(a, b) memset((a), 0, sizeof(int) * 4)
#endif
static int query_cpu_feature_sse() {
- int buffer[4];
- __cpuid(buffer,1);
- if ((buffer[3]&(1<<25)) == 0) return 0;
- return 1;
+ int buffer[4];
+ __cpuid(buffer, 1);
+ if ((buffer[3] & (1 << 25)) == 0)
+ return 0;
+ return 1;
}
static int _dumb_it_use_sse = 0;
-void _dumb_init_sse()
-{
+void _dumb_init_sse() {
static int initialized = 0;
- if (!initialized)
- {
+ if (!initialized) {
_dumb_it_use_sse = query_cpu_feature_sse();
initialized = 1;
}
@@ -898,54 +1048,57 @@
static const int _dumb_it_use_sse = 1;
-void _dumb_init_sse() { }
+void _dumb_init_sse() {}
#else
static const int _dumb_it_use_sse = 0;
-void _dumb_init_sse() { }
+void _dumb_init_sse() {}
#endif
#endif
-static void it_filter(DUMB_CLICK_REMOVER *cr, IT_FILTER_STATE *state, sample_t *dst, long pos, sample_t *src, long size, int step, int sampfreq, int cutoff, int resonance)
-{
-#if defined(_USE_SSE) && (defined(_M_IX86) || defined(__i386__) || defined(_M_X64) || defined(__amd64__))
+static void it_filter(DUMB_CLICK_REMOVER *cr, IT_FILTER_STATE *state,
+ sample_t *dst, long pos, sample_t *src, long size,
+ int step, int sampfreq, int cutoff, int resonance) {
+#if defined(_USE_SSE) && (defined(_M_IX86) || defined(__i386__) || \
+ defined(_M_X64) || defined(__amd64__))
_dumb_init_sse();
- if ( _dumb_it_use_sse ) it_filter_sse( cr, state, dst, pos, src, size, step, sampfreq, cutoff, resonance );
- else
+ if (_dumb_it_use_sse)
+ it_filter_sse(cr, state, dst, pos, src, size, step, sampfreq, cutoff,
+ resonance);
+ else
#endif
#ifdef FILTER_NEON
- it_filter_neon( cr, state, dst, pos, src, size, step, sampfreq, cutoff, resonance );
+ it_filter_neon(cr, state, dst, pos, src, size, step, sampfreq, cutoff,
+ resonance);
#else
- it_filter_int( cr, state, dst, pos, src, size, step, sampfreq, cutoff, resonance );
+ it_filter_int(cr, state, dst, pos, src, size, step, sampfreq, cutoff,
+ resonance);
#endif
}
-
-
static const signed char it_sine[256] = {
- 0, 2, 3, 5, 6, 8, 9, 11, 12, 14, 16, 17, 19, 20, 22, 23,
- 24, 26, 27, 29, 30, 32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44,
- 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59,
- 59, 60, 60, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 63, 63, 63, 62, 62, 62, 61, 61, 60, 60,
- 59, 59, 58, 57, 56, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46,
- 45, 44, 43, 42, 41, 39, 38, 37, 36, 34, 33, 32, 30, 29, 27, 26,
- 24, 23, 22, 20, 19, 17, 16, 14, 12, 11, 9, 8, 6, 5, 3, 2,
- 0, -2, -3, -5, -6, -8, -9,-11,-12,-14,-16,-17,-19,-20,-22,-23,
- -24,-26,-27,-29,-30,-32,-33,-34,-36,-37,-38,-39,-41,-42,-43,-44,
- -45,-46,-47,-48,-49,-50,-51,-52,-53,-54,-55,-56,-56,-57,-58,-59,
- -59,-60,-60,-61,-61,-62,-62,-62,-63,-63,-63,-64,-64,-64,-64,-64,
- -64,-64,-64,-64,-64,-64,-63,-63,-63,-62,-62,-62,-61,-61,-60,-60,
- -59,-59,-58,-57,-56,-56,-55,-54,-53,-52,-51,-50,-49,-48,-47,-46,
- -45,-44,-43,-42,-41,-39,-38,-37,-36,-34,-33,-32,-30,-29,-27,-26,
- -24,-23,-22,-20,-19,-17,-16,-14,-12,-11, -9, -8, -6, -5, -3, -2
-};
+ 0, 2, 3, 5, 6, 8, 9, 11, 12, 14, 16, 17, 19, 20, 22,
+ 23, 24, 26, 27, 29, 30, 32, 33, 34, 36, 37, 38, 39, 41, 42,
+ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56,
+ 57, 58, 59, 59, 60, 60, 61, 61, 62, 62, 62, 63, 63, 63, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 63, 63, 63, 62, 62,
+ 62, 61, 61, 60, 60, 59, 59, 58, 57, 56, 56, 55, 54, 53, 52,
+ 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 39, 38, 37, 36,
+ 34, 33, 32, 30, 29, 27, 26, 24, 23, 22, 20, 19, 17, 16, 14,
+ 12, 11, 9, 8, 6, 5, 3, 2, 0, -2, -3, -5, -6, -8, -9,
+ -11, -12, -14, -16, -17, -19, -20, -22, -23, -24, -26, -27, -29, -30, -32,
+ -33, -34, -36, -37, -38, -39, -41, -42, -43, -44, -45, -46, -47, -48, -49,
+ -50, -51, -52, -53, -54, -55, -56, -56, -57, -58, -59, -59, -60, -60, -61,
+ -61, -62, -62, -62, -63, -63, -63, -64, -64, -64, -64, -64, -64, -64, -64,
+ -64, -64, -64, -63, -63, -63, -62, -62, -62, -61, -61, -60, -60, -59, -59,
+ -58, -57, -56, -56, -55, -54, -53, -52, -51, -50, -49, -48, -47, -46, -45,
+ -44, -43, -42, -41, -39, -38, -37, -36, -34, -33, -32, -30, -29, -27, -26,
+ -24, -23, -22, -20, -19, -17, -16, -14, -12, -11, -9, -8, -6, -5, -3,
+ -2};
-
-
#if 1
/** WARNING: use these! */
/** JULIEN: Plus for XM compatibility it could be interesting to rename
@@ -957,991 +1110,1057 @@
*/
/** ENTHEH: IT also has the 'don't retrig' thingy :) */
static const signed char it_sawtooth[256] = {
- 64, 63, 63, 62, 62, 61, 61, 60, 60, 59, 59, 58, 58, 57, 57, 56,
- 56, 55, 55, 54, 54, 53, 53, 52, 52, 51, 51, 50, 50, 49, 49, 48,
- 48, 47, 47, 46, 46, 45, 45, 44, 44, 43, 43, 42, 42, 41, 41, 40,
- 40, 39, 39, 38, 38, 37, 37, 36, 36, 35, 35, 34, 34, 33, 33, 32,
- 32, 31, 31, 30, 30, 29, 29, 28, 28, 27, 27, 26, 26, 25, 25, 24,
- 24, 23, 23, 22, 22, 21, 21, 20, 20, 19, 19, 18, 18, 17, 17, 16,
- 16, 15, 15, 14, 14, 13, 13, 12, 12, 11, 11, 10, 10, 9, 9, 8,
- 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0,
- 0, -1, -1, -2, -2, -3, -3, -4, -4, -5, -5, -6, -6, -7, -7, -8,
- -8, -9, -9,-10,-10,-11,-11,-12,-12,-13,-13,-14,-14,-15,-15,-16,
- -16,-17,-17,-18,-18,-19,-19,-20,-20,-21,-21,-22,-22,-23,-23,-24,
- -24,-25,-25,-26,-26,-27,-27,-28,-28,-29,-29,-30,-30,-31,-31,-32,
- -32,-33,-33,-34,-34,-35,-35,-36,-36,-37,-37,-38,-38,-39,-39,-40,
- -40,-41,-41,-42,-42,-43,-43,-44,-44,-45,-45,-46,-46,-47,-47,-48,
- -48,-49,-49,-50,-50,-51,-51,-52,-52,-53,-53,-54,-54,-55,-55,-56,
- -56,-57,-57,-58,-58,-59,-59,-60,-60,-61,-61,-62,-62,-63,-63,-64
-};
+ 64, 63, 63, 62, 62, 61, 61, 60, 60, 59, 59, 58, 58, 57, 57,
+ 56, 56, 55, 55, 54, 54, 53, 53, 52, 52, 51, 51, 50, 50, 49,
+ 49, 48, 48, 47, 47, 46, 46, 45, 45, 44, 44, 43, 43, 42, 42,
+ 41, 41, 40, 40, 39, 39, 38, 38, 37, 37, 36, 36, 35, 35, 34,
+ 34, 33, 33, 32, 32, 31, 31, 30, 30, 29, 29, 28, 28, 27, 27,
+ 26, 26, 25, 25, 24, 24, 23, 23, 22, 22, 21, 21, 20, 20, 19,
+ 19, 18, 18, 17, 17, 16, 16, 15, 15, 14, 14, 13, 13, 12, 12,
+ 11, 11, 10, 10, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4,
+ 4, 3, 3, 2, 2, 1, 1, 0, 0, -1, -1, -2, -2, -3, -3,
+ -4, -4, -5, -5, -6, -6, -7, -7, -8, -8, -9, -9, -10, -10, -11,
+ -11, -12, -12, -13, -13, -14, -14, -15, -15, -16, -16, -17, -17, -18, -18,
+ -19, -19, -20, -20, -21, -21, -22, -22, -23, -23, -24, -24, -25, -25, -26,
+ -26, -27, -27, -28, -28, -29, -29, -30, -30, -31, -31, -32, -32, -33, -33,
+ -34, -34, -35, -35, -36, -36, -37, -37, -38, -38, -39, -39, -40, -40, -41,
+ -41, -42, -42, -43, -43, -44, -44, -45, -45, -46, -46, -47, -47, -48, -48,
+ -49, -49, -50, -50, -51, -51, -52, -52, -53, -53, -54, -54, -55, -55, -56,
+ -56, -57, -57, -58, -58, -59, -59, -60, -60, -61, -61, -62, -62, -63, -63,
+ -64};
static const signed char it_squarewave[256] = {
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0};
static const signed char it_xm_ramp[256] = {
- 0, -1, -1, -2, -2, -3, -3, -4, -4, -5, -5, -6, -6, -7, -7, -8,
- -8, -9, -9,-10,-10,-11,-11,-12,-12,-13,-13,-14,-14,-15,-15,-16,
- -16,-17,-17,-18,-18,-19,-19,-20,-20,-21,-21,-22,-22,-23,-23,-24,
- -24,-25,-25,-26,-26,-27,-27,-28,-28,-29,-29,-30,-30,-31,-31,-32,
- -32,-33,-33,-34,-34,-35,-35,-36,-36,-37,-37,-38,-38,-39,-39,-40,
- -40,-41,-41,-42,-42,-43,-43,-44,-44,-45,-45,-46,-46,-47,-47,-48,
- -48,-49,-49,-50,-50,-51,-51,-52,-52,-53,-53,-54,-54,-55,-55,-56,
- -56,-57,-57,-58,-58,-59,-59,-60,-60,-61,-61,-62,-62,-63,-63,-64,
- 64, 63, 63, 62, 62, 61, 61, 60, 60, 59, 59, 58, 58, 57, 57, 56,
- 56, 55, 55, 54, 54, 53, 53, 52, 52, 51, 51, 50, 50, 49, 49, 48,
- 48, 47, 47, 46, 46, 45, 45, 44, 44, 43, 43, 42, 42, 41, 41, 40,
- 40, 39, 39, 38, 38, 37, 37, 36, 36, 35, 35, 34, 34, 33, 33, 32,
- 32, 31, 31, 30, 30, 29, 29, 28, 28, 27, 27, 26, 26, 25, 25, 24,
- 24, 23, 23, 22, 22, 21, 21, 20, 20, 19, 19, 18, 18, 17, 17, 16,
- 16, 15, 15, 14, 14, 13, 13, 12, 12, 11, 11, 10, 10, 9, 9, 8,
- 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0
-};
+ 0, -1, -1, -2, -2, -3, -3, -4, -4, -5, -5, -6, -6, -7, -7,
+ -8, -8, -9, -9, -10, -10, -11, -11, -12, -12, -13, -13, -14, -14, -15,
+ -15, -16, -16, -17, -17, -18, -18, -19, -19, -20, -20, -21, -21, -22, -22,
+ -23, -23, -24, -24, -25, -25, -26, -26, -27, -27, -28, -28, -29, -29, -30,
+ -30, -31, -31, -32, -32, -33, -33, -34, -34, -35, -35, -36, -36, -37, -37,
+ -38, -38, -39, -39, -40, -40, -41, -41, -42, -42, -43, -43, -44, -44, -45,
+ -45, -46, -46, -47, -47, -48, -48, -49, -49, -50, -50, -51, -51, -52, -52,
+ -53, -53, -54, -54, -55, -55, -56, -56, -57, -57, -58, -58, -59, -59, -60,
+ -60, -61, -61, -62, -62, -63, -63, -64, 64, 63, 63, 62, 62, 61, 61,
+ 60, 60, 59, 59, 58, 58, 57, 57, 56, 56, 55, 55, 54, 54, 53,
+ 53, 52, 52, 51, 51, 50, 50, 49, 49, 48, 48, 47, 47, 46, 46,
+ 45, 45, 44, 44, 43, 43, 42, 42, 41, 41, 40, 40, 39, 39, 38,
+ 38, 37, 37, 36, 36, 35, 35, 34, 34, 33, 33, 32, 32, 31, 31,
+ 30, 30, 29, 29, 28, 28, 27, 27, 26, 26, 25, 25, 24, 24, 23,
+ 23, 22, 22, 21, 21, 20, 20, 19, 19, 18, 18, 17, 17, 16, 16,
+ 15, 15, 14, 14, 13, 13, 12, 12, 11, 11, 10, 10, 9, 9, 8,
+ 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1,
+ 0};
static const signed char it_xm_squarewave[256] = {
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- -64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,
- -64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,
- -64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,
- -64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,
- -64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,
- -64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,
- -64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,
- -64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64,-64
-};
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, -64, -64, -64, -64, -64, -64, -64,
+ -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64,
+ -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64,
+ -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64,
+ -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64,
+ -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64,
+ -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64,
+ -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64,
+ -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64,
+ -64};
#endif
+static void reset_tick_counts(DUMB_IT_SIGRENDERER *sigrenderer) {
+ int i;
-
-static void reset_tick_counts(DUMB_IT_SIGRENDERER *sigrenderer)
-{
- int i;
-
- for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
- IT_CHANNEL *channel = &sigrenderer->channel[i];
- channel->key_off_count = 0;
- channel->note_cut_count = 0;
- channel->note_delay_count = 0;
- }
+ for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
+ IT_CHANNEL *channel = &sigrenderer->channel[i];
+ channel->key_off_count = 0;
+ channel->note_cut_count = 0;
+ channel->note_delay_count = 0;
+ }
}
+static const unsigned char arpeggio_mod[32] = {0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1,
+ 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0,
+ 1, 2, 0, 1, 2, 0, 1, 2, 0, 1};
+static const unsigned char arpeggio_xm[32] = {0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1,
+ 2, 0, 1, 2, 0, 0, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2};
+static const unsigned char arpeggio_okt_3[32] = {
+ 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1,
+ 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0};
+static const unsigned char arpeggio_okt_4[32] = {
+ 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1,
+ 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1};
+static const unsigned char arpeggio_okt_5[32] = {
+ 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2,
+ 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2};
-
-static const unsigned char arpeggio_mod[32] = {0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1};
-static const unsigned char arpeggio_xm[32] = {0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2};
-static const unsigned char arpeggio_okt_3[32] = {1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0};
-static const unsigned char arpeggio_okt_4[32] = {0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1};
-static const unsigned char arpeggio_okt_5[32] = {2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2};
-
-
-
-static void reset_channel_effects(IT_CHANNEL *channel)
-{
- channel->volslide = 0;
- channel->xm_volslide = 0;
- channel->panslide = 0;
- channel->channelvolslide = 0;
- channel->arpeggio_table = (const unsigned char *) &arpeggio_mod;
- memset(channel->arpeggio_offsets, 0, sizeof(channel->arpeggio_offsets));
- channel->retrig = 0;
- if (channel->xm_retrig) {
- channel->xm_retrig = 0;
- channel->retrig_tick = 0;
- }
- channel->tremor_time &= 127;
- channel->portamento = 0;
- channel->toneporta = 0;
- if (channel->ptm_toneslide) {
- channel->ptm_last_toneslide = channel->ptm_toneslide;
- channel->last_toneslide_tick = channel->toneslide_tick;
- } else
- channel->ptm_last_toneslide = 0;
- channel->ptm_toneslide = 0;
- channel->toneslide_tick = 0;
- channel->okt_toneslide = 0;
- if (channel->playing) {
- channel->playing->vibrato_n = 0;
- channel->playing->tremolo_speed = 0;
- channel->playing->tremolo_depth = 0;
- channel->playing->panbrello_speed = 0;
- }
+static void reset_channel_effects(IT_CHANNEL *channel) {
+ channel->volslide = 0;
+ channel->xm_volslide = 0;
+ channel->panslide = 0;
+ channel->channelvolslide = 0;
+ channel->arpeggio_table = (const unsigned char *)&arpeggio_mod;
+ memset(channel->arpeggio_offsets, 0, sizeof(channel->arpeggio_offsets));
+ channel->retrig = 0;
+ if (channel->xm_retrig) {
+ channel->xm_retrig = 0;
+ channel->retrig_tick = 0;
+ }
+ channel->tremor_time &= 127;
+ channel->portamento = 0;
+ channel->toneporta = 0;
+ if (channel->ptm_toneslide) {
+ channel->ptm_last_toneslide = channel->ptm_toneslide;
+ channel->last_toneslide_tick = channel->toneslide_tick;
+ } else
+ channel->ptm_last_toneslide = 0;
+ channel->ptm_toneslide = 0;
+ channel->toneslide_tick = 0;
+ channel->okt_toneslide = 0;
+ if (channel->playing) {
+ channel->playing->vibrato_n = 0;
+ channel->playing->tremolo_speed = 0;
+ channel->playing->tremolo_depth = 0;
+ channel->playing->panbrello_speed = 0;
+ }
}
-static void reset_effects(DUMB_IT_SIGRENDERER *sigrenderer)
-{
- int i;
+static void reset_effects(DUMB_IT_SIGRENDERER *sigrenderer) {
+ int i;
- sigrenderer->globalvolslide = 0;
- sigrenderer->temposlide = 0;
+ sigrenderer->globalvolslide = 0;
+ sigrenderer->temposlide = 0;
- for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
- reset_channel_effects(&sigrenderer->channel[i]);
- }
+ for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
+ reset_channel_effects(&sigrenderer->channel[i]);
+ }
}
-
-
-static void update_tremor(IT_CHANNEL *channel)
-{
- if ((channel->tremor_time & 128) && channel->playing) {
- if (channel->tremor_time == 128)
- channel->tremor_time = (channel->lastI >> 4) | 192;
- else if (channel->tremor_time == 192)
- channel->tremor_time = (channel->lastI & 15) | 128;
- else
- channel->tremor_time--;
- }
+static void update_tremor(IT_CHANNEL *channel) {
+ if ((channel->tremor_time & 128) && channel->playing) {
+ if (channel->tremor_time == 128)
+ channel->tremor_time = (channel->lastI >> 4) | 192;
+ else if (channel->tremor_time == 192)
+ channel->tremor_time = (channel->lastI & 15) | 128;
+ else
+ channel->tremor_time--;
+ }
}
-
-
-static void it_pickup_loop(DUMB_RESAMPLER *resampler, void *data)
-{
- resampler->pos -= resampler->end - resampler->start;
- ((IT_PLAYING *)data)->time_lost += resampler->end - resampler->start;
+static void it_pickup_loop(DUMB_RESAMPLER *resampler, void *data) {
+ resampler->pos -= resampler->end - resampler->start;
+ ((IT_PLAYING *)data)->time_lost += resampler->end - resampler->start;
}
-
-
-static void it_pickup_pingpong_loop(DUMB_RESAMPLER *resampler, void *data)
-{
- if (resampler->dir < 0) {
- resampler->pos = (resampler->start << 1) - 1 - resampler->pos;
- resampler->subpos ^= 65535;
- resampler->dir = 1;
- ((IT_PLAYING *)data)->time_lost += (resampler->end - resampler->start) << 1;
- } else {
- resampler->pos = (resampler->end << 1) - 1 - resampler->pos;
- resampler->subpos ^= 65535;
- resampler->dir = -1;
- }
+static void it_pickup_pingpong_loop(DUMB_RESAMPLER *resampler, void *data) {
+ if (resampler->dir < 0) {
+ resampler->pos = (resampler->start << 1) - 1 - resampler->pos;
+ resampler->subpos ^= 65535;
+ resampler->dir = 1;
+ ((IT_PLAYING *)data)->time_lost += (resampler->end - resampler->start)
+ << 1;
+ } else {
+ resampler->pos = (resampler->end << 1) - 1 - resampler->pos;
+ resampler->subpos ^= 65535;
+ resampler->dir = -1;
+ }
}
+static void it_pickup_stop_at_end(DUMB_RESAMPLER *resampler, void *data) {
+ (void)data;
-
-static void it_pickup_stop_at_end(DUMB_RESAMPLER *resampler, void *data)
-{
- (void)data;
-
- if (resampler->dir < 0) {
- resampler->pos = (resampler->start << 1) - 1 - resampler->pos;
- resampler->subpos ^= 65535;
- /* By rights, time_lost would be updated here. However, there is no
- * need at this point; it will not be used.
- *
- * ((IT_PLAYING *)data)->time_lost += (resampler->src_end - resampler->src_start) << 1;
- */
- resampler->dir = 1;
- } else
- resampler->dir = 0;
+ if (resampler->dir < 0) {
+ resampler->pos = (resampler->start << 1) - 1 - resampler->pos;
+ resampler->subpos ^= 65535;
+ /* By rights, time_lost would be updated here. However, there is no
+ * need at this point; it will not be used.
+ *
+ * ((IT_PLAYING *)data)->time_lost += (resampler->src_end -
+ * resampler->src_start) << 1;
+ */
+ resampler->dir = 1;
+ } else
+ resampler->dir = 0;
}
+static void it_pickup_stop_after_reverse(DUMB_RESAMPLER *resampler,
+ void *data) {
+ (void)data;
-
-static void it_pickup_stop_after_reverse(DUMB_RESAMPLER *resampler, void *data)
-{
- (void)data;
-
- resampler->dir = 0;
+ resampler->dir = 0;
}
-
-
-static void it_playing_update_resamplers(IT_PLAYING *playing)
-{
- if ((playing->sample->flags & IT_SAMPLE_SUS_LOOP) && !(playing->flags & IT_PLAYING_SUSTAINOFF)) {
- playing->resampler.start = playing->sample->sus_loop_start;
- playing->resampler.end = playing->sample->sus_loop_end;
- if (playing->resampler.start == playing->resampler.end)
- playing->resampler.pickup = &it_pickup_stop_at_end;
- else if (playing->sample->flags & IT_SAMPLE_PINGPONG_SUS_LOOP)
- playing->resampler.pickup = &it_pickup_pingpong_loop;
- else
- playing->resampler.pickup = &it_pickup_loop;
- } else if (playing->sample->flags & IT_SAMPLE_LOOP) {
- playing->resampler.start = playing->sample->loop_start;
- playing->resampler.end = playing->sample->loop_end;
- if (playing->resampler.start == playing->resampler.end)
- playing->resampler.pickup = &it_pickup_stop_at_end;
- else if (playing->sample->flags & IT_SAMPLE_PINGPONG_LOOP)
- playing->resampler.pickup = &it_pickup_pingpong_loop;
- else
- playing->resampler.pickup = &it_pickup_loop;
- } else if (playing->flags & IT_PLAYING_REVERSE) {
- playing->resampler.start = 0;
- playing->resampler.end = playing->sample->length;
- playing->resampler.dir = -1;
- playing->resampler.pickup = &it_pickup_stop_after_reverse;
- } else {
- if (playing->sample->flags & IT_SAMPLE_SUS_LOOP)
- playing->resampler.start = playing->sample->sus_loop_start;
- else
- playing->resampler.start = 0;
- playing->resampler.end = playing->sample->length;
- playing->resampler.pickup = &it_pickup_stop_at_end;
- }
- ASSERT(playing->resampler.pickup_data == playing);
+static void it_playing_update_resamplers(IT_PLAYING *playing) {
+ if ((playing->sample->flags & IT_SAMPLE_SUS_LOOP) &&
+ !(playing->flags & IT_PLAYING_SUSTAINOFF)) {
+ playing->resampler.start = playing->sample->sus_loop_start;
+ playing->resampler.end = playing->sample->sus_loop_end;
+ if (playing->resampler.start == playing->resampler.end)
+ playing->resampler.pickup = &it_pickup_stop_at_end;
+ else if (playing->sample->flags & IT_SAMPLE_PINGPONG_SUS_LOOP)
+ playing->resampler.pickup = &it_pickup_pingpong_loop;
+ else
+ playing->resampler.pickup = &it_pickup_loop;
+ } else if (playing->sample->flags & IT_SAMPLE_LOOP) {
+ playing->resampler.start = playing->sample->loop_start;
+ playing->resampler.end = playing->sample->loop_end;
+ if (playing->resampler.start == playing->resampler.end)
+ playing->resampler.pickup = &it_pickup_stop_at_end;
+ else if (playing->sample->flags & IT_SAMPLE_PINGPONG_LOOP)
+ playing->resampler.pickup = &it_pickup_pingpong_loop;
+ else
+ playing->resampler.pickup = &it_pickup_loop;
+ } else if (playing->flags & IT_PLAYING_REVERSE) {
+ playing->resampler.start = 0;
+ playing->resampler.end = playing->sample->length;
+ playing->resampler.dir = -1;
+ playing->resampler.pickup = &it_pickup_stop_after_reverse;
+ } else {
+ if (playing->sample->flags & IT_SAMPLE_SUS_LOOP)
+ playing->resampler.start = playing->sample->sus_loop_start;
+ else
+ playing->resampler.start = 0;
+ playing->resampler.end = playing->sample->length;
+ playing->resampler.pickup = &it_pickup_stop_at_end;
+ }
+ ASSERT(playing->resampler.pickup_data == playing);
}
-
-
/* This should be called whenever the sample or sample position changes. */
-static void it_playing_reset_resamplers(IT_PLAYING *playing, long pos)
-{
- int bits = playing->sample->flags & IT_SAMPLE_16BIT ? 16 : 8;
- int quality = playing->resampling_quality;
- int channels = playing->sample->flags & IT_SAMPLE_STEREO ? 2 : 1;
- if (playing->sample->max_resampling_quality >= 0 && quality > playing->sample->max_resampling_quality)
- quality = playing->sample->max_resampling_quality;
- dumb_reset_resampler_n(bits, &playing->resampler, playing->sample->data, channels, pos, 0, 0, quality);
- playing->resampler.pickup_data = playing;
- playing->time_lost = 0;
- playing->flags &= ~IT_PLAYING_DEAD;
- it_playing_update_resamplers(playing);
+static void it_playing_reset_resamplers(IT_PLAYING *playing, long pos) {
+ int bits = playing->sample->flags & IT_SAMPLE_16BIT ? 16 : 8;
+ int quality = playing->resampling_quality;
+ int channels = playing->sample->flags & IT_SAMPLE_STEREO ? 2 : 1;
+ if (playing->sample->max_resampling_quality >= 0 &&
+ quality > playing->sample->max_resampling_quality)
+ quality = playing->sample->max_resampling_quality;
+ dumb_reset_resampler_n(bits, &playing->resampler, playing->sample->data,
+ channels, pos, 0, 0, quality);
+ playing->resampler.pickup_data = playing;
+ playing->time_lost = 0;
+ playing->flags &= ~IT_PLAYING_DEAD;
+ it_playing_update_resamplers(playing);
}
-static void it_retrigger_note(DUMB_IT_SIGRENDERER *sigrenderer, IT_CHANNEL *channel);
+static void it_retrigger_note(DUMB_IT_SIGRENDERER *sigrenderer,
+ IT_CHANNEL *channel);
/* Should we only be retriggering short samples on XM? */
-static void update_retrig(DUMB_IT_SIGRENDERER *sigrenderer, IT_CHANNEL *channel)
-{
- if (channel->xm_retrig) {
- channel->retrig_tick--;
- if (channel->retrig_tick <= 0) {
- if (channel->playing) {
- it_playing_reset_resamplers(channel->playing, 0);
- channel->playing->declick_stage = 0;
- } else if (sigrenderer->sigdata->flags & IT_WAS_AN_XM) it_retrigger_note(sigrenderer, channel);
- channel->retrig_tick = channel->xm_retrig;
- }
- } else if (channel->retrig & 0x0F) {
- channel->retrig_tick--;
- if (channel->retrig_tick <= 0) {
- if (channel->retrig < 0x10) {
- } else if (channel->retrig < 0x20) {
- channel->volume--;
- if (channel->volume > 64) channel->volume = 0;
- } else if (channel->retrig < 0x30) {
- channel->volume -= 2;
- if (channel->volume > 64) channel->volume = 0;
- } else if (channel->retrig < 0x40) {
- channel->volume -= 4;
- if (channel->volume > 64) channel->volume = 0;
- } else if (channel->retrig < 0x50) {
- channel->volume -= 8;
- if (channel->volume > 64) channel->volume = 0;
- } else if (channel->retrig < 0x60) {
- channel->volume -= 16;
- if (channel->volume > 64) channel->volume = 0;
- } else if (channel->retrig < 0x70) {
- channel->volume <<= 1;
- channel->volume /= 3;
- } else if (channel->retrig < 0x80) {
- channel->volume >>= 1;
- } else if (channel->retrig < 0x90) {
- } else if (channel->retrig < 0xA0) {
- channel->volume++;
- if (channel->volume > 64) channel->volume = 64;
- } else if (channel->retrig < 0xB0) {
- channel->volume += 2;
- if (channel->volume > 64) channel->volume = 64;
- } else if (channel->retrig < 0xC0) {
- channel->volume += 4;
- if (channel->volume > 64) channel->volume = 64;
- } else if (channel->retrig < 0xD0) {
- channel->volume += 8;
- if (channel->volume > 64) channel->volume = 64;
- } else if (channel->retrig < 0xE0) {
- channel->volume += 16;
- if (channel->volume > 64) channel->volume = 64;
- } else if (channel->retrig < 0xF0) {
- channel->volume *= 3;
- channel->volume >>= 1;
- if (channel->volume > 64) channel->volume = 64;
- } else {
- channel->volume <<= 1;
- if (channel->volume > 64) channel->volume = 64;
- }
- if (channel->playing) {
- it_playing_reset_resamplers(channel->playing, 0);
- channel->playing->declick_stage = 0;
- } else if (sigrenderer->sigdata->flags & IT_WAS_AN_XM) it_retrigger_note(sigrenderer, channel);
- channel->retrig_tick = channel->retrig & 0x0F;
- }
- }
+static void update_retrig(DUMB_IT_SIGRENDERER *sigrenderer,
+ IT_CHANNEL *channel) {
+ if (channel->xm_retrig) {
+ channel->retrig_tick--;
+ if (channel->retrig_tick <= 0) {
+ if (channel->playing) {
+ it_playing_reset_resamplers(channel->playing, 0);
+ channel->playing->declick_stage = 0;
+ } else if (sigrenderer->sigdata->flags & IT_WAS_AN_XM)
+ it_retrigger_note(sigrenderer, channel);
+ channel->retrig_tick = channel->xm_retrig;
+ }
+ } else if (channel->retrig & 0x0F) {
+ channel->retrig_tick--;
+ if (channel->retrig_tick <= 0) {
+ if (channel->retrig < 0x10) {
+ } else if (channel->retrig < 0x20) {
+ channel->volume--;
+ if (channel->volume > 64)
+ channel->volume = 0;
+ } else if (channel->retrig < 0x30) {
+ channel->volume -= 2;
+ if (channel->volume > 64)
+ channel->volume = 0;
+ } else if (channel->retrig < 0x40) {
+ channel->volume -= 4;
+ if (channel->volume > 64)
+ channel->volume = 0;
+ } else if (channel->retrig < 0x50) {
+ channel->volume -= 8;
+ if (channel->volume > 64)
+ channel->volume = 0;
+ } else if (channel->retrig < 0x60) {
+ channel->volume -= 16;
+ if (channel->volume > 64)
+ channel->volume = 0;
+ } else if (channel->retrig < 0x70) {
+ channel->volume <<= 1;
+ channel->volume /= 3;
+ } else if (channel->retrig < 0x80) {
+ channel->volume >>= 1;
+ } else if (channel->retrig < 0x90) {
+ } else if (channel->retrig < 0xA0) {
+ channel->volume++;
+ if (channel->volume > 64)
+ channel->volume = 64;
+ } else if (channel->retrig < 0xB0) {
+ channel->volume += 2;
+ if (channel->volume > 64)
+ channel->volume = 64;
+ } else if (channel->retrig < 0xC0) {
+ channel->volume += 4;
+ if (channel->volume > 64)
+ channel->volume = 64;
+ } else if (channel->retrig < 0xD0) {
+ channel->volume += 8;
+ if (channel->volume > 64)
+ channel->volume = 64;
+ } else if (channel->retrig < 0xE0) {
+ channel->volume += 16;
+ if (channel->volume > 64)
+ channel->volume = 64;
+ } else if (channel->retrig < 0xF0) {
+ channel->volume *= 3;
+ channel->volume >>= 1;
+ if (channel->volume > 64)
+ channel->volume = 64;
+ } else {
+ channel->volume <<= 1;
+ if (channel->volume > 64)
+ channel->volume = 64;
+ }
+ if (channel->playing) {
+ it_playing_reset_resamplers(channel->playing, 0);
+ channel->playing->declick_stage = 0;
+ } else if (sigrenderer->sigdata->flags & IT_WAS_AN_XM)
+ it_retrigger_note(sigrenderer, channel);
+ channel->retrig_tick = channel->retrig & 0x0F;
+ }
+ }
}
-
-static void update_smooth_effects_playing(IT_PLAYING *playing)
-{
- playing->vibrato_time += playing->vibrato_n *
- (playing->vibrato_speed << 2);
- playing->tremolo_time += playing->tremolo_speed << 2;
- playing->panbrello_time += playing->panbrello_speed;
- if (playing->panbrello_waveform == 3)
- playing->panbrello_random = (rand() % 129) - 64;
+static void update_smooth_effects_playing(IT_PLAYING *playing) {
+ playing->vibrato_time += playing->vibrato_n * (playing->vibrato_speed << 2);
+ playing->tremolo_time += playing->tremolo_speed << 2;
+ playing->panbrello_time += playing->panbrello_speed;
+ if (playing->panbrello_waveform == 3)
+ playing->panbrello_random = (rand() % 129) - 64;
}
-static void update_smooth_effects(DUMB_IT_SIGRENDERER *sigrenderer)
-{
- int i;
+static void update_smooth_effects(DUMB_IT_SIGRENDERER *sigrenderer) {
+ int i;
- for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
- IT_CHANNEL *channel = &sigrenderer->channel[i];
- IT_PLAYING *playing = channel->playing;
+ for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
+ IT_CHANNEL *channel = &sigrenderer->channel[i];
+ IT_PLAYING *playing = channel->playing;
- if (playing) {
- update_smooth_effects_playing(playing);
- }
- }
+ if (playing) {
+ update_smooth_effects_playing(playing);
+ }
+ }
- for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
- IT_PLAYING *playing = sigrenderer->playing[i];
+ for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ IT_PLAYING *playing = sigrenderer->playing[i];
- if (playing) {
- update_smooth_effects_playing(playing);
- }
- }
+ if (playing) {
+ update_smooth_effects_playing(playing);
+ }
+ }
}
+static const unsigned char pt_tab_invloop[16] = {
+ 0x00, 0x05, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0D,
+ 0x0F, 0x13, 0x16, 0x1A, 0x20, 0x2B, 0x40, 0x80};
-static const unsigned char pt_tab_invloop[16] =
-{
- 0x00, 0x05, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0D,
- 0x0F, 0x13, 0x16, 0x1A, 0x20, 0x2B, 0x40, 0x80
-};
+static void update_invert_loop(IT_CHANNEL *channel, IT_SAMPLE *sample) {
+ channel->inv_loop_delay += pt_tab_invloop[channel->inv_loop_speed];
+ if (channel->inv_loop_delay >= 0x80) {
+ channel->inv_loop_delay = 0;
-static void update_invert_loop(IT_CHANNEL *channel, IT_SAMPLE *sample)
-{
- channel->inv_loop_delay += pt_tab_invloop[channel->inv_loop_speed];
- if (channel->inv_loop_delay >= 0x80)
- {
- channel->inv_loop_delay = 0;
+ if (sample &&
+ ((sample->flags & (IT_SAMPLE_EXISTS | IT_SAMPLE_LOOP)) ==
+ (IT_SAMPLE_EXISTS | IT_SAMPLE_LOOP)) &&
+ !(sample->flags & (IT_SAMPLE_STEREO | IT_SAMPLE_16BIT))) {
+ if (sample->loop_end - sample->loop_start >= 4) {
+ channel->inv_loop_offset++;
+ if (channel->inv_loop_offset >=
+ (sample->loop_end - sample->loop_start))
+ channel->inv_loop_offset = 0;
- if (sample && ((sample->flags & (IT_SAMPLE_EXISTS | IT_SAMPLE_LOOP)) == (IT_SAMPLE_EXISTS | IT_SAMPLE_LOOP)) && !(sample->flags & (IT_SAMPLE_STEREO | IT_SAMPLE_16BIT)))
- {
- if (sample->loop_end - sample->loop_start >= 4)
- {
- channel->inv_loop_offset++;
- if (channel->inv_loop_offset >= (sample->loop_end - sample->loop_start)) channel->inv_loop_offset = 0;
-
- ((char *)sample->data)[sample->loop_start + channel->inv_loop_offset] ^= 0xFF;
- }
- }
- }
+ ((char *)sample
+ ->data)[sample->loop_start + channel->inv_loop_offset] ^=
+ 0xFF;
+ }
+ }
+ }
}
+static void update_playing_effects(IT_PLAYING *playing) {
+ IT_CHANNEL *channel = playing->channel;
-static void update_playing_effects(IT_PLAYING *playing)
-{
- IT_CHANNEL *channel = playing->channel;
+ if (channel->channelvolslide) {
+ playing->channel_volume = channel->channelvolume;
+ }
- if (channel->channelvolslide) {
- playing->channel_volume = channel->channelvolume;
- }
-
- if (channel->okt_toneslide) {
- if (channel->okt_toneslide--) {
- playing->note += channel->toneslide;
- if (playing->note >= 120) {
- if (channel->toneslide < 0) playing->note = 0;
- else playing->note = 119;
- }
- }
- } else if (channel->ptm_toneslide) {
- if (--channel->toneslide_tick == 0) {
- channel->toneslide_tick = channel->ptm_toneslide;
- if (playing) {
- playing->note += channel->toneslide;
- if (playing->note >= 120) {
- if (channel->toneslide < 0) playing->note = 0;
- else playing->note = 119;
- }
- if (channel->playing == playing) {
- channel->note = channel->truenote = playing->note;
- }
- if (channel->toneslide_retrig) {
- it_playing_reset_resamplers(playing, 0);
- playing->declick_stage = 0;
- }
- }
- }
- }
-}
+ if (channel->okt_toneslide) {
+ if (channel->okt_toneslide--) {
+ playing->note += channel->toneslide;
+ if (playing->note >= 120) {
+ if (channel->toneslide < 0)
+ playing->note = 0;
+ else
+ playing->note = 119;
+ }
+ }
+ } else if (channel->ptm_toneslide) {
+ if (--channel->toneslide_tick == 0) {
+ channel->toneslide_tick = channel->ptm_toneslide;
+ if (playing) {
+ playing->note += channel->toneslide;
+ if (playing->note >= 120) {
+ if (channel->toneslide < 0)
+ playing->note = 0;
+ else
+ playing->note = 119;
+ }
+ if (channel->playing == playing) {
+ channel->note = channel->truenote = playing->note;
+ }
+ if (channel->toneslide_retrig) {
+ it_playing_reset_resamplers(playing, 0);
+ playing->declick_stage = 0;
+ }
+ }
+ }
+ }
+}
-
-static void update_effects(DUMB_IT_SIGRENDERER *sigrenderer)
-{
+static void update_effects(DUMB_IT_SIGRENDERER *sigrenderer) {
int i;
- if (sigrenderer->globalvolslide) {
- sigrenderer->globalvolume += sigrenderer->globalvolslide;
- if (sigrenderer->globalvolume > 128) {
- if (sigrenderer->globalvolslide >= 0)
- sigrenderer->globalvolume = 128;
- else
- sigrenderer->globalvolume = 0;
- }
- }
+ if (sigrenderer->globalvolslide) {
+ sigrenderer->globalvolume += sigrenderer->globalvolslide;
+ if (sigrenderer->globalvolume > 128) {
+ if (sigrenderer->globalvolslide >= 0)
+ sigrenderer->globalvolume = 128;
+ else
+ sigrenderer->globalvolume = 0;
+ }
+ }
- if (sigrenderer->temposlide) {
- sigrenderer->tempo += sigrenderer->temposlide;
- if (sigrenderer->tempo < 32) {
- if (sigrenderer->temposlide >= 0)
- sigrenderer->tempo = 255;
- else
- sigrenderer->tempo = 32;
- }
- }
+ if (sigrenderer->temposlide) {
+ sigrenderer->tempo += sigrenderer->temposlide;
+ if (sigrenderer->tempo < 32) {
+ if (sigrenderer->temposlide >= 0)
+ sigrenderer->tempo = 255;
+ else
+ sigrenderer->tempo = 32;
+ }
+ }
- for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
- IT_CHANNEL *channel = &sigrenderer->channel[i];
- IT_PLAYING *playing = channel->playing;
+ for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
+ IT_CHANNEL *channel = &sigrenderer->channel[i];
+ IT_PLAYING *playing = channel->playing;
- if (channel->xm_volslide) {
- channel->volume += channel->xm_volslide;
- if (channel->volume > 64) {
- if (channel->xm_volslide >= 0)
- channel->volume = 64;
- else
- channel->volume = 0;
- }
- }
+ if (channel->xm_volslide) {
+ channel->volume += channel->xm_volslide;
+ if (channel->volume > 64) {
+ if (channel->xm_volslide >= 0)
+ channel->volume = 64;
+ else
+ channel->volume = 0;
+ }
+ }
- if (channel->volslide) {
- int clip = (sigrenderer->sigdata->flags & IT_WAS_AN_S3M) ? 63 : 64;
- channel->volume += channel->volslide;
- if (channel->volume > clip) {
- if (channel->volslide >= 0)
- channel->volume = clip;
- else
- channel->volume = 0;
- }
- }
+ if (channel->volslide) {
+ int clip = (sigrenderer->sigdata->flags & IT_WAS_AN_S3M) ? 63 : 64;
+ channel->volume += channel->volslide;
+ if (channel->volume > clip) {
+ if (channel->volslide >= 0)
+ channel->volume = clip;
+ else
+ channel->volume = 0;
+ }
+ }
- if (channel->panslide) {
- if (sigrenderer->sigdata->flags & IT_WAS_AN_XM) {
- if (IT_IS_SURROUND(channel->pan))
- {
- channel->pan = 32;
- channel->truepan = 32 + 128 * 64;
- }
- if (channel->panslide == -128)
- channel->truepan = 32;
- else
- channel->truepan = MID(32, channel->truepan + channel->panslide*64, 32+255*64);
- } else {
- if (IT_IS_SURROUND(channel->pan))
- {
- channel->pan = 32;
- }
- channel->pan += channel->panslide;
- if (channel->pan > 64) {
- if (channel->panslide >= 0)
- channel->pan = 64;
- else
- channel->pan = 0;
- }
- channel->truepan = channel->pan << IT_ENVELOPE_SHIFT;
- }
- }
+ if (channel->panslide) {
+ if (sigrenderer->sigdata->flags & IT_WAS_AN_XM) {
+ if (IT_IS_SURROUND(channel->pan)) {
+ channel->pan = 32;
+ channel->truepan = 32 + 128 * 64;
+ }
+ if (channel->panslide == -128)
+ channel->truepan = 32;
+ else
+ channel->truepan =
+ MID(32, channel->truepan + channel->panslide * 64,
+ 32 + 255 * 64);
+ } else {
+ if (IT_IS_SURROUND(channel->pan)) {
+ channel->pan = 32;
+ }
+ channel->pan += channel->panslide;
+ if (channel->pan > 64) {
+ if (channel->panslide >= 0)
+ channel->pan = 64;
+ else
+ channel->pan = 0;
+ }
+ channel->truepan = channel->pan << IT_ENVELOPE_SHIFT;
+ }
+ }
- if (channel->channelvolslide) {
- channel->channelvolume += channel->channelvolslide;
- if (channel->channelvolume > 64) {
- if (channel->channelvolslide >= 0)
- channel->channelvolume = 64;
- else
- channel->channelvolume = 0;
- }
- }
+ if (channel->channelvolslide) {
+ channel->channelvolume += channel->channelvolslide;
+ if (channel->channelvolume > 64) {
+ if (channel->channelvolslide >= 0)
+ channel->channelvolume = 64;
+ else
+ channel->channelvolume = 0;
+ }
+ }
- update_tremor(channel);
+ update_tremor(channel);
- update_retrig(sigrenderer, channel);
+ update_retrig(sigrenderer, channel);
- if (channel->inv_loop_speed) update_invert_loop(channel, playing ? playing->sample : NULL);
+ if (channel->inv_loop_speed)
+ update_invert_loop(channel, playing ? playing->sample : NULL);
- if (playing) {
- playing->slide += channel->portamento;
+ if (playing) {
+ playing->slide += channel->portamento;
- if (sigrenderer->sigdata->flags & IT_LINEAR_SLIDES) {
- if (channel->toneporta && channel->destnote < 120) {
- int currpitch = ((playing->note - 60) << 8) + playing->slide;
- int destpitch = (channel->destnote - 60) << 8;
- if (currpitch > destpitch) {
- currpitch -= channel->toneporta;
- if (currpitch < destpitch) {
- currpitch = destpitch;
- channel->destnote = IT_NOTE_OFF;
- }
- } else if (currpitch < destpitch) {
- currpitch += channel->toneporta;
- if (currpitch > destpitch) {
- currpitch = destpitch;
- channel->destnote = IT_NOTE_OFF;
- }
- }
- playing->slide = currpitch - ((playing->note - 60) << 8);
- }
- } else {
- if (channel->toneporta && channel->destnote < 120) {
- float amiga_multiplier = playing->sample->C5_speed * (1.0f / AMIGA_DIVISOR);
+ if (sigrenderer->sigdata->flags & IT_LINEAR_SLIDES) {
+ if (channel->toneporta && channel->destnote < 120) {
+ int currpitch =
+ ((playing->note - 60) << 8) + playing->slide;
+ int destpitch = (channel->destnote - 60) << 8;
+ if (currpitch > destpitch) {
+ currpitch -= channel->toneporta;
+ if (currpitch < destpitch) {
+ currpitch = destpitch;
+ channel->destnote = IT_NOTE_OFF;
+ }
+ } else if (currpitch < destpitch) {
+ currpitch += channel->toneporta;
+ if (currpitch > destpitch) {
+ currpitch = destpitch;
+ channel->destnote = IT_NOTE_OFF;
+ }
+ }
+ playing->slide = currpitch - ((playing->note - 60) << 8);
+ }
+ } else {
+ if (channel->toneporta && channel->destnote < 120) {
+ float amiga_multiplier =
+ playing->sample->C5_speed * (1.0f / AMIGA_DIVISOR);
- float deltanote = (float)pow(DUMB_SEMITONE_BASE, 60 - playing->note);
- /* deltanote is 1.0 for C-5, 0.5 for C-6, etc. */
+ float deltanote =
+ (float)pow(DUMB_SEMITONE_BASE, 60 - playing->note);
+ /* deltanote is 1.0 for C-5, 0.5 for C-6, etc. */
- float deltaslid = deltanote - playing->slide * amiga_multiplier;
+ float deltaslid =
+ deltanote - playing->slide * amiga_multiplier;
- float destdelta = (float)pow(DUMB_SEMITONE_BASE, 60 - channel->destnote);
- if (deltaslid < destdelta) {
- playing->slide -= channel->toneporta;
- deltaslid = deltanote - playing->slide * amiga_multiplier;
- if (deltaslid > destdelta) {
- playing->note = channel->destnote;
- playing->slide = 0;
- channel->destnote = IT_NOTE_OFF;
- }
- } else {
- playing->slide += channel->toneporta;
- deltaslid = deltanote - playing->slide * amiga_multiplier;
- if (deltaslid < destdelta) {
- playing->note = channel->destnote;
- playing->slide = 0;
- channel->destnote = IT_NOTE_OFF;
- }
- }
- }
- }
+ float destdelta =
+ (float)pow(DUMB_SEMITONE_BASE, 60 - channel->destnote);
+ if (deltaslid < destdelta) {
+ playing->slide -= channel->toneporta;
+ deltaslid =
+ deltanote - playing->slide * amiga_multiplier;
+ if (deltaslid > destdelta) {
+ playing->note = channel->destnote;
+ playing->slide = 0;
+ channel->destnote = IT_NOTE_OFF;
+ }
+ } else {
+ playing->slide += channel->toneporta;
+ deltaslid =
+ deltanote - playing->slide * amiga_multiplier;
+ if (deltaslid < destdelta) {
+ playing->note = channel->destnote;
+ playing->slide = 0;
+ channel->destnote = IT_NOTE_OFF;
+ }
+ }
+ }
+ }
- update_playing_effects(playing);
- }
- }
+ update_playing_effects(playing);
+ }
+ }
- for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
- IT_PLAYING *playing = sigrenderer->playing[i];
- if (playing) update_playing_effects(playing);
- }
+ for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ IT_PLAYING *playing = sigrenderer->playing[i];
+ if (playing)
+ update_playing_effects(playing);
+ }
- update_smooth_effects(sigrenderer);
+ update_smooth_effects(sigrenderer);
}
-
static void it_note_off(IT_PLAYING *playing);
-// This function should be renamed; it doesn't do the 'Update Pattern Variables' operation ittech.txt describes
+// This function should be renamed; it doesn't do the 'Update Pattern Variables'
+// operation ittech.txt describes
/* Returns 1 if a pattern loop is happening. */
-static int update_pattern_variables(DUMB_IT_SIGRENDERER *sigrenderer, IT_ENTRY *entry)
-{
- IT_CHANNEL *channel = &sigrenderer->channel[(int)entry->channel];
+static int update_pattern_variables(DUMB_IT_SIGRENDERER *sigrenderer,
+ IT_ENTRY *entry) {
+ IT_CHANNEL *channel = &sigrenderer->channel[(int)entry->channel];
- if (entry->mask & IT_ENTRY_EFFECT) {
- switch (entry->effect) {
- case IT_JUMP_TO_ORDER:
- /* XXX jump and break in same row */
- if ( ( ( sigrenderer->processrow | 0xC00 ) == 0xFFFE ) &&
- ! ( sigrenderer->processrow & 0x800 ) ) {
- sigrenderer->processrow = 0xFFFE & ~0xC00;
- } else {
- sigrenderer->breakrow = 0;
- sigrenderer->processrow = 0xFFFE & ~0x400;
- }
- sigrenderer->processorder = entry->effectvalue - 1;
- break;
+ if (entry->mask & IT_ENTRY_EFFECT) {
+ switch (entry->effect) {
+ case IT_JUMP_TO_ORDER:
+ /* XXX jump and break in same row */
+ if (((sigrenderer->processrow | 0xC00) == 0xFFFE) &&
+ !(sigrenderer->processrow & 0x800)) {
+ sigrenderer->processrow = 0xFFFE & ~0xC00;
+ } else {
+ sigrenderer->breakrow = 0;
+ sigrenderer->processrow = 0xFFFE & ~0x400;
+ }
+ sigrenderer->processorder = entry->effectvalue - 1;
+ break;
- case IT_S:
- {
- unsigned char effectvalue = entry->effectvalue;
- if (sigrenderer->sigdata->flags & IT_WAS_AN_S3M) {
- if (effectvalue == 0)
- effectvalue = channel->lastDKL;
- channel->lastDKL = effectvalue;
- } else {
- if (effectvalue == 0)
- effectvalue = channel->lastS;
- }
- channel->lastS = effectvalue;
- switch (effectvalue >> 4) {
- case IT_S_PATTERN_LOOP:
- {
- unsigned char v = effectvalue & 15;
- if (v == 0) {
+ case IT_S: {
+ unsigned char effectvalue = entry->effectvalue;
+ if (sigrenderer->sigdata->flags & IT_WAS_AN_S3M) {
+ if (effectvalue == 0)
+ effectvalue = channel->lastDKL;
+ channel->lastDKL = effectvalue;
+ } else {
+ if (effectvalue == 0)
+ effectvalue = channel->lastS;
+ }
+ channel->lastS = effectvalue;
+ switch (effectvalue >> 4) {
+ case IT_S_PATTERN_LOOP: {
+ unsigned char v = effectvalue & 15;
+ if (v == 0) {
#ifdef BIT_ARRAY_BULLSHIT
- if (!channel->played_patjump)
- channel->played_patjump = bit_array_create(256);
- else {
- if ( channel->played_patjump_order != 0xFFFE && channel->played_patjump_order != sigrenderer->order )
- bit_array_merge(sigrenderer->played, channel->played_patjump, channel->played_patjump_order * 256);
- //if (channel->played_patjump_order != sigrenderer->order)
- bit_array_reset(channel->played_patjump);
- }
- channel->played_patjump_order = sigrenderer->order;
+ if (!channel->played_patjump)
+ channel->played_patjump = bit_array_create(256);
+ else {
+ if (channel->played_patjump_order != 0xFFFE &&
+ channel->played_patjump_order != sigrenderer->order)
+ bit_array_merge(
+ sigrenderer->played, channel->played_patjump,
+ channel->played_patjump_order * 256);
+ // if (channel->played_patjump_order !=
+ // sigrenderer->order)
+ bit_array_reset(channel->played_patjump);
+ }
+ channel->played_patjump_order = sigrenderer->order;
#endif
- channel->pat_loop_row = sigrenderer->processrow;
- } else {
- if (channel->pat_loop_count == 0) {
+ channel->pat_loop_row = sigrenderer->processrow;
+ } else {
+ if (channel->pat_loop_count == 0) {
#ifdef BIT_ARRAY_BULLSHIT
- /* wft, uninitialized and no start marker yet... */
- if (channel->played_patjump_order == 0xFFFE) {
- int n;
- bit_array_destroy(channel->played_patjump);
- channel->played_patjump = bit_array_create(256);
- for (n = channel->pat_loop_row; n <= sigrenderer->row; n++)
- bit_array_clear(sigrenderer->played, sigrenderer->order * 256 + n);
- channel->played_patjump_order = sigrenderer->order;
- } else if (channel->played_patjump_order == sigrenderer->order) {
- bit_array_set(channel->played_patjump, sigrenderer->row);
- bit_array_mask(sigrenderer->played, channel->played_patjump, channel->played_patjump_order * 256);
- //bit_array_reset(channel->played_patjump);
- }
+ /* wft, uninitialized and no start marker yet... */
+ if (channel->played_patjump_order == 0xFFFE) {
+ int n;
+ bit_array_destroy(channel->played_patjump);
+ channel->played_patjump = bit_array_create(256);
+ for (n = channel->pat_loop_row;
+ n <= sigrenderer->row; n++)
+ bit_array_clear(sigrenderer->played,
+ sigrenderer->order * 256 + n);
+ channel->played_patjump_order = sigrenderer->order;
+ } else if (channel->played_patjump_order ==
+ sigrenderer->order) {
+ bit_array_set(channel->played_patjump,
+ sigrenderer->row);
+ bit_array_mask(sigrenderer->played,
+ channel->played_patjump,
+ channel->played_patjump_order * 256);
+ // bit_array_reset(channel->played_patjump);
+ }
#endif
- channel->pat_loop_count = v;
- sigrenderer->breakrow = channel->pat_loop_row;
- if ((sigrenderer->sigdata->flags & (IT_WAS_AN_XM|IT_WAS_A_MOD)) == IT_WAS_AN_XM) {
- /* For XM files, if a loop occurs by itself, keep breakrow set for when the pattern ends - fun bug in FT2! */
- if ((sigrenderer->processrow|0xC00) < 0xFFFE) {
- /* Infinite pattern loops are possible, so we check whether the pattern loop we're hitting now is earlier than the last one we hit. */
- if (sigrenderer->processrow < channel->pat_loop_end_row)
- sigrenderer->processorder = 0xFFFE; /* suspect infinite loop, so trigger loop callback */
- else
- sigrenderer->processorder = 0xFFFF; /* don't trigger loop callback */
- channel->pat_loop_end_row = sigrenderer->processrow;
- sigrenderer->processrow = 0xFFFF; /* special case: don't reset breakrow or pat_loop_end_row */
- }
- } else {
- /* IT files do this regardless of other flow control effects seen here. */
- sigrenderer->processorder = 0xFFFF; /* special case: don't trigger loop callback */
- sigrenderer->processrow = 0xFFFE;
- }
- return 1;
- } else if (--channel->pat_loop_count) {
+ channel->pat_loop_count = v;
+ sigrenderer->breakrow = channel->pat_loop_row;
+ if ((sigrenderer->sigdata->flags &
+ (IT_WAS_AN_XM | IT_WAS_A_MOD)) == IT_WAS_AN_XM) {
+ /* For XM files, if a loop occurs by itself, keep
+ * breakrow set for when the pattern ends - fun bug
+ * in FT2! */
+ if ((sigrenderer->processrow | 0xC00) < 0xFFFE) {
+ /* Infinite pattern loops are possible, so we
+ * check whether the pattern loop we're hitting
+ * now is earlier than the last one we hit. */
+ if (sigrenderer->processrow <
+ channel->pat_loop_end_row)
+ sigrenderer->processorder =
+ 0xFFFE; /* suspect infinite loop, so
+ trigger loop callback */
+ else
+ sigrenderer->processorder =
+ 0xFFFF; /* don't trigger loop callback
+ */
+ channel->pat_loop_end_row =
+ sigrenderer->processrow;
+ sigrenderer->processrow =
+ 0xFFFF; /* special case: don't reset
+ breakrow or pat_loop_end_row */
+ }
+ } else {
+ /* IT files do this regardless of other flow control
+ * effects seen here. */
+ sigrenderer->processorder =
+ 0xFFFF; /* special case: don't trigger loop
+ callback */
+ sigrenderer->processrow = 0xFFFE;
+ }
+ return 1;
+ } else if (--channel->pat_loop_count) {
#ifdef BIT_ARRAY_BULLSHIT
- if (channel->played_patjump_order == sigrenderer->order) {
- bit_array_set(channel->played_patjump, sigrenderer->row);
- bit_array_mask(sigrenderer->played, channel->played_patjump, channel->played_patjump_order * 256);
- //bit_array_reset(channel->played_patjump);
- }
+ if (channel->played_patjump_order ==
+ sigrenderer->order) {
+ bit_array_set(channel->played_patjump,
+ sigrenderer->row);
+ bit_array_mask(sigrenderer->played,
+ channel->played_patjump,
+ channel->played_patjump_order * 256);
+ // bit_array_reset(channel->played_patjump);
+ }
#endif
- sigrenderer->breakrow = channel->pat_loop_row;
- if ((sigrenderer->sigdata->flags & (IT_WAS_AN_XM|IT_WAS_A_MOD)) == IT_WAS_AN_XM) {
- /* For XM files, if a loop occurs by itself, keep breakrow set for when the pattern ends - fun bug in FT2! */
- if ((sigrenderer->processrow|0xC00) < 0xFFFE) {
- /* Infinite pattern loops are possible, so we check whether the pattern loop we're hitting now is earlier than the last one we hit. */
- if (sigrenderer->processrow < channel->pat_loop_end_row)
- sigrenderer->processorder = 0xFFFE; /* suspect infinite loop, so trigger loop callback */
- else
- sigrenderer->processorder = 0xFFFF; /* don't trigger loop callback */
- channel->pat_loop_end_row = sigrenderer->processrow;
- sigrenderer->processrow = 0xFFFF; /* special case: don't reset breakrow or pat_loop_end_row */
- }
- } else {
- /* IT files do this regardless of other flow control effects seen here. */
- sigrenderer->processorder = 0xFFFF; /* special case: don't trigger loop callback */
- sigrenderer->processrow = 0xFFFE;
- }
- return 1;
- } else if ((sigrenderer->sigdata->flags & (IT_WAS_AN_XM|IT_WAS_A_MOD)) == IT_WAS_AN_XM) {
- channel->pat_loop_end_row = 0;
- // TODO
- /* Findings:
- - If a pattern loop completes successfully, and then the pattern terminates, then the next pattern will start on the row corresponding to the E60.
- - If a pattern loop doesn't do any loops, and then the pattern terminates, then the next pattern will start on the first row.
- - If a break appears to the left of the pattern loop, it jumps into the relevant position in the next pattern, and that's it.
- - If a break appears to the right of the pattern loop, it jumps to the start of the next pattern, and that's it.
- - If we jump, then effect a loop using an old E60, and then the pattern ends, the next pattern starts on the row corresponding to the E60.
- - Theory: breakrow is not cleared when it's a pattern loop effect!
- */
- if ((sigrenderer->processrow | 0xC00) < 0xFFFE) // I have no idea if this is correct or not - FT2 is so weird :(
- sigrenderer->breakrow = channel->pat_loop_row; /* emulate bug in FT2 */
- } else
- channel->pat_loop_row = sigrenderer->processrow + 1;
+ sigrenderer->breakrow = channel->pat_loop_row;
+ if ((sigrenderer->sigdata->flags &
+ (IT_WAS_AN_XM | IT_WAS_A_MOD)) == IT_WAS_AN_XM) {
+ /* For XM files, if a loop occurs by itself, keep
+ * breakrow set for when the pattern ends - fun bug
+ * in FT2! */
+ if ((sigrenderer->processrow | 0xC00) < 0xFFFE) {
+ /* Infinite pattern loops are possible, so we
+ * check whether the pattern loop we're hitting
+ * now is earlier than the last one we hit. */
+ if (sigrenderer->processrow <
+ channel->pat_loop_end_row)
+ sigrenderer->processorder =
+ 0xFFFE; /* suspect infinite loop, so
+ trigger loop callback */
+ else
+ sigrenderer->processorder =
+ 0xFFFF; /* don't trigger loop callback
+ */
+ channel->pat_loop_end_row =
+ sigrenderer->processrow;
+ sigrenderer->processrow =
+ 0xFFFF; /* special case: don't reset
+ breakrow or pat_loop_end_row */
+ }
+ } else {
+ /* IT files do this regardless of other flow control
+ * effects seen here. */
+ sigrenderer->processorder =
+ 0xFFFF; /* special case: don't trigger loop
+ callback */
+ sigrenderer->processrow = 0xFFFE;
+ }
+ return 1;
+ } else if ((sigrenderer->sigdata->flags &
+ (IT_WAS_AN_XM | IT_WAS_A_MOD)) ==
+ IT_WAS_AN_XM) {
+ channel->pat_loop_end_row = 0;
+ // TODO
+ /* Findings:
+ - If a pattern loop completes successfully, and then the
+ pattern terminates, then the next pattern will start on
+ the row corresponding to the E60.
+ - If a pattern loop doesn't do any loops, and then the
+ pattern terminates, then the next pattern will start on
+ the first row.
+ - If a break appears to the left of the pattern loop, it
+ jumps into the relevant position in the next pattern,
+ and that's it.
+ - If a break appears to the right of the pattern loop,
+ it jumps to the start of the next pattern, and that's
+ it.
+ - If we jump, then effect a loop using an old E60, and
+ then the pattern ends, the next pattern starts on the
+ row corresponding to the E60.
+ - Theory: breakrow is not cleared when it's a pattern
+ loop effect!
+ */
+ if ((sigrenderer->processrow | 0xC00) <
+ 0xFFFE) // I have no idea if this is correct or not
+ // - FT2 is so weird :(
+ sigrenderer->breakrow =
+ channel->pat_loop_row; /* emulate bug in FT2 */
+ } else
+ channel->pat_loop_row = sigrenderer->processrow + 1;
#ifdef BIT_ARRAY_BULLSHIT
- /*channel->played_patjump_order |= 0x8000;*/
- if (channel->played_patjump_order == sigrenderer->order) {
- bit_array_destroy(channel->played_patjump);
- channel->played_patjump = 0;
- channel->played_patjump_order = 0xFFFE;
- }
- bit_array_clear(sigrenderer->played, sigrenderer->order * 256 + sigrenderer->row);
+ /*channel->played_patjump_order |= 0x8000;*/
+ if (channel->played_patjump_order == sigrenderer->order) {
+ bit_array_destroy(channel->played_patjump);
+ channel->played_patjump = 0;
+ channel->played_patjump_order = 0xFFFE;
+ }
+ bit_array_clear(sigrenderer->played,
+ sigrenderer->order * 256 +
+ sigrenderer->row);
#endif
- }
- }
- break;
- case IT_S_PATTERN_DELAY:
- sigrenderer->rowcount = 1 + (effectvalue & 15);
- break;
- }
- }
- }
- }
+ }
+ } break;
+ case IT_S_PATTERN_DELAY:
+ sigrenderer->rowcount = 1 + (effectvalue & 15);
+ break;
+ }
+ }
+ }
+ }
- return 0;
+ return 0;
}
-
-
/* This function guarantees that channel->sample will always be valid if it
* is nonzero. In other words, to check if it is valid, simply check if it is
* nonzero.
*/
-static void instrument_to_sample(DUMB_IT_SIGDATA *sigdata, IT_CHANNEL *channel)
-{
- if (sigdata->flags & IT_USE_INSTRUMENTS) {
- if (channel->instrument >= 1 && channel->instrument <= sigdata->n_instruments) {
- if (channel->note < 120) {
- channel->sample = sigdata->instrument[channel->instrument-1].map_sample[channel->note];
- channel->truenote = sigdata->instrument[channel->instrument-1].map_note[channel->note];
- } else
- channel->sample = 0;
- } else
- channel->sample = 0;
- } else {
- channel->sample = channel->instrument;
- channel->truenote = channel->note;
- }
- if (!(channel->sample >= 1 && channel->sample <= sigdata->n_samples && (sigdata->sample[channel->sample-1].flags & IT_SAMPLE_EXISTS) && sigdata->sample[channel->sample-1].C5_speed))
- channel->sample = 0;
+static void instrument_to_sample(DUMB_IT_SIGDATA *sigdata,
+ IT_CHANNEL *channel) {
+ if (sigdata->flags & IT_USE_INSTRUMENTS) {
+ if (channel->instrument >= 1 &&
+ channel->instrument <= sigdata->n_instruments) {
+ if (channel->note < 120) {
+ channel->sample = sigdata->instrument[channel->instrument - 1]
+ .map_sample[channel->note];
+ channel->truenote = sigdata->instrument[channel->instrument - 1]
+ .map_note[channel->note];
+ } else
+ channel->sample = 0;
+ } else
+ channel->sample = 0;
+ } else {
+ channel->sample = channel->instrument;
+ channel->truenote = channel->note;
+ }
+ if (!(channel->sample >= 1 && channel->sample <= sigdata->n_samples &&
+ (sigdata->sample[channel->sample - 1].flags & IT_SAMPLE_EXISTS) &&
+ sigdata->sample[channel->sample - 1].C5_speed))
+ channel->sample = 0;
}
+static void fix_sample_looping(IT_PLAYING *playing) {
+ if ((playing->sample->flags & (IT_SAMPLE_LOOP | IT_SAMPLE_SUS_LOOP)) ==
+ (IT_SAMPLE_LOOP | IT_SAMPLE_SUS_LOOP)) {
+ if (playing->resampler.dir < 0) {
+ playing->resampler.pos = (playing->sample->sus_loop_end << 1) - 1 -
+ playing->resampler.pos;
+ playing->resampler.subpos ^= 65535;
+ playing->resampler.dir = 1;
+ }
-
-static void fix_sample_looping(IT_PLAYING *playing)
-{
- if ((playing->sample->flags & (IT_SAMPLE_LOOP | IT_SAMPLE_SUS_LOOP)) ==
- (IT_SAMPLE_LOOP | IT_SAMPLE_SUS_LOOP)) {
- if (playing->resampler.dir < 0) {
- playing->resampler.pos = (playing->sample->sus_loop_end << 1) - 1 - playing->resampler.pos;
- playing->resampler.subpos ^= 65535;
- playing->resampler.dir = 1;
- }
-
- playing->resampler.pos += playing->time_lost;
- // XXX what
- playing->time_lost = 0;
- }
+ playing->resampler.pos += playing->time_lost;
+ // XXX what
+ playing->time_lost = 0;
+ }
}
+static void it_compatible_gxx_retrigger(DUMB_IT_SIGDATA *sigdata,
+ IT_CHANNEL *channel) {
+ int flags = 0;
+ if (channel->sample) {
+ if (sigdata->flags & IT_USE_INSTRUMENTS) {
+ if (!(channel->playing->flags & IT_PLAYING_SUSTAINOFF)) {
+ if (channel->playing->env_instrument->volume_envelope.flags &
+ IT_ENVELOPE_CARRY)
+ flags |= 1;
+ if (channel->playing->env_instrument->pan_envelope.flags &
+ IT_ENVELOPE_CARRY)
+ flags |= 2;
+ if (channel->playing->env_instrument->pitch_envelope.flags &
+ IT_ENVELOPE_CARRY)
+ flags |= 4;
+ }
+ }
+ }
+ if (!(flags & 1)) {
+ channel->playing->volume_envelope.next_node = 0;
+ channel->playing->volume_envelope.tick = 0;
+ }
+ if (!(flags & 2)) {
+ channel->playing->pan_envelope.next_node = 0;
+ channel->playing->pan_envelope.tick = 0;
+ }
+ if (!(flags & 4)) {
+ channel->playing->pitch_envelope.next_node = 0;
+ channel->playing->pitch_envelope.tick = 0;
+ }
+ channel->playing->fadeoutcount = 1024;
+ // Should we remove IT_PLAYING_BACKGROUND? Test with sample with sustain
+ // loop...
+ channel->playing->flags &= ~(IT_PLAYING_BACKGROUND | IT_PLAYING_SUSTAINOFF |
+ IT_PLAYING_FADING | IT_PLAYING_DEAD);
+ it_playing_update_resamplers(channel->playing);
-
-static void it_compatible_gxx_retrigger(DUMB_IT_SIGDATA *sigdata, IT_CHANNEL *channel)
-{
- int flags = 0;
- if (channel->sample) {
- if (sigdata->flags & IT_USE_INSTRUMENTS) {
- if (!(channel->playing->flags & IT_PLAYING_SUSTAINOFF)) {
- if (channel->playing->env_instrument->volume_envelope.flags & IT_ENVELOPE_CARRY)
- flags |= 1;
- if (channel->playing->env_instrument->pan_envelope.flags & IT_ENVELOPE_CARRY)
- flags |= 2;
- if (channel->playing->env_instrument->pitch_envelope.flags & IT_ENVELOPE_CARRY)
- flags |= 4;
- }
- }
- }
- if (!(flags & 1)) {
- channel->playing->volume_envelope.next_node = 0;
- channel->playing->volume_envelope.tick = 0;
- }
- if (!(flags & 2)) {
- channel->playing->pan_envelope.next_node = 0;
- channel->playing->pan_envelope.tick = 0;
- }
- if (!(flags & 4)) {
- channel->playing->pitch_envelope.next_node = 0;
- channel->playing->pitch_envelope.tick = 0;
- }
- channel->playing->fadeoutcount = 1024;
- // Should we remove IT_PLAYING_BACKGROUND? Test with sample with sustain loop...
- channel->playing->flags &= ~(IT_PLAYING_BACKGROUND | IT_PLAYING_SUSTAINOFF | IT_PLAYING_FADING | IT_PLAYING_DEAD);
- it_playing_update_resamplers(channel->playing);
-
- if (!flags && channel->sample)
- if (sigdata->flags & IT_USE_INSTRUMENTS)
- channel->playing->env_instrument = &sigdata->instrument[channel->instrument-1];
+ if (!flags && channel->sample)
+ if (sigdata->flags & IT_USE_INSTRUMENTS)
+ channel->playing->env_instrument =
+ &sigdata->instrument[channel->instrument - 1];
}
-
-
-static void it_note_off(IT_PLAYING *playing)
-{
- if (playing) {
- playing->enabled_envelopes |= IT_ENV_VOLUME;
- playing->flags |= IT_PLAYING_BACKGROUND | IT_PLAYING_SUSTAINOFF;
- fix_sample_looping(playing);
- it_playing_update_resamplers(playing);
- if (playing->instrument)
- if ((playing->instrument->volume_envelope.flags & (IT_ENVELOPE_ON | IT_ENVELOPE_LOOP_ON)) != IT_ENVELOPE_ON)
- playing->flags |= IT_PLAYING_FADING;
- }
+static void it_note_off(IT_PLAYING *playing) {
+ if (playing) {
+ playing->enabled_envelopes |= IT_ENV_VOLUME;
+ playing->flags |= IT_PLAYING_BACKGROUND | IT_PLAYING_SUSTAINOFF;
+ fix_sample_looping(playing);
+ it_playing_update_resamplers(playing);
+ if (playing->instrument)
+ if ((playing->instrument->volume_envelope.flags &
+ (IT_ENVELOPE_ON | IT_ENVELOPE_LOOP_ON)) != IT_ENVELOPE_ON)
+ playing->flags |= IT_PLAYING_FADING;
+ }
}
-
-
-static void xm_note_off(DUMB_IT_SIGDATA *sigdata, IT_CHANNEL *channel)
-{
- if (channel->playing) {
- if (!channel->instrument || channel->instrument > sigdata->n_instruments ||
- !(sigdata->instrument[channel->instrument-1].volume_envelope.flags & IT_ENVELOPE_ON))
- //if (!(entry->mask & IT_ENTRY_INSTRUMENT))
- // dunno what that was there for ...
- channel->volume = 0;
- channel->playing->flags |= IT_PLAYING_SUSTAINOFF | IT_PLAYING_FADING;
- it_playing_update_resamplers(channel->playing);
- }
+static void xm_note_off(DUMB_IT_SIGDATA *sigdata, IT_CHANNEL *channel) {
+ if (channel->playing) {
+ if (!channel->instrument ||
+ channel->instrument > sigdata->n_instruments ||
+ !(sigdata->instrument[channel->instrument - 1]
+ .volume_envelope.flags &
+ IT_ENVELOPE_ON))
+ // if (!(entry->mask & IT_ENTRY_INSTRUMENT))
+ // dunno what that was there for ...
+ channel->volume = 0;
+ channel->playing->flags |= IT_PLAYING_SUSTAINOFF | IT_PLAYING_FADING;
+ it_playing_update_resamplers(channel->playing);
+ }
}
-
-static void recalculate_it_envelope_node(IT_PLAYING_ENVELOPE *pe, IT_ENVELOPE *e)
-{
- int envpos = pe->tick;
- unsigned int pt = e->n_nodes - 1;
- unsigned int i;
- for (i = 0; i < (unsigned int)(e->n_nodes - 1); ++i)
- {
- if (envpos <= e->node_t[i])
- {
- pt = i;
- break;
- }
- }
- pe->next_node = pt;
+static void recalculate_it_envelope_node(IT_PLAYING_ENVELOPE *pe,
+ IT_ENVELOPE *e) {
+ int envpos = pe->tick;
+ unsigned int pt = e->n_nodes - 1;
+ unsigned int i;
+ for (i = 0; i < (unsigned int)(e->n_nodes - 1); ++i) {
+ if (envpos <= e->node_t[i]) {
+ pt = i;
+ break;
+ }
+ }
+ pe->next_node = pt;
}
-
-static void recalculate_it_envelope_nodes(IT_PLAYING *playing)
-{
- recalculate_it_envelope_node(&playing->volume_envelope, &playing->env_instrument->volume_envelope);
- recalculate_it_envelope_node(&playing->pan_envelope, &playing->env_instrument->pitch_envelope);
- recalculate_it_envelope_node(&playing->pitch_envelope, &playing->env_instrument->pitch_envelope);
+static void recalculate_it_envelope_nodes(IT_PLAYING *playing) {
+ recalculate_it_envelope_node(&playing->volume_envelope,
+ &playing->env_instrument->volume_envelope);
+ recalculate_it_envelope_node(&playing->pan_envelope,
+ &playing->env_instrument->pitch_envelope);
+ recalculate_it_envelope_node(&playing->pitch_envelope,
+ &playing->env_instrument->pitch_envelope);
}
+static void it_retrigger_note(DUMB_IT_SIGRENDERER *sigrenderer,
+ IT_CHANNEL *channel) {
+ int vol_env_tick = 0;
+ int pan_env_tick = 0;
+ int pitch_env_tick = 0;
-static void it_retrigger_note(DUMB_IT_SIGRENDERER *sigrenderer, IT_CHANNEL *channel)
-{
- int vol_env_tick = 0;
- int pan_env_tick = 0;
- int pitch_env_tick = 0;
+ DUMB_IT_SIGDATA *sigdata = sigrenderer->sigdata;
+ unsigned char nna = ~0;
+ int i, envelopes_copied = 0;
- DUMB_IT_SIGDATA *sigdata = sigrenderer->sigdata;
- unsigned char nna = ~0;
- int i, envelopes_copied = 0;
+ if (channel->playing) {
+ if (channel->note == IT_NOTE_CUT)
+ nna = NNA_NOTE_CUT;
+ else if (channel->note == IT_NOTE_OFF)
+ nna = NNA_NOTE_OFF;
+ else if (channel->note > 120)
+ nna = NNA_NOTE_FADE;
+ else if (!channel->playing->instrument ||
+ (channel->playing->flags & IT_PLAYING_DEAD))
+ nna = NNA_NOTE_CUT;
+ else if (channel->new_note_action != 0xFF) {
+ nna = channel->new_note_action;
+ } else
+ nna = channel->playing->instrument->new_note_action;
- if (channel->playing) {
- if (channel->note == IT_NOTE_CUT)
- nna = NNA_NOTE_CUT;
- else if (channel->note == IT_NOTE_OFF)
- nna = NNA_NOTE_OFF;
- else if (channel->note > 120)
- nna = NNA_NOTE_FADE;
- else if (!channel->playing->instrument || (channel->playing->flags & IT_PLAYING_DEAD))
- nna = NNA_NOTE_CUT;
- else if (channel->new_note_action != 0xFF)
- {
- nna = channel->new_note_action;
- }
- else
- nna = channel->playing->instrument->new_note_action;
+ if (!(channel->playing->flags & IT_PLAYING_SUSTAINOFF)) {
+ if (nna != NNA_NOTE_CUT)
+ vol_env_tick = channel->playing->volume_envelope.tick;
+ pan_env_tick = channel->playing->pan_envelope.tick;
+ pitch_env_tick = channel->playing->pitch_envelope.tick;
+ envelopes_copied = 1;
+ }
- if (!(channel->playing->flags & IT_PLAYING_SUSTAINOFF))
- {
- if (nna != NNA_NOTE_CUT)
- vol_env_tick = channel->playing->volume_envelope.tick;
- pan_env_tick = channel->playing->pan_envelope.tick;
- pitch_env_tick = channel->playing->pitch_envelope.tick;
- envelopes_copied = 1;
- }
+ switch (nna) {
+ case NNA_NOTE_CUT:
+ channel->playing->declick_stage = 3;
+ break;
+ case NNA_NOTE_OFF:
+ it_note_off(channel->playing);
+ break;
+ case NNA_NOTE_FADE:
+ channel->playing->flags |=
+ IT_PLAYING_BACKGROUND | IT_PLAYING_FADING;
+ break;
+ }
+ }
- switch (nna) {
- case NNA_NOTE_CUT:
- channel->playing->declick_stage = 3;
- break;
- case NNA_NOTE_OFF:
- it_note_off(channel->playing);
- break;
- case NNA_NOTE_FADE:
- channel->playing->flags |= IT_PLAYING_BACKGROUND | IT_PLAYING_FADING;
- break;
- }
- }
+ channel->new_note_action = 0xFF;
- channel->new_note_action = 0xFF;
+ if (channel->sample == 0 || channel->note > 120)
+ return;
- if (channel->sample == 0 || channel->note > 120)
- return;
+ channel->destnote = IT_NOTE_OFF;
- channel->destnote = IT_NOTE_OFF;
+ if (channel->playing) {
+ for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ if (!sigrenderer->playing[i]) {
+ sigrenderer->playing[i] = channel->playing;
+ channel->playing = NULL;
+ break;
+ }
+ }
- if (channel->playing) {
- for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
- if (!sigrenderer->playing[i]) {
- sigrenderer->playing[i] = channel->playing;
- channel->playing = NULL;
- break;
- }
- }
+ if (sigrenderer->sigdata->flags & IT_USE_INSTRUMENTS) {
+ for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ IT_PLAYING *playing = sigrenderer->playing[i];
+ if (playing && playing->channel == channel &&
+ playing->instrument->dup_check_type) {
+ int match = 1;
+ switch (playing->instrument->dup_check_type) {
+ case DCT_NOTE:
+ match = (channel->truenote == playing->note);
+ case DCT_SAMPLE:
+ match = match && (channel->sample == playing->sampnum);
+ case DCT_INSTRUMENT:
+ match =
+ match && (channel->instrument == playing->instnum);
+ break;
+ }
- if (sigrenderer->sigdata->flags & IT_USE_INSTRUMENTS)
- {
- for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
- IT_PLAYING * playing = sigrenderer->playing[i];
- if (playing && playing->channel == channel && playing->instrument->dup_check_type) {
- int match = 1;
- switch (playing->instrument->dup_check_type)
- {
- case DCT_NOTE:
- match = (channel->truenote == playing->note);
- case DCT_SAMPLE:
- match = match && (channel->sample == playing->sampnum);
- case DCT_INSTRUMENT:
- match = match && (channel->instrument == playing->instnum);
- break;
- }
+ if (match) {
+ switch (playing->instrument->dup_check_action) {
+ case DCA_NOTE_CUT:
+ playing->declick_stage = 3;
+ if (channel->playing == playing)
+ channel->playing = NULL;
+ break;
+ case DCA_NOTE_OFF:
+ if (!(playing->flags & IT_PLAYING_SUSTAINOFF))
+ it_note_off(playing);
+ break;
+ case DCA_NOTE_FADE:
+ playing->flags |=
+ IT_PLAYING_BACKGROUND | IT_PLAYING_FADING;
+ break;
+ }
+ }
+ }
+ }
+ }
- if (match)
- {
- switch (playing->instrument->dup_check_action)
- {
- case DCA_NOTE_CUT:
- playing->declick_stage = 3;
- if (channel->playing == playing) channel->playing = NULL;
- break;
- case DCA_NOTE_OFF:
- if (!(playing->flags & IT_PLAYING_SUSTAINOFF))
- it_note_off(playing);
- break;
- case DCA_NOTE_FADE:
- playing->flags |= IT_PLAYING_BACKGROUND | IT_PLAYING_FADING;
- break;
- }
- }
- }
- }
- }
-
/** WARNING - come up with some more heuristics for replacing old notes */
#if 0
if (channel->playing) {
@@ -1956,1885 +2175,1955 @@
}
}
#endif
- }
+ }
- if (channel->playing)
- free_playing(channel->playing);
+ if (channel->playing)
+ free_playing(channel->playing);
- channel->playing = new_playing();
+ channel->playing = new_playing();
- if (!channel->playing)
- return;
+ if (!channel->playing)
+ return;
- if (!envelopes_copied && sigdata->flags & IT_USE_INSTRUMENTS) {
- for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
- IT_PLAYING * playing = sigrenderer->playing[i];
- if (!playing || playing->channel != channel) continue;
- if (playing->flags & IT_PLAYING_SUSTAINOFF) continue;
- if (nna != NNA_NOTE_CUT)
- vol_env_tick = playing->volume_envelope.tick;
- pan_env_tick = playing->pan_envelope.tick;
- pitch_env_tick = playing->pitch_envelope.tick;
- envelopes_copied = 1;
- break;
- }
- }
+ if (!envelopes_copied && sigdata->flags & IT_USE_INSTRUMENTS) {
+ for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ IT_PLAYING *playing = sigrenderer->playing[i];
+ if (!playing || playing->channel != channel)
+ continue;
+ if (playing->flags & IT_PLAYING_SUSTAINOFF)
+ continue;
+ if (nna != NNA_NOTE_CUT)
+ vol_env_tick = playing->volume_envelope.tick;
+ pan_env_tick = playing->pan_envelope.tick;
+ pitch_env_tick = playing->pitch_envelope.tick;
+ envelopes_copied = 1;
+ break;
+ }
+ }
+
+ channel->playing->flags = 0;
+ channel->playing->resampling_quality = sigrenderer->resampling_quality;
+ channel->playing->channel = channel;
+ channel->playing->sample = &sigdata->sample[channel->sample - 1];
+ if (sigdata->flags & IT_USE_INSTRUMENTS)
+ channel->playing->instrument =
+ &sigdata->instrument[channel->instrument - 1];
+ else
+ channel->playing->instrument = NULL;
+ channel->playing->env_instrument = channel->playing->instrument;
+ channel->playing->sampnum = channel->sample;
+ channel->playing->instnum = channel->instrument;
+ channel->playing->declick_stage = 0;
+ channel->playing->channel_volume = channel->channelvolume;
+ channel->playing->note = channel->truenote;
+ channel->playing->enabled_envelopes = 0;
+ channel->playing->volume_offset = 0;
+ channel->playing->panning_offset = 0;
+ // channel->playing->output = channel->output;
+ if (sigdata->flags & IT_USE_INSTRUMENTS) {
+ IT_PLAYING *playing = channel->playing;
+ IT_INSTRUMENT *instrument = playing->instrument;
+ if (instrument->volume_envelope.flags & IT_ENVELOPE_ON)
+ playing->enabled_envelopes |= IT_ENV_VOLUME;
+ if (instrument->pan_envelope.flags & IT_ENVELOPE_ON)
+ playing->enabled_envelopes |= IT_ENV_PANNING;
+ if (instrument->pitch_envelope.flags & IT_ENVELOPE_ON)
+ playing->enabled_envelopes |= IT_ENV_PITCH;
+ if (instrument->random_volume)
+ playing->volume_offset =
+ (rand() % (instrument->random_volume * 2 + 1)) -
+ instrument->random_volume;
+ if (instrument->random_pan)
+ playing->panning_offset =
+ (rand() % (instrument->random_pan * 2 + 1)) -
+ instrument->random_pan;
+ // if (instrument->output) playing->output = instrument->output;
+ }
+ channel->playing->filter_cutoff = 127;
+ channel->playing->filter_resonance = 0;
+ channel->playing->true_filter_cutoff = 127 << 8;
+ channel->playing->true_filter_resonance = 0;
+ channel->playing->vibrato_speed = 0;
+ channel->playing->vibrato_depth = 0;
+ channel->playing->vibrato_n = 0;
+ channel->playing->vibrato_time = 0;
+ channel->playing->vibrato_waveform = channel->vibrato_waveform;
+ channel->playing->tremolo_speed = 0;
+ channel->playing->tremolo_depth = 0;
+ channel->playing->tremolo_time = 0;
+ channel->playing->tremolo_waveform = channel->tremolo_waveform;
+ channel->playing->panbrello_speed = 0;
+ channel->playing->panbrello_depth = 0;
+ channel->playing->panbrello_time = 0;
+ channel->playing->panbrello_waveform = channel->panbrello_waveform;
+ channel->playing->panbrello_random = 0;
+ channel->playing->sample_vibrato_time = 0;
+ channel->playing->sample_vibrato_waveform =
+ channel->playing->sample->vibrato_waveform;
+ channel->playing->sample_vibrato_depth = 0;
+ channel->playing->slide = 0;
+ channel->playing->finetune = channel->playing->sample->finetune;
- channel->playing->flags = 0;
- channel->playing->resampling_quality = sigrenderer->resampling_quality;
- channel->playing->channel = channel;
- channel->playing->sample = &sigdata->sample[channel->sample-1];
- if (sigdata->flags & IT_USE_INSTRUMENTS)
- channel->playing->instrument = &sigdata->instrument[channel->instrument-1];
- else
- channel->playing->instrument = NULL;
- channel->playing->env_instrument = channel->playing->instrument;
- channel->playing->sampnum = channel->sample;
- channel->playing->instnum = channel->instrument;
- channel->playing->declick_stage = 0;
- channel->playing->channel_volume = channel->channelvolume;
- channel->playing->note = channel->truenote;
- channel->playing->enabled_envelopes = 0;
- channel->playing->volume_offset = 0;
- channel->playing->panning_offset = 0;
- //channel->playing->output = channel->output;
- if (sigdata->flags & IT_USE_INSTRUMENTS) {
- IT_PLAYING * playing = channel->playing;
- IT_INSTRUMENT * instrument = playing->instrument;
- if (instrument->volume_envelope.flags & IT_ENVELOPE_ON) playing->enabled_envelopes |= IT_ENV_VOLUME;
- if (instrument->pan_envelope.flags & IT_ENVELOPE_ON) playing->enabled_envelopes |= IT_ENV_PANNING;
- if (instrument->pitch_envelope.flags & IT_ENVELOPE_ON) playing->enabled_envelopes |= IT_ENV_PITCH;
- if (instrument->random_volume) playing->volume_offset = (rand() % (instrument->random_volume * 2 + 1)) - instrument->random_volume;
- if (instrument->random_pan) playing->panning_offset = (rand() % (instrument->random_pan * 2 + 1)) - instrument->random_pan;
- //if (instrument->output) playing->output = instrument->output;
- }
- channel->playing->filter_cutoff = 127;
- channel->playing->filter_resonance = 0;
- channel->playing->true_filter_cutoff = 127 << 8;
- channel->playing->true_filter_resonance = 0;
- channel->playing->vibrato_speed = 0;
- channel->playing->vibrato_depth = 0;
- channel->playing->vibrato_n = 0;
- channel->playing->vibrato_time = 0;
- channel->playing->vibrato_waveform = channel->vibrato_waveform;
- channel->playing->tremolo_speed = 0;
- channel->playing->tremolo_depth = 0;
- channel->playing->tremolo_time = 0;
- channel->playing->tremolo_waveform = channel->tremolo_waveform;
- channel->playing->panbrello_speed = 0;
- channel->playing->panbrello_depth = 0;
- channel->playing->panbrello_time = 0;
- channel->playing->panbrello_waveform = channel->panbrello_waveform;
- channel->playing->panbrello_random = 0;
- channel->playing->sample_vibrato_time = 0;
- channel->playing->sample_vibrato_waveform = channel->playing->sample->vibrato_waveform;
- channel->playing->sample_vibrato_depth = 0;
- channel->playing->slide = 0;
- channel->playing->finetune = channel->playing->sample->finetune;
+ if (sigdata->flags & IT_USE_INSTRUMENTS) {
+ if (envelopes_copied &&
+ channel->playing->env_instrument->volume_envelope.flags &
+ IT_ENVELOPE_CARRY) {
+ channel->playing->volume_envelope.tick = vol_env_tick;
+ } else {
+ channel->playing->volume_envelope.tick = 0;
+ }
+ if (envelopes_copied &&
+ channel->playing->env_instrument->pan_envelope.flags &
+ IT_ENVELOPE_CARRY) {
+ channel->playing->pan_envelope.tick = pan_env_tick;
+ } else {
+ channel->playing->pan_envelope.tick = 0;
+ }
+ if (envelopes_copied &&
+ channel->playing->env_instrument->pitch_envelope.flags &
+ IT_ENVELOPE_CARRY) {
+ channel->playing->pitch_envelope.tick = pitch_env_tick;
+ } else {
+ channel->playing->pitch_envelope.tick = 0;
+ }
+ recalculate_it_envelope_nodes(channel->playing);
+ }
+ channel->playing->fadeoutcount = 1024;
+ it_reset_filter_state(&channel->playing->filter_state[0]);
+ it_reset_filter_state(&channel->playing->filter_state[1]);
+ it_playing_reset_resamplers(channel->playing, 0);
- if (sigdata->flags & IT_USE_INSTRUMENTS)
- {
- if (envelopes_copied && channel->playing->env_instrument->volume_envelope.flags & IT_ENVELOPE_CARRY) {
- channel->playing->volume_envelope.tick = vol_env_tick;
- } else {
- channel->playing->volume_envelope.tick = 0;
- }
- if (envelopes_copied && channel->playing->env_instrument->pan_envelope.flags & IT_ENVELOPE_CARRY) {
- channel->playing->pan_envelope.tick = pan_env_tick;
- } else {
- channel->playing->pan_envelope.tick = 0;
- }
- if (envelopes_copied && channel->playing->env_instrument->pitch_envelope.flags & IT_ENVELOPE_CARRY) {
- channel->playing->pitch_envelope.tick = pitch_env_tick;
- } else {
- channel->playing->pitch_envelope.tick = 0;
- }
- recalculate_it_envelope_nodes(channel->playing);
- }
- channel->playing->fadeoutcount = 1024;
- it_reset_filter_state(&channel->playing->filter_state[0]);
- it_reset_filter_state(&channel->playing->filter_state[1]);
- it_playing_reset_resamplers(channel->playing, 0);
-
- /** WARNING - is everything initialised? */
+ /** WARNING - is everything initialised? */
}
+static void get_default_volpan(DUMB_IT_SIGDATA *sigdata, IT_CHANNEL *channel) {
+ if (channel->sample == 0)
+ return;
+ channel->volume = sigdata->sample[channel->sample - 1].default_volume;
-static void get_default_volpan(DUMB_IT_SIGDATA *sigdata, IT_CHANNEL *channel)
-{
- if (channel->sample == 0)
- return;
+ if (sigdata->flags & IT_WAS_AN_XM) {
+ if (!(sigdata->flags & IT_WAS_A_MOD))
+ channel->truepan =
+ 32 + sigdata->sample[channel->sample - 1].default_pan * 64;
+ return;
+ }
- channel->volume = sigdata->sample[channel->sample-1].default_volume;
+ {
+ int pan = sigdata->sample[channel->sample - 1].default_pan;
+ if (pan >= 128 && pan <= 192) {
+ channel->pan = pan - 128;
+ return;
+ }
+ }
- if (sigdata->flags & IT_WAS_AN_XM) {
- if (!(sigdata->flags & IT_WAS_A_MOD))
- channel->truepan = 32 + sigdata->sample[channel->sample-1].default_pan*64;
- return;
- }
-
- {
- int pan = sigdata->sample[channel->sample-1].default_pan;
- if (pan >= 128 && pan <= 192) {
- channel->pan = pan - 128;
- return;
- }
- }
-
- if (sigdata->flags & IT_USE_INSTRUMENTS) {
- IT_INSTRUMENT *instrument = &sigdata->instrument[channel->instrument-1];
- if (instrument->default_pan <= 64)
- channel->pan = instrument->default_pan;
- if (instrument->filter_cutoff >= 128)
- channel->filter_cutoff = instrument->filter_cutoff - 128;
- if (instrument->filter_resonance >= 128)
- channel->filter_resonance = instrument->filter_resonance - 128;
- }
+ if (sigdata->flags & IT_USE_INSTRUMENTS) {
+ IT_INSTRUMENT *instrument =
+ &sigdata->instrument[channel->instrument - 1];
+ if (instrument->default_pan <= 64)
+ channel->pan = instrument->default_pan;
+ if (instrument->filter_cutoff >= 128)
+ channel->filter_cutoff = instrument->filter_cutoff - 128;
+ if (instrument->filter_resonance >= 128)
+ channel->filter_resonance = instrument->filter_resonance - 128;
+ }
}
+static void get_true_pan(DUMB_IT_SIGDATA *sigdata, IT_CHANNEL *channel) {
+ channel->truepan = channel->pan << IT_ENVELOPE_SHIFT;
-
-static void get_true_pan(DUMB_IT_SIGDATA *sigdata, IT_CHANNEL *channel)
-{
- channel->truepan = channel->pan << IT_ENVELOPE_SHIFT;
-
- if (channel->sample && !IT_IS_SURROUND_SHIFTED(channel->truepan) && (sigdata->flags & IT_USE_INSTRUMENTS)) {
- IT_INSTRUMENT *instrument = &sigdata->instrument[channel->instrument-1];
- int truepan = channel->truepan;
- truepan += (channel->note - instrument->pp_centre) * instrument->pp_separation << (IT_ENVELOPE_SHIFT - 3);
- channel->truepan = (unsigned short)MID(0, truepan, 64 << IT_ENVELOPE_SHIFT);
- }
+ if (channel->sample && !IT_IS_SURROUND_SHIFTED(channel->truepan) &&
+ (sigdata->flags & IT_USE_INSTRUMENTS)) {
+ IT_INSTRUMENT *instrument =
+ &sigdata->instrument[channel->instrument - 1];
+ int truepan = channel->truepan;
+ truepan +=
+ (channel->note - instrument->pp_centre) * instrument->pp_separation
+ << (IT_ENVELOPE_SHIFT - 3);
+ channel->truepan =
+ (unsigned short)MID(0, truepan, 64 << IT_ENVELOPE_SHIFT);
+ }
}
+static void post_process_it_volpan(DUMB_IT_SIGRENDERER *sigrenderer,
+ IT_ENTRY *entry) {
+ IT_CHANNEL *channel = &sigrenderer->channel[(int)entry->channel];
-
-static void post_process_it_volpan(DUMB_IT_SIGRENDERER *sigrenderer, IT_ENTRY *entry)
-{
- IT_CHANNEL *channel = &sigrenderer->channel[(int)entry->channel];
-
- if (entry->mask & IT_ENTRY_VOLPAN) {
- if (entry->volpan <= 84) {
- /* Volume */
- /* Fine volume slide up */
- /* Fine volume slide down */
- } else if (entry->volpan <= 94) {
- /* Volume slide up */
- unsigned char v = entry->volpan - 85;
- if (v == 0)
- v = channel->lastvolslide;
- channel->lastvolslide = v;
- /* = effect Dx0 where x == entry->volpan - 85 */
- channel->volslide += v;
- } else if (entry->volpan <= 104) {
- /* Volume slide down */
- unsigned char v = entry->volpan - 95;
- if (v == 0)
- v = channel->lastvolslide;
- channel->lastvolslide = v;
- /* = effect D0x where x == entry->volpan - 95 */
- channel->volslide -= v;
- } else if (entry->volpan <= 114) {
- /* Portamento down */
- unsigned char v = (entry->volpan - 105) << 2;
- if (v == 0)
- v = channel->lastEF;
- channel->lastEF = v;
- channel->portamento -= v << 4;
- } else if (entry->volpan <= 124) {
- /* Portamento up */
- unsigned char v = (entry->volpan - 115) << 2;
- if (v == 0)
- v = channel->lastEF;
- channel->lastEF = v;
- channel->portamento += v << 4;
- } else if (entry->volpan <= 202) {
- /* Pan */
- /* Tone Portamento */
- } else if (entry->volpan <= 212) {
- /* Vibrato */
- /* This is unaffected by IT_OLD_EFFECTS. However, if v == 0, then any doubling of depth that happened before (with Hxy in the effect column) will be preserved. */
- unsigned char v = entry->volpan - 203;
- if (v == 0)
- v = channel->lastHdepth;
- else {
- v <<= 2;
- channel->lastHdepth = v;
- }
- if (channel->playing) {
- channel->playing->vibrato_speed = channel->lastHspeed;
- channel->playing->vibrato_depth = v;
- channel->playing->vibrato_n++;
- }
- }
- }
+ if (entry->mask & IT_ENTRY_VOLPAN) {
+ if (entry->volpan <= 84) {
+ /* Volume */
+ /* Fine volume slide up */
+ /* Fine volume slide down */
+ } else if (entry->volpan <= 94) {
+ /* Volume slide up */
+ unsigned char v = entry->volpan - 85;
+ if (v == 0)
+ v = channel->lastvolslide;
+ channel->lastvolslide = v;
+ /* = effect Dx0 where x == entry->volpan - 85 */
+ channel->volslide += v;
+ } else if (entry->volpan <= 104) {
+ /* Volume slide down */
+ unsigned char v = entry->volpan - 95;
+ if (v == 0)
+ v = channel->lastvolslide;
+ channel->lastvolslide = v;
+ /* = effect D0x where x == entry->volpan - 95 */
+ channel->volslide -= v;
+ } else if (entry->volpan <= 114) {
+ /* Portamento down */
+ unsigned char v = (entry->volpan - 105) << 2;
+ if (v == 0)
+ v = channel->lastEF;
+ channel->lastEF = v;
+ channel->portamento -= v << 4;
+ } else if (entry->volpan <= 124) {
+ /* Portamento up */
+ unsigned char v = (entry->volpan - 115) << 2;
+ if (v == 0)
+ v = channel->lastEF;
+ channel->lastEF = v;
+ channel->portamento += v << 4;
+ } else if (entry->volpan <= 202) {
+ /* Pan */
+ /* Tone Portamento */
+ } else if (entry->volpan <= 212) {
+ /* Vibrato */
+ /* This is unaffected by IT_OLD_EFFECTS. However, if v == 0, then
+ * any doubling of depth that happened before (with Hxy in the
+ * effect column) will be preserved. */
+ unsigned char v = entry->volpan - 203;
+ if (v == 0)
+ v = channel->lastHdepth;
+ else {
+ v <<= 2;
+ channel->lastHdepth = v;
+ }
+ if (channel->playing) {
+ channel->playing->vibrato_speed = channel->lastHspeed;
+ channel->playing->vibrato_depth = v;
+ channel->playing->vibrato_n++;
+ }
+ }
+ }
}
+static void it_send_midi(DUMB_IT_SIGRENDERER *sigrenderer, IT_CHANNEL *channel,
+ unsigned char midi_byte) {
+ if (sigrenderer->callbacks->midi)
+ if ((*sigrenderer->callbacks->midi)(
+ sigrenderer->callbacks->midi_data,
+ (int)(channel - sigrenderer->channel), midi_byte))
+ return;
-
-static void it_send_midi(DUMB_IT_SIGRENDERER *sigrenderer, IT_CHANNEL *channel, unsigned char midi_byte)
-{
- if (sigrenderer->callbacks->midi)
- if ((*sigrenderer->callbacks->midi)(sigrenderer->callbacks->midi_data, (int)(channel - sigrenderer->channel), midi_byte))
- return;
-
- switch (channel->midi_state) {
- case 4: /* Ready to receive resonance parameter */
- if (midi_byte < 0x80) channel->filter_resonance = midi_byte;
- channel->midi_state = 0;
- break;
- case 3: /* Ready to receive cutoff parameter */
- if (midi_byte < 0x80) channel->filter_cutoff = midi_byte;
- channel->midi_state = 0;
- break;
- case 2: /* Ready for byte specifying which parameter will follow */
- if (midi_byte == 0) /* Cutoff */
- channel->midi_state = 3;
- else if (midi_byte == 1) /* Resonance */
- channel->midi_state = 4;
- else
- channel->midi_state = 0;
- break;
- default: /* Counting initial F0 bytes */
- switch (midi_byte) {
- case 0xF0:
- channel->midi_state++;
- break;
- case 0xFA:
- case 0xFC:
- case 0xFF:
- /* Reset filter parameters for all channels */
- {
- int i;
- for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
- sigrenderer->channel[i].filter_cutoff = 127;
- sigrenderer->channel[i].filter_resonance = 0;
- //// should we be resetting channel[i].playing->filter_* here?
- }
- }
- /* Fall through */
- default:
- channel->midi_state = 0;
- break;
- }
- }
-}
+ switch (channel->midi_state) {
+ case 4: /* Ready to receive resonance parameter */
+ if (midi_byte < 0x80)
+ channel->filter_resonance = midi_byte;
+ channel->midi_state = 0;
+ break;
+ case 3: /* Ready to receive cutoff parameter */
+ if (midi_byte < 0x80)
+ channel->filter_cutoff = midi_byte;
+ channel->midi_state = 0;
+ break;
+ case 2: /* Ready for byte specifying which parameter will follow */
+ if (midi_byte == 0) /* Cutoff */
+ channel->midi_state = 3;
+ else if (midi_byte == 1) /* Resonance */
+ channel->midi_state = 4;
+ else
+ channel->midi_state = 0;
+ break;
+ default: /* Counting initial F0 bytes */
+ switch (midi_byte) {
+ case 0xF0:
+ channel->midi_state++;
+ break;
+ case 0xFA:
+ case 0xFC:
+ case 0xFF:
+ /* Reset filter parameters for all channels */
+ {
+ int i;
+ for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
+ sigrenderer->channel[i].filter_cutoff = 127;
+ sigrenderer->channel[i].filter_resonance = 0;
+ //// should we be resetting channel[i].playing->filter_*
+ /// here?
+ }
+ }
+ /* Fall through */
+ default:
+ channel->midi_state = 0;
+ break;
+ }
+ }
+}
+static void xm_envelope_calculate_value(IT_ENVELOPE *envelope,
+ IT_PLAYING_ENVELOPE *pe) {
+ if (pe->next_node <= 0)
+ pe->value = envelope->node_y[0] << IT_ENVELOPE_SHIFT;
+ else if (pe->next_node >= envelope->n_nodes)
+ pe->value = envelope->node_y[envelope->n_nodes - 1]
+ << IT_ENVELOPE_SHIFT;
+ else {
+ int ys = envelope->node_y[pe->next_node - 1] << IT_ENVELOPE_SHIFT;
+ int ts = envelope->node_t[pe->next_node - 1];
+ int te = envelope->node_t[pe->next_node];
+ if (ts == te)
+ pe->value = ys;
+ else {
+ int ye = envelope->node_y[pe->next_node] << IT_ENVELOPE_SHIFT;
+ int t = pe->tick;
-static void xm_envelope_calculate_value(IT_ENVELOPE *envelope, IT_PLAYING_ENVELOPE *pe)
-{
- if (pe->next_node <= 0)
- pe->value = envelope->node_y[0] << IT_ENVELOPE_SHIFT;
- else if (pe->next_node >= envelope->n_nodes)
- pe->value = envelope->node_y[envelope->n_nodes-1] << IT_ENVELOPE_SHIFT;
- else {
- int ys = envelope->node_y[pe->next_node-1] << IT_ENVELOPE_SHIFT;
- int ts = envelope->node_t[pe->next_node-1];
- int te = envelope->node_t[pe->next_node];
-
- if (ts == te)
- pe->value = ys;
- else {
- int ye = envelope->node_y[pe->next_node] << IT_ENVELOPE_SHIFT;
- int t = pe->tick;
-
- pe->value = ys + (ye - ys) * (t - ts) / (te - ts);
- }
- }
+ pe->value = ys + (ye - ys) * (t - ts) / (te - ts);
+ }
+ }
}
-
-
extern const char xm_convert_vibrato[];
const char mod_convert_vibrato[] = {
- IT_VIBRATO_SINE,
- IT_VIBRATO_RAMP_UP, /* this will be inverted by IT_OLD_EFFECTS */
- IT_VIBRATO_XM_SQUARE,
- IT_VIBRATO_XM_SQUARE
-};
+ IT_VIBRATO_SINE,
+ IT_VIBRATO_RAMP_UP, /* this will be inverted by IT_OLD_EFFECTS */
+ IT_VIBRATO_XM_SQUARE, IT_VIBRATO_XM_SQUARE};
/* Returns 1 if a callback caused termination of playback. */
-static int process_effects(DUMB_IT_SIGRENDERER *sigrenderer, IT_ENTRY *entry, int ignore_cxx)
-{
- DUMB_IT_SIGDATA *sigdata = sigrenderer->sigdata;
- IT_PLAYING *playing;
- int i;
+static int process_effects(DUMB_IT_SIGRENDERER *sigrenderer, IT_ENTRY *entry,
+ int ignore_cxx) {
+ DUMB_IT_SIGDATA *sigdata = sigrenderer->sigdata;
+ IT_PLAYING *playing;
+ int i;
- IT_CHANNEL *channel = &sigrenderer->channel[(int)entry->channel];
+ IT_CHANNEL *channel = &sigrenderer->channel[(int)entry->channel];
- if (entry->mask & IT_ENTRY_EFFECT) {
- switch (entry->effect) {
-/*
-Notes about effects (as compared to other module formats)
+ if (entry->mask & IT_ENTRY_EFFECT) {
+ switch (entry->effect) {
+ /*
+ Notes about effects (as compared to other module formats)
-C This is now in *HEX*. (Used to be in decimal in ST3)
-E/F/G/H/U You need to check whether the song uses Amiga/Linear slides.
-H/U Vibrato in Impulse Tracker is two times finer than in
- any other tracker and is updated EVERY tick.
- If "Old Effects" is *ON*, then the vibrato is played in the
- normal manner (every non-row tick and normal depth)
-E/F/G These commands ALL share the same memory.
-Oxx Offsets to samples are to the 'xx00th' SAMPLE. (ie. for
- 16 bit samples, the offset is xx00h*2)
- Oxx past the sample end will be ignored, unless "Old Effects"
- is ON, in which case the Oxx will play from the end of the
- sample.
-Yxy This uses a table 4 times larger (hence 4 times slower) than
- vibrato or tremelo. If the waveform is set to random, then
- the 'speed' part of the command is interpreted as a delay.
-*/
- case IT_SET_SPEED:
- if (entry->effectvalue)
- {
- /*if (entry->effectvalue == 255)
- if (sigrenderer->callbacks->xm_speed_zero && (*sigrenderer->callbacks->xm_speed_zero)(sigrenderer->callbacks->xm_speed_zero_data))
- return 1;*/
- if (sigdata->flags & IT_WAS_AN_STM) {
- int n = entry->effectvalue;
- if (n >= 32) {
- sigrenderer->tick = sigrenderer->speed = n;
- }
- } else {
- sigrenderer->tick = sigrenderer->speed = entry->effectvalue;
- }
- }
- else if ((sigdata->flags & (IT_WAS_AN_XM|IT_WAS_A_MOD)) == IT_WAS_AN_XM) {
+ C This is now in *HEX*. (Used to be in decimal in ST3)
+ E/F/G/H/U You need to check whether the song uses Amiga/Linear
+ slides. H/U Vibrato in Impulse Tracker is two times
+ finer than in any other tracker and is updated EVERY tick. If "Old
+ Effects" is *ON*, then the vibrato is played in the normal manner
+ (every non-row tick and normal depth) E/F/G These commands
+ ALL share the same memory. Oxx Offsets to samples are to
+ the 'xx00th' SAMPLE. (ie. for 16 bit samples, the offset is xx00h*2)
+ Oxx past the sample end will be ignored, unless "Old
+ Effects" is ON, in which case the Oxx will play from the end of the
+ sample.
+ Yxy This uses a table 4 times larger (hence 4 times
+ slower) than vibrato or tremelo. If the waveform is set to random,
+ then the 'speed' part of the command is interpreted as a delay.
+ */
+ case IT_SET_SPEED:
+ if (entry->effectvalue) {
+ /*if (entry->effectvalue == 255)
+ if (sigrenderer->callbacks->xm_speed_zero &&
+ (*sigrenderer->callbacks->xm_speed_zero)(sigrenderer->callbacks->xm_speed_zero_data))
+ return 1;*/
+ if (sigdata->flags & IT_WAS_AN_STM) {
+ int n = entry->effectvalue;
+ if (n >= 32) {
+ sigrenderer->tick = sigrenderer->speed = n;
+ }
+ } else {
+ sigrenderer->tick = sigrenderer->speed = entry->effectvalue;
+ }
+ } else if ((sigdata->flags & (IT_WAS_AN_XM | IT_WAS_A_MOD)) ==
+ IT_WAS_AN_XM) {
#ifdef BIT_ARRAY_BULLSHIT
- bit_array_set(sigrenderer->played, sigrenderer->order * 256 + sigrenderer->row);
+ bit_array_set(sigrenderer->played,
+ sigrenderer->order * 256 + sigrenderer->row);
#endif
- sigrenderer->speed = 0;
+ sigrenderer->speed = 0;
#ifdef BIT_ARRAY_BULLSHIT
- sigrenderer->looped = 1;
+ sigrenderer->looped = 1;
#endif
- if (sigrenderer->callbacks->xm_speed_zero && (*sigrenderer->callbacks->xm_speed_zero)(sigrenderer->callbacks->xm_speed_zero_data))
- return 1;
- }
- break;
+ if (sigrenderer->callbacks->xm_speed_zero &&
+ (*sigrenderer->callbacks->xm_speed_zero)(
+ sigrenderer->callbacks->xm_speed_zero_data))
+ return 1;
+ }
+ break;
- case IT_BREAK_TO_ROW:
- if (ignore_cxx) break;
- sigrenderer->breakrow = entry->effectvalue;
- /* XXX jump and break on the same row */
- if ( ( ( sigrenderer->processrow | 0xC00 ) == 0xFFFE ) &&
- ! ( sigrenderer->processrow & 0x400 ) ) {
- sigrenderer->processrow = 0xFFFE & ~0xC00;
- } else {
- sigrenderer->processorder = sigrenderer->order;
- sigrenderer->processrow = 0xFFFE & ~0x800;
- }
- break;
+ case IT_BREAK_TO_ROW:
+ if (ignore_cxx)
+ break;
+ sigrenderer->breakrow = entry->effectvalue;
+ /* XXX jump and break on the same row */
+ if (((sigrenderer->processrow | 0xC00) == 0xFFFE) &&
+ !(sigrenderer->processrow & 0x400)) {
+ sigrenderer->processrow = 0xFFFE & ~0xC00;
+ } else {
+ sigrenderer->processorder = sigrenderer->order;
+ sigrenderer->processrow = 0xFFFE & ~0x800;
+ }
+ break;
- case IT_VOLSLIDE_VIBRATO:
- for (i = -1; i < DUMB_IT_N_NNA_CHANNELS; i++) {
- if (i < 0) playing = channel->playing;
- else {
- playing = sigrenderer->playing[i];
- if (!playing || playing->channel != channel) continue;
- }
- if (playing) {
- playing->vibrato_speed = channel->lastHspeed;
- playing->vibrato_depth = channel->lastHdepth;
- playing->vibrato_n++;
- }
- }
- /* Fall through and process volume slide. */
- case IT_VOLUME_SLIDE:
- case IT_VOLSLIDE_TONEPORTA:
- /* The tone portamento component is handled elsewhere. */
- {
- unsigned char v = entry->effectvalue;
- if (!(sigdata->flags & IT_WAS_A_MOD)) {
- if (v == 0)
- v = channel->lastDKL;
- channel->lastDKL = v;
- }
- if (!(sigdata->flags & IT_WAS_AN_XM)) {
- int clip = (sigdata->flags & IT_WAS_AN_S3M) ? 63 : 64;
- if ((v & 0x0F) == 0x0F) {
- if (!(v & 0xF0)) {
- channel->volslide = -15;
- channel->volume -= 15;
- if (channel->volume > clip) channel->volume = 0;
- } else {
- channel->volume += v >> 4;
- if (channel->volume > clip) channel->volume = clip;
- }
- } else if ((v & 0xF0) == 0xF0) {
- if (!(v & 0x0F)) {
- channel->volslide = 15;
- channel->volume += 15;
- if (channel->volume > clip) channel->volume = clip;
- } else {
- channel->volume -= v & 15;
- if (channel->volume > clip) channel->volume = 0;
- }
- } else if (!(v & 0x0F)) {
- channel->volslide = v >> 4;
- } else {
- channel->volslide = -(v & 15);
- }
- } else {
- if ((v & 0x0F) == 0) { /* Dx0 */
- channel->volslide = v >> 4;
- } else if ((v & 0xF0) == 0) { /* D0x */
- channel->volslide = -v;
- } else if ((v & 0x0F) == 0x0F) { /* DxF */
- channel->volume += v >> 4;
- if (channel->volume > 64) channel->volume = 64;
- } else if ((v & 0xF0) == 0xF0) { /* DFx */
- channel->volume -= v & 15;
- if (channel->volume > 64) channel->volume = 0;
- }
- }
- }
- break;
- case IT_XM_FINE_VOLSLIDE_DOWN:
- {
- unsigned char v = entry->effectvalue;
- if (v == 0)
- v = channel->xm_lastEB;
- channel->xm_lastEB = v;
- channel->volume -= v;
- if (channel->volume > 64) channel->volume = 0;
- }
- break;
- case IT_XM_FINE_VOLSLIDE_UP:
- {
- unsigned char v = entry->effectvalue;
- if (v == 0)
- v = channel->xm_lastEA;
- channel->xm_lastEA = v;
- channel->volume += v;
- if (channel->volume > 64) channel->volume = 64;
- }
- break;
- case IT_PORTAMENTO_DOWN:
- {
- unsigned char v = entry->effectvalue;
- if (sigdata->flags & (IT_WAS_AN_XM|IT_WAS_A_669)) {
- if (!(sigdata->flags & IT_WAS_A_MOD)) {
- if (v == 0xF0)
- v |= channel->xm_lastE2;
- else if (v >= 0xF0)
- channel->xm_lastE2 = v & 15;
- else if (v == 0xE0)
- v |= channel->xm_lastX2;
- else
- channel->xm_lastX2 = v & 15;
- }
- } else if (sigdata->flags & IT_WAS_AN_S3M) {
- if (v == 0)
- v = channel->lastDKL;
- channel->lastDKL = v;
- } else {
- if (v == 0)
- v = channel->lastEF;
- channel->lastEF = v;
- }
- for (i = -1; i < DUMB_IT_N_NNA_CHANNELS; i++) {
- if (i < 0) playing = channel->playing;
- else {
- playing = sigrenderer->playing[i];
- if (!playing || playing->channel != channel) continue;
- }
- if (playing) {
- if ((v & 0xF0) == 0xF0)
- playing->slide -= (v & 15) << 4;
- else if ((v & 0xF0) == 0xE0)
- playing->slide -= (v & 15) << 2;
- else if (i < 0 && sigdata->flags & IT_WAS_A_669)
- channel->portamento -= v << 3;
- else if (i < 0)
- channel->portamento -= v << 4;
- }
- }
- }
- break;
- case IT_PORTAMENTO_UP:
- {
- unsigned char v = entry->effectvalue;
- if (sigdata->flags & (IT_WAS_AN_XM|IT_WAS_A_669)) {
- if (!(sigdata->flags & IT_WAS_A_MOD)) {
- if (v == 0xF0)
- v |= channel->xm_lastE1;
- else if (v >= 0xF0)
- channel->xm_lastE1 = v & 15;
- else if (v == 0xE0)
- v |= channel->xm_lastX1;
- else
- channel->xm_lastX1 = v & 15;
- }
- } else if (sigdata->flags & IT_WAS_AN_S3M) {
- if (v == 0)
- v = channel->lastDKL;
- channel->lastDKL = v;
- } else {
- if (v == 0)
- v = channel->lastEF;
- channel->lastEF = v;
- }
- for (i = -1; i < DUMB_IT_N_NNA_CHANNELS; i++) {
- if (i < 0) playing = channel->playing;
- else {
- playing = sigrenderer->playing[i];
- if (!playing || playing->channel != channel) continue;
- }
- if (playing) {
- if ((v & 0xF0) == 0xF0)
- playing->slide += (v & 15) << 4;
- else if ((v & 0xF0) == 0xE0)
- playing->slide += (v & 15) << 2;
- else if (i < 0 && sigdata->flags & IT_WAS_A_669)
- channel->portamento += v << 3;
- else if (i < 0)
- channel->portamento += v << 4;
- }
- }
- }
- break;
- case IT_XM_PORTAMENTO_DOWN:
- {
- unsigned char v = entry->effectvalue;
- if (!(sigdata->flags & IT_WAS_A_MOD)) {
- if (v == 0)
- v = channel->lastJ;
- channel->lastJ = v;
- }
- if (channel->playing)
- channel->portamento -= v << 4;
- }
- break;
- case IT_XM_PORTAMENTO_UP:
- {
- unsigned char v = entry->effectvalue;
- if (!(sigdata->flags & IT_WAS_A_MOD)) {
- if (v == 0)
- v = channel->lastEF;
- channel->lastEF = v;
- }
- if (channel->playing)
- channel->portamento += v << 4;
- }
- break;
- case IT_XM_KEY_OFF:
- channel->key_off_count = entry->effectvalue;
- if (!channel->key_off_count) xm_note_off(sigdata, channel);
- break;
- case IT_VIBRATO:
- {
- if (entry->effectvalue || !(sigdata->flags & IT_WAS_A_669)) {
- unsigned char speed = entry->effectvalue >> 4;
- unsigned char depth = entry->effectvalue & 15;
- if (speed == 0)
- speed = channel->lastHspeed;
- channel->lastHspeed = speed;
- if (depth == 0)
- depth = channel->lastHdepth;
- else {
- if (sigdata->flags & IT_OLD_EFFECTS && !(sigdata->flags & IT_WAS_A_MOD))
- depth <<= 3;
- else
- depth <<= 2;
- channel->lastHdepth = depth;
- }
- for (i = -1; i < DUMB_IT_N_NNA_CHANNELS; i++) {
- if (i < 0) playing = channel->playing;
- else {
- playing = sigrenderer->playing[i];
- if (!playing || playing->channel != channel) continue;
- }
- if (playing) {
- playing->vibrato_speed = speed;
- playing->vibrato_depth = depth;
- playing->vibrato_n++;
- }
- }
- }
- }
- break;
- case IT_TREMOR:
- {
- unsigned char v = entry->effectvalue;
- if (v == 0) {
- if (sigdata->flags & IT_WAS_AN_S3M)
- v = channel->lastDKL;
- else
- v = channel->lastI;
- }
- else if (!(sigdata->flags & IT_OLD_EFFECTS)) {
- if (v & 0xF0) v -= 0x10;
- if (v & 0x0F) v -= 0x01;
- }
- if (sigdata->flags & IT_WAS_AN_S3M)
- channel->lastDKL = v;
- else
- channel->lastI = v;
- channel->tremor_time |= 128;
- }
- update_tremor(channel);
- break;
- case IT_ARPEGGIO:
- {
- unsigned char v = entry->effectvalue;
- /* XM files have no memory for arpeggio (000 = no effect)
- * and we use lastJ for portamento down instead.
- */
- if (!(sigdata->flags & IT_WAS_AN_XM)) {
- if (sigdata->flags & IT_WAS_AN_S3M) {
- if (v == 0)
- v = channel->lastDKL;
- channel->lastDKL = v;
- } else {
- if (v == 0)
- v = channel->lastJ;
- channel->lastJ = v;
- }
- }
- channel->arpeggio_offsets[0] = 0;
- channel->arpeggio_offsets[1] = (v & 0xF0) >> 4;
- channel->arpeggio_offsets[2] = (v & 0x0F);
- channel->arpeggio_table = (const unsigned char *)(((sigdata->flags & (IT_WAS_AN_XM|IT_WAS_A_MOD))==IT_WAS_AN_XM) ? &arpeggio_xm : &arpeggio_mod);
- }
- break;
- case IT_SET_CHANNEL_VOLUME:
- if (sigdata->flags & IT_WAS_AN_XM)
- channel->volume = MIN(entry->effectvalue, 64);
- else if (entry->effectvalue <= 64)
- channel->channelvolume = entry->effectvalue;
-#ifdef VOLUME_OUT_OF_RANGE_SETS_MAXIMUM
- else
- channel->channelvolume = 64;
-#endif
- if (channel->playing)
- channel->playing->channel_volume = channel->channelvolume;
- break;
- case IT_CHANNEL_VOLUME_SLIDE:
- {
- unsigned char v = entry->effectvalue;
- if (v == 0)
- v = channel->lastN;
- channel->lastN = v;
- if ((v & 0x0F) == 0) { /* Nx0 */
- channel->channelvolslide = v >> 4;
- } else if ((v & 0xF0) == 0) { /* N0x */
- channel->channelvolslide = -v;
- } else {
- if ((v & 0x0F) == 0x0F) { /* NxF */
- channel->channelvolume += v >> 4;
- if (channel->channelvolume > 64) channel->channelvolume = 64;
- } else if ((v & 0xF0) == 0xF0) { /* NFx */
- channel->channelvolume -= v & 15;
- if (channel->channelvolume > 64) channel->channelvolume = 0;
- } else
- break;
- if (channel->playing)
- channel->playing->channel_volume = channel->channelvolume;
- }
- }
- break;
- case IT_SET_SAMPLE_OFFSET:
- {
- unsigned char v = entry->effectvalue;
- /*if (sigdata->flags & IT_WAS_A_MOD) {
+ case IT_VOLSLIDE_VIBRATO:
+ for (i = -1; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ if (i < 0)
+ playing = channel->playing;
+ else {
+ playing = sigrenderer->playing[i];
+ if (!playing || playing->channel != channel)
+ continue;
+ }
+ if (playing) {
+ playing->vibrato_speed = channel->lastHspeed;
+ playing->vibrato_depth = channel->lastHdepth;
+ playing->vibrato_n++;
+ }
+ }
+ /* Fall through and process volume slide. */
+ case IT_VOLUME_SLIDE:
+ case IT_VOLSLIDE_TONEPORTA:
+ /* The tone portamento component is handled elsewhere. */
+ {
+ unsigned char v = entry->effectvalue;
+ if (!(sigdata->flags & IT_WAS_A_MOD)) {
+ if (v == 0)
+ v = channel->lastDKL;
+ channel->lastDKL = v;
+ }
+ if (!(sigdata->flags & IT_WAS_AN_XM)) {
+ int clip = (sigdata->flags & IT_WAS_AN_S3M) ? 63 : 64;
+ if ((v & 0x0F) == 0x0F) {
+ if (!(v & 0xF0)) {
+ channel->volslide = -15;
+ channel->volume -= 15;
+ if (channel->volume > clip)
+ channel->volume = 0;
+ } else {
+ channel->volume += v >> 4;
+ if (channel->volume > clip)
+ channel->volume = clip;
+ }
+ } else if ((v & 0xF0) == 0xF0) {
+ if (!(v & 0x0F)) {
+ channel->volslide = 15;
+ channel->volume += 15;
+ if (channel->volume > clip)
+ channel->volume = clip;
+ } else {
+ channel->volume -= v & 15;
+ if (channel->volume > clip)
+ channel->volume = 0;
+ }
+ } else if (!(v & 0x0F)) {
+ channel->volslide = v >> 4;
+ } else {
+ channel->volslide = -(v & 15);
+ }
+ } else {
+ if ((v & 0x0F) == 0) { /* Dx0 */
+ channel->volslide = v >> 4;
+ } else if ((v & 0xF0) == 0) { /* D0x */
+ channel->volslide = -v;
+ } else if ((v & 0x0F) == 0x0F) { /* DxF */
+ channel->volume += v >> 4;
+ if (channel->volume > 64)
+ channel->volume = 64;
+ } else if ((v & 0xF0) == 0xF0) { /* DFx */
+ channel->volume -= v & 15;
+ if (channel->volume > 64)
+ channel->volume = 0;
+ }
+ }
+ }
+ break;
+ case IT_XM_FINE_VOLSLIDE_DOWN: {
+ unsigned char v = entry->effectvalue;
+ if (v == 0)
+ v = channel->xm_lastEB;
+ channel->xm_lastEB = v;
+ channel->volume -= v;
+ if (channel->volume > 64)
+ channel->volume = 0;
+ } break;
+ case IT_XM_FINE_VOLSLIDE_UP: {
+ unsigned char v = entry->effectvalue;
+ if (v == 0)
+ v = channel->xm_lastEA;
+ channel->xm_lastEA = v;
+ channel->volume += v;
+ if (channel->volume > 64)
+ channel->volume = 64;
+ } break;
+ case IT_PORTAMENTO_DOWN: {
+ unsigned char v = entry->effectvalue;
+ if (sigdata->flags & (IT_WAS_AN_XM | IT_WAS_A_669)) {
+ if (!(sigdata->flags & IT_WAS_A_MOD)) {
+ if (v == 0xF0)
+ v |= channel->xm_lastE2;
+ else if (v >= 0xF0)
+ channel->xm_lastE2 = v & 15;
+ else if (v == 0xE0)
+ v |= channel->xm_lastX2;
+ else
+ channel->xm_lastX2 = v & 15;
+ }
+ } else if (sigdata->flags & IT_WAS_AN_S3M) {
+ if (v == 0)
+ v = channel->lastDKL;
+ channel->lastDKL = v;
+ } else {
+ if (v == 0)
+ v = channel->lastEF;
+ channel->lastEF = v;
+ }
+ for (i = -1; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ if (i < 0)
+ playing = channel->playing;
+ else {
+ playing = sigrenderer->playing[i];
+ if (!playing || playing->channel != channel)
+ continue;
+ }
+ if (playing) {
+ if ((v & 0xF0) == 0xF0)
+ playing->slide -= (v & 15) << 4;
+ else if ((v & 0xF0) == 0xE0)
+ playing->slide -= (v & 15) << 2;
+ else if (i < 0 && sigdata->flags & IT_WAS_A_669)
+ channel->portamento -= v << 3;
+ else if (i < 0)
+ channel->portamento -= v << 4;
+ }
+ }
+ } break;
+ case IT_PORTAMENTO_UP: {
+ unsigned char v = entry->effectvalue;
+ if (sigdata->flags & (IT_WAS_AN_XM | IT_WAS_A_669)) {
+ if (!(sigdata->flags & IT_WAS_A_MOD)) {
+ if (v == 0xF0)
+ v |= channel->xm_lastE1;
+ else if (v >= 0xF0)
+ channel->xm_lastE1 = v & 15;
+ else if (v == 0xE0)
+ v |= channel->xm_lastX1;
+ else
+ channel->xm_lastX1 = v & 15;
+ }
+ } else if (sigdata->flags & IT_WAS_AN_S3M) {
+ if (v == 0)
+ v = channel->lastDKL;
+ channel->lastDKL = v;
+ } else {
+ if (v == 0)
+ v = channel->lastEF;
+ channel->lastEF = v;
+ }
+ for (i = -1; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ if (i < 0)
+ playing = channel->playing;
+ else {
+ playing = sigrenderer->playing[i];
+ if (!playing || playing->channel != channel)
+ continue;
+ }
+ if (playing) {
+ if ((v & 0xF0) == 0xF0)
+ playing->slide += (v & 15) << 4;
+ else if ((v & 0xF0) == 0xE0)
+ playing->slide += (v & 15) << 2;
+ else if (i < 0 && sigdata->flags & IT_WAS_A_669)
+ channel->portamento += v << 3;
+ else if (i < 0)
+ channel->portamento += v << 4;
+ }
+ }
+ } break;
+ case IT_XM_PORTAMENTO_DOWN: {
+ unsigned char v = entry->effectvalue;
+ if (!(sigdata->flags & IT_WAS_A_MOD)) {
+ if (v == 0)
+ v = channel->lastJ;
+ channel->lastJ = v;
+ }
+ if (channel->playing)
+ channel->portamento -= v << 4;
+ } break;
+ case IT_XM_PORTAMENTO_UP: {
+ unsigned char v = entry->effectvalue;
+ if (!(sigdata->flags & IT_WAS_A_MOD)) {
+ if (v == 0)
+ v = channel->lastEF;
+ channel->lastEF = v;
+ }
+ if (channel->playing)
+ channel->portamento += v << 4;
+ } break;
+ case IT_XM_KEY_OFF:
+ channel->key_off_count = entry->effectvalue;
+ if (!channel->key_off_count)
+ xm_note_off(sigdata, channel);
+ break;
+ case IT_VIBRATO: {
+ if (entry->effectvalue || !(sigdata->flags & IT_WAS_A_669)) {
+ unsigned char speed = entry->effectvalue >> 4;
+ unsigned char depth = entry->effectvalue & 15;
+ if (speed == 0)
+ speed = channel->lastHspeed;
+ channel->lastHspeed = speed;
+ if (depth == 0)
+ depth = channel->lastHdepth;
+ else {
+ if (sigdata->flags & IT_OLD_EFFECTS &&
+ !(sigdata->flags & IT_WAS_A_MOD))
+ depth <<= 3;
+ else
+ depth <<= 2;
+ channel->lastHdepth = depth;
+ }
+ for (i = -1; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ if (i < 0)
+ playing = channel->playing;
+ else {
+ playing = sigrenderer->playing[i];
+ if (!playing || playing->channel != channel)
+ continue;
+ }
+ if (playing) {
+ playing->vibrato_speed = speed;
+ playing->vibrato_depth = depth;
+ playing->vibrato_n++;
+ }
+ }
+ }
+ } break;
+ case IT_TREMOR: {
+ unsigned char v = entry->effectvalue;
+ if (v == 0) {
+ if (sigdata->flags & IT_WAS_AN_S3M)
+ v = channel->lastDKL;
+ else
+ v = channel->lastI;
+ } else if (!(sigdata->flags & IT_OLD_EFFECTS)) {
+ if (v & 0xF0)
+ v -= 0x10;
+ if (v & 0x0F)
+ v -= 0x01;
+ }
+ if (sigdata->flags & IT_WAS_AN_S3M)
+ channel->lastDKL = v;
+ else
+ channel->lastI = v;
+ channel->tremor_time |= 128;
+ }
+ update_tremor(channel);
+ break;
+ case IT_ARPEGGIO: {
+ unsigned char v = entry->effectvalue;
+ /* XM files have no memory for arpeggio (000 = no effect)
+ * and we use lastJ for portamento down instead.
+ */
+ if (!(sigdata->flags & IT_WAS_AN_XM)) {
+ if (sigdata->flags & IT_WAS_AN_S3M) {
+ if (v == 0)
+ v = channel->lastDKL;
+ channel->lastDKL = v;
+ } else {
+ if (v == 0)
+ v = channel->lastJ;
+ channel->lastJ = v;
+ }
+ }
+ channel->arpeggio_offsets[0] = 0;
+ channel->arpeggio_offsets[1] = (v & 0xF0) >> 4;
+ channel->arpeggio_offsets[2] = (v & 0x0F);
+ channel->arpeggio_table =
+ (const unsigned char *)(((sigdata->flags &
+ (IT_WAS_AN_XM | IT_WAS_A_MOD)) ==
+ IT_WAS_AN_XM)
+ ? &arpeggio_xm
+ : &arpeggio_mod);
+ } break;
+ case IT_SET_CHANNEL_VOLUME:
+ if (sigdata->flags & IT_WAS_AN_XM)
+ channel->volume = MIN(entry->effectvalue, 64);
+ else if (entry->effectvalue <= 64)
+ channel->channelvolume = entry->effectvalue;
+#ifdef VOLUME_OUT_OF_RANGE_SETS_MAXIMUM
+ else
+ channel->channelvolume = 64;
+#endif
+ if (channel->playing)
+ channel->playing->channel_volume = channel->channelvolume;
+ break;
+ case IT_CHANNEL_VOLUME_SLIDE: {
+ unsigned char v = entry->effectvalue;
+ if (v == 0)
+ v = channel->lastN;
+ channel->lastN = v;
+ if ((v & 0x0F) == 0) { /* Nx0 */
+ channel->channelvolslide = v >> 4;
+ } else if ((v & 0xF0) == 0) { /* N0x */
+ channel->channelvolslide = -v;
+ } else {
+ if ((v & 0x0F) == 0x0F) { /* NxF */
+ channel->channelvolume += v >> 4;
+ if (channel->channelvolume > 64)
+ channel->channelvolume = 64;
+ } else if ((v & 0xF0) == 0xF0) { /* NFx */
+ channel->channelvolume -= v & 15;
+ if (channel->channelvolume > 64)
+ channel->channelvolume = 0;
+ } else
+ break;
+ if (channel->playing)
+ channel->playing->channel_volume = channel->channelvolume;
+ }
+ } break;
+ case IT_SET_SAMPLE_OFFSET: {
+ unsigned char v = entry->effectvalue;
+ /*if (sigdata->flags & IT_WAS_A_MOD) {
if (v == 0) break;
} else*/ {
- if (v == 0)
- v = channel->lastO;
- channel->lastO = v;
- }
- /* Note: we set the offset even if tone portamento is
- * specified. Impulse Tracker does the same.
- */
- if (entry->mask & IT_ENTRY_NOTE) {
- if (channel->playing) {
- int offset = ((int)channel->high_offset << 16) | ((int)v << 8);
- IT_PLAYING *playing = channel->playing;
- IT_SAMPLE *sample = playing->sample;
- int end;
- if ((sample->flags & IT_SAMPLE_SUS_LOOP) && !(playing->flags & IT_PLAYING_SUSTAINOFF))
- end = (int)sample->sus_loop_end;
- else if (sample->flags & IT_SAMPLE_LOOP)
- end = (int)sample->loop_end;
- else {
- end = (int)sample->length;
- if ( sigdata->flags & IT_WAS_PROCESSED && end > 64 ) // XXX bah damn LPC and edge case modules
- end -= 64;
- }
- if ((sigdata->flags & IT_WAS_A_PTM) && (sample->flags & IT_SAMPLE_16BIT))
- offset >>= 1;
- if (offset < end) {
- it_playing_reset_resamplers(playing, offset);
- playing->declick_stage = 0;
- } else if (sigdata->flags & IT_OLD_EFFECTS) {
- it_playing_reset_resamplers(playing, end);
- playing->declick_stage = 0;
- }
- }
- }
- }
- break;
- case IT_PANNING_SLIDE:
- /** JULIEN: guess what? the docs are wrong! (how unusual ;)
- * Pxy seems to memorize its previous value... and there
- * might be other mistakes like that... (sigh!)
- */
- /** ENTHEH: umm... but... the docs say that Pxy memorises its
- * value... don't they? :o
- */
- {
- unsigned char v = entry->effectvalue;
- int p = channel->truepan;
- if (sigdata->flags & IT_WAS_AN_XM)
- {
- if (IT_IS_SURROUND(channel->pan))
- {
- channel->pan = 32;
- p = 32 + 128 * 64;
- }
- p >>= 6;
- }
- else {
- if (IT_IS_SURROUND(channel->pan)) p = 32 << 8;
- p = (p + 128) >> 8;
- channel->pan = p;
- }
- if (v == 0)
- v = channel->lastP;
- channel->lastP = v;
- if ((v & 0x0F) == 0) { /* Px0 */
- channel->panslide = -(v >> 4);
- } else if ((v & 0xF0) == 0) { /* P0x */
- channel->panslide = v;
- } else if ((v & 0x0F) == 0x0F) { /* PxF */
- p -= v >> 4;
- } else if ((v & 0xF0) == 0xF0) { /* PFx */
- p += v & 15;
- }
- if (sigdata->flags & IT_WAS_AN_XM)
- channel->truepan = 32 + MID(0, p, 255) * 64;
- else {
- if (p < 0) p = 0;
- else if (p > 64) p = 64;
- channel->pan = p;
- channel->truepan = p << 8;
- }
- }
- break;
- case IT_RETRIGGER_NOTE:
- {
- unsigned char v = entry->effectvalue;
- if (sigdata->flags & IT_WAS_AN_XM) {
- if ((v & 0x0F) == 0) v |= channel->lastQ & 0x0F;
- if ((v & 0xF0) == 0) v |= channel->lastQ & 0xF0;
- channel->lastQ = v;
- } else if (sigdata->flags & IT_WAS_AN_S3M) {
- if (v == 0)
- v = channel->lastDKL;
- channel->lastDKL = v;
- } else {
- if (v == 0)
- v = channel->lastQ;
- channel->lastQ = v;
- }
- if ((v & 0x0F) == 0) v |= 0x01;
- channel->retrig = v;
- if (entry->mask & IT_ENTRY_NOTE) {
- channel->retrig_tick = v & 0x0F;
- /* Emulate a bug */
- if (sigdata->flags & IT_WAS_AN_XM)
- update_retrig(sigrenderer, channel);
- } else
- update_retrig(sigrenderer, channel);
- }
- break;
- case IT_XM_RETRIGGER_NOTE:
- channel->retrig_tick = channel->xm_retrig = entry->effectvalue;
- if (entry->effectvalue == 0)
- if (channel->playing) {
- it_playing_reset_resamplers(channel->playing, 0);
- channel->playing->declick_stage = 0;
- }
- break;
- case IT_TREMOLO:
- {
- unsigned char speed, depth;
- if (sigdata->flags & IT_WAS_AN_S3M) {
- unsigned char v = entry->effectvalue;
- if (v == 0)
- v = channel->lastDKL;
- channel->lastDKL = v;
- speed = v >> 4;
- depth = v & 15;
- } else {
- speed = entry->effectvalue >> 4;
- depth = entry->effectvalue & 15;
- if (speed == 0)
- speed = channel->lastRspeed;
- channel->lastRspeed = speed;
- if (depth == 0)
- depth = channel->lastRdepth;
- channel->lastRdepth = depth;
- }
- for (i = -1; i < DUMB_IT_N_NNA_CHANNELS; i++) {
- if (i < 0) playing = channel->playing;
- else {
- playing = sigrenderer->playing[i];
- if (!playing || playing->channel != channel) continue;
- }
- if (playing) {
- playing->tremolo_speed = speed;
- playing->tremolo_depth = depth;
- }
- }
- }
- break;
- case IT_S:
- {
- /* channel->lastS was set in update_pattern_variables(). */
- unsigned char effectvalue = channel->lastS;
- switch (effectvalue >> 4) {
- //case IT_S_SET_FILTER:
- /* Waveforms for commands S3x, S4x and S5x:
- * 0: Sine wave
- * 1: Ramp down
- * 2: Square wave
- * 3: Random wave
- */
- case IT_S_SET_GLISSANDO_CONTROL:
- channel->glissando = effectvalue & 15;
- break;
+ if (v == 0)
+ v = channel->lastO;
+ channel->lastO = v;
+ }
+ /* Note: we set the offset even if tone portamento is
+ * specified. Impulse Tracker does the same.
+ */
+ if (entry->mask & IT_ENTRY_NOTE) {
+ if (channel->playing) {
+ int offset =
+ ((int)channel->high_offset << 16) | ((int)v << 8);
+ IT_PLAYING *playing = channel->playing;
+ IT_SAMPLE *sample = playing->sample;
+ int end;
+ if ((sample->flags & IT_SAMPLE_SUS_LOOP) &&
+ !(playing->flags & IT_PLAYING_SUSTAINOFF))
+ end = (int)sample->sus_loop_end;
+ else if (sample->flags & IT_SAMPLE_LOOP)
+ end = (int)sample->loop_end;
+ else {
+ end = (int)sample->length;
+ if (sigdata->flags & IT_WAS_PROCESSED &&
+ end > 64) // XXX bah damn LPC and edge case modules
+ end -= 64;
+ }
+ if ((sigdata->flags & IT_WAS_A_PTM) &&
+ (sample->flags & IT_SAMPLE_16BIT))
+ offset >>= 1;
+ if (offset < end) {
+ it_playing_reset_resamplers(playing, offset);
+ playing->declick_stage = 0;
+ } else if (sigdata->flags & IT_OLD_EFFECTS) {
+ it_playing_reset_resamplers(playing, end);
+ playing->declick_stage = 0;
+ }
+ }
+ }
+ } break;
+ case IT_PANNING_SLIDE:
+ /** JULIEN: guess what? the docs are wrong! (how unusual ;)
+ * Pxy seems to memorize its previous value... and there
+ * might be other mistakes like that... (sigh!)
+ */
+ /** ENTHEH: umm... but... the docs say that Pxy memorises its
+ * value... don't they? :o
+ */
+ {
+ unsigned char v = entry->effectvalue;
+ int p = channel->truepan;
+ if (sigdata->flags & IT_WAS_AN_XM) {
+ if (IT_IS_SURROUND(channel->pan)) {
+ channel->pan = 32;
+ p = 32 + 128 * 64;
+ }
+ p >>= 6;
+ } else {
+ if (IT_IS_SURROUND(channel->pan))
+ p = 32 << 8;
+ p = (p + 128) >> 8;
+ channel->pan = p;
+ }
+ if (v == 0)
+ v = channel->lastP;
+ channel->lastP = v;
+ if ((v & 0x0F) == 0) { /* Px0 */
+ channel->panslide = -(v >> 4);
+ } else if ((v & 0xF0) == 0) { /* P0x */
+ channel->panslide = v;
+ } else if ((v & 0x0F) == 0x0F) { /* PxF */
+ p -= v >> 4;
+ } else if ((v & 0xF0) == 0xF0) { /* PFx */
+ p += v & 15;
+ }
+ if (sigdata->flags & IT_WAS_AN_XM)
+ channel->truepan = 32 + MID(0, p, 255) * 64;
+ else {
+ if (p < 0)
+ p = 0;
+ else if (p > 64)
+ p = 64;
+ channel->pan = p;
+ channel->truepan = p << 8;
+ }
+ }
+ break;
+ case IT_RETRIGGER_NOTE: {
+ unsigned char v = entry->effectvalue;
+ if (sigdata->flags & IT_WAS_AN_XM) {
+ if ((v & 0x0F) == 0)
+ v |= channel->lastQ & 0x0F;
+ if ((v & 0xF0) == 0)
+ v |= channel->lastQ & 0xF0;
+ channel->lastQ = v;
+ } else if (sigdata->flags & IT_WAS_AN_S3M) {
+ if (v == 0)
+ v = channel->lastDKL;
+ channel->lastDKL = v;
+ } else {
+ if (v == 0)
+ v = channel->lastQ;
+ channel->lastQ = v;
+ }
+ if ((v & 0x0F) == 0)
+ v |= 0x01;
+ channel->retrig = v;
+ if (entry->mask & IT_ENTRY_NOTE) {
+ channel->retrig_tick = v & 0x0F;
+ /* Emulate a bug */
+ if (sigdata->flags & IT_WAS_AN_XM)
+ update_retrig(sigrenderer, channel);
+ } else
+ update_retrig(sigrenderer, channel);
+ } break;
+ case IT_XM_RETRIGGER_NOTE:
+ channel->retrig_tick = channel->xm_retrig = entry->effectvalue;
+ if (entry->effectvalue == 0)
+ if (channel->playing) {
+ it_playing_reset_resamplers(channel->playing, 0);
+ channel->playing->declick_stage = 0;
+ }
+ break;
+ case IT_TREMOLO: {
+ unsigned char speed, depth;
+ if (sigdata->flags & IT_WAS_AN_S3M) {
+ unsigned char v = entry->effectvalue;
+ if (v == 0)
+ v = channel->lastDKL;
+ channel->lastDKL = v;
+ speed = v >> 4;
+ depth = v & 15;
+ } else {
+ speed = entry->effectvalue >> 4;
+ depth = entry->effectvalue & 15;
+ if (speed == 0)
+ speed = channel->lastRspeed;
+ channel->lastRspeed = speed;
+ if (depth == 0)
+ depth = channel->lastRdepth;
+ channel->lastRdepth = depth;
+ }
+ for (i = -1; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ if (i < 0)
+ playing = channel->playing;
+ else {
+ playing = sigrenderer->playing[i];
+ if (!playing || playing->channel != channel)
+ continue;
+ }
+ if (playing) {
+ playing->tremolo_speed = speed;
+ playing->tremolo_depth = depth;
+ }
+ }
+ } break;
+ case IT_S: {
+ /* channel->lastS was set in update_pattern_variables(). */
+ unsigned char effectvalue = channel->lastS;
+ switch (effectvalue >> 4) {
+ // case IT_S_SET_FILTER:
+ /* Waveforms for commands S3x, S4x and S5x:
+ * 0: Sine wave
+ * 1: Ramp down
+ * 2: Square wave
+ * 3: Random wave
+ */
+ case IT_S_SET_GLISSANDO_CONTROL:
+ channel->glissando = effectvalue & 15;
+ break;
- case IT_S_FINETUNE:
- if (channel->playing) {
- channel->playing->finetune = ((int)(effectvalue & 15) - 8) << 5;
- }
- break;
+ case IT_S_FINETUNE:
+ if (channel->playing) {
+ channel->playing->finetune = ((int)(effectvalue & 15) - 8)
+ << 5;
+ }
+ break;
- case IT_S_SET_VIBRATO_WAVEFORM:
- {
- int waveform = effectvalue & 3;
- if (sigdata->flags & IT_WAS_A_MOD) waveform = mod_convert_vibrato[waveform];
- else if (sigdata->flags & IT_WAS_AN_XM) waveform = xm_convert_vibrato[waveform];
- channel->vibrato_waveform = waveform;
- if (channel->playing) {
- channel->playing->vibrato_waveform = waveform;
- if (!(effectvalue & 4))
- channel->playing->vibrato_time = 0;
- }
- }
- break;
- case IT_S_SET_TREMOLO_WAVEFORM:
- {
- int waveform = effectvalue & 3;
- if (sigdata->flags & IT_WAS_A_MOD) waveform = mod_convert_vibrato[waveform];
- else if (sigdata->flags & IT_WAS_AN_XM) waveform = xm_convert_vibrato[waveform];
- channel->tremolo_waveform = waveform;
- if (channel->playing) {
- channel->playing->tremolo_waveform = waveform;
- if (!(effectvalue & 4))
- channel->playing->tremolo_time = 0;
- }
- }
- break;
- case IT_S_SET_PANBRELLO_WAVEFORM:
- channel->panbrello_waveform = effectvalue & 3;
- if (channel->playing) {
- channel->playing->panbrello_waveform = effectvalue & 3;
- if (!(effectvalue & 4))
- channel->playing->panbrello_time = 0;
- }
- break;
+ case IT_S_SET_VIBRATO_WAVEFORM: {
+ int waveform = effectvalue & 3;
+ if (sigdata->flags & IT_WAS_A_MOD)
+ waveform = mod_convert_vibrato[waveform];
+ else if (sigdata->flags & IT_WAS_AN_XM)
+ waveform = xm_convert_vibrato[waveform];
+ channel->vibrato_waveform = waveform;
+ if (channel->playing) {
+ channel->playing->vibrato_waveform = waveform;
+ if (!(effectvalue & 4))
+ channel->playing->vibrato_time = 0;
+ }
+ } break;
+ case IT_S_SET_TREMOLO_WAVEFORM: {
+ int waveform = effectvalue & 3;
+ if (sigdata->flags & IT_WAS_A_MOD)
+ waveform = mod_convert_vibrato[waveform];
+ else if (sigdata->flags & IT_WAS_AN_XM)
+ waveform = xm_convert_vibrato[waveform];
+ channel->tremolo_waveform = waveform;
+ if (channel->playing) {
+ channel->playing->tremolo_waveform = waveform;
+ if (!(effectvalue & 4))
+ channel->playing->tremolo_time = 0;
+ }
+ } break;
+ case IT_S_SET_PANBRELLO_WAVEFORM:
+ channel->panbrello_waveform = effectvalue & 3;
+ if (channel->playing) {
+ channel->playing->panbrello_waveform = effectvalue & 3;
+ if (!(effectvalue & 4))
+ channel->playing->panbrello_time = 0;
+ }
+ break;
- case IT_S_FINE_PATTERN_DELAY:
- sigrenderer->tick += effectvalue & 15;
- break;
+ case IT_S_FINE_PATTERN_DELAY:
+ sigrenderer->tick += effectvalue & 15;
+ break;
#if 1
- case IT_S7:
- {
- if (sigrenderer->sigdata->flags & IT_USE_INSTRUMENTS)
- {
- int i;
- switch (effectvalue & 15)
- {
- case 0: /* cut background notes */
- for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++)
- {
- IT_PLAYING * playing = sigrenderer->playing[i];
- if (playing && channel == playing->channel)
- {
- playing->declick_stage = 3;
- if (channel->playing == playing) channel->playing = NULL;
- }
- }
- break;
- case 1: /* release background notes */
- for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++)
- {
- IT_PLAYING * playing = sigrenderer->playing[i];
- if (playing && channel == playing->channel && !(playing->flags & IT_PLAYING_SUSTAINOFF))
- {
- it_note_off(playing);
- }
- }
- break;
- case 2: /* fade background notes */
- for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++)
- {
- IT_PLAYING * playing = sigrenderer->playing[i];
- if (playing && channel == playing->channel)
- {
- //playing->flags &= IT_PLAYING_SUSTAINOFF;
- playing->flags |= IT_PLAYING_FADING;
- }
- }
- break;
- case 3:
- channel->new_note_action = NNA_NOTE_CUT;
- break;
- case 4:
- channel->new_note_action = NNA_NOTE_CONTINUE;
- break;
- case 5:
- channel->new_note_action = NNA_NOTE_OFF;
- break;
- case 6:
- channel->new_note_action = NNA_NOTE_FADE;
- break;
+ case IT_S7: {
+ if (sigrenderer->sigdata->flags & IT_USE_INSTRUMENTS) {
+ int i;
+ switch (effectvalue & 15) {
+ case 0: /* cut background notes */
+ for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ IT_PLAYING *playing = sigrenderer->playing[i];
+ if (playing && channel == playing->channel) {
+ playing->declick_stage = 3;
+ if (channel->playing == playing)
+ channel->playing = NULL;
+ }
+ }
+ break;
+ case 1: /* release background notes */
+ for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ IT_PLAYING *playing = sigrenderer->playing[i];
+ if (playing && channel == playing->channel &&
+ !(playing->flags & IT_PLAYING_SUSTAINOFF)) {
+ it_note_off(playing);
+ }
+ }
+ break;
+ case 2: /* fade background notes */
+ for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ IT_PLAYING *playing = sigrenderer->playing[i];
+ if (playing && channel == playing->channel) {
+ // playing->flags &= IT_PLAYING_SUSTAINOFF;
+ playing->flags |= IT_PLAYING_FADING;
+ }
+ }
+ break;
+ case 3:
+ channel->new_note_action = NNA_NOTE_CUT;
+ break;
+ case 4:
+ channel->new_note_action = NNA_NOTE_CONTINUE;
+ break;
+ case 5:
+ channel->new_note_action = NNA_NOTE_OFF;
+ break;
+ case 6:
+ channel->new_note_action = NNA_NOTE_FADE;
+ break;
- case 7:
- if (channel->playing)
- channel->playing->enabled_envelopes &= ~IT_ENV_VOLUME;
- break;
- case 8:
- if (channel->playing)
- channel->playing->enabled_envelopes |= IT_ENV_VOLUME;
- break;
+ case 7:
+ if (channel->playing)
+ channel->playing->enabled_envelopes &=
+ ~IT_ENV_VOLUME;
+ break;
+ case 8:
+ if (channel->playing)
+ channel->playing->enabled_envelopes |=
+ IT_ENV_VOLUME;
+ break;
- case 9:
- if (channel->playing)
- channel->playing->enabled_envelopes &= ~IT_ENV_PANNING;
- break;
- case 10:
- if (channel->playing)
- channel->playing->enabled_envelopes |= IT_ENV_PANNING;
- break;
+ case 9:
+ if (channel->playing)
+ channel->playing->enabled_envelopes &=
+ ~IT_ENV_PANNING;
+ break;
+ case 10:
+ if (channel->playing)
+ channel->playing->enabled_envelopes |=
+ IT_ENV_PANNING;
+ break;
- case 11:
- if (channel->playing)
- channel->playing->enabled_envelopes &= ~IT_ENV_PITCH;
- break;
- case 12:
- if (channel->playing)
- channel->playing->enabled_envelopes |= IT_ENV_PITCH;
- break;
- }
- }
- }
- break;
+ case 11:
+ if (channel->playing)
+ channel->playing->enabled_envelopes &=
+ ~IT_ENV_PITCH;
+ break;
+ case 12:
+ if (channel->playing)
+ channel->playing->enabled_envelopes |= IT_ENV_PITCH;
+ break;
+ }
+ }
+ } break;
#endif
- case IT_S_SET_PAN:
- //ASSERT(!(sigdata->flags & IT_WAS_AN_XM));
- channel->pan =
- ((effectvalue & 15) << 2) |
- ((effectvalue & 15) >> 2);
- channel->truepan = channel->pan << IT_ENVELOPE_SHIFT;
+ case IT_S_SET_PAN:
+ // ASSERT(!(sigdata->flags & IT_WAS_AN_XM));
+ channel->pan =
+ ((effectvalue & 15) << 2) | ((effectvalue & 15) >> 2);
+ channel->truepan = channel->pan << IT_ENVELOPE_SHIFT;
- if (channel->playing)
- channel->playing->panbrello_depth = 0;
- break;
- case IT_S_SET_SURROUND_SOUND:
- if ((effectvalue & 15) == 15) {
- if (channel->playing && channel->playing->sample &&
- !(channel->playing->sample->flags & (IT_SAMPLE_LOOP | IT_SAMPLE_SUS_LOOP))) {
- channel->playing->flags |= IT_PLAYING_REVERSE;
- it_playing_reset_resamplers( channel->playing, channel->playing->sample->length - 1 );
- }
- } else if ((effectvalue & 15) == 1) {
- channel->pan = IT_SURROUND;
- channel->truepan = channel->pan << IT_ENVELOPE_SHIFT;
- }
- if (channel->playing)
- channel->playing->panbrello_depth = 0;
- break;
- case IT_S_SET_HIGH_OFFSET:
- channel->high_offset = effectvalue & 15;
- break;
- //case IT_S_PATTERN_LOOP:
- case IT_S_DELAYED_NOTE_CUT:
- channel->note_cut_count = effectvalue & 15;
- if (!channel->note_cut_count) {
- if (sigdata->flags & (IT_WAS_AN_XM | IT_WAS_A_PTM))
- channel->volume = 0;
- else
- channel->note_cut_count = 1;
- }
- break;
- case IT_S_SET_MIDI_MACRO:
- if ((sigdata->flags & (IT_WAS_AN_XM | IT_WAS_A_MOD)) == (IT_WAS_AN_XM | IT_WAS_A_MOD)) {
- channel->inv_loop_speed = effectvalue & 15;
- update_invert_loop(channel, channel->playing ? channel->playing->sample : NULL);
- } else channel->SFmacro = effectvalue & 15;
- break;
- }
- }
- break;
- case IT_SET_SONG_TEMPO:
- {
- unsigned char v = entry->effectvalue;
- if (v == 0)
- v = channel->lastW;
- channel->lastW = v;
- if (v < 0x10)
- sigrenderer->temposlide = -v;
- else if (v < 0x20)
- sigrenderer->temposlide = v & 15;
- else
- sigrenderer->tempo = v;
- }
- break;
- case IT_FINE_VIBRATO:
- {
- unsigned char speed = entry->effectvalue >> 4;
- unsigned char depth = entry->effectvalue & 15;
- if (speed == 0)
- speed = channel->lastHspeed;
- channel->lastHspeed = speed;
- if (depth == 0)
- depth = channel->lastHdepth;
- else {
- if (sigdata->flags & IT_OLD_EFFECTS)
- depth <<= 1;
- channel->lastHdepth = depth;
- }
- for (i = -1; i < DUMB_IT_N_NNA_CHANNELS; i++) {
- if (i < 0) playing = channel->playing;
- else {
- playing = sigrenderer->playing[i];
- if (!playing || playing->channel != channel) continue;
- }
- if (playing) {
- playing->vibrato_speed = speed;
- playing->vibrato_depth = depth;
- playing->vibrato_n++;
- }
- }
- }
- break;
- case IT_SET_GLOBAL_VOLUME:
- if ((sigdata->flags & IT_WAS_AN_S3M) && (entry->effectvalue > 64))
- break;
- if (entry->effectvalue <= 128)
- sigrenderer->globalvolume = entry->effectvalue;
+ if (channel->playing)
+ channel->playing->panbrello_depth = 0;
+ break;
+ case IT_S_SET_SURROUND_SOUND:
+ if ((effectvalue & 15) == 15) {
+ if (channel->playing && channel->playing->sample &&
+ !(channel->playing->sample->flags &
+ (IT_SAMPLE_LOOP | IT_SAMPLE_SUS_LOOP))) {
+ channel->playing->flags |= IT_PLAYING_REVERSE;
+ it_playing_reset_resamplers(
+ channel->playing,
+ channel->playing->sample->length - 1);
+ }
+ } else if ((effectvalue & 15) == 1) {
+ channel->pan = IT_SURROUND;
+ channel->truepan = channel->pan << IT_ENVELOPE_SHIFT;
+ }
+ if (channel->playing)
+ channel->playing->panbrello_depth = 0;
+ break;
+ case IT_S_SET_HIGH_OFFSET:
+ channel->high_offset = effectvalue & 15;
+ break;
+ // case IT_S_PATTERN_LOOP:
+ case IT_S_DELAYED_NOTE_CUT:
+ channel->note_cut_count = effectvalue & 15;
+ if (!channel->note_cut_count) {
+ if (sigdata->flags & (IT_WAS_AN_XM | IT_WAS_A_PTM))
+ channel->volume = 0;
+ else
+ channel->note_cut_count = 1;
+ }
+ break;
+ case IT_S_SET_MIDI_MACRO:
+ if ((sigdata->flags & (IT_WAS_AN_XM | IT_WAS_A_MOD)) ==
+ (IT_WAS_AN_XM | IT_WAS_A_MOD)) {
+ channel->inv_loop_speed = effectvalue & 15;
+ update_invert_loop(channel, channel->playing
+ ? channel->playing->sample
+ : NULL);
+ } else
+ channel->SFmacro = effectvalue & 15;
+ break;
+ }
+ } break;
+ case IT_SET_SONG_TEMPO: {
+ unsigned char v = entry->effectvalue;
+ if (v == 0)
+ v = channel->lastW;
+ channel->lastW = v;
+ if (v < 0x10)
+ sigrenderer->temposlide = -v;
+ else if (v < 0x20)
+ sigrenderer->temposlide = v & 15;
+ else
+ sigrenderer->tempo = v;
+ } break;
+ case IT_FINE_VIBRATO: {
+ unsigned char speed = entry->effectvalue >> 4;
+ unsigned char depth = entry->effectvalue & 15;
+ if (speed == 0)
+ speed = channel->lastHspeed;
+ channel->lastHspeed = speed;
+ if (depth == 0)
+ depth = channel->lastHdepth;
+ else {
+ if (sigdata->flags & IT_OLD_EFFECTS)
+ depth <<= 1;
+ channel->lastHdepth = depth;
+ }
+ for (i = -1; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ if (i < 0)
+ playing = channel->playing;
+ else {
+ playing = sigrenderer->playing[i];
+ if (!playing || playing->channel != channel)
+ continue;
+ }
+ if (playing) {
+ playing->vibrato_speed = speed;
+ playing->vibrato_depth = depth;
+ playing->vibrato_n++;
+ }
+ }
+ } break;
+ case IT_SET_GLOBAL_VOLUME:
+ if ((sigdata->flags & IT_WAS_AN_S3M) && (entry->effectvalue > 64))
+ break;
+ if (entry->effectvalue <= 128)
+ sigrenderer->globalvolume = entry->effectvalue;
#ifdef VOLUME_OUT_OF_RANGE_SETS_MAXIMUM
- else
- sigrenderer->globalvolume = 128;
+ else
+ sigrenderer->globalvolume = 128;
#endif
- break;
- case IT_GLOBAL_VOLUME_SLIDE:
- {
- unsigned char v = entry->effectvalue;
- if (v == 0)
- v = channel->lastW;
- channel->lastW = v;
- if ((v & 0x0F) == 0) { /* Wx0 */
- sigrenderer->globalvolslide =
- (sigdata->flags & IT_WAS_AN_XM) ? (v >> 4)*2 : (v >> 4);
- } else if ((v & 0xF0) == 0) { /* W0x */
- sigrenderer->globalvolslide =
- (sigdata->flags & IT_WAS_AN_XM) ? (-v)*2 : (-v);
- } else if ((v & 0x0F) == 0x0F) { /* WxF */
- sigrenderer->globalvolume += v >> 4;
- if (sigrenderer->globalvolume > 128) sigrenderer->globalvolume = 128;
- } else if ((v & 0xF0) == 0xF0) { /* WFx */
- sigrenderer->globalvolume -= v & 15;
- if (sigrenderer->globalvolume > 128) sigrenderer->globalvolume = 0;
- }
- }
- break;
- case IT_SET_PANNING:
- if (sigdata->flags & IT_WAS_AN_XM) {
- channel->truepan = 32 + entry->effectvalue*64;
- } else {
- if (sigdata->flags & IT_WAS_AN_S3M)
- channel->pan = (entry->effectvalue + 1) >> 1;
- else
- channel->pan = (entry->effectvalue + 2) >> 2;
- channel->truepan = channel->pan << IT_ENVELOPE_SHIFT;
- }
- if (channel->playing)
- channel->playing->panbrello_depth = 0;
- break;
- case IT_PANBRELLO:
- {
- unsigned char speed = entry->effectvalue >> 4;
- unsigned char depth = entry->effectvalue & 15;
- if (speed == 0)
- speed = channel->lastYspeed;
- channel->lastYspeed = speed;
- if (depth == 0)
- depth = channel->lastYdepth;
- channel->lastYdepth = depth;
- if (channel->playing) {
- channel->playing->panbrello_speed = speed;
- channel->playing->panbrello_depth = depth;
- }
- }
- break;
- case IT_MIDI_MACRO:
- {
- const IT_MIDI *midi = sigdata->midi ? sigdata->midi : &default_midi;
- if (entry->effectvalue >= 0x80) {
- int n = midi->Zmacrolen[entry->effectvalue-0x80];
- int i;
- for (i = 0; i < n; i++)
- it_send_midi(sigrenderer, channel, midi->Zmacro[entry->effectvalue-0x80][i]);
- } else {
- int n = midi->SFmacrolen[channel->SFmacro];
- int i, j;
- for (i = 0, j = 1; i < n; i++, j <<= 1)
- it_send_midi(sigrenderer, channel,
- (unsigned char)(midi->SFmacroz[channel->SFmacro] & j ?
- entry->effectvalue : midi->SFmacro[channel->SFmacro][i]));
- }
- }
- break;
- case IT_XM_SET_ENVELOPE_POSITION:
- if (channel->playing && channel->playing->env_instrument) {
- IT_ENVELOPE *envelope = &channel->playing->env_instrument->volume_envelope;
- if (envelope->flags & IT_ENVELOPE_ON) {
- IT_PLAYING_ENVELOPE *pe = &channel->playing->volume_envelope;
- pe->tick = entry->effectvalue;
- if (pe->tick >= envelope->node_t[envelope->n_nodes-1])
- pe->tick = envelope->node_t[envelope->n_nodes-1];
- pe->next_node = 0;
- while (pe->tick > envelope->node_t[pe->next_node]) pe->next_node++;
- xm_envelope_calculate_value(envelope, pe);
- }
- }
- break;
+ break;
+ case IT_GLOBAL_VOLUME_SLIDE: {
+ unsigned char v = entry->effectvalue;
+ if (v == 0)
+ v = channel->lastW;
+ channel->lastW = v;
+ if ((v & 0x0F) == 0) { /* Wx0 */
+ sigrenderer->globalvolslide =
+ (sigdata->flags & IT_WAS_AN_XM) ? (v >> 4) * 2 : (v >> 4);
+ } else if ((v & 0xF0) == 0) { /* W0x */
+ sigrenderer->globalvolslide =
+ (sigdata->flags & IT_WAS_AN_XM) ? (-v) * 2 : (-v);
+ } else if ((v & 0x0F) == 0x0F) { /* WxF */
+ sigrenderer->globalvolume += v >> 4;
+ if (sigrenderer->globalvolume > 128)
+ sigrenderer->globalvolume = 128;
+ } else if ((v & 0xF0) == 0xF0) { /* WFx */
+ sigrenderer->globalvolume -= v & 15;
+ if (sigrenderer->globalvolume > 128)
+ sigrenderer->globalvolume = 0;
+ }
+ } break;
+ case IT_SET_PANNING:
+ if (sigdata->flags & IT_WAS_AN_XM) {
+ channel->truepan = 32 + entry->effectvalue * 64;
+ } else {
+ if (sigdata->flags & IT_WAS_AN_S3M)
+ channel->pan = (entry->effectvalue + 1) >> 1;
+ else
+ channel->pan = (entry->effectvalue + 2) >> 2;
+ channel->truepan = channel->pan << IT_ENVELOPE_SHIFT;
+ }
+ if (channel->playing)
+ channel->playing->panbrello_depth = 0;
+ break;
+ case IT_PANBRELLO: {
+ unsigned char speed = entry->effectvalue >> 4;
+ unsigned char depth = entry->effectvalue & 15;
+ if (speed == 0)
+ speed = channel->lastYspeed;
+ channel->lastYspeed = speed;
+ if (depth == 0)
+ depth = channel->lastYdepth;
+ channel->lastYdepth = depth;
+ if (channel->playing) {
+ channel->playing->panbrello_speed = speed;
+ channel->playing->panbrello_depth = depth;
+ }
+ } break;
+ case IT_MIDI_MACRO: {
+ const IT_MIDI *midi = sigdata->midi ? sigdata->midi : &default_midi;
+ if (entry->effectvalue >= 0x80) {
+ int n = midi->Zmacrolen[entry->effectvalue - 0x80];
+ int i;
+ for (i = 0; i < n; i++)
+ it_send_midi(sigrenderer, channel,
+ midi->Zmacro[entry->effectvalue - 0x80][i]);
+ } else {
+ int n = midi->SFmacrolen[channel->SFmacro];
+ int i, j;
+ for (i = 0, j = 1; i < n; i++, j <<= 1)
+ it_send_midi(
+ sigrenderer, channel,
+ (unsigned char)(midi->SFmacroz[channel->SFmacro] & j
+ ? entry->effectvalue
+ : midi->SFmacro[channel->SFmacro]
+ [i]));
+ }
+ } break;
+ case IT_XM_SET_ENVELOPE_POSITION:
+ if (channel->playing && channel->playing->env_instrument) {
+ IT_ENVELOPE *envelope =
+ &channel->playing->env_instrument->volume_envelope;
+ if (envelope->flags & IT_ENVELOPE_ON) {
+ IT_PLAYING_ENVELOPE *pe =
+ &channel->playing->volume_envelope;
+ pe->tick = entry->effectvalue;
+ if (pe->tick >= envelope->node_t[envelope->n_nodes - 1])
+ pe->tick = envelope->node_t[envelope->n_nodes - 1];
+ pe->next_node = 0;
+ while (pe->tick > envelope->node_t[pe->next_node])
+ pe->next_node++;
+ xm_envelope_calculate_value(envelope, pe);
+ }
+ }
+ break;
- /* uggly plain portamento for now */
- case IT_PTM_NOTE_SLIDE_DOWN:
- case IT_PTM_NOTE_SLIDE_DOWN_RETRIG:
- {
- channel->toneslide_retrig = (entry->effect == IT_PTM_NOTE_SLIDE_DOWN_RETRIG);
+ /* uggly plain portamento for now */
+ case IT_PTM_NOTE_SLIDE_DOWN:
+ case IT_PTM_NOTE_SLIDE_DOWN_RETRIG: {
+ channel->toneslide_retrig =
+ (entry->effect == IT_PTM_NOTE_SLIDE_DOWN_RETRIG);
- if (channel->ptm_last_toneslide) {
- channel->toneslide_tick = channel->last_toneslide_tick;
+ if (channel->ptm_last_toneslide) {
+ channel->toneslide_tick = channel->last_toneslide_tick;
- if (--channel->toneslide_tick == 0) {
- channel->truenote += channel->toneslide;
- if (channel->truenote >= 120) {
- if (channel->toneslide < 0) channel->truenote = 0;
- else channel->truenote = 119;
- }
- channel->note += channel->toneslide;
- if (channel->note >= 120) {
- if (channel->toneslide < 0) channel->note = 0;
- else channel->note = 119;
- }
+ if (--channel->toneslide_tick == 0) {
+ channel->truenote += channel->toneslide;
+ if (channel->truenote >= 120) {
+ if (channel->toneslide < 0)
+ channel->truenote = 0;
+ else
+ channel->truenote = 119;
+ }
+ channel->note += channel->toneslide;
+ if (channel->note >= 120) {
+ if (channel->toneslide < 0)
+ channel->note = 0;
+ else
+ channel->note = 119;
+ }
- if (channel->playing) {
- if (channel->sample) channel->playing->note = channel->truenote;
- else channel->playing->note = channel->note;
- it_playing_reset_resamplers(channel->playing, 0);
- channel->playing->declick_stage = 0;
- }
- }
- }
+ if (channel->playing) {
+ if (channel->sample)
+ channel->playing->note = channel->truenote;
+ else
+ channel->playing->note = channel->note;
+ it_playing_reset_resamplers(channel->playing, 0);
+ channel->playing->declick_stage = 0;
+ }
+ }
+ }
- channel->ptm_last_toneslide = 0;
+ channel->ptm_last_toneslide = 0;
- channel->toneslide = -(entry->effectvalue & 15);
- channel->ptm_toneslide = (entry->effectvalue & 0xF0) >> 4;
- channel->toneslide_tick += channel->ptm_toneslide;
- }
- break;
- case IT_PTM_NOTE_SLIDE_UP:
- case IT_PTM_NOTE_SLIDE_UP_RETRIG:
- {
- channel->toneslide_retrig = (entry->effect == IT_PTM_NOTE_SLIDE_UP_RETRIG);
+ channel->toneslide = -(entry->effectvalue & 15);
+ channel->ptm_toneslide = (entry->effectvalue & 0xF0) >> 4;
+ channel->toneslide_tick += channel->ptm_toneslide;
+ } break;
+ case IT_PTM_NOTE_SLIDE_UP:
+ case IT_PTM_NOTE_SLIDE_UP_RETRIG: {
+ channel->toneslide_retrig =
+ (entry->effect == IT_PTM_NOTE_SLIDE_UP_RETRIG);
- if (channel->ptm_last_toneslide) {
- channel->toneslide_tick = channel->last_toneslide_tick;
+ if (channel->ptm_last_toneslide) {
+ channel->toneslide_tick = channel->last_toneslide_tick;
- if (--channel->toneslide_tick == 0) {
- channel->truenote += channel->toneslide;
- if (channel->truenote >= 120) {
- if (channel->toneslide < 0) channel->truenote = 0;
- else channel->truenote = 119;
- }
- channel->note += channel->toneslide;
- if (channel->note >= 120) {
- if (channel->toneslide < 0) channel->note = 0;
- else channel->note = 119;
- }
+ if (--channel->toneslide_tick == 0) {
+ channel->truenote += channel->toneslide;
+ if (channel->truenote >= 120) {
+ if (channel->toneslide < 0)
+ channel->truenote = 0;
+ else
+ channel->truenote = 119;
+ }
+ channel->note += channel->toneslide;
+ if (channel->note >= 120) {
+ if (channel->toneslide < 0)
+ channel->note = 0;
+ else
+ channel->note = 119;
+ }
- if (channel->playing) {
- if (channel->sample) channel->playing->note = channel->truenote;
- else channel->playing->note = channel->note;
- it_playing_reset_resamplers(channel->playing, 0);
- channel->playing->declick_stage = 0;
- }
- }
- }
+ if (channel->playing) {
+ if (channel->sample)
+ channel->playing->note = channel->truenote;
+ else
+ channel->playing->note = channel->note;
+ it_playing_reset_resamplers(channel->playing, 0);
+ channel->playing->declick_stage = 0;
+ }
+ }
+ }
- channel->ptm_last_toneslide = 0;
+ channel->ptm_last_toneslide = 0;
- channel->toneslide = -(entry->effectvalue & 15);
- channel->ptm_toneslide = (entry->effectvalue & 0xF0) >> 4;
- channel->toneslide_tick += channel->ptm_toneslide;
- }
- break;
+ channel->toneslide = -(entry->effectvalue & 15);
+ channel->ptm_toneslide = (entry->effectvalue & 0xF0) >> 4;
+ channel->toneslide_tick += channel->ptm_toneslide;
+ } break;
- case IT_OKT_NOTE_SLIDE_DOWN:
- case IT_OKT_NOTE_SLIDE_DOWN_ROW:
- channel->toneslide = -entry->effectvalue;
- channel->okt_toneslide = (entry->effect == IT_OKT_NOTE_SLIDE_DOWN) ? 255 : 1;
- break;
+ case IT_OKT_NOTE_SLIDE_DOWN:
+ case IT_OKT_NOTE_SLIDE_DOWN_ROW:
+ channel->toneslide = -entry->effectvalue;
+ channel->okt_toneslide =
+ (entry->effect == IT_OKT_NOTE_SLIDE_DOWN) ? 255 : 1;
+ break;
- case IT_OKT_NOTE_SLIDE_UP:
- case IT_OKT_NOTE_SLIDE_UP_ROW:
- channel->toneslide = entry->effectvalue;
- channel->okt_toneslide = (entry->effect == IT_OKT_NOTE_SLIDE_UP) ? 255 : 1;
- break;
+ case IT_OKT_NOTE_SLIDE_UP:
+ case IT_OKT_NOTE_SLIDE_UP_ROW:
+ channel->toneslide = entry->effectvalue;
+ channel->okt_toneslide =
+ (entry->effect == IT_OKT_NOTE_SLIDE_UP) ? 255 : 1;
+ break;
- case IT_OKT_ARPEGGIO_3:
- case IT_OKT_ARPEGGIO_4:
- case IT_OKT_ARPEGGIO_5:
- {
- channel->arpeggio_offsets[0] = 0;
- channel->arpeggio_offsets[1] = -(entry->effectvalue >> 4);
- channel->arpeggio_offsets[2] = entry->effectvalue & 0x0F;
+ case IT_OKT_ARPEGGIO_3:
+ case IT_OKT_ARPEGGIO_4:
+ case IT_OKT_ARPEGGIO_5: {
+ channel->arpeggio_offsets[0] = 0;
+ channel->arpeggio_offsets[1] = -(entry->effectvalue >> 4);
+ channel->arpeggio_offsets[2] = entry->effectvalue & 0x0F;
- switch (entry->effect)
- {
- case IT_OKT_ARPEGGIO_3:
- channel->arpeggio_table = (const unsigned char *)&arpeggio_okt_3;
- break;
+ switch (entry->effect) {
+ case IT_OKT_ARPEGGIO_3:
+ channel->arpeggio_table =
+ (const unsigned char *)&arpeggio_okt_3;
+ break;
- case IT_OKT_ARPEGGIO_4:
- channel->arpeggio_table = (const unsigned char *)&arpeggio_okt_4;
- break;
+ case IT_OKT_ARPEGGIO_4:
+ channel->arpeggio_table =
+ (const unsigned char *)&arpeggio_okt_4;
+ break;
- case IT_OKT_ARPEGGIO_5:
- channel->arpeggio_table = (const unsigned char *)&arpeggio_okt_5;
- break;
- }
- }
- break;
+ case IT_OKT_ARPEGGIO_5:
+ channel->arpeggio_table =
+ (const unsigned char *)&arpeggio_okt_5;
+ break;
+ }
+ } break;
- case IT_OKT_VOLUME_SLIDE_DOWN:
- if ( entry->effectvalue <= 16 ) channel->volslide = -entry->effectvalue;
- else
- {
- channel->volume -= entry->effectvalue - 16;
- if (channel->volume > 64) channel->volume = 0;
- }
- break;
+ case IT_OKT_VOLUME_SLIDE_DOWN:
+ if (entry->effectvalue <= 16)
+ channel->volslide = -entry->effectvalue;
+ else {
+ channel->volume -= entry->effectvalue - 16;
+ if (channel->volume > 64)
+ channel->volume = 0;
+ }
+ break;
- case IT_OKT_VOLUME_SLIDE_UP:
- if ( entry->effectvalue <= 16 ) channel->volslide = entry->effectvalue;
- else
- {
- channel->volume += entry->effectvalue - 16;
- if (channel->volume > 64) channel->volume = 64;
- }
- break;
- }
- }
+ case IT_OKT_VOLUME_SLIDE_UP:
+ if (entry->effectvalue <= 16)
+ channel->volslide = entry->effectvalue;
+ else {
+ channel->volume += entry->effectvalue - 16;
+ if (channel->volume > 64)
+ channel->volume = 64;
+ }
+ break;
+ }
+ }
- if (!(sigdata->flags & IT_WAS_AN_XM))
- post_process_it_volpan(sigrenderer, entry);
+ if (!(sigdata->flags & IT_WAS_AN_XM))
+ post_process_it_volpan(sigrenderer, entry);
- return 0;
+ return 0;
}
+static int process_it_note_data(DUMB_IT_SIGRENDERER *sigrenderer,
+ IT_ENTRY *entry) {
+ DUMB_IT_SIGDATA *sigdata = sigrenderer->sigdata;
+ IT_CHANNEL *channel = &sigrenderer->channel[(int)entry->channel];
+ // When tone portamento and instrument are specified:
+ // If Gxx is off:
+ // - same sample, do nothing but portamento
+ // - diff sample, retrigger all but keep current note+slide + do porta
+ // - if instrument is invalid, nothing; if sample is invalid, cut
+ // If Gxx is on:
+ // - same sample or new sample invalid, retrigger envelopes and initialise
+ // note value for portamento to 'seek' to
+ // - diff sample/inst, start using new envelopes
+ // When tone portamento is specified alone, sample won't change.
+ // TODO: consider what happens with instrument alone after all this...
-static int process_it_note_data(DUMB_IT_SIGRENDERER *sigrenderer, IT_ENTRY *entry)
-{
- DUMB_IT_SIGDATA *sigdata = sigrenderer->sigdata;
- IT_CHANNEL *channel = &sigrenderer->channel[(int)entry->channel];
+ if (entry->mask & (IT_ENTRY_NOTE | IT_ENTRY_INSTRUMENT)) {
+ if (entry->mask & IT_ENTRY_INSTRUMENT)
+ channel->instrument = entry->instrument;
+ instrument_to_sample(sigdata, channel);
+ if (channel->note <= 120) {
+ if ((sigdata->flags & IT_USE_INSTRUMENTS) && channel->sample == 0)
+ it_retrigger_note(sigrenderer, channel);
+ /* Stop the note */ /*return 1;*/
+ if (entry->mask & IT_ENTRY_INSTRUMENT)
+ get_default_volpan(sigdata, channel);
+ } else
+ it_retrigger_note(sigrenderer, channel); /* Stop the note */
+ }
- // When tone portamento and instrument are specified:
- // If Gxx is off:
- // - same sample, do nothing but portamento
- // - diff sample, retrigger all but keep current note+slide + do porta
- // - if instrument is invalid, nothing; if sample is invalid, cut
- // If Gxx is on:
- // - same sample or new sample invalid, retrigger envelopes and initialise note value for portamento to 'seek' to
- // - diff sample/inst, start using new envelopes
- // When tone portamento is specified alone, sample won't change.
- // TODO: consider what happens with instrument alone after all this...
+ /** WARNING: This is not ideal, since channel->playing might not get
+ * allocated owing to lack of memory... */
+ if (((entry->mask & IT_ENTRY_VOLPAN) && entry->volpan >= 193 &&
+ entry->volpan <= 202) ||
+ ((entry->mask & IT_ENTRY_EFFECT) &&
+ (entry->effect == IT_TONE_PORTAMENTO ||
+ entry->effect == IT_VOLSLIDE_TONEPORTA))) {
+ if (channel->playing && (entry->mask & IT_ENTRY_INSTRUMENT)) {
+ if (sigdata->flags & IT_COMPATIBLE_GXX)
+ it_compatible_gxx_retrigger(sigdata, channel);
+ else if ((!(sigdata->flags & IT_USE_INSTRUMENTS) ||
+ (channel->instrument >= 1 &&
+ channel->instrument <= sigdata->n_instruments)) &&
+ channel->sample != channel->playing->sampnum) {
+ unsigned char note = channel->playing->note;
+ int slide = channel->playing->slide;
+ it_retrigger_note(sigrenderer, channel);
+ if (channel->playing) {
+ channel->playing->note = note;
+ channel->playing->slide = slide;
+ // Should we be preserving sample_vibrato_time? depth?
+ }
+ }
+ }
- if (entry->mask & (IT_ENTRY_NOTE | IT_ENTRY_INSTRUMENT)) {
- if (entry->mask & IT_ENTRY_INSTRUMENT)
- channel->instrument = entry->instrument;
- instrument_to_sample(sigdata, channel);
- if (channel->note <= 120) {
- if ((sigdata->flags & IT_USE_INSTRUMENTS) && channel->sample == 0)
- it_retrigger_note(sigrenderer, channel); /* Stop the note */ /*return 1;*/
- if (entry->mask & IT_ENTRY_INSTRUMENT)
- get_default_volpan(sigdata, channel);
- } else
- it_retrigger_note(sigrenderer, channel); /* Stop the note */
- }
+ channel->toneporta = 0;
- /** WARNING: This is not ideal, since channel->playing might not get allocated owing to lack of memory... */
- if (((entry->mask & IT_ENTRY_VOLPAN) && entry->volpan >= 193 && entry->volpan <= 202) ||
- ((entry->mask & IT_ENTRY_EFFECT) && (entry->effect == IT_TONE_PORTAMENTO || entry->effect == IT_VOLSLIDE_TONEPORTA)))
- {
- if (channel->playing && (entry->mask & IT_ENTRY_INSTRUMENT)) {
- if (sigdata->flags & IT_COMPATIBLE_GXX)
- it_compatible_gxx_retrigger(sigdata, channel);
- else if ((!(sigdata->flags & IT_USE_INSTRUMENTS) ||
- (channel->instrument >= 1 && channel->instrument <= sigdata->n_instruments)) &&
- channel->sample != channel->playing->sampnum)
- {
- unsigned char note = channel->playing->note;
- int slide = channel->playing->slide;
- it_retrigger_note(sigrenderer, channel);
- if (channel->playing) {
- channel->playing->note = note;
- channel->playing->slide = slide;
- // Should we be preserving sample_vibrato_time? depth?
- }
- }
- }
+ if ((entry->mask & IT_ENTRY_VOLPAN) && entry->volpan >= 193 &&
+ entry->volpan <= 202) {
+ /* Tone Portamento in the volume column */
+ static const unsigned char slidetable[] = {0, 1, 4, 8, 16,
+ 32, 64, 96, 128, 255};
+ unsigned char v = slidetable[entry->volpan - 193];
+ if (sigdata->flags & IT_COMPATIBLE_GXX) {
+ if (v == 0)
+ v = channel->lastG;
+ channel->lastG = v;
+ } else {
+ if (v == 0)
+ v = channel->lastEF;
+ channel->lastEF = v;
+ }
+ channel->toneporta += v << 4;
+ }
- channel->toneporta = 0;
+ if ((entry->mask & IT_ENTRY_EFFECT) &&
+ (entry->effect == IT_TONE_PORTAMENTO ||
+ entry->effect == IT_VOLSLIDE_TONEPORTA)) {
+ /* Tone Portamento in the effect column */
+ unsigned char v;
+ if (entry->effect == IT_TONE_PORTAMENTO)
+ v = entry->effectvalue;
+ else
+ v = 0;
+ if (sigdata->flags & IT_COMPATIBLE_GXX) {
+ if (v == 0)
+ v = channel->lastG;
+ channel->lastG = v;
+ } else {
+ if (v == 0 && !(sigdata->flags & IT_WAS_A_669))
+ v = channel->lastEF;
+ channel->lastEF = v;
+ }
+ channel->toneporta += v << 4;
+ }
- if ((entry->mask & IT_ENTRY_VOLPAN) && entry->volpan >= 193 && entry->volpan <= 202) {
- /* Tone Portamento in the volume column */
- static const unsigned char slidetable[] = {0, 1, 4, 8, 16, 32, 64, 96, 128, 255};
- unsigned char v = slidetable[entry->volpan - 193];
- if (sigdata->flags & IT_COMPATIBLE_GXX) {
- if (v == 0)
- v = channel->lastG;
- channel->lastG = v;
- } else {
- if (v == 0)
- v = channel->lastEF;
- channel->lastEF = v;
- }
- channel->toneporta += v << 4;
- }
+ if ((entry->mask & IT_ENTRY_NOTE) ||
+ ((sigdata->flags & IT_COMPATIBLE_GXX) &&
+ (entry->mask & IT_ENTRY_INSTRUMENT))) {
+ if (channel->note <= 120) {
+ if (channel->sample)
+ channel->destnote = channel->truenote;
+ else
+ channel->destnote = channel->note;
+ }
+ }
- if ((entry->mask & IT_ENTRY_EFFECT) && (entry->effect == IT_TONE_PORTAMENTO || entry->effect == IT_VOLSLIDE_TONEPORTA)) {
- /* Tone Portamento in the effect column */
- unsigned char v;
- if (entry->effect == IT_TONE_PORTAMENTO)
- v = entry->effectvalue;
- else
- v = 0;
- if (sigdata->flags & IT_COMPATIBLE_GXX) {
- if (v == 0)
- v = channel->lastG;
- channel->lastG = v;
- } else {
- if (v == 0 && !(sigdata->flags & IT_WAS_A_669))
- v = channel->lastEF;
- channel->lastEF = v;
- }
- channel->toneporta += v << 4;
- }
+ if (channel->playing)
+ goto skip_start_note;
+ }
- if ((entry->mask & IT_ENTRY_NOTE) || ((sigdata->flags & IT_COMPATIBLE_GXX) && (entry->mask & IT_ENTRY_INSTRUMENT))) {
- if (channel->note <= 120) {
- if (channel->sample)
- channel->destnote = channel->truenote;
- else
- channel->destnote = channel->note;
- }
- }
+ if ((entry->mask & IT_ENTRY_NOTE) ||
+ ((entry->mask & IT_ENTRY_INSTRUMENT) &&
+ (!channel->playing ||
+ entry->instrument != channel->playing->instnum))) {
+ if (channel->note <= 120) {
+ get_true_pan(sigdata, channel);
+ if ((entry->mask & IT_ENTRY_NOTE) ||
+ !(sigdata->flags & (IT_WAS_AN_S3M | IT_WAS_A_PTM)))
+ it_retrigger_note(sigrenderer, channel);
+ }
+ }
- if (channel->playing) goto skip_start_note;
- }
+skip_start_note:
- if ((entry->mask & IT_ENTRY_NOTE) ||
- ((entry->mask & IT_ENTRY_INSTRUMENT) && (!channel->playing || entry->instrument != channel->playing->instnum)))
- {
- if (channel->note <= 120) {
- get_true_pan(sigdata, channel);
- if ((entry->mask & IT_ENTRY_NOTE) || !(sigdata->flags & (IT_WAS_AN_S3M|IT_WAS_A_PTM)))
- it_retrigger_note(sigrenderer, channel);
- }
- }
-
- skip_start_note:
-
- if (entry->mask & IT_ENTRY_VOLPAN) {
- if (entry->volpan <= 64) {
- /* Volume */
- channel->volume = entry->volpan;
- } else if (entry->volpan <= 74) {
- /* Fine volume slide up */
- unsigned char v = entry->volpan - 65;
- if (v == 0)
- v = channel->lastvolslide;
- channel->lastvolslide = v;
- /* = effect DxF where x == entry->volpan - 65 */
- channel->volume += v;
- if (channel->volume > 64) channel->volume = 64;
- } else if (entry->volpan <= 84) {
- /* Fine volume slide down */
- unsigned char v = entry->volpan - 75;
- if (v == 0)
- v = channel->lastvolslide;
- channel->lastvolslide = v;
- /* = effect DFx where x == entry->volpan - 75 */
- channel->volume -= v;
- if (channel->volume > 64) channel->volume = 0;
- } else if (entry->volpan < 128) {
- /* Volume slide up */
- /* Volume slide down */
- /* Portamento down */
- /* Portamento up */
- } else if (entry->volpan <= 192) {
- /* Pan */
- channel->pan = entry->volpan - 128;
- channel->truepan = channel->pan << IT_ENVELOPE_SHIFT;
- }
- /* else */
- /* Tone Portamento */
- /* Vibrato */
- }
- return 0;
+ if (entry->mask & IT_ENTRY_VOLPAN) {
+ if (entry->volpan <= 64) {
+ /* Volume */
+ channel->volume = entry->volpan;
+ } else if (entry->volpan <= 74) {
+ /* Fine volume slide up */
+ unsigned char v = entry->volpan - 65;
+ if (v == 0)
+ v = channel->lastvolslide;
+ channel->lastvolslide = v;
+ /* = effect DxF where x == entry->volpan - 65 */
+ channel->volume += v;
+ if (channel->volume > 64)
+ channel->volume = 64;
+ } else if (entry->volpan <= 84) {
+ /* Fine volume slide down */
+ unsigned char v = entry->volpan - 75;
+ if (v == 0)
+ v = channel->lastvolslide;
+ channel->lastvolslide = v;
+ /* = effect DFx where x == entry->volpan - 75 */
+ channel->volume -= v;
+ if (channel->volume > 64)
+ channel->volume = 0;
+ } else if (entry->volpan < 128) {
+ /* Volume slide up */
+ /* Volume slide down */
+ /* Portamento down */
+ /* Portamento up */
+ } else if (entry->volpan <= 192) {
+ /* Pan */
+ channel->pan = entry->volpan - 128;
+ channel->truepan = channel->pan << IT_ENVELOPE_SHIFT;
+ }
+ /* else */
+ /* Tone Portamento */
+ /* Vibrato */
+ }
+ return 0;
}
-
-
-static void retrigger_xm_envelopes(IT_PLAYING *playing)
-{
- playing->volume_envelope.next_node = 0;
- playing->volume_envelope.tick = -1;
- playing->pan_envelope.next_node = 0;
- playing->pan_envelope.tick = -1;
- playing->fadeoutcount = 1024;
+static void retrigger_xm_envelopes(IT_PLAYING *playing) {
+ playing->volume_envelope.next_node = 0;
+ playing->volume_envelope.tick = -1;
+ playing->pan_envelope.next_node = 0;
+ playing->pan_envelope.tick = -1;
+ playing->fadeoutcount = 1024;
}
+static void process_xm_note_data(DUMB_IT_SIGRENDERER *sigrenderer,
+ IT_ENTRY *entry) {
+ DUMB_IT_SIGDATA *sigdata = sigrenderer->sigdata;
+ IT_CHANNEL *channel = &sigrenderer->channel[(int)entry->channel];
+ IT_PLAYING *playing = NULL;
+ if (entry->mask & IT_ENTRY_INSTRUMENT) {
+ int oldsample = channel->sample;
+ channel->inv_loop_offset = 0;
+ channel->instrument = entry->instrument;
+ instrument_to_sample(sigdata, channel);
+ if (channel->playing &&
+ !((entry->mask & IT_ENTRY_NOTE) && entry->note >= 120) &&
+ !((entry->mask & IT_ENTRY_EFFECT) &&
+ entry->effect == IT_XM_KEY_OFF && entry->effectvalue == 0)) {
+ playing = dup_playing(channel->playing, channel, channel);
+ if (!playing)
+ return;
+ if (!(sigdata->flags & IT_WAS_A_MOD)) {
+ /* Retrigger vol/pan envelopes if enabled, and cancel fadeout.
+ * Also reset vol/pan to that of _original_ instrument.
+ */
+ channel->playing->flags &=
+ ~(IT_PLAYING_SUSTAINOFF | IT_PLAYING_FADING);
+ it_playing_update_resamplers(channel->playing);
-static void process_xm_note_data(DUMB_IT_SIGRENDERER *sigrenderer, IT_ENTRY *entry)
-{
- DUMB_IT_SIGDATA *sigdata = sigrenderer->sigdata;
- IT_CHANNEL *channel = &sigrenderer->channel[(int)entry->channel];
- IT_PLAYING * playing = NULL;
+ channel->volume = channel->playing->sample->default_volume;
+ channel->truepan =
+ 32 + channel->playing->sample->default_pan * 64;
- if (entry->mask & IT_ENTRY_INSTRUMENT) {
- int oldsample = channel->sample;
- channel->inv_loop_offset = 0;
- channel->instrument = entry->instrument;
- instrument_to_sample(sigdata, channel);
- if (channel->playing &&
- !((entry->mask & IT_ENTRY_NOTE) && entry->note >= 120) &&
- !((entry->mask & IT_ENTRY_EFFECT) && entry->effect == IT_XM_KEY_OFF && entry->effectvalue == 0)) {
- playing = dup_playing(channel->playing, channel, channel);
- if (!playing) return;
- if (!(sigdata->flags & IT_WAS_A_MOD)) {
- /* Retrigger vol/pan envelopes if enabled, and cancel fadeout.
- * Also reset vol/pan to that of _original_ instrument.
- */
- channel->playing->flags &= ~(IT_PLAYING_SUSTAINOFF | IT_PLAYING_FADING);
- it_playing_update_resamplers(channel->playing);
+ retrigger_xm_envelopes(channel->playing);
+ } else {
+ /* Switch if sample changed */
+ if (oldsample != channel->sample) {
+ int i;
+ for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ if (!sigrenderer->playing[i]) {
+ channel->playing->declick_stage = 3;
+ sigrenderer->playing[i] = channel->playing;
+ channel->playing = NULL;
+ break;
+ }
+ }
- channel->volume = channel->playing->sample->default_volume;
- channel->truepan = 32 + channel->playing->sample->default_pan*64;
+ if (!channel->sample) {
+ if (channel->playing) {
+ free_playing(channel->playing);
+ channel->playing = NULL;
+ }
+ } else {
+ if (channel->playing) {
+ free_playing(channel->playing);
+ }
+ channel->playing = playing;
+ playing = NULL;
+ channel->playing->declick_stage = 0;
+ channel->playing->sampnum = channel->sample;
+ channel->playing->sample =
+ &sigdata->sample[channel->sample - 1];
+ it_playing_reset_resamplers(channel->playing, 0);
+ }
+ }
+ get_default_volpan(sigdata, channel);
+ }
+ }
+ }
- retrigger_xm_envelopes(channel->playing);
- } else {
- /* Switch if sample changed */
- if (oldsample != channel->sample) {
- int i;
- for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
- if (!sigrenderer->playing[i]) {
- channel->playing->declick_stage = 3;
- sigrenderer->playing[i] = channel->playing;
- channel->playing = NULL;
- break;
- }
- }
+ if (!((entry->mask & IT_ENTRY_EFFECT) && entry->effect == IT_XM_KEY_OFF &&
+ entry->effectvalue == 0) &&
+ (entry->mask & IT_ENTRY_NOTE)) {
+ if (!(entry->mask & IT_ENTRY_INSTRUMENT))
+ instrument_to_sample(sigdata, channel);
- if (!channel->sample) {
- if (channel->playing)
- {
- free_playing(channel->playing);
- channel->playing = NULL;
- }
- } else {
- if (channel->playing) {
- free_playing(channel->playing);
- }
- channel->playing = playing;
- playing = NULL;
- channel->playing->declick_stage = 0;
- channel->playing->sampnum = channel->sample;
- channel->playing->sample = &sigdata->sample[channel->sample-1];
- it_playing_reset_resamplers(channel->playing, 0);
- }
- }
- get_default_volpan(sigdata, channel);
- }
- }
- }
+ if (channel->note >= 120)
+ xm_note_off(sigdata, channel);
+ else if (channel->sample == 0) {
+ /** If we get here, one of the following is the case:
+ ** 1. The instrument has never been specified on this channel.
+ ** 2. The specified instrument is invalid.
+ ** 3. The instrument has no sample mapped to the selected note.
+ ** What should happen?
+ **
+ ** Experimentation shows that any existing note stops and cannot
+ ** be brought back. A subsequent instrument change fixes that.
+ **/
+ if (channel->playing) {
+ int i;
+ if (playing) {
+ free_playing(channel->playing);
+ channel->playing = playing;
+ playing = NULL;
+ }
+ for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ if (!sigrenderer->playing[i]) {
+ channel->playing->declick_stage = 3;
+ sigrenderer->playing[i] = channel->playing;
+ channel->playing = NULL;
+ break;
+ }
+ }
+ if (channel->playing) {
+ free_playing(channel->playing);
+ channel->playing = NULL;
+ }
+ }
+ if (playing)
+ free_playing(playing);
+ return;
+ } else if (channel->playing && (entry->mask & IT_ENTRY_VOLPAN) &&
+ ((entry->volpan >> 4) == 0xF)) {
+ /* Don't retrigger note; portamento in the volume column. */
+ } else if (channel->playing && (entry->mask & IT_ENTRY_EFFECT) &&
+ (entry->effect == IT_TONE_PORTAMENTO ||
+ entry->effect == IT_VOLSLIDE_TONEPORTA)) {
+ /* Don't retrigger note; portamento in the effects column. */
+ } else {
+ channel->destnote = IT_NOTE_OFF;
- if (!((entry->mask & IT_ENTRY_EFFECT) && entry->effect == IT_XM_KEY_OFF && entry->effectvalue == 0) &&
- (entry->mask & IT_ENTRY_NOTE))
- {
- if (!(entry->mask & IT_ENTRY_INSTRUMENT))
- instrument_to_sample(sigdata, channel);
+ if (!channel->playing) {
+ channel->playing = new_playing();
+ if (!channel->playing) {
+ if (playing)
+ free_playing(playing);
+ return;
+ }
+ // Adding the following seems to do the trick for the case where
+ // a piece starts with an instrument alone and then some notes
+ // alone.
+ retrigger_xm_envelopes(channel->playing);
+ } else if (playing) {
+ /* volume rampy stuff! move note to NNA */
+ int i;
+ IT_PLAYING *ptemp;
+ if (playing->sample)
+ ptemp = playing;
+ else
+ ptemp = channel->playing;
+ if (!ptemp) {
+ if (playing)
+ free_playing(playing);
+ return;
+ }
+ playing = NULL;
+ for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ if (!sigrenderer->playing[i]) {
+ ptemp->declick_stage = 3;
+ ptemp->flags |=
+ IT_PLAYING_SUSTAINOFF | IT_PLAYING_FADING;
+ sigrenderer->playing[i] = ptemp;
+ ptemp = NULL;
+ break;
+ }
+ }
+ if (ptemp)
+ free_playing(ptemp);
+ }
- if (channel->note >= 120)
- xm_note_off(sigdata, channel);
- else if (channel->sample == 0) {
- /** If we get here, one of the following is the case:
- ** 1. The instrument has never been specified on this channel.
- ** 2. The specified instrument is invalid.
- ** 3. The instrument has no sample mapped to the selected note.
- ** What should happen?
- **
- ** Experimentation shows that any existing note stops and cannot
- ** be brought back. A subsequent instrument change fixes that.
- **/
- if (channel->playing) {
- int i;
- if (playing) {
- free_playing(channel->playing);
- channel->playing = playing;
- playing = NULL;
- }
- for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
- if (!sigrenderer->playing[i]) {
- channel->playing->declick_stage = 3;
- sigrenderer->playing[i] = channel->playing;
- channel->playing = NULL;
- break;
- }
- }
- if (channel->playing) {
- free_playing(channel->playing);
- channel->playing = NULL;
- }
- }
- if (playing) free_playing(playing);
- return;
- } else if (channel->playing && (entry->mask & IT_ENTRY_VOLPAN) && ((entry->volpan>>4) == 0xF)) {
- /* Don't retrigger note; portamento in the volume column. */
- } else if (channel->playing &&
- (entry->mask & IT_ENTRY_EFFECT) &&
- (entry->effect == IT_TONE_PORTAMENTO ||
- entry->effect == IT_VOLSLIDE_TONEPORTA)) {
- /* Don't retrigger note; portamento in the effects column. */
- } else {
- channel->destnote = IT_NOTE_OFF;
+ channel->playing->flags = 0;
+ channel->playing->resampling_quality =
+ sigrenderer->resampling_quality;
+ channel->playing->channel = channel;
+ channel->playing->sample = &sigdata->sample[channel->sample - 1];
+ if (sigdata->flags & IT_USE_INSTRUMENTS)
+ channel->playing->instrument =
+ &sigdata->instrument[channel->instrument - 1];
+ else
+ channel->playing->instrument = NULL;
+ channel->playing->env_instrument = channel->playing->instrument;
+ channel->playing->sampnum = channel->sample;
+ channel->playing->instnum = channel->instrument;
+ channel->playing->declick_stage = 0;
+ channel->playing->channel_volume = channel->channelvolume;
+ channel->playing->note = channel->truenote;
+ channel->playing->enabled_envelopes = 0;
+ channel->playing->volume_offset = 0;
+ channel->playing->panning_offset = 0;
+ // channel->playing->output = channel->output;
+ if (sigdata->flags & IT_USE_INSTRUMENTS) {
+ IT_PLAYING *playing = channel->playing;
+ IT_INSTRUMENT *instrument = playing->instrument;
+ if (instrument->volume_envelope.flags & IT_ENVELOPE_ON)
+ playing->enabled_envelopes |= IT_ENV_VOLUME;
+ if (instrument->pan_envelope.flags & IT_ENVELOPE_ON)
+ playing->enabled_envelopes |= IT_ENV_PANNING;
+ // if (instrument->output) playing->output = instrument->output;
+ }
+ channel->playing->filter_cutoff = 127;
+ channel->playing->filter_resonance = 0;
+ channel->playing->true_filter_cutoff = 127 << 8;
+ channel->playing->true_filter_resonance = 0;
+ channel->playing->vibrato_speed = 0;
+ channel->playing->vibrato_depth = 0;
+ channel->playing->vibrato_n = 0;
+ channel->playing->vibrato_time = 0;
+ channel->playing->vibrato_waveform = 0;
+ channel->playing->tremolo_speed = 0;
+ channel->playing->tremolo_depth = 0;
+ channel->playing->tremolo_time = 0;
+ channel->playing->tremolo_waveform = 0;
+ channel->playing->panbrello_speed = 0;
+ channel->playing->panbrello_depth = 0;
+ channel->playing->panbrello_time = 0;
+ channel->playing->panbrello_waveform = 0;
+ channel->playing->panbrello_random = 0;
+ channel->playing->sample_vibrato_time = 0;
+ channel->playing->sample_vibrato_waveform =
+ channel->playing->sample->vibrato_waveform;
+ channel->playing->sample_vibrato_depth = 0;
+ channel->playing->slide = 0;
+ channel->playing->finetune = channel->playing->sample->finetune;
+ it_reset_filter_state(
+ &channel->playing->filter_state[0]); // Are these
+ it_reset_filter_state(
+ &channel->playing->filter_state[1]); // necessary?
+ it_playing_reset_resamplers(channel->playing, 0);
- if (!channel->playing) {
- channel->playing = new_playing();
- if (!channel->playing) {
- if (playing) free_playing(playing);
- return;
- }
- // Adding the following seems to do the trick for the case where a piece starts with an instrument alone and then some notes alone.
- retrigger_xm_envelopes(channel->playing);
- }
- else if (playing) {
- /* volume rampy stuff! move note to NNA */
- int i;
- IT_PLAYING * ptemp;
- if (playing->sample) ptemp = playing;
- else ptemp = channel->playing;
- if (!ptemp) {
- if (playing) free_playing(playing);
- return;
- }
- playing = NULL;
- for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
- if (!sigrenderer->playing[i]) {
- ptemp->declick_stage = 3;
- ptemp->flags |= IT_PLAYING_SUSTAINOFF | IT_PLAYING_FADING;
- sigrenderer->playing[i] = ptemp;
- ptemp = NULL;
- break;
- }
- }
- if (ptemp) free_playing(ptemp);
- }
+ /** WARNING - is everything initialised? */
+ }
+ }
- channel->playing->flags = 0;
- channel->playing->resampling_quality = sigrenderer->resampling_quality;
- channel->playing->channel = channel;
- channel->playing->sample = &sigdata->sample[channel->sample-1];
- if (sigdata->flags & IT_USE_INSTRUMENTS)
- channel->playing->instrument = &sigdata->instrument[channel->instrument-1];
- else
- channel->playing->instrument = NULL;
- channel->playing->env_instrument = channel->playing->instrument;
- channel->playing->sampnum = channel->sample;
- channel->playing->instnum = channel->instrument;
- channel->playing->declick_stage = 0;
- channel->playing->channel_volume = channel->channelvolume;
- channel->playing->note = channel->truenote;
- channel->playing->enabled_envelopes = 0;
- channel->playing->volume_offset = 0;
- channel->playing->panning_offset = 0;
- //channel->playing->output = channel->output;
- if (sigdata->flags & IT_USE_INSTRUMENTS) {
- IT_PLAYING * playing = channel->playing;
- IT_INSTRUMENT * instrument = playing->instrument;
- if (instrument->volume_envelope.flags & IT_ENVELOPE_ON) playing->enabled_envelopes |= IT_ENV_VOLUME;
- if (instrument->pan_envelope.flags & IT_ENVELOPE_ON) playing->enabled_envelopes |= IT_ENV_PANNING;
- //if (instrument->output) playing->output = instrument->output;
- }
- channel->playing->filter_cutoff = 127;
- channel->playing->filter_resonance = 0;
- channel->playing->true_filter_cutoff = 127 << 8;
- channel->playing->true_filter_resonance = 0;
- channel->playing->vibrato_speed = 0;
- channel->playing->vibrato_depth = 0;
- channel->playing->vibrato_n = 0;
- channel->playing->vibrato_time = 0;
- channel->playing->vibrato_waveform = 0;
- channel->playing->tremolo_speed = 0;
- channel->playing->tremolo_depth = 0;
- channel->playing->tremolo_time = 0;
- channel->playing->tremolo_waveform = 0;
- channel->playing->panbrello_speed = 0;
- channel->playing->panbrello_depth = 0;
- channel->playing->panbrello_time = 0;
- channel->playing->panbrello_waveform = 0;
- channel->playing->panbrello_random = 0;
- channel->playing->sample_vibrato_time = 0;
- channel->playing->sample_vibrato_waveform = channel->playing->sample->vibrato_waveform;
- channel->playing->sample_vibrato_depth = 0;
- channel->playing->slide = 0;
- channel->playing->finetune = channel->playing->sample->finetune;
- it_reset_filter_state(&channel->playing->filter_state[0]); // Are these
- it_reset_filter_state(&channel->playing->filter_state[1]); // necessary?
- it_playing_reset_resamplers(channel->playing, 0);
+ if (!((entry->mask & IT_ENTRY_EFFECT) && entry->effect == IT_XM_KEY_OFF &&
+ entry->effectvalue == 0) &&
+ !((entry->mask & IT_ENTRY_NOTE) && entry->note >= 120) &&
+ (entry->mask & (IT_ENTRY_NOTE | IT_ENTRY_INSTRUMENT)) ==
+ (IT_ENTRY_NOTE | IT_ENTRY_INSTRUMENT)) {
+ if (channel->playing)
+ retrigger_xm_envelopes(channel->playing);
+ get_default_volpan(sigdata, channel);
+ }
- /** WARNING - is everything initialised? */
- }
- }
+ if ((entry->mask & IT_ENTRY_VOLPAN) && ((entry->volpan >> 4) == 0xF)) {
+ /* Tone Portamento */
+ unsigned char v = (entry->volpan & 15) << 4;
+ if (v == 0)
+ v = channel->lastG;
+ channel->lastG = v;
+ if (entry->mask & IT_ENTRY_NOTE)
+ if (channel->sample && channel->note < 120)
+ channel->destnote = channel->truenote;
+ channel->toneporta = v << 4;
+ } else if ((entry->mask & IT_ENTRY_EFFECT) &&
+ (entry->effect == IT_TONE_PORTAMENTO ||
+ entry->effect == IT_VOLSLIDE_TONEPORTA)) {
+ unsigned char v;
+ if (entry->effect == IT_TONE_PORTAMENTO)
+ v = entry->effectvalue;
+ else
+ v = 0;
+ if (v == 0)
+ v = channel->lastG;
+ channel->lastG = v;
+ if (entry->mask & IT_ENTRY_NOTE)
+ if (channel->sample && channel->note < 120)
+ channel->destnote = channel->truenote;
+ channel->toneporta = v << 4;
+ }
- if (!((entry->mask & IT_ENTRY_EFFECT) && entry->effect == IT_XM_KEY_OFF && entry->effectvalue == 0) &&
- !((entry->mask & IT_ENTRY_NOTE) && entry->note >= 120) &&
- (entry->mask & (IT_ENTRY_NOTE | IT_ENTRY_INSTRUMENT)) == (IT_ENTRY_NOTE | IT_ENTRY_INSTRUMENT))
- {
- if (channel->playing) retrigger_xm_envelopes(channel->playing);
- get_default_volpan(sigdata, channel);
- }
+ if (entry->mask & IT_ENTRY_VOLPAN) {
+ int effect = entry->volpan >> 4;
+ int value = entry->volpan & 15;
+ switch (effect) {
+ case 0x6: /* Volume slide down */
+ channel->xm_volslide = -value;
+ break;
+ case 0x7: /* Volume slide up */
+ channel->xm_volslide = value;
+ break;
+ case 0x8: /* Fine volume slide down */
+ channel->volume -= value;
+ if (channel->volume > 64)
+ channel->volume = 0;
+ break;
+ case 0x9: /* Fine volume slide up */
+ channel->volume += value;
+ if (channel->volume > 64)
+ channel->volume = 64;
+ break;
+ case 0xA: /* Set vibrato speed */
+ if (value)
+ channel->lastHspeed = value;
+ if (channel->playing)
+ channel->playing->vibrato_speed = channel->lastHspeed;
+ break;
+ case 0xB: /* Vibrato */
+ if (value)
+ channel->lastHdepth = value << 2; /** WARNING: correct ? */
+ if (channel->playing) {
+ channel->playing->vibrato_depth = channel->lastHdepth;
+ channel->playing->vibrato_speed = channel->lastHspeed;
+ channel->playing->vibrato_n++;
+ }
+ break;
+ case 0xC: /* Set panning */
+ channel->truepan = 32 + value * (17 * 64);
+ break;
+ case 0xD: /* Pan slide left */
+ /* -128 is a special case for emulating a 'feature' in FT2.
+ * As soon as effects are processed, it goes hard left.
+ */
+ channel->panslide = value ? -value : -128;
+ break;
+ case 0xE: /* Pan slide Right */
+ channel->panslide = value;
+ break;
+ case 0xF: /* Tone porta */
+ break;
+ default: /* Volume */
+ channel->volume = entry->volpan - 0x10;
+ break;
+ }
+ }
- if ((entry->mask & IT_ENTRY_VOLPAN) && ((entry->volpan>>4) == 0xF)) {
- /* Tone Portamento */
- unsigned char v = (entry->volpan & 15) << 4;
- if (v == 0)
- v = channel->lastG;
- channel->lastG = v;
- if (entry->mask & IT_ENTRY_NOTE)
- if (channel->sample && channel->note < 120)
- channel->destnote = channel->truenote;
- channel->toneporta = v << 4;
- } else if ((entry->mask & IT_ENTRY_EFFECT) &&
- (entry->effect == IT_TONE_PORTAMENTO ||
- entry->effect == IT_VOLSLIDE_TONEPORTA)) {
- unsigned char v;
- if (entry->effect == IT_TONE_PORTAMENTO)
- v = entry->effectvalue;
- else
- v = 0;
- if (v == 0)
- v = channel->lastG;
- channel->lastG = v;
- if (entry->mask & IT_ENTRY_NOTE)
- if (channel->sample && channel->note < 120)
- channel->destnote = channel->truenote;
- channel->toneporta = v << 4;
- }
-
- if (entry->mask & IT_ENTRY_VOLPAN) {
- int effect = entry->volpan >> 4;
- int value = entry->volpan & 15;
- switch (effect) {
- case 0x6: /* Volume slide down */
- channel->xm_volslide = -value;
- break;
- case 0x7: /* Volume slide up */
- channel->xm_volslide = value;
- break;
- case 0x8: /* Fine volume slide down */
- channel->volume -= value;
- if (channel->volume > 64) channel->volume = 0;
- break;
- case 0x9: /* Fine volume slide up */
- channel->volume += value;
- if (channel->volume > 64) channel->volume = 64;
- break;
- case 0xA: /* Set vibrato speed */
- if (value)
- channel->lastHspeed = value;
- if (channel->playing)
- channel->playing->vibrato_speed = channel->lastHspeed;
- break;
- case 0xB: /* Vibrato */
- if (value)
- channel->lastHdepth = value << 2; /** WARNING: correct ? */
- if (channel->playing) {
- channel->playing->vibrato_depth = channel->lastHdepth;
- channel->playing->vibrato_speed = channel->lastHspeed;
- channel->playing->vibrato_n++;
- }
- break;
- case 0xC: /* Set panning */
- channel->truepan = 32 + value*(17*64);
- break;
- case 0xD: /* Pan slide left */
- /* -128 is a special case for emulating a 'feature' in FT2.
- * As soon as effects are processed, it goes hard left.
- */
- channel->panslide = value ? -value : -128;
- break;
- case 0xE: /* Pan slide Right */
- channel->panslide = value;
- break;
- case 0xF: /* Tone porta */
- break;
- default: /* Volume */
- channel->volume = entry->volpan - 0x10;
- break;
- }
- }
-
- if (playing) free_playing(playing);
+ if (playing)
+ free_playing(playing);
}
-
-
/* This function assumes !IT_IS_END_ROW(entry). */
-static int process_note_data(DUMB_IT_SIGRENDERER *sigrenderer, IT_ENTRY *entry, int ignore_cxx)
-{
- DUMB_IT_SIGDATA *sigdata = sigrenderer->sigdata;
+static int process_note_data(DUMB_IT_SIGRENDERER *sigrenderer, IT_ENTRY *entry,
+ int ignore_cxx) {
+ DUMB_IT_SIGDATA *sigdata = sigrenderer->sigdata;
- if (sigdata->flags & IT_WAS_AN_XM)
- process_xm_note_data(sigrenderer, entry);
- else
- if (process_it_note_data(sigrenderer, entry)) return 0;
+ if (sigdata->flags & IT_WAS_AN_XM)
+ process_xm_note_data(sigrenderer, entry);
+ else if (process_it_note_data(sigrenderer, entry))
+ return 0;
- return process_effects(sigrenderer, entry, ignore_cxx);
+ return process_effects(sigrenderer, entry, ignore_cxx);
}
+static int process_entry(DUMB_IT_SIGRENDERER *sigrenderer, IT_ENTRY *entry,
+ int ignore_cxx) {
+ IT_CHANNEL *channel = &sigrenderer->channel[(int)entry->channel];
+ if (entry->mask & IT_ENTRY_NOTE)
+ channel->note = entry->note;
-static int process_entry(DUMB_IT_SIGRENDERER *sigrenderer, IT_ENTRY *entry, int ignore_cxx)
-{
- IT_CHANNEL *channel = &sigrenderer->channel[(int)entry->channel];
+ if ((entry->mask & (IT_ENTRY_NOTE | IT_ENTRY_EFFECT)) &&
+ (sigrenderer->sigdata->flags & IT_WAS_A_669)) {
+ reset_channel_effects(channel);
+ // XXX unknown
+ if (channel->playing)
+ channel->playing->finetune = 0;
+ }
- if (entry->mask & IT_ENTRY_NOTE)
- channel->note = entry->note;
+ if ((entry->mask & IT_ENTRY_EFFECT) && entry->effect == IT_S) {
+ /* channel->lastS was set in update_pattern_variables(). */
+ unsigned char effectvalue = channel->lastS;
+ if (effectvalue >> 4 == IT_S_NOTE_DELAY) {
+ channel->note_delay_count = effectvalue & 15;
+ if (channel->note_delay_count == 0)
+ channel->note_delay_count = 1;
+ channel->note_delay_entry = entry;
+ return 0;
+ }
+ }
- if ((entry->mask & (IT_ENTRY_NOTE|IT_ENTRY_EFFECT)) && (sigrenderer->sigdata->flags & IT_WAS_A_669)) {
- reset_channel_effects(channel);
- // XXX unknown
- if (channel->playing) channel->playing->finetune = 0;
- }
-
- if ((entry->mask & IT_ENTRY_EFFECT) && entry->effect == IT_S) {
- /* channel->lastS was set in update_pattern_variables(). */
- unsigned char effectvalue = channel->lastS;
- if (effectvalue >> 4 == IT_S_NOTE_DELAY) {
- channel->note_delay_count = effectvalue & 15;
- if (channel->note_delay_count == 0)
- channel->note_delay_count = 1;
- channel->note_delay_entry = entry;
- return 0;
- }
- }
-
- return process_note_data(sigrenderer, entry, ignore_cxx);
+ return process_note_data(sigrenderer, entry, ignore_cxx);
}
+static void update_tick_counts(DUMB_IT_SIGRENDERER *sigrenderer) {
+ int i;
+ for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
+ IT_CHANNEL *channel = &sigrenderer->channel[i];
-static void update_tick_counts(DUMB_IT_SIGRENDERER *sigrenderer)
-{
- int i;
-
- for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
- IT_CHANNEL *channel = &sigrenderer->channel[i];
-
- if (channel->key_off_count) {
- channel->key_off_count--;
- if (channel->key_off_count == 0)
- xm_note_off(sigrenderer->sigdata, channel);
- } else if (channel->note_cut_count) {
- channel->note_cut_count--;
- if (channel->note_cut_count == 0) {
- if (sigrenderer->sigdata->flags & (IT_WAS_AN_XM | IT_WAS_A_PTM))
- channel->volume = 0;
- else if (channel->playing) {
- int i;
- for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
- if (!sigrenderer->playing[i]) {
- channel->playing->declick_stage = 3;
- sigrenderer->playing[i] = channel->playing;
- channel->playing = NULL;
- break;
- }
- }
- if (channel->playing) {
- free_playing(channel->playing);
- channel->playing = NULL;
- }
- }
- }
- } else if (channel->note_delay_count && channel->note_delay_entry) {
- channel->note_delay_count--;
- if (channel->note_delay_count == 0)
- process_note_data(sigrenderer, channel->note_delay_entry, 0);
- /* Don't bother checking the return value; if the note
- * was delayed, there can't have been a speed=0.
- */
- }
- }
-}
+ if (channel->key_off_count) {
+ channel->key_off_count--;
+ if (channel->key_off_count == 0)
+ xm_note_off(sigrenderer->sigdata, channel);
+ } else if (channel->note_cut_count) {
+ channel->note_cut_count--;
+ if (channel->note_cut_count == 0) {
+ if (sigrenderer->sigdata->flags & (IT_WAS_AN_XM | IT_WAS_A_PTM))
+ channel->volume = 0;
+ else if (channel->playing) {
+ int i;
+ for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ if (!sigrenderer->playing[i]) {
+ channel->playing->declick_stage = 3;
+ sigrenderer->playing[i] = channel->playing;
+ channel->playing = NULL;
+ break;
+ }
+ }
+ if (channel->playing) {
+ free_playing(channel->playing);
+ channel->playing = NULL;
+ }
+ }
+ }
+ } else if (channel->note_delay_count && channel->note_delay_entry) {
+ channel->note_delay_count--;
+ if (channel->note_delay_count == 0)
+ process_note_data(sigrenderer, channel->note_delay_entry, 0);
+ /* Don't bother checking the return value; if the note
+ * was delayed, there can't have been a speed=0.
+ */
+ }
+ }
+}
-
-
-static int envelope_get_y(IT_ENVELOPE *envelope, IT_PLAYING_ENVELOPE *pe)
-{
+static int envelope_get_y(IT_ENVELOPE *envelope, IT_PLAYING_ENVELOPE *pe) {
#if 1
- (void)envelope; //TODO: remove the parameter
- return pe->value;
+ (void)envelope; // TODO: remove the parameter
+ return pe->value;
#else
- int ys, ye;
- int ts, te;
- int t;
+ int ys, ye;
+ int ts, te;
+ int t;
- if (pe->next_node <= 0)
- return envelope->node_y[0] << IT_ENVELOPE_SHIFT;
+ if (pe->next_node <= 0)
+ return envelope->node_y[0] << IT_ENVELOPE_SHIFT;
- if (pe->next_node >= envelope->n_nodes)
- return envelope->node_y[envelope->n_nodes-1] << IT_ENVELOPE_SHIFT;
+ if (pe->next_node >= envelope->n_nodes)
+ return envelope->node_y[envelope->n_nodes - 1] << IT_ENVELOPE_SHIFT;
- ys = envelope->node_y[pe->next_node-1] << IT_ENVELOPE_SHIFT;
- ts = envelope->node_t[pe->next_node-1];
- te = envelope->node_t[pe->next_node];
+ ys = envelope->node_y[pe->next_node - 1] << IT_ENVELOPE_SHIFT;
+ ts = envelope->node_t[pe->next_node - 1];
+ te = envelope->node_t[pe->next_node];
- if (ts == te)
- return ys;
+ if (ts == te)
+ return ys;
- ye = envelope->node_y[pe->next_node] << IT_ENVELOPE_SHIFT;
+ ye = envelope->node_y[pe->next_node] << IT_ENVELOPE_SHIFT;
- t = pe->tick;
+ t = pe->tick;
- return ys + (ye - ys) * (t - ts) / (te - ts);
+ return ys + (ye - ys) * (t - ts) / (te - ts);
#endif
}
-
-
#if 0
static int it_envelope_end(IT_PLAYING *playing, IT_ENVELOPE *envelope, IT_PLAYING_ENVELOPE *pe)
{
@@ -3858,191 +4147,187 @@
}
#endif
-
-
/* Returns 1 when fading should be initiated for a volume envelope. */
-static int update_it_envelope(IT_PLAYING *playing, IT_ENVELOPE *envelope, IT_PLAYING_ENVELOPE *pe, int flags)
-{
- if (!(playing->enabled_envelopes & flags) || !envelope->n_nodes)
- return 0;
+static int update_it_envelope(IT_PLAYING *playing, IT_ENVELOPE *envelope,
+ IT_PLAYING_ENVELOPE *pe, int flags) {
+ if (!(playing->enabled_envelopes & flags) || !envelope->n_nodes)
+ return 0;
- ASSERT(envelope->n_nodes > 0);
+ ASSERT(envelope->n_nodes > 0);
- if (pe->tick <= 0)
- pe->value = envelope->node_y[0] << IT_ENVELOPE_SHIFT;
- else if (pe->tick >= envelope->node_t[envelope->n_nodes-1]) {
- pe->value = envelope->node_y[envelope->n_nodes-1] << IT_ENVELOPE_SHIFT;
- } else {
- int ys = envelope->node_y[pe->next_node-1] << IT_ENVELOPE_SHIFT;
- int ts = envelope->node_t[pe->next_node-1];
- int te = envelope->node_t[pe->next_node];
+ if (pe->tick <= 0)
+ pe->value = envelope->node_y[0] << IT_ENVELOPE_SHIFT;
+ else if (pe->tick >= envelope->node_t[envelope->n_nodes - 1]) {
+ pe->value = envelope->node_y[envelope->n_nodes - 1]
+ << IT_ENVELOPE_SHIFT;
+ } else {
+ int ys = envelope->node_y[pe->next_node - 1] << IT_ENVELOPE_SHIFT;
+ int ts = envelope->node_t[pe->next_node - 1];
+ int te = envelope->node_t[pe->next_node];
- if (ts == te)
- pe->value = ys;
- else {
- int ye = envelope->node_y[pe->next_node] << IT_ENVELOPE_SHIFT;
- int t = pe->tick;
+ if (ts == te)
+ pe->value = ys;
+ else {
+ int ye = envelope->node_y[pe->next_node] << IT_ENVELOPE_SHIFT;
+ int t = pe->tick;
- pe->value = ys + (ye - ys) * (t - ts) / (te - ts);
- }
- }
+ pe->value = ys + (ye - ys) * (t - ts) / (te - ts);
+ }
+ }
- pe->tick++;
+ pe->tick++;
- recalculate_it_envelope_node(pe, envelope);
+ recalculate_it_envelope_node(pe, envelope);
- if ((envelope->flags & IT_ENVELOPE_SUSTAIN_LOOP) && !(playing->flags & IT_PLAYING_SUSTAINOFF)) {
- if (pe->tick > envelope->node_t[envelope->sus_loop_end]) {
- pe->next_node = envelope->sus_loop_start + 1;
- ASSERT(pe->next_node <= envelope->n_nodes);
- pe->tick = envelope->node_t[envelope->sus_loop_start];
- return 0;
- }
- } else if (envelope->flags & IT_ENVELOPE_LOOP_ON) {
- if (pe->tick > envelope->node_t[envelope->loop_end]) {
- pe->next_node = envelope->loop_start + 1;
- ASSERT(pe->next_node <= envelope->n_nodes);
- pe->tick = envelope->node_t[envelope->loop_start];
- return 0;
- }
- }
- else if (pe->tick > envelope->node_t[envelope->n_nodes - 1])
- return 1;
+ if ((envelope->flags & IT_ENVELOPE_SUSTAIN_LOOP) &&
+ !(playing->flags & IT_PLAYING_SUSTAINOFF)) {
+ if (pe->tick > envelope->node_t[envelope->sus_loop_end]) {
+ pe->next_node = envelope->sus_loop_start + 1;
+ ASSERT(pe->next_node <= envelope->n_nodes);
+ pe->tick = envelope->node_t[envelope->sus_loop_start];
+ return 0;
+ }
+ } else if (envelope->flags & IT_ENVELOPE_LOOP_ON) {
+ if (pe->tick > envelope->node_t[envelope->loop_end]) {
+ pe->next_node = envelope->loop_start + 1;
+ ASSERT(pe->next_node <= envelope->n_nodes);
+ pe->tick = envelope->node_t[envelope->loop_start];
+ return 0;
+ }
+ } else if (pe->tick > envelope->node_t[envelope->n_nodes - 1])
+ return 1;
- return 0;
+ return 0;
}
+static void update_it_envelopes(IT_PLAYING *playing) {
+ IT_ENVELOPE *envelope = &playing->env_instrument->volume_envelope;
+ IT_PLAYING_ENVELOPE *pe = &playing->volume_envelope;
+ if (update_it_envelope(playing, envelope, pe, IT_ENV_VOLUME)) {
+ playing->flags |= IT_PLAYING_FADING;
+ if (pe->value == 0)
+ playing->flags |= IT_PLAYING_DEAD;
+ }
-static void update_it_envelopes(IT_PLAYING *playing)
-{
- IT_ENVELOPE *envelope = &playing->env_instrument->volume_envelope;
- IT_PLAYING_ENVELOPE *pe = &playing->volume_envelope;
-
- if (update_it_envelope(playing, envelope, pe, IT_ENV_VOLUME)) {
- playing->flags |= IT_PLAYING_FADING;
- if (pe->value == 0)
- playing->flags |= IT_PLAYING_DEAD;
- }
-
- update_it_envelope(playing, &playing->env_instrument->pan_envelope, &playing->pan_envelope, IT_ENV_PANNING);
- update_it_envelope(playing, &playing->env_instrument->pitch_envelope, &playing->pitch_envelope, IT_ENV_PITCH);
+ update_it_envelope(playing, &playing->env_instrument->pan_envelope,
+ &playing->pan_envelope, IT_ENV_PANNING);
+ update_it_envelope(playing, &playing->env_instrument->pitch_envelope,
+ &playing->pitch_envelope, IT_ENV_PITCH);
}
-
-
-static int xm_envelope_is_sustaining(IT_PLAYING *playing, IT_ENVELOPE *envelope, IT_PLAYING_ENVELOPE *pe)
-{
- if ((envelope->flags & IT_ENVELOPE_SUSTAIN_LOOP) && !(playing->flags & IT_PLAYING_SUSTAINOFF))
- if (envelope->sus_loop_start < envelope->n_nodes)
- if (pe->tick == envelope->node_t[envelope->sus_loop_start])
- return 1;
- return 0;
+static int xm_envelope_is_sustaining(IT_PLAYING *playing, IT_ENVELOPE *envelope,
+ IT_PLAYING_ENVELOPE *pe) {
+ if ((envelope->flags & IT_ENVELOPE_SUSTAIN_LOOP) &&
+ !(playing->flags & IT_PLAYING_SUSTAINOFF))
+ if (envelope->sus_loop_start < envelope->n_nodes)
+ if (pe->tick == envelope->node_t[envelope->sus_loop_start])
+ return 1;
+ return 0;
}
+static void update_xm_envelope(IT_PLAYING *playing, IT_ENVELOPE *envelope,
+ IT_PLAYING_ENVELOPE *pe) {
+ if (!(envelope->flags & IT_ENVELOPE_ON))
+ return;
+ if (xm_envelope_is_sustaining(playing, envelope, pe))
+ return;
-static void update_xm_envelope(IT_PLAYING *playing, IT_ENVELOPE *envelope, IT_PLAYING_ENVELOPE *pe)
-{
- if (!(envelope->flags & IT_ENVELOPE_ON))
- return;
+ if (pe->tick >= envelope->node_t[envelope->n_nodes - 1])
+ return;
- if (xm_envelope_is_sustaining(playing, envelope, pe))
- return;
+ pe->tick++;
- if (pe->tick >= envelope->node_t[envelope->n_nodes-1])
- return;
+ /* pe->next_node must be kept up to date for envelope_get_y(). */
+ while (pe->tick > envelope->node_t[pe->next_node])
+ pe->next_node++;
- pe->tick++;
+ if ((envelope->flags & IT_ENVELOPE_LOOP_ON) &&
+ envelope->loop_end < envelope->n_nodes) {
+ if (pe->tick == envelope->node_t[envelope->loop_end]) {
+ pe->next_node = MID(0, envelope->loop_start, envelope->n_nodes - 1);
+ pe->tick = envelope->node_t[pe->next_node];
+ }
+ }
- /* pe->next_node must be kept up to date for envelope_get_y(). */
- while (pe->tick > envelope->node_t[pe->next_node])
- pe->next_node++;
-
- if ((envelope->flags & IT_ENVELOPE_LOOP_ON) && envelope->loop_end < envelope->n_nodes) {
- if (pe->tick == envelope->node_t[envelope->loop_end]) {
- pe->next_node = MID(0, envelope->loop_start, envelope->n_nodes - 1);
- pe->tick = envelope->node_t[pe->next_node];
- }
- }
-
- xm_envelope_calculate_value(envelope, pe);
+ xm_envelope_calculate_value(envelope, pe);
}
-
-
-static void update_xm_envelopes(IT_PLAYING *playing)
-{
- update_xm_envelope(playing, &playing->env_instrument->volume_envelope, &playing->volume_envelope);
- update_xm_envelope(playing, &playing->env_instrument->pan_envelope, &playing->pan_envelope);
+static void update_xm_envelopes(IT_PLAYING *playing) {
+ update_xm_envelope(playing, &playing->env_instrument->volume_envelope,
+ &playing->volume_envelope);
+ update_xm_envelope(playing, &playing->env_instrument->pan_envelope,
+ &playing->pan_envelope);
}
-
-
-static void update_fadeout(DUMB_IT_SIGDATA *sigdata, IT_PLAYING *playing)
-{
- if (playing->flags & IT_PLAYING_FADING) {
- playing->fadeoutcount -= playing->env_instrument->fadeout;
- if (playing->fadeoutcount <= 0) {
- playing->fadeoutcount = 0;
- if (!(sigdata->flags & IT_WAS_AN_XM))
- playing->flags |= IT_PLAYING_DEAD;
- }
- }
+static void update_fadeout(DUMB_IT_SIGDATA *sigdata, IT_PLAYING *playing) {
+ if (playing->flags & IT_PLAYING_FADING) {
+ playing->fadeoutcount -= playing->env_instrument->fadeout;
+ if (playing->fadeoutcount <= 0) {
+ playing->fadeoutcount = 0;
+ if (!(sigdata->flags & IT_WAS_AN_XM))
+ playing->flags |= IT_PLAYING_DEAD;
+ }
+ }
}
static int apply_pan_envelope(IT_PLAYING *playing);
-static float calculate_volume(DUMB_IT_SIGRENDERER *sigrenderer, IT_PLAYING *playing, float volume);
+static float calculate_volume(DUMB_IT_SIGRENDERER *sigrenderer,
+ IT_PLAYING *playing, float volume);
-static void playing_volume_setup(DUMB_IT_SIGRENDERER * sigrenderer, IT_PLAYING * playing, float invt2g)
-{
- DUMB_IT_SIGDATA * sigdata = sigrenderer->sigdata;
- int pan;
- float vol, span;
+static void playing_volume_setup(DUMB_IT_SIGRENDERER *sigrenderer,
+ IT_PLAYING *playing, float invt2g) {
+ DUMB_IT_SIGDATA *sigdata = sigrenderer->sigdata;
+ int pan;
+ float vol, span;
float rampScale;
int ramp_style = sigrenderer->ramp_style;
-
- pan = apply_pan_envelope(playing);
- if ((sigrenderer->n_channels >= 2) && (sigdata->flags & IT_STEREO) && (sigrenderer->n_channels != 3 || !IT_IS_SURROUND_SHIFTED(pan))) {
- if (!IT_IS_SURROUND_SHIFTED(pan)) {
- span = (pan - (32<<8)) * sigdata->pan_separation * (1.0f / ((32<<8) * 128));
- vol = 0.5f * (1.0f - span);
- playing->float_volume[0] = vol;
- playing->float_volume[1] = 1.0f - vol;
- } else {
- playing->float_volume[0] = -0.5f;
- playing->float_volume[1] = 0.5f;
- }
- } else {
- playing->float_volume[0] = 1.0f;
- playing->float_volume[1] = 1.0f;
- }
+ pan = apply_pan_envelope(playing);
- vol = calculate_volume(sigrenderer, playing, 1.0f);
- playing->float_volume[0] *= vol;
- playing->float_volume[1] *= vol;
-
+ if ((sigrenderer->n_channels >= 2) && (sigdata->flags & IT_STEREO) &&
+ (sigrenderer->n_channels != 3 || !IT_IS_SURROUND_SHIFTED(pan))) {
+ if (!IT_IS_SURROUND_SHIFTED(pan)) {
+ span = (pan - (32 << 8)) * sigdata->pan_separation *
+ (1.0f / ((32 << 8) * 128));
+ vol = 0.5f * (1.0f - span);
+ playing->float_volume[0] = vol;
+ playing->float_volume[1] = 1.0f - vol;
+ } else {
+ playing->float_volume[0] = -0.5f;
+ playing->float_volume[1] = 0.5f;
+ }
+ } else {
+ playing->float_volume[0] = 1.0f;
+ playing->float_volume[1] = 1.0f;
+ }
+
+ vol = calculate_volume(sigrenderer, playing, 1.0f);
+ playing->float_volume[0] *= vol;
+ playing->float_volume[1] *= vol;
+
rampScale = 4;
if (ramp_style > 0 && playing->declick_stage == 2) {
- if ((playing->ramp_volume[0] == 0 && playing->ramp_volume[1] == 0) || vol == 0)
+ if ((playing->ramp_volume[0] == 0 && playing->ramp_volume[1] == 0) ||
+ vol == 0)
rampScale = 48;
}
if (ramp_style == 0 || (ramp_style < 2 && playing->declick_stage == 2)) {
- if (playing->declick_stage <= 2) {
- playing->ramp_volume[0] = playing->float_volume[0];
- playing->ramp_volume[1] = playing->float_volume[1];
- playing->declick_stage = 2;
- } else {
- playing->float_volume[0] = 0;
- playing->float_volume[1] = 0;
- playing->ramp_volume[0] = 0;
- playing->ramp_volume[1] = 0;
- playing->declick_stage = 5;
- }
- playing->ramp_delta[0] = 0;
+ if (playing->declick_stage <= 2) {
+ playing->ramp_volume[0] = playing->float_volume[0];
+ playing->ramp_volume[1] = playing->float_volume[1];
+ playing->declick_stage = 2;
+ } else {
+ playing->float_volume[0] = 0;
+ playing->float_volume[1] = 0;
+ playing->ramp_volume[0] = 0;
+ playing->ramp_volume[1] = 0;
+ playing->declick_stage = 5;
+ }
+ playing->ramp_delta[0] = 0;
playing->ramp_delta[1] = 0;
} else {
if (playing->declick_stage == 0) {
@@ -4059,49 +4344,54 @@
playing->declick_stage++;
rampScale = 48;
}
- playing->ramp_delta[0] = rampScale * invt2g * (playing->float_volume[0] - playing->ramp_volume[0]);
- playing->ramp_delta[1] = rampScale * invt2g * (playing->float_volume[1] - playing->ramp_volume[1]);
+ playing->ramp_delta[0] =
+ rampScale * invt2g *
+ (playing->float_volume[0] - playing->ramp_volume[0]);
+ playing->ramp_delta[1] =
+ rampScale * invt2g *
+ (playing->float_volume[1] - playing->ramp_volume[1]);
}
}
-static void process_playing(DUMB_IT_SIGRENDERER *sigrenderer, IT_PLAYING *playing, float invt2g)
-{
- DUMB_IT_SIGDATA * sigdata = sigrenderer->sigdata;
+static void process_playing(DUMB_IT_SIGRENDERER *sigrenderer,
+ IT_PLAYING *playing, float invt2g) {
+ DUMB_IT_SIGDATA *sigdata = sigrenderer->sigdata;
- if (playing->instrument) {
- if (sigdata->flags & IT_WAS_AN_XM)
- update_xm_envelopes(playing);
- else
- update_it_envelopes(playing);
- update_fadeout(sigdata, playing);
- }
+ if (playing->instrument) {
+ if (sigdata->flags & IT_WAS_AN_XM)
+ update_xm_envelopes(playing);
+ else
+ update_it_envelopes(playing);
+ update_fadeout(sigdata, playing);
+ }
- playing_volume_setup(sigrenderer, playing, invt2g);
+ playing_volume_setup(sigrenderer, playing, invt2g);
- if (sigdata->flags & IT_WAS_AN_XM) {
- /* 'depth' is used to store the tick number for XM files. */
- if (playing->sample_vibrato_depth < playing->sample->vibrato_rate)
- playing->sample_vibrato_depth++;
- } else {
- playing->sample_vibrato_depth += playing->sample->vibrato_rate;
- if (playing->sample_vibrato_depth > playing->sample->vibrato_depth << 8)
- playing->sample_vibrato_depth = playing->sample->vibrato_depth << 8;
- }
+ if (sigdata->flags & IT_WAS_AN_XM) {
+ /* 'depth' is used to store the tick number for XM files. */
+ if (playing->sample_vibrato_depth < playing->sample->vibrato_rate)
+ playing->sample_vibrato_depth++;
+ } else {
+ playing->sample_vibrato_depth += playing->sample->vibrato_rate;
+ if (playing->sample_vibrato_depth > playing->sample->vibrato_depth << 8)
+ playing->sample_vibrato_depth = playing->sample->vibrato_depth << 8;
+ }
- playing->sample_vibrato_time += playing->sample->vibrato_speed;
+ playing->sample_vibrato_time += playing->sample->vibrato_speed;
}
#if (defined(_MSC_VER) && _MSC_VER < 1800) || defined(__ANDROID__)
-static float log2(float x) {return (float)log(x)/(float)log(2.0f);}
+static float log2(float x) { return (float)log(x) / (float)log(2.0f); }
#endif
-static int delta_to_note(float delta, int base)
-{
- float note;
- note = log2(delta * 65536.f / (float)base)*12.0f+60.5f;
- if (note > 119) note = 119;
- else if (note < 0) note = 0;
- return (int)note;
+static int delta_to_note(float delta, int base) {
+ float note;
+ note = log2(delta * 65536.f / (float)base) * 12.0f + 60.5f;
+ if (note > 119)
+ note = 119;
+ else if (note < 0)
+ note = 0;
+ return (int)note;
}
// Period table for Protracker octaves 0-5:
@@ -4138,465 +4428,519 @@
};
#endif
-static void process_all_playing(DUMB_IT_SIGRENDERER *sigrenderer)
-{
- DUMB_IT_SIGDATA *sigdata = sigrenderer->sigdata;
- int i;
+static void process_all_playing(DUMB_IT_SIGRENDERER *sigrenderer) {
+ DUMB_IT_SIGDATA *sigdata = sigrenderer->sigdata;
+ int i;
- float invt2g = 1.0f / ((float)TICK_TIME_DIVIDEND / (float)sigrenderer->tempo / 256.0f);
+ float invt2g =
+ 1.0f / ((float)TICK_TIME_DIVIDEND / (float)sigrenderer->tempo / 256.0f);
- for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
- IT_CHANNEL *channel = &sigrenderer->channel[i];
- IT_PLAYING *playing = channel->playing;
+ for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
+ IT_CHANNEL *channel = &sigrenderer->channel[i];
+ IT_PLAYING *playing = channel->playing;
- if (playing) {
- int vibrato_shift;
- switch (playing->vibrato_waveform)
- {
- default:
- vibrato_shift = it_sine[playing->vibrato_time];
- break;
- case 1:
- vibrato_shift = it_sawtooth[playing->vibrato_time];
- break;
- case 2:
- vibrato_shift = it_squarewave[playing->vibrato_time];
- break;
- case 3:
- vibrato_shift = (rand() % 129) - 64;
- break;
- case 4:
- vibrato_shift = it_xm_squarewave[playing->vibrato_time];
- break;
- case 5:
- vibrato_shift = it_xm_ramp[playing->vibrato_time];
- break;
- case 6:
- vibrato_shift = it_xm_ramp[255-playing->vibrato_time];
- break;
- }
- vibrato_shift *= playing->vibrato_n;
- vibrato_shift *= playing->vibrato_depth;
- vibrato_shift >>= 4;
+ if (playing) {
+ int vibrato_shift;
+ switch (playing->vibrato_waveform) {
+ default:
+ vibrato_shift = it_sine[playing->vibrato_time];
+ break;
+ case 1:
+ vibrato_shift = it_sawtooth[playing->vibrato_time];
+ break;
+ case 2:
+ vibrato_shift = it_squarewave[playing->vibrato_time];
+ break;
+ case 3:
+ vibrato_shift = (rand() % 129) - 64;
+ break;
+ case 4:
+ vibrato_shift = it_xm_squarewave[playing->vibrato_time];
+ break;
+ case 5:
+ vibrato_shift = it_xm_ramp[playing->vibrato_time];
+ break;
+ case 6:
+ vibrato_shift = it_xm_ramp[255 - playing->vibrato_time];
+ break;
+ }
+ vibrato_shift *= playing->vibrato_n;
+ vibrato_shift *= playing->vibrato_depth;
+ vibrato_shift >>= 4;
- if (sigdata->flags & IT_OLD_EFFECTS)
- vibrato_shift = -vibrato_shift;
+ if (sigdata->flags & IT_OLD_EFFECTS)
+ vibrato_shift = -vibrato_shift;
- playing->volume = channel->volume;
- playing->pan = channel->truepan;
+ playing->volume = channel->volume;
+ playing->pan = channel->truepan;
- if (playing->volume_offset) {
- playing->volume += (playing->volume_offset * playing->volume) >> 7;
- if (playing->volume > 64) {
- if (playing->volume_offset < 0) playing->volume = 0;
- else playing->volume = 64;
- }
- }
+ if (playing->volume_offset) {
+ playing->volume +=
+ (playing->volume_offset * playing->volume) >> 7;
+ if (playing->volume > 64) {
+ if (playing->volume_offset < 0)
+ playing->volume = 0;
+ else
+ playing->volume = 64;
+ }
+ }
- if (playing->panning_offset && !IT_IS_SURROUND_SHIFTED(playing->pan)) {
- playing->pan += playing->panning_offset << IT_ENVELOPE_SHIFT;
- if (playing->pan > 64 << IT_ENVELOPE_SHIFT) {
- if (playing->panning_offset < 0) playing->pan = 0;
- else playing->pan = 64 << IT_ENVELOPE_SHIFT;
- }
- }
+ if (playing->panning_offset &&
+ !IT_IS_SURROUND_SHIFTED(playing->pan)) {
+ playing->pan += playing->panning_offset << IT_ENVELOPE_SHIFT;
+ if (playing->pan > 64 << IT_ENVELOPE_SHIFT) {
+ if (playing->panning_offset < 0)
+ playing->pan = 0;
+ else
+ playing->pan = 64 << IT_ENVELOPE_SHIFT;
+ }
+ }
- if (sigdata->flags & IT_LINEAR_SLIDES) {
- int currpitch = ((playing->note - 60) << 8) + playing->slide
- + vibrato_shift
- + playing->finetune;
+ if (sigdata->flags & IT_LINEAR_SLIDES) {
+ int currpitch = ((playing->note - 60) << 8) + playing->slide +
+ vibrato_shift + playing->finetune;
- /* We add a feature here, which is that of keeping the pitch
- * within range. Otherwise it crashes. Trust me. It happened.
- * The limit 32768 gives almost 11 octaves either way.
- */
- if (currpitch < -32768)
- currpitch = -32768;
- else if (currpitch > 32767)
- currpitch = 32767;
+ /* We add a feature here, which is that of keeping the pitch
+ * within range. Otherwise it crashes. Trust me. It happened.
+ * The limit 32768 gives almost 11 octaves either way.
+ */
+ if (currpitch < -32768)
+ currpitch = -32768;
+ else if (currpitch > 32767)
+ currpitch = 32767;
- playing->delta = (float)pow(DUMB_PITCH_BASE, currpitch);
- playing->delta *= playing->sample->C5_speed * (1.f / 65536.0f);
- } else {
- int slide = playing->slide + vibrato_shift;
+ playing->delta = (float)pow(DUMB_PITCH_BASE, currpitch);
+ playing->delta *= playing->sample->C5_speed * (1.f / 65536.0f);
+ } else {
+ int slide = playing->slide + vibrato_shift;
- playing->delta = (float)pow(DUMB_PITCH_BASE, ((60 - playing->note) << 8) - playing->finetune );
- /* playing->delta is 1.0 for C-5, 0.5 for C-6, etc. */
+ playing->delta =
+ (float)pow(DUMB_PITCH_BASE,
+ ((60 - playing->note) << 8) - playing->finetune);
+ /* playing->delta is 1.0 for C-5, 0.5 for C-6, etc. */
- playing->delta *= 1.0f / playing->sample->C5_speed;
+ playing->delta *= 1.0f / playing->sample->C5_speed;
- playing->delta -= slide / AMIGA_DIVISOR;
+ playing->delta -= slide / AMIGA_DIVISOR;
- if (playing->delta < (1.0f / 65536.0f) / 32768.0f) {
- // Should XM notes die if Amiga slides go out of range?
- playing->flags |= IT_PLAYING_DEAD;
- playing->delta = 1. / 32768.;
- continue;
- }
+ if (playing->delta < (1.0f / 65536.0f) / 32768.0f) {
+ // Should XM notes die if Amiga slides go out of range?
+ playing->flags |= IT_PLAYING_DEAD;
+ playing->delta = 1. / 32768.;
+ continue;
+ }
- playing->delta = (1.0f / 65536.0f) / playing->delta;
- }
+ playing->delta = (1.0f / 65536.0f) / playing->delta;
+ }
- if (playing->channel->glissando && playing->channel->toneporta && playing->channel->destnote < 120) {
- playing->delta = (float)pow(DUMB_SEMITONE_BASE, delta_to_note(playing->delta, (int)playing->sample->C5_speed) - 60)
- * playing->sample->C5_speed * (1.f / 65536.f);
- }
+ if (playing->channel->glissando && playing->channel->toneporta &&
+ playing->channel->destnote < 120) {
+ playing->delta =
+ (float)pow(DUMB_SEMITONE_BASE,
+ delta_to_note(playing->delta,
+ (int)playing->sample->C5_speed) -
+ 60) *
+ playing->sample->C5_speed * (1.f / 65536.f);
+ }
- /*
- if ( channel->arpeggio ) { // another FT2 bug...
- if ((sigdata->flags & (IT_LINEAR_SLIDES|IT_WAS_AN_XM|IT_WAS_A_MOD)) == (IT_WAS_AN_XM|IT_LINEAR_SLIDES) &&
- playing->flags & IT_PLAYING_SUSTAINOFF)
- {
- if ( channel->arpeggio > 0xFF )
- playing->delta = playing->sample->C5_speed * (1.f / 65536.f);
- }
- else*/
- {
- int tick = sigrenderer->tick - 1;
- if ((sigrenderer->sigdata->flags & (IT_WAS_AN_XM|IT_WAS_A_MOD))!=IT_WAS_AN_XM)
- tick = sigrenderer->speed - tick - 1;
- else if (tick == sigrenderer->speed - 1)
- tick = 0;
- else
- ++tick;
- if (sigrenderer->sigdata->flags & IT_WAS_AN_STM)
- tick /= 16;
- playing->delta *= (float)pow(DUMB_SEMITONE_BASE, channel->arpeggio_offsets[channel->arpeggio_table[tick&31]]);
- }
- /*
- }*/
+ /*
+ if ( channel->arpeggio ) { // another FT2 bug...
+ if ((sigdata->flags &
+ (IT_LINEAR_SLIDES|IT_WAS_AN_XM|IT_WAS_A_MOD)) ==
+ (IT_WAS_AN_XM|IT_LINEAR_SLIDES) && playing->flags &
+ IT_PLAYING_SUSTAINOFF)
+ {
+ if ( channel->arpeggio > 0xFF )
+ playing->delta = playing->sample->C5_speed *
+ (1.f / 65536.f);
+ }
+ else*/
+ {
+ int tick = sigrenderer->tick - 1;
+ if ((sigrenderer->sigdata->flags &
+ (IT_WAS_AN_XM | IT_WAS_A_MOD)) != IT_WAS_AN_XM)
+ tick = sigrenderer->speed - tick - 1;
+ else if (tick == sigrenderer->speed - 1)
+ tick = 0;
+ else
+ ++tick;
+ if (sigrenderer->sigdata->flags & IT_WAS_AN_STM)
+ tick /= 16;
+ playing->delta *= (float)pow(
+ DUMB_SEMITONE_BASE,
+ channel
+ ->arpeggio_offsets[channel->arpeggio_table[tick & 31]]);
+ }
+ /*
+ }*/
- playing->filter_cutoff = channel->filter_cutoff;
- playing->filter_resonance = channel->filter_resonance;
- }
- }
+ playing->filter_cutoff = channel->filter_cutoff;
+ playing->filter_resonance = channel->filter_resonance;
+ }
+ }
- for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
- if (sigrenderer->channel[i].playing) {
- process_playing(sigrenderer, sigrenderer->channel[i].playing, invt2g);
- if (!(sigdata->flags & IT_WAS_AN_XM)) {
- //if ((sigrenderer->channel[i].playing->flags & (IT_PLAYING_BACKGROUND | IT_PLAYING_DEAD)) == (IT_PLAYING_BACKGROUND | IT_PLAYING_DEAD)) {
- // This change was made so Gxx would work correctly when a note faded out or whatever. Let's hope nothing else was broken by it.
- if (sigrenderer->channel[i].playing->flags & IT_PLAYING_DEAD) {
- free_playing(sigrenderer->channel[i].playing);
- sigrenderer->channel[i].playing = NULL;
- }
- }
- }
- }
+ for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
+ if (sigrenderer->channel[i].playing) {
+ process_playing(sigrenderer, sigrenderer->channel[i].playing,
+ invt2g);
+ if (!(sigdata->flags & IT_WAS_AN_XM)) {
+ // if ((sigrenderer->channel[i].playing->flags &
+ // (IT_PLAYING_BACKGROUND | IT_PLAYING_DEAD)) ==
+ // (IT_PLAYING_BACKGROUND | IT_PLAYING_DEAD)) {
+ // This change was made so Gxx would work correctly when a note
+ // faded out or whatever. Let's hope nothing else was broken by
+ // it.
+ if (sigrenderer->channel[i].playing->flags & IT_PLAYING_DEAD) {
+ free_playing(sigrenderer->channel[i].playing);
+ sigrenderer->channel[i].playing = NULL;
+ }
+ }
+ }
+ }
- for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
- if (sigrenderer->playing[i]) {
- process_playing(sigrenderer, sigrenderer->playing[i], invt2g);
- if (sigrenderer->playing[i]->flags & IT_PLAYING_DEAD) {
- free_playing(sigrenderer->playing[i]);
- sigrenderer->playing[i] = NULL;
- }
- }
- }
+ for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ if (sigrenderer->playing[i]) {
+ process_playing(sigrenderer, sigrenderer->playing[i], invt2g);
+ if (sigrenderer->playing[i]->flags & IT_PLAYING_DEAD) {
+ free_playing(sigrenderer->playing[i]);
+ sigrenderer->playing[i] = NULL;
+ }
+ }
+ }
}
+static int process_tick(DUMB_IT_SIGRENDERER *sigrenderer) {
+ DUMB_IT_SIGDATA *sigdata = sigrenderer->sigdata;
+ if (sigrenderer->tempo < 32 || sigrenderer->tempo > 255) // problematic
+ return 1;
-static int process_tick(DUMB_IT_SIGRENDERER *sigrenderer)
-{
- DUMB_IT_SIGDATA *sigdata = sigrenderer->sigdata;
-
- if ( sigrenderer->tempo < 32 || sigrenderer->tempo > 255 ) // problematic
- return 1;
+ // Set note vol/freq to vol/freq set for each channel
- // Set note vol/freq to vol/freq set for each channel
+ if (sigrenderer->speed && --sigrenderer->tick == 0) {
+ reset_tick_counts(sigrenderer);
+ sigrenderer->tick = sigrenderer->speed;
+ sigrenderer->rowcount--;
+ if (sigrenderer->rowcount == 0) {
+ sigrenderer->rowcount = 1;
- if (sigrenderer->speed && --sigrenderer->tick == 0) {
- reset_tick_counts(sigrenderer);
- sigrenderer->tick = sigrenderer->speed;
- sigrenderer->rowcount--;
- if (sigrenderer->rowcount == 0) {
- sigrenderer->rowcount = 1;
-
#ifdef BIT_ARRAY_BULLSHIT
- if (sigrenderer->n_rows)
- {
+ if (sigrenderer->n_rows) {
#if 1
- /*
- if (bit_array_test(sigrenderer->played, sigrenderer->order * 256 + sigrenderer->row))
- {
- if (sigrenderer->callbacks->loop) {
- if ((*sigrenderer->callbacks->loop)(sigrenderer->callbacks->loop_data))
- return 1;
- bit_array_reset(sigrenderer->played);
- if (sigrenderer->speed == 0)
- goto speed0; I love goto
- }
- }
- */
+ /*
+ if (bit_array_test(sigrenderer->played, sigrenderer->order * 256
+ + sigrenderer->row))
+ {
+ if (sigrenderer->callbacks->loop) {
+ if
+ ((*sigrenderer->callbacks->loop)(sigrenderer->callbacks->loop_data))
+ return 1;
+ bit_array_reset(sigrenderer->played);
+ if (sigrenderer->speed == 0)
+ goto speed0; I love goto
+ }
+ }
+ */
#endif
- bit_array_set(sigrenderer->played, sigrenderer->order * 256 + sigrenderer->row);
- {
- int n;
- for (n = 0; n < DUMB_IT_N_CHANNELS; n++)
- {
- IT_CHANNEL * channel = &sigrenderer->channel[n];
- if (channel->played_patjump)
- {
- if (channel->played_patjump_order == sigrenderer->order)
- {
- bit_array_set(channel->played_patjump, sigrenderer->row);
- }
- /*
- else if ((channel->played_patjump_order & 0x7FFF) == sigrenderer->order)
- {
- channel->played_patjump_order |= 0x4000;
- }
- else if ((channel->played_patjump_order & 0x3FFF) == sigrenderer->order)
- {
- if ((sigdata->flags & (IT_WAS_AN_XM|IT_WAS_A_MOD)) == IT_WAS_AN_XM)
- {
- joy, was XM, pattern loop bug triggered break to row in same order
- bit_array_mask(sigrenderer->played, channel->played_patjump, sigrenderer->order * 256);
- }
- bit_array_destroy(channel->played_patjump);
- channel->played_patjump = 0;
- channel->played_patjump_order = 0xFFFE;
- }
- */
- else
- {
- bit_array_destroy(channel->played_patjump);
- channel->played_patjump = 0;
- channel->played_patjump_order = 0xFFFE;
- }
- }
- }
- }
- }
+ bit_array_set(sigrenderer->played,
+ sigrenderer->order * 256 + sigrenderer->row);
+ {
+ int n;
+ for (n = 0; n < DUMB_IT_N_CHANNELS; n++) {
+ IT_CHANNEL *channel = &sigrenderer->channel[n];
+ if (channel->played_patjump) {
+ if (channel->played_patjump_order ==
+ sigrenderer->order) {
+ bit_array_set(channel->played_patjump,
+ sigrenderer->row);
+ }
+ /*
+ else if ((channel->played_patjump_order & 0x7FFF) ==
+ sigrenderer->order)
+ {
+ channel->played_patjump_order |= 0x4000;
+ }
+ else if ((channel->played_patjump_order & 0x3FFF) ==
+ sigrenderer->order)
+ {
+ if ((sigdata->flags &
+ (IT_WAS_AN_XM|IT_WAS_A_MOD)) == IT_WAS_AN_XM)
+ {
+ joy, was XM, pattern loop bug triggered break to row in same order
+ bit_array_mask(sigrenderer->played,
+ channel->played_patjump, sigrenderer->order * 256);
+ }
+ bit_array_destroy(channel->played_patjump);
+ channel->played_patjump = 0;
+ channel->played_patjump_order = 0xFFFE;
+ }
+ */
+ else {
+ bit_array_destroy(channel->played_patjump);
+ channel->played_patjump = 0;
+ channel->played_patjump_order = 0xFFFE;
+ }
+ }
+ }
+ }
+ }
#endif
- sigrenderer->processrow++;
+ sigrenderer->processrow++;
- if (sigrenderer->processrow >= sigrenderer->n_rows) {
- IT_PATTERN *pattern;
- int n;
- int processorder = sigrenderer->processorder;
+ if (sigrenderer->processrow >= sigrenderer->n_rows) {
+ IT_PATTERN *pattern;
+ int n;
+ int processorder = sigrenderer->processorder;
- if ((sigrenderer->processrow|0xC00) == 0xFFFE + 1) { /* It was incremented above! */
- sigrenderer->processrow = sigrenderer->breakrow;
- sigrenderer->breakrow = 0;
- for (n = 0; n < DUMB_IT_N_CHANNELS; n++) sigrenderer->channel[n].pat_loop_end_row = 0;
- } else {
- sigrenderer->processrow = sigrenderer->breakrow;
- sigrenderer->breakrow = 0; // XXX lolwut
- }
+ if ((sigrenderer->processrow | 0xC00) ==
+ 0xFFFE + 1) { /* It was incremented above! */
+ sigrenderer->processrow = sigrenderer->breakrow;
+ sigrenderer->breakrow = 0;
+ for (n = 0; n < DUMB_IT_N_CHANNELS; n++)
+ sigrenderer->channel[n].pat_loop_end_row = 0;
+ } else {
+ sigrenderer->processrow = sigrenderer->breakrow;
+ sigrenderer->breakrow = 0; // XXX lolwut
+ }
- if (sigrenderer->processorder == 0xFFFF)
- sigrenderer->processorder = sigrenderer->order - 1;
+ if (sigrenderer->processorder == 0xFFFF)
+ sigrenderer->processorder = sigrenderer->order - 1;
- for (;;) {
- sigrenderer->processorder++;
+ for (;;) {
+ sigrenderer->processorder++;
- if (sigrenderer->processorder >= sigdata->n_orders) {
- sigrenderer->processorder = sigrenderer->restart_position;
- if (sigrenderer->processorder >= sigdata->n_orders) {
- /* Restarting beyond end. We'll loop for now. */
- sigrenderer->processorder = -1;
- continue;
- }
- if (sigdata->flags & IT_WAS_AN_OKT) {
- /* Reset some things */
- sigrenderer->speed = sigdata->speed;
- sigrenderer->tempo = sigdata->tempo;
- for (n = 0; n < DUMB_IT_N_CHANNELS; n++) {
- xm_note_off(sigdata, &sigrenderer->channel[n]);
- }
- }
- }
+ if (sigrenderer->processorder >= sigdata->n_orders) {
+ sigrenderer->processorder =
+ sigrenderer->restart_position;
+ if (sigrenderer->processorder >= sigdata->n_orders) {
+ /* Restarting beyond end. We'll loop for now. */
+ sigrenderer->processorder = -1;
+ continue;
+ }
+ if (sigdata->flags & IT_WAS_AN_OKT) {
+ /* Reset some things */
+ sigrenderer->speed = sigdata->speed;
+ sigrenderer->tempo = sigdata->tempo;
+ for (n = 0; n < DUMB_IT_N_CHANNELS; n++) {
+ xm_note_off(sigdata, &sigrenderer->channel[n]);
+ }
+ }
+ }
- n = sigdata->order[sigrenderer->processorder];
+ n = sigdata->order[sigrenderer->processorder];
- if (n < sigdata->n_patterns)
- break;
+ if (n < sigdata->n_patterns)
+ break;
#ifdef INVALID_ORDERS_END_SONG
- if (n != IT_ORDER_SKIP)
+ if (n != IT_ORDER_SKIP)
#else
- if (n == IT_ORDER_END)
+ if (n == IT_ORDER_END)
#endif
- {
- sigrenderer->processorder = sigrenderer->restart_position - 1;
- }
+ {
+ sigrenderer->processorder =
+ sigrenderer->restart_position - 1;
+ }
#ifdef BIT_ARRAY_BULLSHIT
- /* Fix play tracking and timekeeping for orders containing skip commands */
- for (n = 0; n < 256; n++) {
- bit_array_set(sigrenderer->played, sigrenderer->processorder * 256 + n);
- timekeeping_array_push(sigrenderer->row_timekeeper, sigrenderer->processorder * 256 + n, sigrenderer->time_played);
- timekeeping_array_bump(sigrenderer->row_timekeeper, sigrenderer->processorder * 256 + n);
- }
+ /* Fix play tracking and timekeeping for orders containing
+ * skip commands */
+ for (n = 0; n < 256; n++) {
+ bit_array_set(sigrenderer->played,
+ sigrenderer->processorder * 256 + n);
+ timekeeping_array_push(sigrenderer->row_timekeeper,
+ sigrenderer->processorder * 256 +
+ n,
+ sigrenderer->time_played);
+ timekeeping_array_bump(sigrenderer->row_timekeeper,
+ sigrenderer->processorder * 256 +
+ n);
+ }
#endif
- }
+ }
- pattern = &sigdata->pattern[n];
+ pattern = &sigdata->pattern[n];
- n = sigrenderer->n_rows;
- sigrenderer->n_rows = pattern->n_rows;
+ n = sigrenderer->n_rows;
+ sigrenderer->n_rows = pattern->n_rows;
- if (sigrenderer->processrow >= sigrenderer->n_rows)
- sigrenderer->processrow = 0;
+ if (sigrenderer->processrow >= sigrenderer->n_rows)
+ sigrenderer->processrow = 0;
-/** WARNING - everything pertaining to a new pattern initialised? */
+ /** WARNING - everything pertaining to a new pattern
+ * initialised? */
- if ( pattern->entry ) {
- sigrenderer->entry = sigrenderer->entry_start = pattern->entry;
- sigrenderer->entry_end = sigrenderer->entry + pattern->n_entries;
- } else {
- sigrenderer->entry = sigrenderer->entry_start = 0;
- sigrenderer->entry_end = 0;
- }
+ if (pattern->entry) {
+ sigrenderer->entry = sigrenderer->entry_start =
+ pattern->entry;
+ sigrenderer->entry_end =
+ sigrenderer->entry + pattern->n_entries;
+ } else {
+ sigrenderer->entry = sigrenderer->entry_start = 0;
+ sigrenderer->entry_end = 0;
+ }
- /* If n_rows was 0, we're only just starting. Don't do anything weird here. */
- /* added: process row check, for break to row spooniness */
- if (n && (processorder == 0xFFFF ? sigrenderer->order > sigrenderer->processorder : sigrenderer->order >= sigrenderer->processorder)
+ /* If n_rows was 0, we're only just starting. Don't do anything
+ * weird here. */
+ /* added: process row check, for break to row spooniness */
+ if (n &&
+ (processorder == 0xFFFF
+ ? sigrenderer->order > sigrenderer->processorder
+ : sigrenderer->order >= sigrenderer->processorder)
#ifdef BIT_ARRAY_BULLSHIT
- && bit_array_test(sigrenderer->played, sigrenderer->processorder * 256 + sigrenderer->processrow)
+ && bit_array_test(sigrenderer->played,
+ sigrenderer->processorder * 256 +
+ sigrenderer->processrow)
#endif
- ) {
+ ) {
#ifdef BIT_ARRAY_BULLSHIT
- sigrenderer->looped = 1;
+ sigrenderer->looped = 1;
#endif
- if (sigrenderer->callbacks->loop) {
- if ((*sigrenderer->callbacks->loop)(sigrenderer->callbacks->loop_data))
- return 1;
+ if (sigrenderer->callbacks->loop) {
+ if ((*sigrenderer->callbacks->loop)(
+ sigrenderer->callbacks->loop_data))
+ return 1;
#ifdef BIT_ARRAY_BULLSHIT
- bit_array_reset(sigrenderer->played);
+ bit_array_reset(sigrenderer->played);
#endif
- if (sigrenderer->speed == 0)
- goto speed0; /* I love goto */
- }
- }
- sigrenderer->order = sigrenderer->processorder;
+ if (sigrenderer->speed == 0)
+ goto speed0; /* I love goto */
+ }
+ }
+ sigrenderer->order = sigrenderer->processorder;
- n = sigrenderer->processrow;
- while (n) {
- while (sigrenderer->entry < sigrenderer->entry_end) {
- if (IT_IS_END_ROW(sigrenderer->entry)) {
- sigrenderer->entry++;
- break;
- }
- sigrenderer->entry++;
- }
- n--;
- }
- sigrenderer->row = sigrenderer->processrow;
- } else {
- if (sigrenderer->entry) {
- while (sigrenderer->entry < sigrenderer->entry_end) {
- if (IT_IS_END_ROW(sigrenderer->entry)) {
- sigrenderer->entry++;
- break;
- }
- sigrenderer->entry++;
- }
- sigrenderer->row++;
- } else {
+ n = sigrenderer->processrow;
+ while (n) {
+ while (sigrenderer->entry < sigrenderer->entry_end) {
+ if (IT_IS_END_ROW(sigrenderer->entry)) {
+ sigrenderer->entry++;
+ break;
+ }
+ sigrenderer->entry++;
+ }
+ n--;
+ }
+ sigrenderer->row = sigrenderer->processrow;
+ } else {
+ if (sigrenderer->entry) {
+ while (sigrenderer->entry < sigrenderer->entry_end) {
+ if (IT_IS_END_ROW(sigrenderer->entry)) {
+ sigrenderer->entry++;
+ break;
+ }
+ sigrenderer->entry++;
+ }
+ sigrenderer->row++;
+ } else {
#ifdef BIT_ARRAY_BULLSHIT
- bit_array_clear(sigrenderer->played, sigrenderer->order * 256);
+ bit_array_clear(sigrenderer->played,
+ sigrenderer->order * 256);
#endif
- sigrenderer->entry = sigrenderer->entry_start;
- sigrenderer->row = 0;
- }
- }
+ sigrenderer->entry = sigrenderer->entry_start;
+ sigrenderer->row = 0;
+ }
+ }
#ifdef BIT_ARRAY_BULLSHIT
- if (sigrenderer->looped == 0) {
- timekeeping_array_push(sigrenderer->row_timekeeper, sigrenderer->order * 256 + sigrenderer->row, sigrenderer->time_played);
- }
- timekeeping_array_bump(sigrenderer->row_timekeeper, sigrenderer->order * 256 + sigrenderer->row);
+ if (sigrenderer->looped == 0) {
+ timekeeping_array_push(sigrenderer->row_timekeeper,
+ sigrenderer->order * 256 +
+ sigrenderer->row,
+ sigrenderer->time_played);
+ }
+ timekeeping_array_bump(sigrenderer->row_timekeeper,
+ sigrenderer->order * 256 + sigrenderer->row);
#endif
- if (!(sigdata->flags & IT_WAS_A_669))
- reset_effects(sigrenderer);
+ if (!(sigdata->flags & IT_WAS_A_669))
+ reset_effects(sigrenderer);
- if ( sigrenderer->entry )
- {
- IT_ENTRY *entry = sigrenderer->entry;
- int ignore_cxx = 0;
+ if (sigrenderer->entry) {
+ IT_ENTRY *entry = sigrenderer->entry;
+ int ignore_cxx = 0;
- while (entry < sigrenderer->entry_end && !IT_IS_END_ROW(entry))
- ignore_cxx |= update_pattern_variables(sigrenderer, entry++);
+ while (entry < sigrenderer->entry_end && !IT_IS_END_ROW(entry))
+ ignore_cxx |=
+ update_pattern_variables(sigrenderer, entry++);
- entry = sigrenderer->entry;
+ entry = sigrenderer->entry;
- while (entry < sigrenderer->entry_end && !IT_IS_END_ROW(entry))
- if (process_entry(sigrenderer, entry++, sigdata->flags & IT_WAS_AN_XM ? 0 : ignore_cxx))
- return 1;
- }
+ while (entry < sigrenderer->entry_end && !IT_IS_END_ROW(entry))
+ if (process_entry(
+ sigrenderer, entry++,
+ sigdata->flags & IT_WAS_AN_XM ? 0 : ignore_cxx))
+ return 1;
+ }
- if (sigdata->flags & IT_WAS_AN_OKT)
- update_effects(sigrenderer);
- else if (!(sigdata->flags & IT_OLD_EFFECTS))
- update_smooth_effects(sigrenderer);
- } else {
- if ( sigrenderer->entry )
- {
- IT_ENTRY *entry = sigrenderer->entry;
+ if (sigdata->flags & IT_WAS_AN_OKT)
+ update_effects(sigrenderer);
+ else if (!(sigdata->flags & IT_OLD_EFFECTS))
+ update_smooth_effects(sigrenderer);
+ } else {
+ if (sigrenderer->entry) {
+ IT_ENTRY *entry = sigrenderer->entry;
- while (entry < sigrenderer->entry_end && !IT_IS_END_ROW(entry)) {
- if (entry->mask & IT_ENTRY_EFFECT && entry->effect != IT_SET_SAMPLE_OFFSET)
- process_effects(sigrenderer, entry, 0);
- /* Don't bother checking the return value; if there
- * was a pattern delay, there can't be a speed=0.
- */
- entry++;
- }
- }
+ while (entry < sigrenderer->entry_end &&
+ !IT_IS_END_ROW(entry)) {
+ if (entry->mask & IT_ENTRY_EFFECT &&
+ entry->effect != IT_SET_SAMPLE_OFFSET)
+ process_effects(sigrenderer, entry, 0);
+ /* Don't bother checking the return value; if there
+ * was a pattern delay, there can't be a speed=0.
+ */
+ entry++;
+ }
+ }
- update_effects(sigrenderer);
- }
- } else {
- if ( !(sigdata->flags & IT_WAS_AN_STM) || !(sigrenderer->tick & 15)) {
- speed0:
- update_effects(sigrenderer);
- update_tick_counts(sigrenderer);
- }
- }
+ update_effects(sigrenderer);
+ }
+ } else {
+ if (!(sigdata->flags & IT_WAS_AN_STM) || !(sigrenderer->tick & 15)) {
+ speed0:
+ update_effects(sigrenderer);
+ update_tick_counts(sigrenderer);
+ }
+ }
- if (sigrenderer->globalvolume == 0) {
- if (sigrenderer->callbacks->global_volume_zero) {
- LONG_LONG t = sigrenderer->gvz_sub_time + ((TICK_TIME_DIVIDEND / (sigrenderer->tempo << 8)) << 16);
- sigrenderer->gvz_time += (int)(t >> 16);
- sigrenderer->gvz_sub_time = (int)t & 65535;
- if (sigrenderer->gvz_time >= 65536 * 12) {
+ if (sigrenderer->globalvolume == 0) {
+ if (sigrenderer->callbacks->global_volume_zero) {
+ LONG_LONG t =
+ sigrenderer->gvz_sub_time +
+ ((TICK_TIME_DIVIDEND / (sigrenderer->tempo << 8)) << 16);
+ sigrenderer->gvz_time += (int)(t >> 16);
+ sigrenderer->gvz_sub_time = (int)t & 65535;
+ if (sigrenderer->gvz_time >= 65536 * 12) {
#ifdef BIT_ARRAY_BULLSHIT
- sigrenderer->looped = 1;
+ sigrenderer->looped = 1;
#endif
- if ((*sigrenderer->callbacks->global_volume_zero)(sigrenderer->callbacks->global_volume_zero_data))
- return 1;
- }
- }
- } else {
- if (sigrenderer->callbacks->global_volume_zero) {
- sigrenderer->gvz_time = 0;
- sigrenderer->gvz_sub_time = 0;
- }
- }
+ if ((*sigrenderer->callbacks->global_volume_zero)(
+ sigrenderer->callbacks->global_volume_zero_data))
+ return 1;
+ }
+ }
+ } else {
+ if (sigrenderer->callbacks->global_volume_zero) {
+ sigrenderer->gvz_time = 0;
+ sigrenderer->gvz_sub_time = 0;
+ }
+ }
- process_all_playing(sigrenderer);
+ process_all_playing(sigrenderer);
- {
- LONG_LONG t = (TICK_TIME_DIVIDEND / (sigrenderer->tempo << 8)) << 16;
- if ( sigrenderer->sigdata->flags & IT_WAS_AN_STM ) {
- t /= 16;
- }
- t += sigrenderer->sub_time_left;
- sigrenderer->time_left += (int)(t >> 16);
- sigrenderer->sub_time_left = (int)t & 65535;
- }
+ {
+ LONG_LONG t = (TICK_TIME_DIVIDEND / (sigrenderer->tempo << 8)) << 16;
+ if (sigrenderer->sigdata->flags & IT_WAS_AN_STM) {
+ t /= 16;
+ }
+ t += sigrenderer->sub_time_left;
+ sigrenderer->time_left += (int)(t >> 16);
+ sigrenderer->sub_time_left = (int)t & 65535;
+ }
- return 0;
+ return 0;
}
-
-
int dumb_it_max_to_mix = 64;
#if 0
@@ -4614,1510 +4958,1638 @@
};
#endif
-static const int aiPTMVolScaled[] =
-{
- 0,
- 31, 54, 73, 96, 111, 130, 153, 172,
- 191, 206, 222, 237, 252, 275, 298, 317,
- 336, 351, 370, 386, 401, 416, 428, 443,
- 454, 466, 477, 489, 512, 531, 553, 573,
- 592, 611, 626, 645, 660, 679, 695, 710,
- 725, 740, 756, 767, 782, 798, 809, 820,
- 836, 847, 859, 870, 881, 897, 908, 916,
- 927, 939, 950, 962, 969, 983, 1005, 1024
-};
+static const int aiPTMVolScaled[] = {
+ 0, 31, 54, 73, 96, 111, 130, 153, 172, 191, 206, 222, 237,
+ 252, 275, 298, 317, 336, 351, 370, 386, 401, 416, 428, 443, 454,
+ 466, 477, 489, 512, 531, 553, 573, 592, 611, 626, 645, 660, 679,
+ 695, 710, 725, 740, 756, 767, 782, 798, 809, 820, 836, 847, 859,
+ 870, 881, 897, 908, 916, 927, 939, 950, 962, 969, 983, 1005, 1024};
-static float calculate_volume(DUMB_IT_SIGRENDERER *sigrenderer, IT_PLAYING *playing, float volume)
-{
- if (volume != 0) {
- int vol;
+static float calculate_volume(DUMB_IT_SIGRENDERER *sigrenderer,
+ IT_PLAYING *playing, float volume) {
+ if (volume != 0) {
+ int vol;
- if (playing->channel->flags & IT_CHANNEL_MUTED)
- return 0;
+ if (playing->channel->flags & IT_CHANNEL_MUTED)
+ return 0;
- if ((playing->channel->tremor_time & 192) == 128)
- return 0;
+ if ((playing->channel->tremor_time & 192) == 128)
+ return 0;
- switch (playing->tremolo_waveform)
- {
- default:
- vol = it_sine[playing->tremolo_time];
- break;
- case 1:
- vol = it_sawtooth[playing->tremolo_time];
- break;
- case 2:
- vol = it_squarewave[playing->tremolo_time];
- break;
- case 3:
- vol = (rand() % 129) - 64;
- break;
- case 4:
- vol = it_xm_squarewave[playing->tremolo_time];
- break;
- case 5:
- vol = it_xm_ramp[playing->tremolo_time];
- break;
- case 6:
- vol = it_xm_ramp[255-((sigrenderer->sigdata->flags & IT_WAS_A_MOD)?playing->vibrato_time:playing->tremolo_time)];
- break;
- }
- vol *= playing->tremolo_depth;
+ switch (playing->tremolo_waveform) {
+ default:
+ vol = it_sine[playing->tremolo_time];
+ break;
+ case 1:
+ vol = it_sawtooth[playing->tremolo_time];
+ break;
+ case 2:
+ vol = it_squarewave[playing->tremolo_time];
+ break;
+ case 3:
+ vol = (rand() % 129) - 64;
+ break;
+ case 4:
+ vol = it_xm_squarewave[playing->tremolo_time];
+ break;
+ case 5:
+ vol = it_xm_ramp[playing->tremolo_time];
+ break;
+ case 6:
+ vol = it_xm_ramp[255 - ((sigrenderer->sigdata->flags & IT_WAS_A_MOD)
+ ? playing->vibrato_time
+ : playing->tremolo_time)];
+ break;
+ }
+ vol *= playing->tremolo_depth;
- vol = (playing->volume << 5) + vol;
+ vol = (playing->volume << 5) + vol;
- if (vol <= 0)
- return 0;
+ if (vol <= 0)
+ return 0;
- if (vol > 64 << 5)
- vol = 64 << 5;
+ if (vol > 64 << 5)
+ vol = 64 << 5;
- if ( sigrenderer->sigdata->flags & IT_WAS_A_PTM )
- {
- int v = aiPTMVolScaled[ vol >> 5 ];
- if ( vol < 64 << 5 )
- {
- int f = vol & ( ( 1 << 5 ) - 1 );
- int f2 = ( 1 << 5 ) - f;
- int v2 = aiPTMVolScaled[ ( vol >> 5 ) + 1 ];
- v = ( v * f2 + v2 * f ) >> 5;
- }
- vol = v << 1;
- }
+ if (sigrenderer->sigdata->flags & IT_WAS_A_PTM) {
+ int v = aiPTMVolScaled[vol >> 5];
+ if (vol < 64 << 5) {
+ int f = vol & ((1 << 5) - 1);
+ int f2 = (1 << 5) - f;
+ int v2 = aiPTMVolScaled[(vol >> 5) + 1];
+ v = (v * f2 + v2 * f) >> 5;
+ }
+ vol = v << 1;
+ }
- volume *= vol; /* 64 << 5 */
- volume *= playing->sample->global_volume; /* 64 */
- volume *= playing->channel_volume; /* 64 */
- volume *= sigrenderer->globalvolume; /* 128 */
- volume *= sigrenderer->sigdata->mixing_volume; /* 128 */
- volume *= 1.0f / ((64 << 5) * 64.0f * 64.0f * 128.0f * 128.0f);
+ volume *= vol; /* 64 << 5 */
+ volume *= playing->sample->global_volume; /* 64 */
+ volume *= playing->channel_volume; /* 64 */
+ volume *= sigrenderer->globalvolume; /* 128 */
+ volume *= sigrenderer->sigdata->mixing_volume; /* 128 */
+ volume *= 1.0f / ((64 << 5) * 64.0f * 64.0f * 128.0f * 128.0f);
- if (volume && playing->instrument) {
- if (playing->enabled_envelopes & IT_ENV_VOLUME && playing->env_instrument->volume_envelope.n_nodes) {
- volume *= envelope_get_y(&playing->env_instrument->volume_envelope, &playing->volume_envelope);
- volume *= 1.0f / (64 << IT_ENVELOPE_SHIFT);
- }
- volume *= playing->instrument->global_volume; /* 128 */
- volume *= playing->fadeoutcount; /* 1024 */
- volume *= 1.0f / (128.0f * 1024.0f);
- }
- }
+ if (volume && playing->instrument) {
+ if (playing->enabled_envelopes & IT_ENV_VOLUME &&
+ playing->env_instrument->volume_envelope.n_nodes) {
+ volume *=
+ envelope_get_y(&playing->env_instrument->volume_envelope,
+ &playing->volume_envelope);
+ volume *= 1.0f / (64 << IT_ENVELOPE_SHIFT);
+ }
+ volume *= playing->instrument->global_volume; /* 128 */
+ volume *= playing->fadeoutcount; /* 1024 */
+ volume *= 1.0f / (128.0f * 1024.0f);
+ }
+ }
- return volume;
+ return volume;
}
+static int apply_pan_envelope(IT_PLAYING *playing) {
+ if (playing->pan <= 64 << IT_ENVELOPE_SHIFT) {
+ int pan;
+ if (playing->panbrello_depth) {
+ switch (playing->panbrello_waveform) {
+ default:
+ pan = it_sine[playing->panbrello_time];
+ break;
+ case 1:
+ pan = it_sawtooth[playing->panbrello_time];
+ break;
+ case 2:
+ pan = it_squarewave[playing->panbrello_time];
+ break;
+ case 3:
+ pan = playing->panbrello_random;
+ break;
+ }
+ pan *= playing->panbrello_depth << 3;
+ pan += playing->pan;
+ if (pan < 0)
+ pan = 0;
+ else if (pan > 64 << IT_ENVELOPE_SHIFT)
+ pan = 64 << IT_ENVELOPE_SHIFT;
+ } else {
+ pan = playing->pan;
+ }
-static int apply_pan_envelope(IT_PLAYING *playing)
-{
- if (playing->pan <= 64 << IT_ENVELOPE_SHIFT) {
- int pan;
- if (playing->panbrello_depth) {
- switch (playing->panbrello_waveform) {
- default:
- pan = it_sine[playing->panbrello_time];
- break;
- case 1:
- pan = it_sawtooth[playing->panbrello_time];
- break;
- case 2:
- pan = it_squarewave[playing->panbrello_time];
- break;
- case 3:
- pan = playing->panbrello_random;
- break;
- }
- pan *= playing->panbrello_depth << 3;
-
- pan += playing->pan;
- if (pan < 0) pan = 0;
- else if (pan > 64 << IT_ENVELOPE_SHIFT) pan = 64 << IT_ENVELOPE_SHIFT;
- } else {
- pan = playing->pan;
- }
-
- if (playing->env_instrument && (playing->enabled_envelopes & IT_ENV_PANNING)) {
- int p = envelope_get_y(&playing->env_instrument->pan_envelope, &playing->pan_envelope);
- if (pan > 32 << IT_ENVELOPE_SHIFT)
- p *= (64 << IT_ENVELOPE_SHIFT) - pan;
- else
- p *= pan;
- pan += p >> (5 + IT_ENVELOPE_SHIFT);
- }
- return pan;
- }
- return playing->pan;
+ if (playing->env_instrument &&
+ (playing->enabled_envelopes & IT_ENV_PANNING)) {
+ int p = envelope_get_y(&playing->env_instrument->pan_envelope,
+ &playing->pan_envelope);
+ if (pan > 32 << IT_ENVELOPE_SHIFT)
+ p *= (64 << IT_ENVELOPE_SHIFT) - pan;
+ else
+ p *= pan;
+ pan += p >> (5 + IT_ENVELOPE_SHIFT);
+ }
+ return pan;
+ }
+ return playing->pan;
}
-
-
/* Note: if a click remover is provided, and store_end_sample is set, then
* the end point will be computed twice. This situation should not arise.
*/
-static long render_playing(DUMB_IT_SIGRENDERER *sigrenderer, IT_PLAYING *playing, float volume, float main_delta, float delta, long pos, long size, sample_t **samples, int store_end_sample, int *left_to_mix)
-{
- int bits;
+static long render_playing(DUMB_IT_SIGRENDERER *sigrenderer,
+ IT_PLAYING *playing, float volume, float main_delta,
+ float delta, long pos, long size, sample_t **samples,
+ int store_end_sample, int *left_to_mix) {
+ int bits;
- long size_rendered;
+ long size_rendered;
- DUMB_VOLUME_RAMP_INFO lvol, rvol;
+ DUMB_VOLUME_RAMP_INFO lvol, rvol;
- if (playing->flags & IT_PLAYING_DEAD)
- return 0;
+ if (playing->flags & IT_PLAYING_DEAD)
+ return 0;
- if (*left_to_mix <= 0)
- volume = 0;
+ if (*left_to_mix <= 0)
+ volume = 0;
- {
- int quality = sigrenderer->resampling_quality;
- if (playing->sample->max_resampling_quality >= 0 && quality > playing->sample->max_resampling_quality)
- quality = playing->sample->max_resampling_quality;
- playing->resampler.quality = quality;
- resampler_set_quality(playing->resampler.fir_resampler[0], quality);
- resampler_set_quality(playing->resampler.fir_resampler[1], quality);
- }
+ {
+ int quality = sigrenderer->resampling_quality;
+ if (playing->sample->max_resampling_quality >= 0 &&
+ quality > playing->sample->max_resampling_quality)
+ quality = playing->sample->max_resampling_quality;
+ playing->resampler.quality = quality;
+ resampler_set_quality(playing->resampler.fir_resampler[0], quality);
+ resampler_set_quality(playing->resampler.fir_resampler[1], quality);
+ }
- bits = playing->sample->flags & IT_SAMPLE_16BIT ? 16 : 8;
+ bits = playing->sample->flags & IT_SAMPLE_16BIT ? 16 : 8;
- if (volume == 0) {
- if (playing->sample->flags & IT_SAMPLE_STEREO)
- size_rendered = dumb_resample_n_2_1(bits, &playing->resampler, NULL, size, 0, 0, delta);
- else
- size_rendered = dumb_resample_n_1_1(bits, &playing->resampler, NULL, size, 0, delta);
- } else {
- lvol.volume = playing->ramp_volume [0];
- rvol.volume = playing->ramp_volume [1];
- lvol.delta = playing->ramp_delta [0] * main_delta;
- rvol.delta = playing->ramp_delta [1] * main_delta;
- lvol.target = playing->float_volume [0];
- rvol.target = playing->float_volume [1];
- rvol.mix = lvol.mix = volume;
+ if (volume == 0) {
+ if (playing->sample->flags & IT_SAMPLE_STEREO)
+ size_rendered = dumb_resample_n_2_1(bits, &playing->resampler, NULL,
+ size, 0, 0, delta);
+ else
+ size_rendered = dumb_resample_n_1_1(bits, &playing->resampler, NULL,
+ size, 0, delta);
+ } else {
+ lvol.volume = playing->ramp_volume[0];
+ rvol.volume = playing->ramp_volume[1];
+ lvol.delta = playing->ramp_delta[0] * main_delta;
+ rvol.delta = playing->ramp_delta[1] * main_delta;
+ lvol.target = playing->float_volume[0];
+ rvol.target = playing->float_volume[1];
+ rvol.mix = lvol.mix = volume;
lvol.declick_stage = rvol.declick_stage = playing->declick_stage;
- if (sigrenderer->n_channels >= 2) {
- if (playing->sample->flags & IT_SAMPLE_STEREO) {
- if (sigrenderer->click_remover) {
- sample_t click[2];
- dumb_resample_get_current_sample_n_2_2(bits, &playing->resampler, &lvol, &rvol, click);
- dumb_record_click(sigrenderer->click_remover[0], pos, click[0]);
- dumb_record_click(sigrenderer->click_remover[1], pos, click[1]);
- }
- size_rendered = dumb_resample_n_2_2(bits, &playing->resampler, samples[0] + pos*2, size, &lvol, &rvol, delta);
- if (store_end_sample) {
- sample_t click[2];
- dumb_resample_get_current_sample_n_2_2(bits, &playing->resampler, &lvol, &rvol, click);
- samples[0][(pos + size_rendered) * 2] = click[0];
- samples[0][(pos + size_rendered) * 2 + 1] = click[1];
- }
- if (sigrenderer->click_remover) {
- sample_t click[2];
- dumb_resample_get_current_sample_n_2_2(bits, &playing->resampler, &lvol, &rvol, click);
- dumb_record_click(sigrenderer->click_remover[0], pos + size_rendered, -click[0]);
- dumb_record_click(sigrenderer->click_remover[1], pos + size_rendered, -click[1]);
- }
- } else {
- if (sigrenderer->click_remover) {
- sample_t click[2];
- dumb_resample_get_current_sample_n_1_2(bits, &playing->resampler, &lvol, &rvol, click);
- dumb_record_click(sigrenderer->click_remover[0], pos, click[0]);
- dumb_record_click(sigrenderer->click_remover[1], pos, click[1]);
- }
- size_rendered = dumb_resample_n_1_2(bits, &playing->resampler, samples[0] + pos*2, size, &lvol, &rvol, delta);
- if (store_end_sample) {
- sample_t click[2];
- dumb_resample_get_current_sample_n_1_2(bits, &playing->resampler, &lvol, &rvol, click);
- samples[0][(pos + size_rendered) * 2] = click[0];
- samples[0][(pos + size_rendered) * 2 + 1] = click[1];
- }
- if (sigrenderer->click_remover) {
- sample_t click[2];
- dumb_resample_get_current_sample_n_1_2(bits, &playing->resampler, &lvol, &rvol, click);
- dumb_record_click(sigrenderer->click_remover[0], pos + size_rendered, -click[0]);
- dumb_record_click(sigrenderer->click_remover[1], pos + size_rendered, -click[1]);
- }
- }
- } else {
- if (playing->sample->flags & IT_SAMPLE_STEREO) {
- if (sigrenderer->click_remover) {
- sample_t click;
- dumb_resample_get_current_sample_n_2_1(bits, &playing->resampler, &lvol, &rvol, &click);
- dumb_record_click(sigrenderer->click_remover[0], pos, click);
- }
- size_rendered = dumb_resample_n_2_1(bits, &playing->resampler, samples[0] + pos, size, &lvol, &rvol, delta);
- if (store_end_sample)
- dumb_resample_get_current_sample_n_2_1(bits, &playing->resampler, &lvol, &rvol, &samples[0][pos + size_rendered]);
- if (sigrenderer->click_remover) {
- sample_t click;
- dumb_resample_get_current_sample_n_2_1(bits, &playing->resampler, &lvol, &rvol, &click);
- dumb_record_click(sigrenderer->click_remover[0], pos + size_rendered, -click);
- }
- } else {
- if (sigrenderer->click_remover) {
- sample_t click;
- dumb_resample_get_current_sample_n_1_1(bits, &playing->resampler, &lvol, &click);
- dumb_record_click(sigrenderer->click_remover[0], pos, click);
- }
- size_rendered = dumb_resample_n_1_1(bits, &playing->resampler, samples[0] + pos, size, &lvol, delta);
- if (store_end_sample)
- dumb_resample_get_current_sample_n_1_1(bits, &playing->resampler, &lvol, &samples[0][pos + size_rendered]);
- if (sigrenderer->click_remover) {
- sample_t click;
- dumb_resample_get_current_sample_n_1_1(bits, &playing->resampler, &lvol, &click);
- dumb_record_click(sigrenderer->click_remover[0], pos + size_rendered, -click);
- }
- }
- }
- playing->ramp_volume [0] = lvol.volume;
- playing->ramp_volume [1] = rvol.volume;
- playing->declick_stage = (lvol.declick_stage > rvol.declick_stage) ? lvol.declick_stage : rvol.declick_stage;
+ if (sigrenderer->n_channels >= 2) {
+ if (playing->sample->flags & IT_SAMPLE_STEREO) {
+ if (sigrenderer->click_remover) {
+ sample_t click[2];
+ dumb_resample_get_current_sample_n_2_2(
+ bits, &playing->resampler, &lvol, &rvol, click);
+ dumb_record_click(sigrenderer->click_remover[0], pos,
+ click[0]);
+ dumb_record_click(sigrenderer->click_remover[1], pos,
+ click[1]);
+ }
+ size_rendered = dumb_resample_n_2_2(bits, &playing->resampler,
+ samples[0] + pos * 2, size,
+ &lvol, &rvol, delta);
+ if (store_end_sample) {
+ sample_t click[2];
+ dumb_resample_get_current_sample_n_2_2(
+ bits, &playing->resampler, &lvol, &rvol, click);
+ samples[0][(pos + size_rendered) * 2] = click[0];
+ samples[0][(pos + size_rendered) * 2 + 1] = click[1];
+ }
+ if (sigrenderer->click_remover) {
+ sample_t click[2];
+ dumb_resample_get_current_sample_n_2_2(
+ bits, &playing->resampler, &lvol, &rvol, click);
+ dumb_record_click(sigrenderer->click_remover[0],
+ pos + size_rendered, -click[0]);
+ dumb_record_click(sigrenderer->click_remover[1],
+ pos + size_rendered, -click[1]);
+ }
+ } else {
+ if (sigrenderer->click_remover) {
+ sample_t click[2];
+ dumb_resample_get_current_sample_n_1_2(
+ bits, &playing->resampler, &lvol, &rvol, click);
+ dumb_record_click(sigrenderer->click_remover[0], pos,
+ click[0]);
+ dumb_record_click(sigrenderer->click_remover[1], pos,
+ click[1]);
+ }
+ size_rendered = dumb_resample_n_1_2(bits, &playing->resampler,
+ samples[0] + pos * 2, size,
+ &lvol, &rvol, delta);
+ if (store_end_sample) {
+ sample_t click[2];
+ dumb_resample_get_current_sample_n_1_2(
+ bits, &playing->resampler, &lvol, &rvol, click);
+ samples[0][(pos + size_rendered) * 2] = click[0];
+ samples[0][(pos + size_rendered) * 2 + 1] = click[1];
+ }
+ if (sigrenderer->click_remover) {
+ sample_t click[2];
+ dumb_resample_get_current_sample_n_1_2(
+ bits, &playing->resampler, &lvol, &rvol, click);
+ dumb_record_click(sigrenderer->click_remover[0],
+ pos + size_rendered, -click[0]);
+ dumb_record_click(sigrenderer->click_remover[1],
+ pos + size_rendered, -click[1]);
+ }
+ }
+ } else {
+ if (playing->sample->flags & IT_SAMPLE_STEREO) {
+ if (sigrenderer->click_remover) {
+ sample_t click;
+ dumb_resample_get_current_sample_n_2_1(
+ bits, &playing->resampler, &lvol, &rvol, &click);
+ dumb_record_click(sigrenderer->click_remover[0], pos,
+ click);
+ }
+ size_rendered = dumb_resample_n_2_1(bits, &playing->resampler,
+ samples[0] + pos, size,
+ &lvol, &rvol, delta);
+ if (store_end_sample)
+ dumb_resample_get_current_sample_n_2_1(
+ bits, &playing->resampler, &lvol, &rvol,
+ &samples[0][pos + size_rendered]);
+ if (sigrenderer->click_remover) {
+ sample_t click;
+ dumb_resample_get_current_sample_n_2_1(
+ bits, &playing->resampler, &lvol, &rvol, &click);
+ dumb_record_click(sigrenderer->click_remover[0],
+ pos + size_rendered, -click);
+ }
+ } else {
+ if (sigrenderer->click_remover) {
+ sample_t click;
+ dumb_resample_get_current_sample_n_1_1(
+ bits, &playing->resampler, &lvol, &click);
+ dumb_record_click(sigrenderer->click_remover[0], pos,
+ click);
+ }
+ size_rendered =
+ dumb_resample_n_1_1(bits, &playing->resampler,
+ samples[0] + pos, size, &lvol, delta);
+ if (store_end_sample)
+ dumb_resample_get_current_sample_n_1_1(
+ bits, &playing->resampler, &lvol,
+ &samples[0][pos + size_rendered]);
+ if (sigrenderer->click_remover) {
+ sample_t click;
+ dumb_resample_get_current_sample_n_1_1(
+ bits, &playing->resampler, &lvol, &click);
+ dumb_record_click(sigrenderer->click_remover[0],
+ pos + size_rendered, -click);
+ }
+ }
+ }
+ playing->ramp_volume[0] = lvol.volume;
+ playing->ramp_volume[1] = rvol.volume;
+ playing->declick_stage = (lvol.declick_stage > rvol.declick_stage)
+ ? lvol.declick_stage
+ : rvol.declick_stage;
if (playing->declick_stage >= 4)
playing->flags |= IT_PLAYING_DEAD;
- (*left_to_mix)--;
- }
+ (*left_to_mix)--;
+ }
- if (playing->resampler.dir == 0)
- playing->flags |= IT_PLAYING_DEAD;
+ if (playing->resampler.dir == 0)
+ playing->flags |= IT_PLAYING_DEAD;
- return size_rendered;
+ return size_rendered;
}
-typedef struct IT_TO_MIX
-{
- IT_PLAYING *playing;
- float volume;
-}
-IT_TO_MIX;
+typedef struct IT_TO_MIX {
+ IT_PLAYING *playing;
+ float volume;
+} IT_TO_MIX;
+static int it_to_mix_compare(const void *e1, const void *e2) {
+ if (((const IT_TO_MIX *)e1)->volume > ((const IT_TO_MIX *)e2)->volume)
+ return -1;
+ if (((const IT_TO_MIX *)e1)->volume < ((const IT_TO_MIX *)e2)->volume)
+ return 1;
-static int it_to_mix_compare(const void *e1, const void *e2)
-{
- if (((const IT_TO_MIX *)e1)->volume > ((const IT_TO_MIX *)e2)->volume)
- return -1;
-
- if (((const IT_TO_MIX *)e1)->volume < ((const IT_TO_MIX *)e2)->volume)
- return 1;
-
- return 0;
+ return 0;
}
+static void apply_pitch_modifications(DUMB_IT_SIGDATA *sigdata,
+ IT_PLAYING *playing, float *delta,
+ int *cutoff) {
+ {
+ int sample_vibrato_shift;
+ switch (playing->sample_vibrato_waveform) {
+ default:
+ sample_vibrato_shift = it_sine[playing->sample_vibrato_time];
+ break;
+ case 1:
+ sample_vibrato_shift = it_sawtooth[playing->sample_vibrato_time];
+ break;
+ case 2:
+ sample_vibrato_shift = it_squarewave[playing->sample_vibrato_time];
+ break;
+ case 3:
+ sample_vibrato_shift = (rand() % 129) - 64;
+ break;
+ case 4:
+ sample_vibrato_shift =
+ it_xm_squarewave[playing->sample_vibrato_time];
+ break;
+ case 5:
+ sample_vibrato_shift = it_xm_ramp[playing->sample_vibrato_time];
+ break;
+ case 6:
+ sample_vibrato_shift =
+ it_xm_ramp[255 - playing->sample_vibrato_time];
+ break;
+ }
+ if (sigdata->flags & IT_WAS_AN_XM) {
+ int depth = playing->sample->vibrato_depth; /* True depth */
+ if (playing->sample->vibrato_rate) {
+ depth *= playing->sample_vibrato_depth; /* Tick number */
+ depth /= playing->sample->vibrato_rate; /* XM sweep */
+ }
+ sample_vibrato_shift *= depth;
+ } else
+ sample_vibrato_shift *= playing->sample_vibrato_depth >> 8;
-static void apply_pitch_modifications(DUMB_IT_SIGDATA *sigdata, IT_PLAYING *playing, float *delta, int *cutoff)
-{
- {
- int sample_vibrato_shift;
- switch (playing->sample_vibrato_waveform)
- {
- default:
- sample_vibrato_shift = it_sine[playing->sample_vibrato_time];
- break;
- case 1:
- sample_vibrato_shift = it_sawtooth[playing->sample_vibrato_time];
- break;
- case 2:
- sample_vibrato_shift = it_squarewave[playing->sample_vibrato_time];
- break;
- case 3:
- sample_vibrato_shift = (rand() % 129) - 64;
- break;
- case 4:
- sample_vibrato_shift = it_xm_squarewave[playing->sample_vibrato_time];
- break;
- case 5:
- sample_vibrato_shift = it_xm_ramp[playing->sample_vibrato_time];
- break;
- case 6:
- sample_vibrato_shift = it_xm_ramp[255-playing->sample_vibrato_time];
- break;
- }
+ sample_vibrato_shift >>= 4;
- if (sigdata->flags & IT_WAS_AN_XM) {
- int depth = playing->sample->vibrato_depth; /* True depth */
- if (playing->sample->vibrato_rate) {
- depth *= playing->sample_vibrato_depth; /* Tick number */
- depth /= playing->sample->vibrato_rate; /* XM sweep */
- }
- sample_vibrato_shift *= depth;
- } else
- sample_vibrato_shift *= playing->sample_vibrato_depth >> 8;
+ if (sample_vibrato_shift) {
+ if ((sigdata->flags & IT_LINEAR_SLIDES) ||
+ !(sigdata->flags & IT_WAS_AN_XM))
+ *delta *= (float)pow(DUMB_PITCH_BASE, sample_vibrato_shift);
+ else {
+ /* complicated! */
+ float scale = *delta / playing->delta;
- sample_vibrato_shift >>= 4;
+ *delta = (1.0f / 65536.0f) / playing->delta;
- if (sample_vibrato_shift) {
- if ((sigdata->flags & IT_LINEAR_SLIDES) || !(sigdata->flags & IT_WAS_AN_XM))
- *delta *= (float)pow(DUMB_PITCH_BASE, sample_vibrato_shift);
- else {
- /* complicated! */
- float scale = *delta / playing->delta;
+ *delta -= sample_vibrato_shift / AMIGA_DIVISOR;
- *delta = (1.0f / 65536.0f) / playing->delta;
+ if (*delta < (1.0f / 65536.0f) / 32767.0f) {
+ *delta = (1.0f / 65536.0f) / 32767.0f;
+ }
- *delta -= sample_vibrato_shift / AMIGA_DIVISOR;
+ *delta = (1.0f / 65536.0f) / *delta * scale;
+ }
+ }
+ }
- if (*delta < (1.0f / 65536.0f) / 32767.0f) {
- *delta = (1.0f / 65536.0f) / 32767.0f;
- }
-
- *delta = (1.0f / 65536.0f) / *delta * scale;
- }
- }
- }
-
- if (playing->env_instrument &&
- (playing->enabled_envelopes & IT_ENV_PITCH))
- {
- int p = envelope_get_y(&playing->env_instrument->pitch_envelope, &playing->pitch_envelope);
- if (playing->env_instrument->pitch_envelope.flags & IT_ENVELOPE_PITCH_IS_FILTER)
- *cutoff = (*cutoff * (p+(32<<IT_ENVELOPE_SHIFT))) >> (6 + IT_ENVELOPE_SHIFT);
- else
- *delta *= (float)pow(DUMB_PITCH_BASE, p >> (IT_ENVELOPE_SHIFT - 7));
- }
+ if (playing->env_instrument &&
+ (playing->enabled_envelopes & IT_ENV_PITCH)) {
+ int p = envelope_get_y(&playing->env_instrument->pitch_envelope,
+ &playing->pitch_envelope);
+ if (playing->env_instrument->pitch_envelope.flags &
+ IT_ENVELOPE_PITCH_IS_FILTER)
+ *cutoff = (*cutoff * (p + (32 << IT_ENVELOPE_SHIFT))) >>
+ (6 + IT_ENVELOPE_SHIFT);
+ else
+ *delta *= (float)pow(DUMB_PITCH_BASE, p >> (IT_ENVELOPE_SHIFT - 7));
+ }
}
+static void render_normal(DUMB_IT_SIGRENDERER *sigrenderer, float volume,
+ float delta, long pos, long size,
+ sample_t **samples) {
+ int i;
+ int n_to_mix = 0;
+ IT_TO_MIX to_mix[DUMB_IT_TOTAL_CHANNELS];
+ int left_to_mix = dumb_it_max_to_mix;
-static void render_normal(DUMB_IT_SIGRENDERER *sigrenderer, float volume, float delta, long pos, long size, sample_t **samples)
-{
- int i;
+ sample_t **samples_to_filter = NULL;
- int n_to_mix = 0;
- IT_TO_MIX to_mix[DUMB_IT_TOTAL_CHANNELS];
- int left_to_mix = dumb_it_max_to_mix;
+ // int max_output = sigrenderer->max_output;
- sample_t **samples_to_filter = NULL;
+ for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
+ if (sigrenderer->channel[i].playing &&
+ !(sigrenderer->channel[i].playing->flags & IT_PLAYING_DEAD)) {
+ to_mix[n_to_mix].playing = sigrenderer->channel[i].playing;
+ to_mix[n_to_mix].volume =
+ volume == 0
+ ? 0
+ : calculate_volume(sigrenderer,
+ sigrenderer->channel[i].playing, volume);
+ n_to_mix++;
+ }
+ }
- //int max_output = sigrenderer->max_output;
+ for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ if (sigrenderer
+ ->playing[i]) { /* Won't be dead; it would have been freed. */
+ to_mix[n_to_mix].playing = sigrenderer->playing[i];
+ to_mix[n_to_mix].volume =
+ volume == 0 ? 0
+ : calculate_volume(sigrenderer,
+ sigrenderer->playing[i], volume);
+ n_to_mix++;
+ }
+ }
- for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
- if (sigrenderer->channel[i].playing && !(sigrenderer->channel[i].playing->flags & IT_PLAYING_DEAD)) {
- to_mix[n_to_mix].playing = sigrenderer->channel[i].playing;
- to_mix[n_to_mix].volume = volume == 0 ? 0 : calculate_volume(sigrenderer, sigrenderer->channel[i].playing, volume);
- n_to_mix++;
- }
- }
+ if (volume != 0)
+ qsort(to_mix, n_to_mix, sizeof(IT_TO_MIX), &it_to_mix_compare);
- for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
- if (sigrenderer->playing[i]) { /* Won't be dead; it would have been freed. */
- to_mix[n_to_mix].playing = sigrenderer->playing[i];
- to_mix[n_to_mix].volume = volume == 0 ? 0 : calculate_volume(sigrenderer, sigrenderer->playing[i], volume);
- n_to_mix++;
- }
- }
+ for (i = 0; i < n_to_mix; i++) {
+ IT_PLAYING *playing = to_mix[i].playing;
+ float note_delta = delta * playing->delta;
+ int cutoff = playing->filter_cutoff << IT_ENVELOPE_SHIFT;
+ // int output = min( playing->output, max_output );
- if (volume != 0)
- qsort(to_mix, n_to_mix, sizeof(IT_TO_MIX), &it_to_mix_compare);
+ apply_pitch_modifications(sigrenderer->sigdata, playing, ¬e_delta,
+ &cutoff);
- for (i = 0; i < n_to_mix; i++) {
- IT_PLAYING *playing = to_mix[i].playing;
- float note_delta = delta * playing->delta;
- int cutoff = playing->filter_cutoff << IT_ENVELOPE_SHIFT;
- //int output = min( playing->output, max_output );
+ if (cutoff != 127 << IT_ENVELOPE_SHIFT ||
+ playing->filter_resonance != 0) {
+ playing->true_filter_cutoff = cutoff;
+ playing->true_filter_resonance = playing->filter_resonance;
+ }
- apply_pitch_modifications(sigrenderer->sigdata, playing, ¬e_delta, &cutoff);
+ if (volume &&
+ (playing->true_filter_cutoff != 127 << IT_ENVELOPE_SHIFT ||
+ playing->true_filter_resonance != 0)) {
+ if (!samples_to_filter) {
+ samples_to_filter =
+ allocate_sample_buffer(sigrenderer->n_channels, size + 1);
+ if (!samples_to_filter) {
+ render_playing(sigrenderer, playing, 0, delta, note_delta,
+ pos, size, NULL, 0, &left_to_mix);
+ continue;
+ }
+ }
+ {
+ long size_rendered;
+ DUMB_CLICK_REMOVER **cr = sigrenderer->click_remover;
+ dumb_silence(samples_to_filter[0],
+ sigrenderer->n_channels * (size + 1));
+ sigrenderer->click_remover = NULL;
+ size_rendered = render_playing(
+ sigrenderer, playing, volume, delta, note_delta, 0, size,
+ samples_to_filter, 1, &left_to_mix);
+ sigrenderer->click_remover = cr;
+ if (sigrenderer->n_channels == 2) {
+ it_filter(cr ? cr[0] : NULL, &playing->filter_state[0],
+ samples[0 /*output*/], pos, samples_to_filter[0],
+ size_rendered, 2, (int)(65536.0f / delta),
+ playing->true_filter_cutoff,
+ playing->true_filter_resonance);
+ it_filter(cr ? cr[1] : NULL, &playing->filter_state[1],
+ samples[0 /*output*/] + 1, pos,
+ samples_to_filter[0] + 1, size_rendered, 2,
+ (int)(65536.0f / delta),
+ playing->true_filter_cutoff,
+ playing->true_filter_resonance);
+ } else {
+ it_filter(cr ? cr[0] : NULL, &playing->filter_state[0],
+ samples[0 /*output*/], pos, samples_to_filter[0],
+ size_rendered, 1, (int)(65536.0f / delta),
+ playing->true_filter_cutoff,
+ playing->true_filter_resonance);
+ }
+ // FIXME: filtering is not prevented by low left_to_mix!
+ // FIXME: change 'warning' to 'FIXME' everywhere
+ }
+ } else {
+ it_reset_filter_state(&playing->filter_state[0]);
+ it_reset_filter_state(&playing->filter_state[1]);
+ render_playing(sigrenderer, playing, volume, delta, note_delta, pos,
+ size, samples /*&samples[output]*/, 0, &left_to_mix);
+ }
+ }
- if (cutoff != 127 << IT_ENVELOPE_SHIFT || playing->filter_resonance != 0) {
- playing->true_filter_cutoff = cutoff;
- playing->true_filter_resonance = playing->filter_resonance;
- }
+ destroy_sample_buffer(samples_to_filter);
- if (volume && (playing->true_filter_cutoff != 127 << IT_ENVELOPE_SHIFT || playing->true_filter_resonance != 0)) {
- if (!samples_to_filter) {
- samples_to_filter = allocate_sample_buffer(sigrenderer->n_channels, size + 1);
- if (!samples_to_filter) {
- render_playing(sigrenderer, playing, 0, delta, note_delta, pos, size, NULL, 0, &left_to_mix);
- continue;
- }
- }
- {
- long size_rendered;
- DUMB_CLICK_REMOVER **cr = sigrenderer->click_remover;
- dumb_silence(samples_to_filter[0], sigrenderer->n_channels * (size + 1));
- sigrenderer->click_remover = NULL;
- size_rendered = render_playing(sigrenderer, playing, volume, delta, note_delta, 0, size, samples_to_filter, 1, &left_to_mix);
- sigrenderer->click_remover = cr;
- if (sigrenderer->n_channels == 2) {
- it_filter(cr ? cr[0] : NULL, &playing->filter_state[0], samples[0 /*output*/], pos, samples_to_filter[0], size_rendered,
- 2, (int)(65536.0f/delta), playing->true_filter_cutoff, playing->true_filter_resonance);
- it_filter(cr ? cr[1] : NULL, &playing->filter_state[1], samples[0 /*output*/]+1, pos, samples_to_filter[0]+1, size_rendered,
- 2, (int)(65536.0f/delta), playing->true_filter_cutoff, playing->true_filter_resonance);
- } else {
- it_filter(cr ? cr[0] : NULL, &playing->filter_state[0], samples[0 /*output*/], pos, samples_to_filter[0], size_rendered,
- 1, (int)(65536.0f/delta), playing->true_filter_cutoff, playing->true_filter_resonance);
- }
- // FIXME: filtering is not prevented by low left_to_mix!
- // FIXME: change 'warning' to 'FIXME' everywhere
- }
- } else {
- it_reset_filter_state(&playing->filter_state[0]);
- it_reset_filter_state(&playing->filter_state[1]);
- render_playing(sigrenderer, playing, volume, delta, note_delta, pos, size, samples /*&samples[output]*/, 0, &left_to_mix);
- }
- }
+ for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
+ if (sigrenderer->channel[i].playing) {
+ // if ((sigrenderer->channel[i].playing->flags &
+ // (IT_PLAYING_BACKGROUND | IT_PLAYING_DEAD)) ==
+ // (IT_PLAYING_BACKGROUND | IT_PLAYING_DEAD)) {
+ // This change was made so Gxx would work correctly when a note
+ // faded out or whatever. Let's hope nothing else was broken by it.
+ if (sigrenderer->channel[i].playing->flags & IT_PLAYING_DEAD) {
+ free_playing(sigrenderer->channel[i].playing);
+ sigrenderer->channel[i].playing = NULL;
+ }
+ }
+ }
- destroy_sample_buffer(samples_to_filter);
-
- for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
- if (sigrenderer->channel[i].playing) {
- //if ((sigrenderer->channel[i].playing->flags & (IT_PLAYING_BACKGROUND | IT_PLAYING_DEAD)) == (IT_PLAYING_BACKGROUND | IT_PLAYING_DEAD)) {
- // This change was made so Gxx would work correctly when a note faded out or whatever. Let's hope nothing else was broken by it.
- if (sigrenderer->channel[i].playing->flags & IT_PLAYING_DEAD) {
- free_playing(sigrenderer->channel[i].playing);
- sigrenderer->channel[i].playing = NULL;
- }
- }
- }
-
- for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
- if (sigrenderer->playing[i]) {
- if (sigrenderer->playing[i]->flags & IT_PLAYING_DEAD) {
- free_playing(sigrenderer->playing[i]);
- sigrenderer->playing[i] = NULL;
- }
- }
- }
+ for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ if (sigrenderer->playing[i]) {
+ if (sigrenderer->playing[i]->flags & IT_PLAYING_DEAD) {
+ free_playing(sigrenderer->playing[i]);
+ sigrenderer->playing[i] = NULL;
+ }
+ }
+ }
}
+static void render_surround(DUMB_IT_SIGRENDERER *sigrenderer, float volume,
+ float delta, long pos, long size,
+ sample_t **samples) {
+ int i;
+ int n_to_mix = 0, n_to_mix_surround = 0;
+ IT_TO_MIX to_mix[DUMB_IT_TOTAL_CHANNELS];
+ IT_TO_MIX to_mix_surround[DUMB_IT_TOTAL_CHANNELS];
+ int left_to_mix = dumb_it_max_to_mix;
-static void render_surround(DUMB_IT_SIGRENDERER *sigrenderer, float volume, float delta, long pos, long size, sample_t **samples)
-{
- int i;
+ int saved_channels = sigrenderer->n_channels;
- int n_to_mix = 0, n_to_mix_surround = 0;
- IT_TO_MIX to_mix[DUMB_IT_TOTAL_CHANNELS];
- IT_TO_MIX to_mix_surround[DUMB_IT_TOTAL_CHANNELS];
- int left_to_mix = dumb_it_max_to_mix;
+ sample_t **samples_to_filter = NULL;
- int saved_channels = sigrenderer->n_channels;
+ DUMB_CLICK_REMOVER **saved_cr = sigrenderer->click_remover;
- sample_t **samples_to_filter = NULL;
+ // int max_output = sigrenderer->max_output;
- DUMB_CLICK_REMOVER **saved_cr = sigrenderer->click_remover;
+ for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
+ if (sigrenderer->channel[i].playing &&
+ !(sigrenderer->channel[i].playing->flags & IT_PLAYING_DEAD)) {
+ IT_PLAYING *playing = sigrenderer->channel[i].playing;
+ IT_TO_MIX *_to_mix = IT_IS_SURROUND_SHIFTED(playing->pan)
+ ? to_mix_surround + n_to_mix_surround++
+ : to_mix + n_to_mix++;
+ _to_mix->playing = playing;
+ _to_mix->volume =
+ volume == 0 ? 0
+ : calculate_volume(sigrenderer, playing, volume);
+ }
+ }
- //int max_output = sigrenderer->max_output;
+ for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ if (sigrenderer
+ ->playing[i]) { /* Won't be dead; it would have been freed. */
+ IT_PLAYING *playing = sigrenderer->playing[i];
+ IT_TO_MIX *_to_mix = IT_IS_SURROUND_SHIFTED(playing->pan)
+ ? to_mix_surround + n_to_mix_surround++
+ : to_mix + n_to_mix++;
+ _to_mix->playing = playing;
+ _to_mix->volume =
+ volume == 0 ? 0
+ : calculate_volume(sigrenderer, playing, volume);
+ }
+ }
- for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
- if (sigrenderer->channel[i].playing && !(sigrenderer->channel[i].playing->flags & IT_PLAYING_DEAD)) {
- IT_PLAYING *playing = sigrenderer->channel[i].playing;
- IT_TO_MIX *_to_mix = IT_IS_SURROUND_SHIFTED(playing->pan) ? to_mix_surround + n_to_mix_surround++ : to_mix + n_to_mix++;
- _to_mix->playing = playing;
- _to_mix->volume = volume == 0 ? 0 : calculate_volume(sigrenderer, playing, volume);
- }
- }
+ if (volume != 0) {
+ qsort(to_mix, n_to_mix, sizeof(IT_TO_MIX), &it_to_mix_compare);
+ qsort(to_mix_surround, n_to_mix_surround, sizeof(IT_TO_MIX),
+ &it_to_mix_compare);
+ }
- for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
- if (sigrenderer->playing[i]) { /* Won't be dead; it would have been freed. */
- IT_PLAYING *playing = sigrenderer->playing[i];
- IT_TO_MIX *_to_mix = IT_IS_SURROUND_SHIFTED(playing->pan) ? to_mix_surround + n_to_mix_surround++ : to_mix + n_to_mix++;
- _to_mix->playing = playing;
- _to_mix->volume = volume == 0 ? 0 : calculate_volume(sigrenderer, playing, volume);
- }
- }
+ sigrenderer->n_channels = 2;
- if (volume != 0) {
- qsort(to_mix, n_to_mix, sizeof(IT_TO_MIX), &it_to_mix_compare);
- qsort(to_mix_surround, n_to_mix_surround, sizeof(IT_TO_MIX), &it_to_mix_compare);
- }
+ for (i = 0; i < n_to_mix; i++) {
+ IT_PLAYING *playing = to_mix[i].playing;
+ float note_delta = delta * playing->delta;
+ int cutoff = playing->filter_cutoff << IT_ENVELOPE_SHIFT;
+ // int output = min( playing->output, max_output );
- sigrenderer->n_channels = 2;
+ apply_pitch_modifications(sigrenderer->sigdata, playing, ¬e_delta,
+ &cutoff);
- for (i = 0; i < n_to_mix; i++) {
- IT_PLAYING *playing = to_mix[i].playing;
- float note_delta = delta * playing->delta;
- int cutoff = playing->filter_cutoff << IT_ENVELOPE_SHIFT;
- //int output = min( playing->output, max_output );
+ if (cutoff != 127 << IT_ENVELOPE_SHIFT ||
+ playing->filter_resonance != 0) {
+ playing->true_filter_cutoff = cutoff;
+ playing->true_filter_resonance = playing->filter_resonance;
+ }
- apply_pitch_modifications(sigrenderer->sigdata, playing, ¬e_delta, &cutoff);
+ if (volume &&
+ (playing->true_filter_cutoff != 127 << IT_ENVELOPE_SHIFT ||
+ playing->true_filter_resonance != 0)) {
+ if (!samples_to_filter) {
+ samples_to_filter =
+ allocate_sample_buffer(sigrenderer->n_channels, size + 1);
+ if (!samples_to_filter) {
+ render_playing(sigrenderer, playing, 0, delta, note_delta,
+ pos, size, NULL, 0, &left_to_mix);
+ continue;
+ }
+ }
+ {
+ long size_rendered;
+ DUMB_CLICK_REMOVER **cr = sigrenderer->click_remover;
+ dumb_silence(samples_to_filter[0],
+ sigrenderer->n_channels * (size + 1));
+ sigrenderer->click_remover = NULL;
+ size_rendered = render_playing(
+ sigrenderer, playing, volume, delta, note_delta, 0, size,
+ samples_to_filter, 1, &left_to_mix);
+ sigrenderer->click_remover = cr;
+ it_filter(cr ? cr[0] : NULL, &playing->filter_state[0],
+ samples[0 /*output*/], pos, samples_to_filter[0],
+ size_rendered, 2, (int)(65536.0f / delta),
+ playing->true_filter_cutoff,
+ playing->true_filter_resonance);
+ it_filter(cr ? cr[1] : NULL, &playing->filter_state[1],
+ samples[0 /*output*/] + 1, pos,
+ samples_to_filter[0] + 1, size_rendered, 2,
+ (int)(65536.0f / delta), playing->true_filter_cutoff,
+ playing->true_filter_resonance);
+ }
+ } else {
+ it_reset_filter_state(&playing->filter_state[0]);
+ it_reset_filter_state(&playing->filter_state[1]);
+ render_playing(sigrenderer, playing, volume, delta, note_delta, pos,
+ size, samples /*&samples[output]*/, 0, &left_to_mix);
+ }
+ }
- if (cutoff != 127 << IT_ENVELOPE_SHIFT || playing->filter_resonance != 0) {
- playing->true_filter_cutoff = cutoff;
- playing->true_filter_resonance = playing->filter_resonance;
- }
+ sigrenderer->n_channels = 1;
+ sigrenderer->click_remover = saved_cr ? saved_cr + 2 : 0;
- if (volume && (playing->true_filter_cutoff != 127 << IT_ENVELOPE_SHIFT || playing->true_filter_resonance != 0)) {
- if (!samples_to_filter) {
- samples_to_filter = allocate_sample_buffer(sigrenderer->n_channels, size + 1);
- if (!samples_to_filter) {
- render_playing(sigrenderer, playing, 0, delta, note_delta, pos, size, NULL, 0, &left_to_mix);
- continue;
- }
- }
- {
- long size_rendered;
- DUMB_CLICK_REMOVER **cr = sigrenderer->click_remover;
- dumb_silence(samples_to_filter[0], sigrenderer->n_channels * (size + 1));
- sigrenderer->click_remover = NULL;
- size_rendered = render_playing(sigrenderer, playing, volume, delta, note_delta, 0, size, samples_to_filter, 1, &left_to_mix);
- sigrenderer->click_remover = cr;
- it_filter(cr ? cr[0] : NULL, &playing->filter_state[0], samples[0 /*output*/], pos, samples_to_filter[0], size_rendered,
- 2, (int)(65536.0f/delta), playing->true_filter_cutoff, playing->true_filter_resonance);
- it_filter(cr ? cr[1] : NULL, &playing->filter_state[1], samples[0 /*output*/]+1, pos, samples_to_filter[0]+1, size_rendered,
- 2, (int)(65536.0f/delta), playing->true_filter_cutoff, playing->true_filter_resonance);
- }
- } else {
- it_reset_filter_state(&playing->filter_state[0]);
- it_reset_filter_state(&playing->filter_state[1]);
- render_playing(sigrenderer, playing, volume, delta, note_delta, pos, size, samples /*&samples[output]*/, 0, &left_to_mix);
- }
- }
+ for (i = 0; i < n_to_mix_surround; i++) {
+ IT_PLAYING *playing = to_mix_surround[i].playing;
+ float note_delta = delta * playing->delta;
+ int cutoff = playing->filter_cutoff << IT_ENVELOPE_SHIFT;
+ // int output = min( playing->output, max_output );
- sigrenderer->n_channels = 1;
- sigrenderer->click_remover = saved_cr ? saved_cr + 2 : 0;
+ apply_pitch_modifications(sigrenderer->sigdata, playing, ¬e_delta,
+ &cutoff);
- for (i = 0; i < n_to_mix_surround; i++) {
- IT_PLAYING *playing = to_mix_surround[i].playing;
- float note_delta = delta * playing->delta;
- int cutoff = playing->filter_cutoff << IT_ENVELOPE_SHIFT;
- //int output = min( playing->output, max_output );
+ if (cutoff != 127 << IT_ENVELOPE_SHIFT ||
+ playing->filter_resonance != 0) {
+ playing->true_filter_cutoff = cutoff;
+ playing->true_filter_resonance = playing->filter_resonance;
+ }
- apply_pitch_modifications(sigrenderer->sigdata, playing, ¬e_delta, &cutoff);
+ if (volume &&
+ (playing->true_filter_cutoff != 127 << IT_ENVELOPE_SHIFT ||
+ playing->true_filter_resonance != 0)) {
+ if (!samples_to_filter) {
+ samples_to_filter =
+ allocate_sample_buffer(sigrenderer->n_channels, size + 1);
+ if (!samples_to_filter) {
+ render_playing(sigrenderer, playing, 0, delta, note_delta,
+ pos, size, NULL, 0, &left_to_mix);
+ continue;
+ }
+ }
+ {
+ long size_rendered;
+ DUMB_CLICK_REMOVER **cr = sigrenderer->click_remover;
+ dumb_silence(samples_to_filter[0], size + 1);
+ sigrenderer->click_remover = NULL;
+ size_rendered = render_playing(
+ sigrenderer, playing, volume, delta, note_delta, 0, size,
+ samples_to_filter, 1, &left_to_mix);
+ sigrenderer->click_remover = cr;
+ it_filter(cr ? cr[0] : NULL, &playing->filter_state[0],
+ samples[1 /*output*/], pos, samples_to_filter[0],
+ size_rendered, 1, (int)(65536.0f / delta),
+ playing->true_filter_cutoff,
+ playing->true_filter_resonance);
+ // FIXME: filtering is not prevented by low left_to_mix!
+ // FIXME: change 'warning' to 'FIXME' everywhere
+ }
+ } else {
+ it_reset_filter_state(&playing->filter_state[0]);
+ it_reset_filter_state(&playing->filter_state[1]);
+ render_playing(sigrenderer, playing, volume, delta, note_delta, pos,
+ size, &samples[1], 0, &left_to_mix);
+ }
+ }
- if (cutoff != 127 << IT_ENVELOPE_SHIFT || playing->filter_resonance != 0) {
- playing->true_filter_cutoff = cutoff;
- playing->true_filter_resonance = playing->filter_resonance;
- }
+ sigrenderer->n_channels = saved_channels;
+ sigrenderer->click_remover = saved_cr;
- if (volume && (playing->true_filter_cutoff != 127 << IT_ENVELOPE_SHIFT || playing->true_filter_resonance != 0)) {
- if (!samples_to_filter) {
- samples_to_filter = allocate_sample_buffer(sigrenderer->n_channels, size + 1);
- if (!samples_to_filter) {
- render_playing(sigrenderer, playing, 0, delta, note_delta, pos, size, NULL, 0, &left_to_mix);
- continue;
- }
- }
- {
- long size_rendered;
- DUMB_CLICK_REMOVER **cr = sigrenderer->click_remover;
- dumb_silence(samples_to_filter[0], size + 1);
- sigrenderer->click_remover = NULL;
- size_rendered = render_playing(sigrenderer, playing, volume, delta, note_delta, 0, size, samples_to_filter, 1, &left_to_mix);
- sigrenderer->click_remover = cr;
- it_filter(cr ? cr[0] : NULL, &playing->filter_state[0], samples[1 /*output*/], pos, samples_to_filter[0], size_rendered,
- 1, (int)(65536.0f/delta), playing->true_filter_cutoff, playing->true_filter_resonance);
- // FIXME: filtering is not prevented by low left_to_mix!
- // FIXME: change 'warning' to 'FIXME' everywhere
- }
- } else {
- it_reset_filter_state(&playing->filter_state[0]);
- it_reset_filter_state(&playing->filter_state[1]);
- render_playing(sigrenderer, playing, volume, delta, note_delta, pos, size, &samples[1], 0, &left_to_mix);
- }
- }
+ destroy_sample_buffer(samples_to_filter);
- sigrenderer->n_channels = saved_channels;
- sigrenderer->click_remover = saved_cr;
+ for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
+ if (sigrenderer->channel[i].playing) {
+ // if ((sigrenderer->channel[i].playing->flags &
+ // (IT_PLAYING_BACKGROUND | IT_PLAYING_DEAD)) ==
+ // (IT_PLAYING_BACKGROUND | IT_PLAYING_DEAD)) {
+ // This change was made so Gxx would work correctly when a note
+ // faded out or whatever. Let's hope nothing else was broken by it.
+ if (sigrenderer->channel[i].playing->flags & IT_PLAYING_DEAD) {
+ free_playing(sigrenderer->channel[i].playing);
+ sigrenderer->channel[i].playing = NULL;
+ }
+ }
+ }
- destroy_sample_buffer(samples_to_filter);
-
- for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
- if (sigrenderer->channel[i].playing) {
- //if ((sigrenderer->channel[i].playing->flags & (IT_PLAYING_BACKGROUND | IT_PLAYING_DEAD)) == (IT_PLAYING_BACKGROUND | IT_PLAYING_DEAD)) {
- // This change was made so Gxx would work correctly when a note faded out or whatever. Let's hope nothing else was broken by it.
- if (sigrenderer->channel[i].playing->flags & IT_PLAYING_DEAD) {
- free_playing(sigrenderer->channel[i].playing);
- sigrenderer->channel[i].playing = NULL;
- }
- }
- }
-
- for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
- if (sigrenderer->playing[i]) {
- if (sigrenderer->playing[i]->flags & IT_PLAYING_DEAD) {
- free_playing(sigrenderer->playing[i]);
- sigrenderer->playing[i] = NULL;
- }
- }
- }
+ for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ if (sigrenderer->playing[i]) {
+ if (sigrenderer->playing[i]->flags & IT_PLAYING_DEAD) {
+ free_playing(sigrenderer->playing[i]);
+ sigrenderer->playing[i] = NULL;
+ }
+ }
+ }
}
-
-
-static void render(DUMB_IT_SIGRENDERER *sigrenderer, float volume, float delta, long pos, long size, sample_t **samples)
-{
- if (size == 0) return;
- if (sigrenderer->n_channels == 1 || sigrenderer->n_channels == 2)
- render_normal(sigrenderer, volume, delta, pos, size, samples);
- else if (sigrenderer->n_channels == 3)
- render_surround(sigrenderer, volume, delta, pos, size, samples);
+static void render(DUMB_IT_SIGRENDERER *sigrenderer, float volume, float delta,
+ long pos, long size, sample_t **samples) {
+ if (size == 0)
+ return;
+ if (sigrenderer->n_channels == 1 || sigrenderer->n_channels == 2)
+ render_normal(sigrenderer, volume, delta, pos, size, samples);
+ else if (sigrenderer->n_channels == 3)
+ render_surround(sigrenderer, volume, delta, pos, size, samples);
}
+static DUMB_IT_SIGRENDERER *init_sigrenderer(DUMB_IT_SIGDATA *sigdata,
+ int n_channels, int startorder,
+ IT_CALLBACKS *callbacks,
+ DUMB_CLICK_REMOVER **cr) {
+ DUMB_IT_SIGRENDERER *sigrenderer;
+ int i;
+ if (startorder > sigdata->n_orders) {
+ free(callbacks);
+ dumb_destroy_click_remover_array(n_channels, cr);
+ return NULL;
+ }
-static DUMB_IT_SIGRENDERER *init_sigrenderer(DUMB_IT_SIGDATA *sigdata, int n_channels, int startorder, IT_CALLBACKS *callbacks, DUMB_CLICK_REMOVER **cr)
-{
- DUMB_IT_SIGRENDERER *sigrenderer;
- int i;
+ sigrenderer = malloc(sizeof(*sigrenderer));
+ if (!sigrenderer) {
+ free(callbacks);
+ dumb_destroy_click_remover_array(n_channels, cr);
+ return NULL;
+ }
- if (startorder > sigdata->n_orders) {
- free(callbacks);
- dumb_destroy_click_remover_array(n_channels, cr);
- return NULL;
- }
+ sigrenderer->callbacks = callbacks;
+ sigrenderer->click_remover = cr;
- sigrenderer = malloc(sizeof(*sigrenderer));
- if (!sigrenderer) {
- free(callbacks);
- dumb_destroy_click_remover_array(n_channels, cr);
- return NULL;
- }
-
- sigrenderer->callbacks = callbacks;
- sigrenderer->click_remover = cr;
-
- sigrenderer->sigdata = sigdata;
- sigrenderer->n_channels = n_channels;
- sigrenderer->resampling_quality = dumb_resampling_quality;
+ sigrenderer->sigdata = sigdata;
+ sigrenderer->n_channels = n_channels;
+ sigrenderer->resampling_quality = dumb_resampling_quality;
sigrenderer->ramp_style = DUMB_IT_RAMP_FULL;
- sigrenderer->globalvolume = sigdata->global_volume;
- sigrenderer->tempo = sigdata->tempo;
+ sigrenderer->globalvolume = sigdata->global_volume;
+ sigrenderer->tempo = sigdata->tempo;
- for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
- IT_CHANNEL *channel = &sigrenderer->channel[i];
+ for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
+ IT_CHANNEL *channel = &sigrenderer->channel[i];
#if IT_CHANNEL_MUTED != 1
#error this is wrong
#endif
- channel->flags = sigdata->channel_pan[i] >> 7;
- channel->volume = (sigdata->flags & IT_WAS_AN_XM) ? 0 : 64;
- channel->pan = sigdata->channel_pan[i] & 0x7F;
- channel->truepan = channel->pan << IT_ENVELOPE_SHIFT;
- channel->channelvolume = sigdata->channel_volume[i];
- channel->instrument = 0;
- channel->sample = 0;
- channel->note = IT_NOTE_OFF;
- channel->SFmacro = 0;
- channel->filter_cutoff = 127;
- channel->filter_resonance = 0;
- channel->new_note_action = 0xFF;
- channel->xm_retrig = 0;
- channel->retrig_tick = 0;
- channel->tremor_time = 0;
- channel->vibrato_waveform = 0;
- channel->tremolo_waveform = 0;
- channel->panbrello_waveform = 0;
- channel->glissando = 0;
- channel->toneslide = 0;
- channel->ptm_toneslide = 0;
- channel->ptm_last_toneslide = 0;
- channel->okt_toneslide = 0;
- channel->midi_state = 0;
- channel->lastvolslide = 0;
- channel->lastDKL = 0;
- channel->lastEF = 0;
- channel->lastG = 0;
- channel->lastHspeed = 0;
- channel->lastHdepth = 0;
- channel->lastRspeed = 0;
- channel->lastRdepth = 0;
- channel->lastYspeed = 0;
- channel->lastYdepth = 0;
- channel->lastI = 0;
- channel->lastJ = 0;
- channel->lastN = 0;
- channel->lastO = 0;
- channel->high_offset = 0;
- channel->lastP = 0;
- channel->lastQ = 0;
- channel->lastS = 0;
- channel->pat_loop_row = 0;
- channel->pat_loop_count = 0;
- channel->pat_loop_end_row = 0;
- channel->lastW = 0;
- channel->xm_lastE1 = 0;
- channel->xm_lastE2 = 0;
- channel->xm_lastEA = 0;
- channel->xm_lastEB = 0;
- channel->xm_lastX1 = 0;
- channel->xm_lastX2 = 0;
- channel->inv_loop_delay = 0;
- channel->inv_loop_speed = 0;
- channel->inv_loop_offset = 0;
- channel->playing = NULL;
- channel->key_off_count = 0;
- channel->note_cut_count = 0;
- channel->note_delay_count = 0;
- channel->note_delay_entry = 0;
+ channel->flags = sigdata->channel_pan[i] >> 7;
+ channel->volume = (sigdata->flags & IT_WAS_AN_XM) ? 0 : 64;
+ channel->pan = sigdata->channel_pan[i] & 0x7F;
+ channel->truepan = channel->pan << IT_ENVELOPE_SHIFT;
+ channel->channelvolume = sigdata->channel_volume[i];
+ channel->instrument = 0;
+ channel->sample = 0;
+ channel->note = IT_NOTE_OFF;
+ channel->SFmacro = 0;
+ channel->filter_cutoff = 127;
+ channel->filter_resonance = 0;
+ channel->new_note_action = 0xFF;
+ channel->xm_retrig = 0;
+ channel->retrig_tick = 0;
+ channel->tremor_time = 0;
+ channel->vibrato_waveform = 0;
+ channel->tremolo_waveform = 0;
+ channel->panbrello_waveform = 0;
+ channel->glissando = 0;
+ channel->toneslide = 0;
+ channel->ptm_toneslide = 0;
+ channel->ptm_last_toneslide = 0;
+ channel->okt_toneslide = 0;
+ channel->midi_state = 0;
+ channel->lastvolslide = 0;
+ channel->lastDKL = 0;
+ channel->lastEF = 0;
+ channel->lastG = 0;
+ channel->lastHspeed = 0;
+ channel->lastHdepth = 0;
+ channel->lastRspeed = 0;
+ channel->lastRdepth = 0;
+ channel->lastYspeed = 0;
+ channel->lastYdepth = 0;
+ channel->lastI = 0;
+ channel->lastJ = 0;
+ channel->lastN = 0;
+ channel->lastO = 0;
+ channel->high_offset = 0;
+ channel->lastP = 0;
+ channel->lastQ = 0;
+ channel->lastS = 0;
+ channel->pat_loop_row = 0;
+ channel->pat_loop_count = 0;
+ channel->pat_loop_end_row = 0;
+ channel->lastW = 0;
+ channel->xm_lastE1 = 0;
+ channel->xm_lastE2 = 0;
+ channel->xm_lastEA = 0;
+ channel->xm_lastEB = 0;
+ channel->xm_lastX1 = 0;
+ channel->xm_lastX2 = 0;
+ channel->inv_loop_delay = 0;
+ channel->inv_loop_speed = 0;
+ channel->inv_loop_offset = 0;
+ channel->playing = NULL;
+ channel->key_off_count = 0;
+ channel->note_cut_count = 0;
+ channel->note_delay_count = 0;
+ channel->note_delay_entry = 0;
#ifdef BIT_ARRAY_BULLSHIT
- channel->played_patjump = NULL;
- channel->played_patjump_order = 0xFFFE;
+ channel->played_patjump = NULL;
+ channel->played_patjump_order = 0xFFFE;
#endif
- //channel->output = 0;
- }
+ // channel->output = 0;
+ }
- if (sigdata->flags & IT_WAS_A_669)
- reset_effects(sigrenderer);
+ if (sigdata->flags & IT_WAS_A_669)
+ reset_effects(sigrenderer);
- for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++)
- sigrenderer->playing[i] = NULL;
+ for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++)
+ sigrenderer->playing[i] = NULL;
- sigrenderer->speed = sigdata->speed;
+ sigrenderer->speed = sigdata->speed;
- sigrenderer->processrow = 0xFFFE;
- sigrenderer->n_rows = 0;
- sigrenderer->breakrow = 0;
- sigrenderer->rowcount = 1;
- sigrenderer->order = startorder;
- /* meh!
- if (startorder > 0) {
- int n;
- for (n = startorder - 1; n >= 0; n--) {
- if (sigdata->order[n] > sigdata->n_patterns) {
- sigrenderer->restart_position = n + 1;
- break;
- }
- }
- }
- */
- if (startorder > 0) {
- sigrenderer->restart_position = startorder;
- } else {
- sigrenderer->restart_position = sigdata->restart_position;
- }
+ sigrenderer->processrow = 0xFFFE;
+ sigrenderer->n_rows = 0;
+ sigrenderer->breakrow = 0;
+ sigrenderer->rowcount = 1;
+ sigrenderer->order = startorder;
+ /* meh!
+ if (startorder > 0) {
+ int n;
+ for (n = startorder - 1; n >= 0; n--) {
+ if (sigdata->order[n] > sigdata->n_patterns) {
+ sigrenderer->restart_position = n + 1;
+ break;
+ }
+ }
+ }
+ */
+ if (startorder > 0) {
+ sigrenderer->restart_position = startorder;
+ } else {
+ sigrenderer->restart_position = sigdata->restart_position;
+ }
- sigrenderer->row = 0;
- sigrenderer->processorder = startorder - 1;
- sigrenderer->tick = 1;
+ sigrenderer->row = 0;
+ sigrenderer->processorder = startorder - 1;
+ sigrenderer->tick = 1;
#ifdef BIT_ARRAY_BULLSHIT
- sigrenderer->played = bit_array_create(sigdata->n_orders * 256);
+ sigrenderer->played = bit_array_create(sigdata->n_orders * 256);
- sigrenderer->looped = 0;
- sigrenderer->time_played = 0;
- sigrenderer->row_timekeeper = timekeeping_array_create(sigdata->n_orders * 256);
+ sigrenderer->looped = 0;
+ sigrenderer->time_played = 0;
+ sigrenderer->row_timekeeper =
+ timekeeping_array_create(sigdata->n_orders * 256);
#endif
- {
- int order;
- for (order = 0; order < sigdata->n_orders; order++) {
- int n = sigdata->order[order];
- if (n < sigdata->n_patterns) goto found_valid_order;
+ {
+ int order;
+ for (order = 0; order < sigdata->n_orders; order++) {
+ int n = sigdata->order[order];
+ if (n < sigdata->n_patterns)
+ goto found_valid_order;
#ifdef INVALID_ORDERS_END_SONG
- if (n != IT_ORDER_SKIP)
+ if (n != IT_ORDER_SKIP)
#else
- if (n == IT_ORDER_END)
+ if (n == IT_ORDER_END)
#endif
- break;
+ break;
#ifdef BIT_ARRAY_BULLSHIT
- /* Fix for played order detection for songs which have skips at the start of the orders list */
- for (n = 0; n < 256; n++) {
- bit_array_set(sigrenderer->played, order * 256 + n);
- timekeeping_array_push(sigrenderer->row_timekeeper, order * 256 + n, 0);
- timekeeping_array_bump(sigrenderer->row_timekeeper, order * 256 + n);
- }
+ /* Fix for played order detection for songs which have skips at the
+ * start of the orders list */
+ for (n = 0; n < 256; n++) {
+ bit_array_set(sigrenderer->played, order * 256 + n);
+ timekeeping_array_push(sigrenderer->row_timekeeper,
+ order * 256 + n, 0);
+ timekeeping_array_bump(sigrenderer->row_timekeeper,
+ order * 256 + n);
+ }
#endif
- }
- /* If we get here, there were no valid orders in the song. */
- _dumb_it_end_sigrenderer(sigrenderer);
- return NULL;
- }
- found_valid_order:
+ }
+ /* If we get here, there were no valid orders in the song. */
+ _dumb_it_end_sigrenderer(sigrenderer);
+ return NULL;
+ }
+found_valid_order:
- sigrenderer->time_left = 0;
- sigrenderer->sub_time_left = 0;
+ sigrenderer->time_left = 0;
+ sigrenderer->sub_time_left = 0;
- sigrenderer->gvz_time = 0;
- sigrenderer->gvz_sub_time = 0;
+ sigrenderer->gvz_time = 0;
+ sigrenderer->gvz_sub_time = 0;
- //sigrenderer->max_output = 0;
+ // sigrenderer->max_output = 0;
- if ( !(sigdata->flags & IT_WAS_PROCESSED) ) {
- if ( dumb_it_add_lpc( sigdata ) < 0 ) {
- _dumb_it_end_sigrenderer( sigrenderer );
- return NULL;
- }
+ if (!(sigdata->flags & IT_WAS_PROCESSED)) {
+ if (dumb_it_add_lpc(sigdata) < 0) {
+ _dumb_it_end_sigrenderer(sigrenderer);
+ return NULL;
+ }
- sigdata->flags |= IT_WAS_PROCESSED;
- }
+ sigdata->flags |= IT_WAS_PROCESSED;
+ }
- return sigrenderer;
+ return sigrenderer;
}
-
-void dumb_it_set_resampling_quality(DUMB_IT_SIGRENDERER * sigrenderer, int quality)
-{
- if (sigrenderer && quality >= 0 && quality < DUMB_RQ_N_LEVELS)
- {
- int i;
- sigrenderer->resampling_quality = quality;
- for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
- if (sigrenderer->channel[i].playing)
- {
- IT_PLAYING * playing = sigrenderer->channel[i].playing;
- playing->resampling_quality = quality;
- playing->resampler.quality = quality;
- resampler_set_quality(playing->resampler.fir_resampler[0], quality);
- resampler_set_quality(playing->resampler.fir_resampler[1], quality);
- }
- }
- for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
- if (sigrenderer->playing[i]) {
- IT_PLAYING * playing = sigrenderer->playing[i];
- playing->resampling_quality = quality;
- playing->resampler.quality = quality;
- resampler_set_quality(playing->resampler.fir_resampler[0], quality);
- resampler_set_quality(playing->resampler.fir_resampler[1], quality);
- }
- }
- }
+void dumb_it_set_resampling_quality(DUMB_IT_SIGRENDERER *sigrenderer,
+ int quality) {
+ if (sigrenderer && quality >= 0 && quality < DUMB_RQ_N_LEVELS) {
+ int i;
+ sigrenderer->resampling_quality = quality;
+ for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
+ if (sigrenderer->channel[i].playing) {
+ IT_PLAYING *playing = sigrenderer->channel[i].playing;
+ playing->resampling_quality = quality;
+ playing->resampler.quality = quality;
+ resampler_set_quality(playing->resampler.fir_resampler[0],
+ quality);
+ resampler_set_quality(playing->resampler.fir_resampler[1],
+ quality);
+ }
+ }
+ for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
+ if (sigrenderer->playing[i]) {
+ IT_PLAYING *playing = sigrenderer->playing[i];
+ playing->resampling_quality = quality;
+ playing->resampler.quality = quality;
+ resampler_set_quality(playing->resampler.fir_resampler[0],
+ quality);
+ resampler_set_quality(playing->resampler.fir_resampler[1],
+ quality);
+ }
+ }
+ }
}
-
-void dumb_it_set_ramp_style(DUMB_IT_SIGRENDERER * sigrenderer, int ramp_style) {
- if (sigrenderer && ramp_style >= 0 && ramp_style <= 2) {
- sigrenderer->ramp_style = ramp_style;
- }
+void dumb_it_set_ramp_style(DUMB_IT_SIGRENDERER *sigrenderer, int ramp_style) {
+ if (sigrenderer && ramp_style >= 0 && ramp_style <= 2) {
+ sigrenderer->ramp_style = ramp_style;
+ }
}
-
-void dumb_it_set_loop_callback(DUMB_IT_SIGRENDERER *sigrenderer, int (*callback)(void *data), void *data)
-{
- if (sigrenderer) {
- sigrenderer->callbacks->loop = callback;
- sigrenderer->callbacks->loop_data = data;
- }
+void dumb_it_set_loop_callback(DUMB_IT_SIGRENDERER *sigrenderer,
+ int (*callback)(void *data), void *data) {
+ if (sigrenderer) {
+ sigrenderer->callbacks->loop = callback;
+ sigrenderer->callbacks->loop_data = data;
+ }
}
-
-
-void dumb_it_set_xm_speed_zero_callback(DUMB_IT_SIGRENDERER *sigrenderer, int (*callback)(void *data), void *data)
-{
- if (sigrenderer) {
- sigrenderer->callbacks->xm_speed_zero = callback;
- sigrenderer->callbacks->xm_speed_zero_data = data;
- }
+void dumb_it_set_xm_speed_zero_callback(DUMB_IT_SIGRENDERER *sigrenderer,
+ int (*callback)(void *data),
+ void *data) {
+ if (sigrenderer) {
+ sigrenderer->callbacks->xm_speed_zero = callback;
+ sigrenderer->callbacks->xm_speed_zero_data = data;
+ }
}
-
-
-void dumb_it_set_midi_callback(DUMB_IT_SIGRENDERER *sigrenderer, int (*callback)(void *data, int channel, unsigned char midi_byte), void *data)
-{
- if (sigrenderer) {
- sigrenderer->callbacks->midi = callback;
- sigrenderer->callbacks->midi_data = data;
- }
+void dumb_it_set_midi_callback(DUMB_IT_SIGRENDERER *sigrenderer,
+ int (*callback)(void *data, int channel,
+ unsigned char midi_byte),
+ void *data) {
+ if (sigrenderer) {
+ sigrenderer->callbacks->midi = callback;
+ sigrenderer->callbacks->midi_data = data;
+ }
}
-
-
-void dumb_it_set_global_volume_zero_callback(DUMB_IT_SIGRENDERER *sigrenderer, int (*callback)(void *data), void *data)
-{
- if (sigrenderer) {
- sigrenderer->callbacks->global_volume_zero = callback;
- sigrenderer->callbacks->global_volume_zero_data = data;
- }
+void dumb_it_set_global_volume_zero_callback(DUMB_IT_SIGRENDERER *sigrenderer,
+ int (*callback)(void *data),
+ void *data) {
+ if (sigrenderer) {
+ sigrenderer->callbacks->global_volume_zero = callback;
+ sigrenderer->callbacks->global_volume_zero_data = data;
+ }
}
-
-
-static IT_CALLBACKS *create_callbacks(void)
-{
- IT_CALLBACKS *callbacks = malloc(sizeof(*callbacks));
- if (!callbacks) return NULL;
- callbacks->loop = NULL;
- callbacks->xm_speed_zero = NULL;
- callbacks->midi = NULL;
- callbacks->global_volume_zero = NULL;
- return callbacks;
+static IT_CALLBACKS *create_callbacks(void) {
+ IT_CALLBACKS *callbacks = malloc(sizeof(*callbacks));
+ if (!callbacks)
+ return NULL;
+ callbacks->loop = NULL;
+ callbacks->xm_speed_zero = NULL;
+ callbacks->midi = NULL;
+ callbacks->global_volume_zero = NULL;
+ return callbacks;
}
+static DUMB_IT_SIGRENDERER *dumb_it_init_sigrenderer(DUMB_IT_SIGDATA *sigdata,
+ int n_channels,
+ int startorder) {
+ IT_CALLBACKS *callbacks;
+ if (!sigdata)
+ return NULL;
-static DUMB_IT_SIGRENDERER *dumb_it_init_sigrenderer(DUMB_IT_SIGDATA *sigdata, int n_channels, int startorder)
-{
- IT_CALLBACKS *callbacks;
+ callbacks = create_callbacks();
+ if (!callbacks)
+ return NULL;
- if (!sigdata) return NULL;
-
- callbacks = create_callbacks();
- if (!callbacks) return NULL;
-
- return init_sigrenderer(sigdata, n_channels, startorder, callbacks,
- dumb_create_click_remover_array(n_channels));
+ return init_sigrenderer(sigdata, n_channels, startorder, callbacks,
+ dumb_create_click_remover_array(n_channels));
}
-
-
-DUH_SIGRENDERER *dumb_it_start_at_order(DUH *duh, int n_channels, int startorder)
-{
- DUMB_IT_SIGDATA *itsd = duh_get_it_sigdata(duh);
- DUMB_IT_SIGRENDERER *itsr = dumb_it_init_sigrenderer(itsd, n_channels, startorder);
- /*duh->length = dumb_it_build_checkpoints(itsd, startorder);*/
- return duh_encapsulate_it_sigrenderer(itsr, n_channels, 0);
+DUH_SIGRENDERER *dumb_it_start_at_order(DUH *duh, int n_channels,
+ int startorder) {
+ DUMB_IT_SIGDATA *itsd = duh_get_it_sigdata(duh);
+ DUMB_IT_SIGRENDERER *itsr =
+ dumb_it_init_sigrenderer(itsd, n_channels, startorder);
+ /*duh->length = dumb_it_build_checkpoints(itsd, startorder);*/
+ return duh_encapsulate_it_sigrenderer(itsr, n_channels, 0);
}
+static sigrenderer_t *it_start_sigrenderer(DUH *duh, sigdata_t *vsigdata,
+ int n_channels, long pos) {
+ DUMB_IT_SIGDATA *sigdata = vsigdata;
+ DUMB_IT_SIGRENDERER *sigrenderer;
+ (void)duh;
-static sigrenderer_t *it_start_sigrenderer(DUH *duh, sigdata_t *vsigdata, int n_channels, long pos)
-{
- DUMB_IT_SIGDATA *sigdata = vsigdata;
- DUMB_IT_SIGRENDERER *sigrenderer;
+ {
+ IT_CALLBACKS *callbacks = create_callbacks();
+ if (!callbacks)
+ return NULL;
- (void)duh;
+ if (sigdata->checkpoint) {
+ IT_CHECKPOINT *checkpoint = sigdata->checkpoint;
+ while (checkpoint->next && checkpoint->next->time < pos)
+ checkpoint = checkpoint->next;
+ sigrenderer =
+ dup_sigrenderer(checkpoint->sigrenderer, n_channels, callbacks);
+ if (!sigrenderer)
+ return NULL;
+ sigrenderer->click_remover =
+ dumb_create_click_remover_array(n_channels);
+ pos -= checkpoint->time;
+ } else {
+ sigrenderer =
+ init_sigrenderer(sigdata, n_channels, 0, callbacks,
+ dumb_create_click_remover_array(n_channels));
+ if (!sigrenderer)
+ return NULL;
+ }
+ }
- {
- IT_CALLBACKS *callbacks = create_callbacks();
- if (!callbacks) return NULL;
+ while (pos > 0 && pos >= sigrenderer->time_left) {
+ render(sigrenderer, 0, 1.0f, 0, sigrenderer->time_left, NULL);
- if (sigdata->checkpoint) {
- IT_CHECKPOINT *checkpoint = sigdata->checkpoint;
- while (checkpoint->next && checkpoint->next->time < pos)
- checkpoint = checkpoint->next;
- sigrenderer = dup_sigrenderer(checkpoint->sigrenderer, n_channels, callbacks);
- if (!sigrenderer) return NULL;
- sigrenderer->click_remover = dumb_create_click_remover_array(n_channels);
- pos -= checkpoint->time;
- } else {
- sigrenderer = init_sigrenderer(sigdata, n_channels, 0, callbacks,
- dumb_create_click_remover_array(n_channels));
- if (!sigrenderer) return NULL;
- }
- }
-
- while (pos > 0 && pos >= sigrenderer->time_left) {
- render(sigrenderer, 0, 1.0f, 0, sigrenderer->time_left, NULL);
-
#ifdef BIT_ARRAY_BULLSHIT
- sigrenderer->time_played += (LONG_LONG)sigrenderer->time_left << 16;
+ sigrenderer->time_played += (LONG_LONG)sigrenderer->time_left << 16;
#endif
- pos -= sigrenderer->time_left;
- sigrenderer->time_left = 0;
+ pos -= sigrenderer->time_left;
+ sigrenderer->time_left = 0;
- if (process_tick(sigrenderer)) {
- _dumb_it_end_sigrenderer(sigrenderer);
- return NULL;
- }
- }
+ if (process_tick(sigrenderer)) {
+ _dumb_it_end_sigrenderer(sigrenderer);
+ return NULL;
+ }
+ }
- render(sigrenderer, 0, 1.0f, 0, pos, NULL);
- sigrenderer->time_left -= pos;
+ render(sigrenderer, 0, 1.0f, 0, pos, NULL);
+ sigrenderer->time_left -= pos;
#ifdef BIT_ARRAY_BULLSHIT
- sigrenderer->time_played += (LONG_LONG)pos << 16;
+ sigrenderer->time_played += (LONG_LONG)pos << 16;
#endif
- return sigrenderer;
+ return sigrenderer;
}
+static long it_sigrenderer_get_samples(sigrenderer_t *vsigrenderer,
+ float volume, float delta, long size,
+ sample_t **samples) {
+ DUMB_IT_SIGRENDERER *sigrenderer = vsigrenderer;
+ long pos;
+ int dt;
+ long todo;
+ int ret;
+ LONG_LONG t;
+ if (sigrenderer->order < 0)
+ return 0; // problematic
-static long it_sigrenderer_get_samples(
- sigrenderer_t *vsigrenderer,
- float volume, float delta,
- long size, sample_t **samples
-)
-{
- DUMB_IT_SIGRENDERER *sigrenderer = vsigrenderer;
- long pos;
- int dt;
- long todo;
- int ret;
- LONG_LONG t;
+ if (!sigrenderer->tempo)
+ return 0; // also problematic
- if (sigrenderer->order < 0) return 0; // problematic
-
- if (!sigrenderer->tempo) return 0; // also problematic
+ pos = 0;
+ dt = (int)(delta * 65536.0f + 0.5f);
- pos = 0;
- dt = (int)(delta * 65536.0f + 0.5f);
+ /* When samples is finally used in render_playing(), it won't be used if
+ * volume is 0.
+ */
+ if (!samples)
+ volume = 0;
- /* When samples is finally used in render_playing(), it won't be used if
- * volume is 0.
- */
- if (!samples) volume = 0;
+ for (;;) {
+ todo = (long)((((LONG_LONG)sigrenderer->time_left << 16) |
+ sigrenderer->sub_time_left) /
+ dt);
- for (;;) {
- todo = (long)((((LONG_LONG)sigrenderer->time_left << 16) | sigrenderer->sub_time_left) / dt);
+ if (todo >= size)
+ break;
- if (todo >= size)
- break;
+ render(sigrenderer, volume, delta, pos, todo, samples);
- render(sigrenderer, volume, delta, pos, todo, samples);
+ pos += todo;
+ size -= todo;
- pos += todo;
- size -= todo;
+ t = sigrenderer->sub_time_left - (LONG_LONG)todo * dt;
+ sigrenderer->sub_time_left = (long)t & 65535;
+ sigrenderer->time_left += (long)(t >> 16);
- t = sigrenderer->sub_time_left - (LONG_LONG)todo * dt;
- sigrenderer->sub_time_left = (long)t & 65535;
- sigrenderer->time_left += (long)(t >> 16);
-
#ifdef BIT_ARRAY_BULLSHIT
- sigrenderer->time_played += (LONG_LONG)todo * dt;
+ sigrenderer->time_played += (LONG_LONG)todo * dt;
#endif
- ret = process_tick(sigrenderer);
+ ret = process_tick(sigrenderer);
- if (ret) {
- sigrenderer->order = -1;
- sigrenderer->row = -1;
- }
+ if (ret) {
+ sigrenderer->order = -1;
+ sigrenderer->row = -1;
+ }
#ifdef BIT_ARRAY_BULLSHIT
- if (sigrenderer->looped == 1) {
- sigrenderer->looped = -1;
- size = 0;
- timekeeping_array_reset(sigrenderer->row_timekeeper, sigrenderer->order * 256 + sigrenderer->row);
- sigrenderer->time_played = timekeeping_array_get_item(sigrenderer->row_timekeeper, sigrenderer->order * 256 + sigrenderer->row);
- break;
- }
+ if (sigrenderer->looped == 1) {
+ sigrenderer->looped = -1;
+ size = 0;
+ timekeeping_array_reset(sigrenderer->row_timekeeper,
+ sigrenderer->order * 256 +
+ sigrenderer->row);
+ sigrenderer->time_played = timekeeping_array_get_item(
+ sigrenderer->row_timekeeper,
+ sigrenderer->order * 256 + sigrenderer->row);
+ break;
+ }
#endif
- if (ret) {
- return pos;
- }
- }
+ if (ret) {
+ return pos;
+ }
+ }
- render(sigrenderer, volume, delta, pos, size, samples);
+ render(sigrenderer, volume, delta, pos, size, samples);
- pos += size;
+ pos += size;
- t = sigrenderer->sub_time_left - (LONG_LONG)size * dt;
- sigrenderer->sub_time_left = (long)t & 65535;
- sigrenderer->time_left += (long)(t >> 16);
+ t = sigrenderer->sub_time_left - (LONG_LONG)size * dt;
+ sigrenderer->sub_time_left = (long)t & 65535;
+ sigrenderer->time_left += (long)(t >> 16);
#ifdef BIT_ARRAY_BULLSHIT
- sigrenderer->time_played += (LONG_LONG)size * dt;
+ sigrenderer->time_played += (LONG_LONG)size * dt;
#endif
- if (samples)
- dumb_remove_clicks_array(sigrenderer->n_channels, sigrenderer->click_remover, samples, pos, 512.0f / delta);
+ if (samples)
+ dumb_remove_clicks_array(sigrenderer->n_channels,
+ sigrenderer->click_remover, samples, pos,
+ 512.0f / delta);
- return pos;
+ return pos;
}
-
-
-static void it_sigrenderer_get_current_sample(sigrenderer_t *vsigrenderer, float volume, sample_t *samples)
-{
- DUMB_IT_SIGRENDERER *sigrenderer = vsigrenderer;
- (void)volume; // for consideration: in any of these such functions, is 'volume' going to be required?
- dumb_click_remover_get_offset_array(sigrenderer->n_channels, sigrenderer->click_remover, samples);
+static void it_sigrenderer_get_current_sample(sigrenderer_t *vsigrenderer,
+ float volume, sample_t *samples) {
+ DUMB_IT_SIGRENDERER *sigrenderer = vsigrenderer;
+ (void)volume; // for consideration: in any of these such functions, is
+ // 'volume' going to be required?
+ dumb_click_remover_get_offset_array(sigrenderer->n_channels,
+ sigrenderer->click_remover, samples);
}
+void _dumb_it_end_sigrenderer(sigrenderer_t *vsigrenderer) {
+ DUMB_IT_SIGRENDERER *sigrenderer = vsigrenderer;
+ int i;
-void _dumb_it_end_sigrenderer(sigrenderer_t *vsigrenderer)
-{
- DUMB_IT_SIGRENDERER *sigrenderer = vsigrenderer;
-
- int i;
-
- if (sigrenderer) {
- for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
- if (sigrenderer->channel[i].playing)
- free_playing(sigrenderer->channel[i].playing);
+ if (sigrenderer) {
+ for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
+ if (sigrenderer->channel[i].playing)
+ free_playing(sigrenderer->channel[i].playing);
#ifdef BIT_ARRAY_BULLSHIT
- bit_array_destroy(sigrenderer->channel[i].played_patjump);
+ bit_array_destroy(sigrenderer->channel[i].played_patjump);
#endif
- }
+ }
- for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++)
- if (sigrenderer->playing[i])
- free_playing(sigrenderer->playing[i]);
+ for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++)
+ if (sigrenderer->playing[i])
+ free_playing(sigrenderer->playing[i]);
- dumb_destroy_click_remover_array(sigrenderer->n_channels, sigrenderer->click_remover);
+ dumb_destroy_click_remover_array(sigrenderer->n_channels,
+ sigrenderer->click_remover);
- if (sigrenderer->callbacks)
- free(sigrenderer->callbacks);
+ if (sigrenderer->callbacks)
+ free(sigrenderer->callbacks);
#ifdef BIT_ARRAY_BULLSHIT
- bit_array_destroy(sigrenderer->played);
+ bit_array_destroy(sigrenderer->played);
- timekeeping_array_destroy(sigrenderer->row_timekeeper);
+ timekeeping_array_destroy(sigrenderer->row_timekeeper);
#endif
- free(vsigrenderer);
- }
+ free(vsigrenderer);
+ }
}
-
-
#ifdef BIT_ARRAY_BULLSHIT
-static long it_sigrenderer_get_position(sigrenderer_t *vsigrenderer)
-{
- DUMB_IT_SIGRENDERER *sigrenderer = (DUMB_IT_SIGRENDERER *) vsigrenderer;
+static long it_sigrenderer_get_position(sigrenderer_t *vsigrenderer) {
+ DUMB_IT_SIGRENDERER *sigrenderer = (DUMB_IT_SIGRENDERER *)vsigrenderer;
- return (long)(sigrenderer->time_played >> 16);
+ return (long)(sigrenderer->time_played >> 16);
}
#endif
-
-
-DUH_SIGTYPE_DESC _dumb_sigtype_it = {
- SIGTYPE_IT,
- NULL,
- &it_start_sigrenderer,
- NULL,
- &it_sigrenderer_get_samples,
- &it_sigrenderer_get_current_sample,
+DUH_SIGTYPE_DESC _dumb_sigtype_it = {SIGTYPE_IT,
+ NULL,
+ &it_start_sigrenderer,
+ NULL,
+ &it_sigrenderer_get_samples,
+ &it_sigrenderer_get_current_sample,
#ifdef BIT_ARRAY_BULLSHIT
- &it_sigrenderer_get_position,
+ &it_sigrenderer_get_position,
#else
- NULL,
+ NULL,
#endif
- &_dumb_it_end_sigrenderer,
- &_dumb_it_unload_sigdata
-};
+ &_dumb_it_end_sigrenderer,
+ &_dumb_it_unload_sigdata};
-
-
-DUH_SIGRENDERER *duh_encapsulate_it_sigrenderer(DUMB_IT_SIGRENDERER *it_sigrenderer, int n_channels, long pos)
-{
- return duh_encapsulate_raw_sigrenderer(it_sigrenderer, &_dumb_sigtype_it, n_channels, pos);
+DUH_SIGRENDERER *
+duh_encapsulate_it_sigrenderer(DUMB_IT_SIGRENDERER *it_sigrenderer,
+ int n_channels, long pos) {
+ return duh_encapsulate_raw_sigrenderer(it_sigrenderer, &_dumb_sigtype_it,
+ n_channels, pos);
}
-
-
-DUMB_IT_SIGRENDERER *duh_get_it_sigrenderer(DUH_SIGRENDERER *sigrenderer)
-{
- return duh_get_raw_sigrenderer(sigrenderer, SIGTYPE_IT);
+DUMB_IT_SIGRENDERER *duh_get_it_sigrenderer(DUH_SIGRENDERER *sigrenderer) {
+ return duh_get_raw_sigrenderer(sigrenderer, SIGTYPE_IT);
}
-
-
/* Values of 64 or more will access NNA channels here. */
-void dumb_it_sr_get_channel_state(DUMB_IT_SIGRENDERER *sr, int channel, DUMB_IT_CHANNEL_STATE *state)
-{
- IT_PLAYING *playing;
- int t; /* temporary var for holding accurate pan and filter cutoff */
- float delta;
- ASSERT(channel < DUMB_IT_TOTAL_CHANNELS);
- if (!sr) { state->sample = 0; return; }
- if (channel >= DUMB_IT_N_CHANNELS) {
- playing = sr->playing[channel - DUMB_IT_N_CHANNELS];
- if (!playing) { state->sample = 0; return; }
- } else {
- playing = sr->channel[channel].playing;
- if (!playing) { state->sample = 0; return; }
- }
+void dumb_it_sr_get_channel_state(DUMB_IT_SIGRENDERER *sr, int channel,
+ DUMB_IT_CHANNEL_STATE *state) {
+ IT_PLAYING *playing;
+ int t; /* temporary var for holding accurate pan and filter cutoff */
+ float delta;
+ ASSERT(channel < DUMB_IT_TOTAL_CHANNELS);
+ if (!sr) {
+ state->sample = 0;
+ return;
+ }
+ if (channel >= DUMB_IT_N_CHANNELS) {
+ playing = sr->playing[channel - DUMB_IT_N_CHANNELS];
+ if (!playing) {
+ state->sample = 0;
+ return;
+ }
+ } else {
+ playing = sr->channel[channel].playing;
+ if (!playing) {
+ state->sample = 0;
+ return;
+ }
+ }
- if (playing->flags & IT_PLAYING_DEAD) { state->sample = 0; return; }
+ if (playing->flags & IT_PLAYING_DEAD) {
+ state->sample = 0;
+ return;
+ }
- state->channel = (int)(playing->channel - sr->channel);
- state->sample = playing->sampnum;
- state->volume = calculate_volume(sr, playing, 1.0f);
+ state->channel = (int)(playing->channel - sr->channel);
+ state->sample = playing->sampnum;
+ state->volume = calculate_volume(sr, playing, 1.0f);
- t = apply_pan_envelope(playing);
- state->pan = (unsigned char)((t + 128) >> IT_ENVELOPE_SHIFT);
- state->subpan = (signed char)t;
+ t = apply_pan_envelope(playing);
+ state->pan = (unsigned char)((t + 128) >> IT_ENVELOPE_SHIFT);
+ state->subpan = (signed char)t;
- delta = playing->delta * 65536.0f;
- t = playing->filter_cutoff << IT_ENVELOPE_SHIFT;
- apply_pitch_modifications(sr->sigdata, playing, &delta, &t);
- state->freq = (int)delta;
- if (t == 127 << IT_ENVELOPE_SHIFT && playing->filter_resonance == 0) {
- state->filter_resonance = playing->true_filter_resonance;
- t = playing->true_filter_cutoff;
- } else
- state->filter_resonance = playing->filter_resonance;
- state->filter_cutoff = (unsigned char)(t >> 8);
- state->filter_subcutoff = (unsigned char)t;
+ delta = playing->delta * 65536.0f;
+ t = playing->filter_cutoff << IT_ENVELOPE_SHIFT;
+ apply_pitch_modifications(sr->sigdata, playing, &delta, &t);
+ state->freq = (int)delta;
+ if (t == 127 << IT_ENVELOPE_SHIFT && playing->filter_resonance == 0) {
+ state->filter_resonance = playing->true_filter_resonance;
+ t = playing->true_filter_cutoff;
+ } else
+ state->filter_resonance = playing->filter_resonance;
+ state->filter_cutoff = (unsigned char)(t >> 8);
+ state->filter_subcutoff = (unsigned char)t;
}
-
-
-int dumb_it_callback_terminate(void *data)
-{
- (void)data;
- return 1;
+int dumb_it_callback_terminate(void *data) {
+ (void)data;
+ return 1;
}
-
-
-int dumb_it_callback_midi_block(void *data, int channel, unsigned char midi_byte)
-{
- (void)data;
- (void)channel;
- (void)midi_byte;
- return 1;
+int dumb_it_callback_midi_block(void *data, int channel,
+ unsigned char midi_byte) {
+ (void)data;
+ (void)channel;
+ (void)midi_byte;
+ return 1;
}
-
-
#define IT_CHECKPOINT_INTERVAL (30 * 65536) /* Half a minute */
-#define FUCKIT_THRESHOLD (120 * 60 * 65536) /* two hours? probably a pattern loop mess... */
+#define FUCKIT_THRESHOLD \
+ (120 * 60 * 65536) /* two hours? probably a pattern loop mess... */
/* Returns the length of the module, up until it first loops. */
-long dumb_it_build_checkpoints(DUMB_IT_SIGDATA *sigdata, int startorder)
-{
- IT_CHECKPOINT *checkpoint;
- if (!sigdata) return 0;
- checkpoint = sigdata->checkpoint;
- while (checkpoint) {
- IT_CHECKPOINT *next = checkpoint->next;
- _dumb_it_end_sigrenderer(checkpoint->sigrenderer);
- free(checkpoint);
- checkpoint = next;
- }
- sigdata->checkpoint = NULL;
- checkpoint = malloc(sizeof(*checkpoint));
- if (!checkpoint) return 0;
- checkpoint->time = 0;
- checkpoint->sigrenderer = dumb_it_init_sigrenderer(sigdata, 0, startorder);
- if (!checkpoint->sigrenderer) {
- free(checkpoint);
- return 0;
- }
- checkpoint->sigrenderer->callbacks->loop = &dumb_it_callback_terminate;
- checkpoint->sigrenderer->callbacks->xm_speed_zero = &dumb_it_callback_terminate;
- checkpoint->sigrenderer->callbacks->global_volume_zero = &dumb_it_callback_terminate;
+long dumb_it_build_checkpoints(DUMB_IT_SIGDATA *sigdata, int startorder) {
+ IT_CHECKPOINT *checkpoint;
+ if (!sigdata)
+ return 0;
+ checkpoint = sigdata->checkpoint;
+ while (checkpoint) {
+ IT_CHECKPOINT *next = checkpoint->next;
+ _dumb_it_end_sigrenderer(checkpoint->sigrenderer);
+ free(checkpoint);
+ checkpoint = next;
+ }
+ sigdata->checkpoint = NULL;
+ checkpoint = malloc(sizeof(*checkpoint));
+ if (!checkpoint)
+ return 0;
+ checkpoint->time = 0;
+ checkpoint->sigrenderer = dumb_it_init_sigrenderer(sigdata, 0, startorder);
+ if (!checkpoint->sigrenderer) {
+ free(checkpoint);
+ return 0;
+ }
+ checkpoint->sigrenderer->callbacks->loop = &dumb_it_callback_terminate;
+ checkpoint->sigrenderer->callbacks->xm_speed_zero =
+ &dumb_it_callback_terminate;
+ checkpoint->sigrenderer->callbacks->global_volume_zero =
+ &dumb_it_callback_terminate;
- if (sigdata->checkpoint)
- {
- IT_CHECKPOINT *checkpoint = sigdata->checkpoint;
- while (checkpoint) {
- IT_CHECKPOINT *next = checkpoint->next;
- _dumb_it_end_sigrenderer(checkpoint->sigrenderer);
- free(checkpoint);
- checkpoint = next;
- }
- }
+ if (sigdata->checkpoint) {
+ IT_CHECKPOINT *checkpoint = sigdata->checkpoint;
+ while (checkpoint) {
+ IT_CHECKPOINT *next = checkpoint->next;
+ _dumb_it_end_sigrenderer(checkpoint->sigrenderer);
+ free(checkpoint);
+ checkpoint = next;
+ }
+ }
- sigdata->checkpoint = checkpoint;
+ sigdata->checkpoint = checkpoint;
- for (;;) {
- long l;
- DUMB_IT_SIGRENDERER *sigrenderer = dup_sigrenderer(checkpoint->sigrenderer, 0, checkpoint->sigrenderer->callbacks);
- checkpoint->sigrenderer->callbacks = NULL;
- if (!sigrenderer) {
- checkpoint->next = NULL;
- return checkpoint->time;
- }
+ for (;;) {
+ long l;
+ DUMB_IT_SIGRENDERER *sigrenderer = dup_sigrenderer(
+ checkpoint->sigrenderer, 0, checkpoint->sigrenderer->callbacks);
+ checkpoint->sigrenderer->callbacks = NULL;
+ if (!sigrenderer) {
+ checkpoint->next = NULL;
+ return checkpoint->time;
+ }
- l = it_sigrenderer_get_samples(sigrenderer, 0, 1.0f, IT_CHECKPOINT_INTERVAL, NULL);
- if (l < IT_CHECKPOINT_INTERVAL) {
- _dumb_it_end_sigrenderer(sigrenderer);
- checkpoint->next = NULL;
- return checkpoint->time + l;
- }
+ l = it_sigrenderer_get_samples(sigrenderer, 0, 1.0f,
+ IT_CHECKPOINT_INTERVAL, NULL);
+ if (l < IT_CHECKPOINT_INTERVAL) {
+ _dumb_it_end_sigrenderer(sigrenderer);
+ checkpoint->next = NULL;
+ return checkpoint->time + l;
+ }
- checkpoint->next = malloc(sizeof(*checkpoint->next));
- if (!checkpoint->next) {
- _dumb_it_end_sigrenderer(sigrenderer);
- return checkpoint->time + IT_CHECKPOINT_INTERVAL;
- }
+ checkpoint->next = malloc(sizeof(*checkpoint->next));
+ if (!checkpoint->next) {
+ _dumb_it_end_sigrenderer(sigrenderer);
+ return checkpoint->time + IT_CHECKPOINT_INTERVAL;
+ }
- checkpoint->next->time = checkpoint->time + IT_CHECKPOINT_INTERVAL;
- checkpoint = checkpoint->next;
- checkpoint->sigrenderer = sigrenderer;
+ checkpoint->next->time = checkpoint->time + IT_CHECKPOINT_INTERVAL;
+ checkpoint = checkpoint->next;
+ checkpoint->sigrenderer = sigrenderer;
- if (checkpoint->time >= FUCKIT_THRESHOLD) {
- checkpoint->next = NULL;
- return 0;
- }
- }
+ if (checkpoint->time >= FUCKIT_THRESHOLD) {
+ checkpoint->next = NULL;
+ return 0;
+ }
+ }
}
+void dumb_it_do_initial_runthrough(DUH *duh) {
+ if (duh) {
+ DUMB_IT_SIGDATA *sigdata = duh_get_it_sigdata(duh);
-
-void dumb_it_do_initial_runthrough(DUH *duh)
-{
- if (duh) {
- DUMB_IT_SIGDATA *sigdata = duh_get_it_sigdata(duh);
-
- if (sigdata)
- duh_set_length(duh, dumb_it_build_checkpoints(sigdata, 0));
- }
+ if (sigdata)
+ duh_set_length(duh, dumb_it_build_checkpoints(sigdata, 0));
+ }
}
-static int is_pattern_silent(IT_PATTERN * pattern, int order) {
- int ret = 1;
- IT_ENTRY * entry, * end;
- if (!pattern || !pattern->n_rows || !pattern->n_entries || !pattern->entry) return 2;
+static int is_pattern_silent(IT_PATTERN *pattern, int order) {
+ int ret = 1;
+ IT_ENTRY *entry, *end;
+ if (!pattern || !pattern->n_rows || !pattern->n_entries || !pattern->entry)
+ return 2;
- if ( pattern->n_entries == pattern->n_rows ) {
- int n;
- entry = pattern->entry;
- for ( n = 0; n < pattern->n_entries; ++n, ++entry ) {
- if ( !IT_IS_END_ROW(entry) ) break;
- }
- if ( n == pattern->n_entries ) return 2;
- // broken?
- }
+ if (pattern->n_entries == pattern->n_rows) {
+ int n;
+ entry = pattern->entry;
+ for (n = 0; n < pattern->n_entries; ++n, ++entry) {
+ if (!IT_IS_END_ROW(entry))
+ break;
+ }
+ if (n == pattern->n_entries)
+ return 2;
+ // broken?
+ }
- entry = pattern->entry;
- end = entry + pattern->n_entries;
+ entry = pattern->entry;
+ end = entry + pattern->n_entries;
- while (entry < end) {
- if (!IT_IS_END_ROW(entry)) {
- if (entry->mask & (IT_ENTRY_INSTRUMENT | IT_ENTRY_VOLPAN))
- return 0;
- if (entry->mask & IT_ENTRY_NOTE && entry->note < 120)
- return 0;
- if (entry->mask & IT_ENTRY_EFFECT) {
- switch (entry->effect) {
- case IT_SET_GLOBAL_VOLUME:
- if (entry->effectvalue) return 0;
- break;
+ while (entry < end) {
+ if (!IT_IS_END_ROW(entry)) {
+ if (entry->mask & (IT_ENTRY_INSTRUMENT | IT_ENTRY_VOLPAN))
+ return 0;
+ if (entry->mask & IT_ENTRY_NOTE && entry->note < 120)
+ return 0;
+ if (entry->mask & IT_ENTRY_EFFECT) {
+ switch (entry->effect) {
+ case IT_SET_GLOBAL_VOLUME:
+ if (entry->effectvalue)
+ return 0;
+ break;
- case IT_SET_SPEED:
- if (entry->effectvalue > 64) ret++;
- break;
+ case IT_SET_SPEED:
+ if (entry->effectvalue > 64)
+ ret++;
+ break;
- case IT_SET_SONG_TEMPO:
- case IT_XM_KEY_OFF:
- break;
+ case IT_SET_SONG_TEMPO:
+ case IT_XM_KEY_OFF:
+ break;
- case IT_JUMP_TO_ORDER:
- if (entry->effectvalue != order)
- return 0;
- break;
+ case IT_JUMP_TO_ORDER:
+ if (entry->effectvalue != order)
+ return 0;
+ break;
- case IT_S:
- switch (entry->effectvalue >> 4) {
- case 0: // meh bastard
- if ( entry->effectvalue != 0 ) return 0;
- break;
+ case IT_S:
+ switch (entry->effectvalue >> 4) {
+ case 0: // meh bastard
+ if (entry->effectvalue != 0)
+ return 0;
+ break;
- case IT_S_FINE_PATTERN_DELAY:
- case IT_S_PATTERN_LOOP:
- case IT_S_PATTERN_DELAY:
- ret++;
- break;
+ case IT_S_FINE_PATTERN_DELAY:
+ case IT_S_PATTERN_LOOP:
+ case IT_S_PATTERN_DELAY:
+ ret++;
+ break;
- case IT_S7:
- if ((entry->effectvalue & 15) > 2)
- return 0;
- break;
+ case IT_S7:
+ if ((entry->effectvalue & 15) > 2)
+ return 0;
+ break;
- default:
- return 0;
- }
- break;
+ default:
+ return 0;
+ }
+ break;
- // clever idiot with his S L O W crap; do nothing
- case IT_VOLSLIDE_TONEPORTA:
- case IT_SET_SAMPLE_OFFSET:
- case IT_GLOBAL_VOLUME_SLIDE:
- if ( entry->effectvalue != 0 ) return 0;
- break;
+ // clever idiot with his S L O W crap; do nothing
+ case IT_VOLSLIDE_TONEPORTA:
+ case IT_SET_SAMPLE_OFFSET:
+ case IT_GLOBAL_VOLUME_SLIDE:
+ if (entry->effectvalue != 0)
+ return 0;
+ break;
- // genius also uses this instead of jump to order by mistake, meh, and it's bloody BCD
- case IT_BREAK_TO_ROW:
- if ( ( ( entry->effectvalue >> 4 ) * 10 + ( entry->effectvalue & 15 ) ) != order ) return 0;
- break;
+ // genius also uses this instead of jump to order by mistake,
+ // meh, and it's bloody BCD
+ case IT_BREAK_TO_ROW:
+ if (((entry->effectvalue >> 4) * 10 +
+ (entry->effectvalue & 15)) != order)
+ return 0;
+ break;
- default:
- return 0;
- }
- }
- }
- entry++;
- }
+ default:
+ return 0;
+ }
+ }
+ }
+ entry++;
+ }
- return ret;
+ return ret;
}
-int dumb_it_trim_silent_patterns(DUH * duh) {
- int n;
- DUMB_IT_SIGDATA *sigdata;
+int dumb_it_trim_silent_patterns(DUH *duh) {
+ int n;
+ DUMB_IT_SIGDATA *sigdata;
- if (!duh) return -1;
+ if (!duh)
+ return -1;
- sigdata = duh_get_it_sigdata(duh);
+ sigdata = duh_get_it_sigdata(duh);
- if (!sigdata || !sigdata->order || !sigdata->pattern) return -1;
+ if (!sigdata || !sigdata->order || !sigdata->pattern)
+ return -1;
- for (n = 0; n < sigdata->n_orders; n++) {
- int p = sigdata->order[n];
- if (p < sigdata->n_patterns) {
- IT_PATTERN * pattern = &sigdata->pattern[p];
- if (is_pattern_silent(pattern, n) > 1) {
- pattern->n_rows = 1;
- pattern->n_entries = 0;
- if (pattern->entry)
- {
- free(pattern->entry);
- pattern->entry = NULL;
- }
- } else
- break;
- }
- }
+ for (n = 0; n < sigdata->n_orders; n++) {
+ int p = sigdata->order[n];
+ if (p < sigdata->n_patterns) {
+ IT_PATTERN *pattern = &sigdata->pattern[p];
+ if (is_pattern_silent(pattern, n) > 1) {
+ pattern->n_rows = 1;
+ pattern->n_entries = 0;
+ if (pattern->entry) {
+ free(pattern->entry);
+ pattern->entry = NULL;
+ }
+ } else
+ break;
+ }
+ }
- if (n == sigdata->n_orders) return -1;
+ if (n == sigdata->n_orders)
+ return -1;
- for (n = sigdata->n_orders - 1; n >= 0; n--) {
- int p = sigdata->order[n];
- if (p < sigdata->n_patterns) {
- IT_PATTERN * pattern = &sigdata->pattern[p];
- if (is_pattern_silent(pattern, n) > 1) {
- pattern->n_rows = 1;
- pattern->n_entries = 0;
- if (pattern->entry)
- {
- free(pattern->entry);
- pattern->entry = NULL;
- }
- } else
- break;
- }
- }
+ for (n = sigdata->n_orders - 1; n >= 0; n--) {
+ int p = sigdata->order[n];
+ if (p < sigdata->n_patterns) {
+ IT_PATTERN *pattern = &sigdata->pattern[p];
+ if (is_pattern_silent(pattern, n) > 1) {
+ pattern->n_rows = 1;
+ pattern->n_entries = 0;
+ if (pattern->entry) {
+ free(pattern->entry);
+ pattern->entry = NULL;
+ }
+ } else
+ break;
+ }
+ }
- if (n < 0) return -1;
+ if (n < 0)
+ return -1;
- /*duh->length = dumb_it_build_checkpoints(sigdata, 0);*/
+ /*duh->length = dumb_it_build_checkpoints(sigdata, 0);*/
- return 0;
+ return 0;
}
-int dumb_it_scan_for_playable_orders(DUMB_IT_SIGDATA *sigdata, dumb_scan_callback callback, void * callback_data)
-{
- int n;
- long length;
- void * ba_played;
- DUMB_IT_SIGRENDERER * sigrenderer;
-
- if (!sigdata->n_orders || !sigdata->order) return -1;
+int dumb_it_scan_for_playable_orders(DUMB_IT_SIGDATA *sigdata,
+ dumb_scan_callback callback,
+ void *callback_data) {
+ int n;
+ long length;
+ void *ba_played;
+ DUMB_IT_SIGRENDERER *sigrenderer;
- ba_played = bit_array_create(sigdata->n_orders * 256);
- if (!ba_played) return -1;
+ if (!sigdata->n_orders || !sigdata->order)
+ return -1;
- /* Skip the first order, it should always be played */
- for (n = 1; n < sigdata->n_orders; n++) {
- if ((sigdata->order[n] >= sigdata->n_patterns) ||
- (is_pattern_silent(&sigdata->pattern[sigdata->order[n]], n) > 1))
- bit_array_set(ba_played, n * 256);
- }
+ ba_played = bit_array_create(sigdata->n_orders * 256);
+ if (!ba_played)
+ return -1;
- for (;;) {
- for (n = 0; n < sigdata->n_orders; n++) {
- if (!bit_array_test_range(ba_played, n * 256, 256)) break;
- }
+ /* Skip the first order, it should always be played */
+ for (n = 1; n < sigdata->n_orders; n++) {
+ if ((sigdata->order[n] >= sigdata->n_patterns) ||
+ (is_pattern_silent(&sigdata->pattern[sigdata->order[n]], n) > 1))
+ bit_array_set(ba_played, n * 256);
+ }
- if (n == sigdata->n_orders) break;
+ for (;;) {
+ for (n = 0; n < sigdata->n_orders; n++) {
+ if (!bit_array_test_range(ba_played, n * 256, 256))
+ break;
+ }
- sigrenderer = dumb_it_init_sigrenderer(sigdata, 0, n);
- if (!sigrenderer) {
- bit_array_destroy(ba_played);
- return -1;
- }
- sigrenderer->callbacks->loop = &dumb_it_callback_terminate;
- sigrenderer->callbacks->xm_speed_zero = &dumb_it_callback_terminate;
- sigrenderer->callbacks->global_volume_zero = &dumb_it_callback_terminate;
+ if (n == sigdata->n_orders)
+ break;
- length = 0;
+ sigrenderer = dumb_it_init_sigrenderer(sigdata, 0, n);
+ if (!sigrenderer) {
+ bit_array_destroy(ba_played);
+ return -1;
+ }
+ sigrenderer->callbacks->loop = &dumb_it_callback_terminate;
+ sigrenderer->callbacks->xm_speed_zero = &dumb_it_callback_terminate;
+ sigrenderer->callbacks->global_volume_zero =
+ &dumb_it_callback_terminate;
- for (;;) {
- long l;
+ length = 0;
- l = it_sigrenderer_get_samples(sigrenderer, 0, 1.0f, IT_CHECKPOINT_INTERVAL, NULL);
- length += l;
- if (l < IT_CHECKPOINT_INTERVAL || length >= FUCKIT_THRESHOLD) {
- /* SONG OVA! */
- break;
- }
- }
+ for (;;) {
+ long l;
- if ((*callback)(callback_data, n, length) < 0) return -1;
+ l = it_sigrenderer_get_samples(sigrenderer, 0, 1.0f,
+ IT_CHECKPOINT_INTERVAL, NULL);
+ length += l;
+ if (l < IT_CHECKPOINT_INTERVAL || length >= FUCKIT_THRESHOLD) {
+ /* SONG OVA! */
+ break;
+ }
+ }
- bit_array_merge(ba_played, sigrenderer->played, 0);
+ if ((*callback)(callback_data, n, length) < 0)
+ return -1;
- _dumb_it_end_sigrenderer(sigrenderer);
- }
+ bit_array_merge(ba_played, sigrenderer->played, 0);
- bit_array_destroy(ba_played);
+ _dumb_it_end_sigrenderer(sigrenderer);
+ }
- return 0;
+ bit_array_destroy(ba_played);
+
+ return 0;
}
--- a/src/it/itunload.c
+++ b/src/it/itunload.c
@@ -22,51 +22,48 @@
#include "dumb.h"
#include "internal/it.h"
+void _dumb_it_unload_sigdata(sigdata_t *vsigdata) {
+ if (vsigdata) {
+ DUMB_IT_SIGDATA *sigdata = vsigdata;
+ int n;
+ if (sigdata->song_message)
+ free(sigdata->song_message);
-void _dumb_it_unload_sigdata(sigdata_t *vsigdata)
-{
- if (vsigdata) {
- DUMB_IT_SIGDATA *sigdata = vsigdata;
- int n;
+ if (sigdata->order)
+ free(sigdata->order);
- if (sigdata->song_message)
- free(sigdata->song_message);
+ if (sigdata->instrument)
+ free(sigdata->instrument);
- if (sigdata->order)
- free(sigdata->order);
+ if (sigdata->sample) {
+ for (n = 0; n < sigdata->n_samples; n++)
+ if (sigdata->sample[n].data)
+ free(sigdata->sample[n].data);
- if (sigdata->instrument)
- free(sigdata->instrument);
+ free(sigdata->sample);
+ }
- if (sigdata->sample) {
- for (n = 0; n < sigdata->n_samples; n++)
- if (sigdata->sample[n].data)
- free(sigdata->sample[n].data);
+ if (sigdata->pattern) {
+ for (n = 0; n < sigdata->n_patterns; n++)
+ if (sigdata->pattern[n].entry)
+ free(sigdata->pattern[n].entry);
+ free(sigdata->pattern);
+ }
- free(sigdata->sample);
- }
+ if (sigdata->midi)
+ free(sigdata->midi);
- if (sigdata->pattern) {
- for (n = 0; n < sigdata->n_patterns; n++)
- if (sigdata->pattern[n].entry)
- free(sigdata->pattern[n].entry);
- free(sigdata->pattern);
- }
+ {
+ IT_CHECKPOINT *checkpoint = sigdata->checkpoint;
+ while (checkpoint) {
+ IT_CHECKPOINT *next = checkpoint->next;
+ _dumb_it_end_sigrenderer(checkpoint->sigrenderer);
+ free(checkpoint);
+ checkpoint = next;
+ }
+ }
- if (sigdata->midi)
- free(sigdata->midi);
-
- {
- IT_CHECKPOINT *checkpoint = sigdata->checkpoint;
- while (checkpoint) {
- IT_CHECKPOINT *next = checkpoint->next;
- _dumb_it_end_sigrenderer(checkpoint->sigrenderer);
- free(checkpoint);
- checkpoint = next;
- }
- }
-
- free(vsigdata);
- }
+ free(vsigdata);
+ }
}
--- a/src/it/load669.c
+++ b/src/it/load669.c
@@ -20,23 +20,20 @@
#include "dumb.h"
#include "internal/it.h"
-
-
/* dumb_load_669_quick(): loads a 669 file into a DUH struct, returning a
* pointer to the DUH struct. When you have finished with it, you must
* pass the pointer to unload_duh() so that the memory can be freed.
*/
-DUH *dumb_load_669_quick(const char *filename)
-{
- DUH *duh;
- DUMBFILE *f = dumbfile_open(filename);
+DUH *dumb_load_669_quick(const char *filename) {
+ DUH *duh;
+ DUMBFILE *f = dumbfile_open(filename);
- if (!f)
- return NULL;
+ if (!f)
+ return NULL;
- duh = dumb_read_669_quick(f);
+ duh = dumb_read_669_quick(f);
- dumbfile_close(f);
+ dumbfile_close(f);
- return duh;
+ return duh;
}
--- a/src/it/load6692.c
+++ b/src/it/load6692.c
@@ -20,15 +20,12 @@
#include "dumb.h"
#include "internal/it.h"
-
-
/* dumb_load_669(): loads a 669 file into a DUH struct, returning a pointer
* to the DUH struct. When you have finished with it, you must pass the
* pointer to unload_duh() so that the memory can be freed.
*/
-DUH *dumb_load_669(const char *filename)
-{
- DUH *duh = dumb_load_669_quick(filename);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+DUH *dumb_load_669(const char *filename) {
+ DUH *duh = dumb_load_669_quick(filename);
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/loadamf.c
+++ b/src/it/loadamf.c
@@ -20,23 +20,20 @@
#include "dumb.h"
#include "internal/it.h"
-
-
/* dumb_load_amf_quick(): loads a AMF file into a DUH struct, returning a
* pointer to the DUH struct. When you have finished with it, you must
* pass the pointer to unload_duh() so that the memory can be freed.
*/
-DUH *dumb_load_amf_quick(const char *filename)
-{
- DUH *duh;
- DUMBFILE *f = dumbfile_open(filename);
+DUH *dumb_load_amf_quick(const char *filename) {
+ DUH *duh;
+ DUMBFILE *f = dumbfile_open(filename);
- if (!f)
- return NULL;
+ if (!f)
+ return NULL;
- duh = dumb_read_amf_quick(f);
+ duh = dumb_read_amf_quick(f);
- dumbfile_close(f);
+ dumbfile_close(f);
- return duh;
+ return duh;
}
--- a/src/it/loadamf2.c
+++ b/src/it/loadamf2.c
@@ -20,15 +20,12 @@
#include "dumb.h"
#include "internal/it.h"
-
-
/* dumb_load_amf(): loads a AMF file into a DUH struct, returning a pointer
* to the DUH struct. When you have finished with it, you must pass the
* pointer to unload_duh() so that the memory can be freed.
*/
-DUH *dumb_load_amf(const char *filename)
-{
- DUH *duh = dumb_load_amf_quick(filename);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+DUH *dumb_load_amf(const char *filename) {
+ DUH *duh = dumb_load_amf_quick(filename);
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/loadany.c
+++ b/src/it/loadany.c
@@ -20,19 +20,16 @@
#include "dumb.h"
#include "internal/it.h"
+DUH *dumb_load_any_quick(const char *filename, int restrict_, int subsong) {
+ DUH *duh;
+ DUMBFILE *f = dumbfile_open(filename);
+ if (!f)
+ return NULL;
-DUH *dumb_load_any_quick(const char *filename, int restrict_, int subsong)
-{
- DUH *duh;
- DUMBFILE *f = dumbfile_open(filename);
-
- if (!f)
- return NULL;
-
duh = dumb_read_any_quick(f, restrict_, subsong);
- dumbfile_close(f);
+ dumbfile_close(f);
- return duh;
+ return duh;
}
--- a/src/it/loadany2.c
+++ b/src/it/loadany2.c
@@ -19,11 +19,8 @@
#include "dumb.h"
-
-
-DUH *dumb_load_any(const char *filename, int restrict_, int subsong)
-{
+DUH *dumb_load_any(const char *filename, int restrict_, int subsong) {
DUH *duh = dumb_load_any_quick(filename, restrict_, subsong);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/loadasy.c
+++ b/src/it/loadasy.c
@@ -20,23 +20,20 @@
#include "dumb.h"
#include "internal/it.h"
-
-
/* dumb_load_asy_quick(): loads a AMF file into a DUH struct, returning a
* pointer to the DUH struct. When you have finished with it, you must
* pass the pointer to unload_duh() so that the memory can be freed.
*/
-DUH *dumb_load_asy_quick(const char *filename)
-{
- DUH *duh;
- DUMBFILE *f = dumbfile_open(filename);
+DUH *dumb_load_asy_quick(const char *filename) {
+ DUH *duh;
+ DUMBFILE *f = dumbfile_open(filename);
- if (!f)
- return NULL;
+ if (!f)
+ return NULL;
- duh = dumb_read_asy_quick(f);
+ duh = dumb_read_asy_quick(f);
- dumbfile_close(f);
+ dumbfile_close(f);
- return duh;
+ return duh;
}
--- a/src/it/loadasy2.c
+++ b/src/it/loadasy2.c
@@ -20,15 +20,12 @@
#include "dumb.h"
#include "internal/it.h"
-
-
/* dumb_load_asy(): loads a AMF file into a DUH struct, returning a pointer
* to the DUH struct. When you have finished with it, you must pass the
* pointer to unload_duh() so that the memory can be freed.
*/
-DUH *dumb_load_asy(const char *filename)
-{
- DUH *duh = dumb_load_asy_quick(filename);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+DUH *dumb_load_asy(const char *filename) {
+ DUH *duh = dumb_load_asy_quick(filename);
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/loadmod.c
+++ b/src/it/loadmod.c
@@ -20,23 +20,20 @@
#include "dumb.h"
#include "internal/it.h"
-
-
/* dumb_load_mod_quick(): loads a MOD file into a DUH struct, returning a
* pointer to the DUH struct. When you have finished with it, you must
* pass the pointer to unload_duh() so that the memory can be freed.
*/
-DUH *dumb_load_mod_quick(const char *filename, int restrict_)
-{
- DUH *duh;
- DUMBFILE *f = dumbfile_open(filename);
+DUH *dumb_load_mod_quick(const char *filename, int restrict_) {
+ DUH *duh;
+ DUMBFILE *f = dumbfile_open(filename);
- if (!f)
- return NULL;
+ if (!f)
+ return NULL;
- duh = dumb_read_mod_quick(f, restrict_);
+ duh = dumb_read_mod_quick(f, restrict_);
- dumbfile_close(f);
+ dumbfile_close(f);
- return duh;
+ return duh;
}
--- a/src/it/loadmod2.c
+++ b/src/it/loadmod2.c
@@ -19,11 +19,8 @@
#include "dumb.h"
-
-
-DUH *dumb_load_mod(const char *filename, int restrict_)
-{
- DUH *duh = dumb_load_mod_quick(filename, restrict_);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+DUH *dumb_load_mod(const char *filename, int restrict_) {
+ DUH *duh = dumb_load_mod_quick(filename, restrict_);
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/loadmtm.c
+++ b/src/it/loadmtm.c
@@ -20,23 +20,20 @@
#include "dumb.h"
#include "internal/it.h"
-
-
/* dumb_load_mtm_quick(): loads a MTM file into a DUH struct, returning a
* pointer to the DUH struct. When you have finished with it, you must
* pass the pointer to unload_duh() so that the memory can be freed.
*/
-DUH *dumb_load_mtm_quick(const char *filename)
-{
- DUH *duh;
- DUMBFILE *f = dumbfile_open(filename);
+DUH *dumb_load_mtm_quick(const char *filename) {
+ DUH *duh;
+ DUMBFILE *f = dumbfile_open(filename);
- if (!f)
- return NULL;
+ if (!f)
+ return NULL;
- duh = dumb_read_mtm_quick(f);
+ duh = dumb_read_mtm_quick(f);
- dumbfile_close(f);
+ dumbfile_close(f);
- return duh;
+ return duh;
}
--- a/src/it/loadmtm2.c
+++ b/src/it/loadmtm2.c
@@ -20,15 +20,12 @@
#include "dumb.h"
#include "internal/it.h"
-
-
/* dumb_load_mtm(): loads a MTM file into a DUH struct, returning a pointer
* to the DUH struct. When you have finished with it, you must pass the
* pointer to unload_duh() so that the memory can be freed.
*/
-DUH *dumb_load_mtm(const char *filename)
-{
- DUH *duh = dumb_load_mtm_quick(filename);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+DUH *dumb_load_mtm(const char *filename) {
+ DUH *duh = dumb_load_mtm_quick(filename);
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/loadokt.c
+++ b/src/it/loadokt.c
@@ -20,23 +20,20 @@
#include "dumb.h"
#include "internal/it.h"
-
-
/* dumb_load_okt_quick(): loads an OKT file into a DUH struct, returning a
* pointer to the DUH struct. When you have finished with it, you must
* pass the pointer to unload_duh() so that the memory can be freed.
*/
-DUH *dumb_load_okt_quick(const char *filename)
-{
- DUH *duh;
- DUMBFILE *f = dumbfile_open(filename);
+DUH *dumb_load_okt_quick(const char *filename) {
+ DUH *duh;
+ DUMBFILE *f = dumbfile_open(filename);
- if (!f)
- return NULL;
+ if (!f)
+ return NULL;
- duh = dumb_read_okt_quick(f);
+ duh = dumb_read_okt_quick(f);
- dumbfile_close(f);
+ dumbfile_close(f);
- return duh;
+ return duh;
}
--- a/src/it/loadokt2.c
+++ b/src/it/loadokt2.c
@@ -19,11 +19,8 @@
#include "dumb.h"
-
-
-DUH *dumb_load_okt(const char *filename)
-{
- DUH *duh = dumb_load_okt_quick(filename);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+DUH *dumb_load_okt(const char *filename) {
+ DUH *duh = dumb_load_okt_quick(filename);
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/loadoldpsm.c
+++ b/src/it/loadoldpsm.c
@@ -20,24 +20,21 @@
#include "dumb.h"
#include "internal/it.h"
-
-
/* dumb_load_old_psm_quick(): loads an old PSM file into a DUH struct,
* returning a pointer to the DUH struct. When you have finished with it,
* you must pass the pointer to unload_duh() so that the memory can be
* freed.
*/
-DUH *dumb_load_old_psm_quick(const char *filename)
-{
- DUH *duh;
- DUMBFILE *f = dumbfile_open(filename);
+DUH *dumb_load_old_psm_quick(const char *filename) {
+ DUH *duh;
+ DUMBFILE *f = dumbfile_open(filename);
- if (!f)
- return NULL;
+ if (!f)
+ return NULL;
- duh = dumb_read_old_psm_quick(f);
+ duh = dumb_read_old_psm_quick(f);
- dumbfile_close(f);
+ dumbfile_close(f);
- return duh;
+ return duh;
}
--- a/src/it/loadoldpsm2.c
+++ b/src/it/loadoldpsm2.c
@@ -20,15 +20,12 @@
#include "dumb.h"
#include "internal/it.h"
-
-
/* dumb_load_old_psm(): loads an old PSM file into a DUH struct, returning
* a pointer to the DUH struct. When you have finished with it, you must
* pass the pointer to unload_duh() so that the memory can be freed.
*/
-DUH *dumb_load_old_psm(const char *filename)
-{
- DUH *duh = dumb_load_old_psm_quick(filename);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+DUH *dumb_load_old_psm(const char *filename) {
+ DUH *duh = dumb_load_old_psm_quick(filename);
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/loadpsm.c
+++ b/src/it/loadpsm.c
@@ -20,23 +20,20 @@
#include "dumb.h"
#include "internal/it.h"
-
-
/* dumb_load_psm_quick(): loads a PSM file into a DUH struct, returning a
* pointer to the DUH struct. When you have finished with it, you must
* pass the pointer to unload_duh() so that the memory can be freed.
*/
-DUH *dumb_load_psm_quick(const char *filename, int subsong)
-{
- DUH *duh;
- DUMBFILE *f = dumbfile_open(filename);
+DUH *dumb_load_psm_quick(const char *filename, int subsong) {
+ DUH *duh;
+ DUMBFILE *f = dumbfile_open(filename);
- if (!f)
- return NULL;
+ if (!f)
+ return NULL;
- duh = dumb_read_psm_quick(f, subsong);
+ duh = dumb_read_psm_quick(f, subsong);
- dumbfile_close(f);
+ dumbfile_close(f);
- return duh;
+ return duh;
}
--- a/src/it/loadpsm2.c
+++ b/src/it/loadpsm2.c
@@ -20,15 +20,12 @@
#include "dumb.h"
#include "internal/it.h"
-
-
/* dumb_load_psm(): loads a PSM file into a DUH struct, returning a pointer
* to the DUH struct. When you have finished with it, you must pass the
* pointer to unload_duh() so that the memory can be freed.
*/
-DUH *dumb_load_psm(const char *filename, int subsong)
-{
- DUH *duh = dumb_load_psm_quick(filename, subsong);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+DUH *dumb_load_psm(const char *filename, int subsong) {
+ DUH *duh = dumb_load_psm_quick(filename, subsong);
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/loadptm.c
+++ b/src/it/loadptm.c
@@ -20,23 +20,20 @@
#include "dumb.h"
#include "internal/it.h"
-
-
/* dumb_load_ptm_quick(): loads a PTM file into a DUH struct, returning a
* pointer to the DUH struct. When you have finished with it, you must
* pass the pointer to unload_duh() so that the memory can be freed.
*/
-DUH *dumb_load_ptm_quick(const char *filename)
-{
- DUH *duh;
- DUMBFILE *f = dumbfile_open(filename);
+DUH *dumb_load_ptm_quick(const char *filename) {
+ DUH *duh;
+ DUMBFILE *f = dumbfile_open(filename);
- if (!f)
- return NULL;
+ if (!f)
+ return NULL;
- duh = dumb_read_ptm_quick(f);
+ duh = dumb_read_ptm_quick(f);
- dumbfile_close(f);
+ dumbfile_close(f);
- return duh;
+ return duh;
}
--- a/src/it/loadptm2.c
+++ b/src/it/loadptm2.c
@@ -20,15 +20,12 @@
#include "dumb.h"
#include "internal/it.h"
-
-
/* dumb_load_ptm(): loads a PTM file into a DUH struct, returning a pointer
* to the DUH struct. When you have finished with it, you must pass the
* pointer to unload_duh() so that the memory can be freed.
*/
-DUH *dumb_load_ptm(const char *filename)
-{
- DUH *duh = dumb_load_ptm_quick(filename);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+DUH *dumb_load_ptm(const char *filename) {
+ DUH *duh = dumb_load_ptm_quick(filename);
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/loadriff.c
+++ b/src/it/loadriff.c
@@ -20,23 +20,20 @@
#include "dumb.h"
#include "internal/it.h"
-
-
/* dumb_load_riff_quick(): loads a RIFF file into a DUH struct, returning
* a pointer to the DUH struct. When you have finished with it, you must
* pass the pointer to unload_duh() so that the memory can be freed.
*/
-DUH * dumb_load_riff_quick( const char *filename )
-{
- DUH * duh;
- DUMBFILE * f = dumbfile_open( filename );
+DUH *dumb_load_riff_quick(const char *filename) {
+ DUH *duh;
+ DUMBFILE *f = dumbfile_open(filename);
- if ( ! f )
- return NULL;
+ if (!f)
+ return NULL;
- duh = dumb_read_riff_quick( f );
+ duh = dumb_read_riff_quick(f);
- dumbfile_close( f );
+ dumbfile_close(f);
- return duh;
+ return duh;
}
--- a/src/it/loadriff2.c
+++ b/src/it/loadriff2.c
@@ -19,11 +19,8 @@
#include "dumb.h"
-
-
-DUH *dumb_load_riff(const char *filename)
-{
- DUH *duh = dumb_load_riff_quick(filename);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+DUH *dumb_load_riff(const char *filename) {
+ DUH *duh = dumb_load_riff_quick(filename);
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/loads3m.c
+++ b/src/it/loads3m.c
@@ -20,23 +20,20 @@
#include "dumb.h"
#include "internal/it.h"
-
-
/* dumb_load_s3m_quick(): loads an S3M file into a DUH struct, returning
* a pointer to the DUH struct. When you have finished with it, you must
* pass the pointer to unload_duh() so that the memory can be freed.
*/
-DUH *dumb_load_s3m_quick(const char *filename)
-{
- DUH *duh;
- DUMBFILE *f = dumbfile_open(filename);
+DUH *dumb_load_s3m_quick(const char *filename) {
+ DUH *duh;
+ DUMBFILE *f = dumbfile_open(filename);
- if (!f)
- return NULL;
+ if (!f)
+ return NULL;
- duh = dumb_read_s3m_quick(f);
+ duh = dumb_read_s3m_quick(f);
- dumbfile_close(f);
+ dumbfile_close(f);
- return duh;
+ return duh;
}
--- a/src/it/loads3m2.c
+++ b/src/it/loads3m2.c
@@ -19,11 +19,8 @@
#include "dumb.h"
-
-
-DUH *dumb_load_s3m(const char *filename)
-{
- DUH *duh = dumb_load_s3m_quick(filename);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+DUH *dumb_load_s3m(const char *filename) {
+ DUH *duh = dumb_load_s3m_quick(filename);
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/loadstm.c
+++ b/src/it/loadstm.c
@@ -20,23 +20,20 @@
#include "dumb.h"
#include "internal/it.h"
-
-
/* dumb_load_stm_quick(): loads an STM file into a DUH struct, returning a
* pointer to the DUH struct. When you have finished with it, you must
* pass the pointer to unload_duh() so that the memory can be freed.
*/
-DUH *dumb_load_stm_quick(const char *filename)
-{
- DUH *duh;
- DUMBFILE *f = dumbfile_open(filename);
+DUH *dumb_load_stm_quick(const char *filename) {
+ DUH *duh;
+ DUMBFILE *f = dumbfile_open(filename);
- if (!f)
- return NULL;
+ if (!f)
+ return NULL;
- duh = dumb_read_stm_quick(f);
+ duh = dumb_read_stm_quick(f);
- dumbfile_close(f);
+ dumbfile_close(f);
- return duh;
+ return duh;
}
--- a/src/it/loadstm2.c
+++ b/src/it/loadstm2.c
@@ -19,11 +19,8 @@
#include "dumb.h"
-
-
-DUH *dumb_load_stm(const char *filename)
-{
- DUH *duh = dumb_load_stm_quick(filename);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+DUH *dumb_load_stm(const char *filename) {
+ DUH *duh = dumb_load_stm_quick(filename);
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/loadxm.c
+++ b/src/it/loadxm.c
@@ -20,23 +20,20 @@
#include "dumb.h"
#include "internal/it.h"
-
-
/* dumb_load_xm_quick(): loads an XM file into a DUH struct, returning a
* pointer to the DUH struct. When you have finished with it, you must
* pass the pointer to unload_duh() so that the memory can be freed.
*/
-DUH *dumb_load_xm_quick(const char *filename)
-{
- DUH *duh;
- DUMBFILE *f = dumbfile_open(filename);
+DUH *dumb_load_xm_quick(const char *filename) {
+ DUH *duh;
+ DUMBFILE *f = dumbfile_open(filename);
- if (!f)
- return NULL;
+ if (!f)
+ return NULL;
- duh = dumb_read_xm_quick(f);
+ duh = dumb_read_xm_quick(f);
- dumbfile_close(f);
+ dumbfile_close(f);
- return duh;
+ return duh;
}
--- a/src/it/loadxm2.c
+++ b/src/it/loadxm2.c
@@ -19,11 +19,8 @@
#include "dumb.h"
-
-
-DUH *dumb_load_xm(const char *filename)
-{
- DUH *duh = dumb_load_xm_quick(filename);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+DUH *dumb_load_xm(const char *filename) {
+ DUH *duh = dumb_load_xm_quick(filename);
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/ptmeffect.c
+++ b/src/it/ptmeffect.c
@@ -17,8 +17,6 @@
* \__/
*/
-
-
#include <stdlib.h>
#include <string.h>
@@ -25,101 +23,152 @@
#include "dumb.h"
#include "internal/it.h"
-void _dumb_it_ptm_convert_effect(int effect, int value, IT_ENTRY *entry)
-{
- if (effect >= PTM_N_EFFECTS)
- return;
+void _dumb_it_ptm_convert_effect(int effect, int value, IT_ENTRY *entry) {
+ if (effect >= PTM_N_EFFECTS)
+ return;
- /* Linearisation of the effect number... */
- if (effect == PTM_E) {
- effect = PTM_EBASE + HIGH(value);
- value = LOW(value);
- }
+ /* Linearisation of the effect number... */
+ if (effect == PTM_E) {
+ effect = PTM_EBASE + HIGH(value);
+ value = LOW(value);
+ }
- /* convert effect */
- entry->mask |= IT_ENTRY_EFFECT;
- switch (effect) {
+ /* convert effect */
+ entry->mask |= IT_ENTRY_EFFECT;
+ switch (effect) {
- case PTM_APPREGIO: effect = IT_ARPEGGIO; break;
- case PTM_PORTAMENTO_UP: effect = IT_PORTAMENTO_UP; break;
- case PTM_PORTAMENTO_DOWN: effect = IT_PORTAMENTO_DOWN; break;
- case PTM_TONE_PORTAMENTO: effect = IT_TONE_PORTAMENTO; break;
- case PTM_VIBRATO: effect = IT_VIBRATO; break;
- case PTM_VOLSLIDE_TONEPORTA: effect = IT_VOLSLIDE_TONEPORTA; break;
- case PTM_VOLSLIDE_VIBRATO: effect = IT_VOLSLIDE_VIBRATO; break;
- case PTM_TREMOLO: effect = IT_TREMOLO; break;
- case PTM_SAMPLE_OFFSET: effect = IT_SET_SAMPLE_OFFSET; break;
- case PTM_VOLUME_SLIDE: effect = IT_VOLUME_SLIDE; break;
- case PTM_POSITION_JUMP: effect = IT_JUMP_TO_ORDER; break;
- case PTM_SET_CHANNEL_VOLUME: effect = IT_SET_CHANNEL_VOLUME; break;
- case PTM_PATTERN_BREAK: effect = IT_BREAK_TO_ROW; break;
- case PTM_SET_GLOBAL_VOLUME: effect = IT_SET_GLOBAL_VOLUME; break;
- case PTM_RETRIGGER: effect = IT_RETRIGGER_NOTE; break;
- case PTM_FINE_VIBRATO: effect = IT_FINE_VIBRATO; break;
+ case PTM_APPREGIO:
+ effect = IT_ARPEGGIO;
+ break;
+ case PTM_PORTAMENTO_UP:
+ effect = IT_PORTAMENTO_UP;
+ break;
+ case PTM_PORTAMENTO_DOWN:
+ effect = IT_PORTAMENTO_DOWN;
+ break;
+ case PTM_TONE_PORTAMENTO:
+ effect = IT_TONE_PORTAMENTO;
+ break;
+ case PTM_VIBRATO:
+ effect = IT_VIBRATO;
+ break;
+ case PTM_VOLSLIDE_TONEPORTA:
+ effect = IT_VOLSLIDE_TONEPORTA;
+ break;
+ case PTM_VOLSLIDE_VIBRATO:
+ effect = IT_VOLSLIDE_VIBRATO;
+ break;
+ case PTM_TREMOLO:
+ effect = IT_TREMOLO;
+ break;
+ case PTM_SAMPLE_OFFSET:
+ effect = IT_SET_SAMPLE_OFFSET;
+ break;
+ case PTM_VOLUME_SLIDE:
+ effect = IT_VOLUME_SLIDE;
+ break;
+ case PTM_POSITION_JUMP:
+ effect = IT_JUMP_TO_ORDER;
+ break;
+ case PTM_SET_CHANNEL_VOLUME:
+ effect = IT_SET_CHANNEL_VOLUME;
+ break;
+ case PTM_PATTERN_BREAK:
+ effect = IT_BREAK_TO_ROW;
+ break;
+ case PTM_SET_GLOBAL_VOLUME:
+ effect = IT_SET_GLOBAL_VOLUME;
+ break;
+ case PTM_RETRIGGER:
+ effect = IT_RETRIGGER_NOTE;
+ break;
+ case PTM_FINE_VIBRATO:
+ effect = IT_FINE_VIBRATO;
+ break;
- /* TODO properly */
- case PTM_NOTE_SLIDE_UP: effect = IT_PTM_NOTE_SLIDE_UP; break;
- case PTM_NOTE_SLIDE_DOWN: effect = IT_PTM_NOTE_SLIDE_DOWN; break;
- case PTM_NOTE_SLIDE_UP_RETRIG: effect = IT_PTM_NOTE_SLIDE_UP_RETRIG; break;
- case PTM_NOTE_SLIDE_DOWN_RETRIG: effect = IT_PTM_NOTE_SLIDE_DOWN_RETRIG; break;
+ /* TODO properly */
+ case PTM_NOTE_SLIDE_UP:
+ effect = IT_PTM_NOTE_SLIDE_UP;
+ break;
+ case PTM_NOTE_SLIDE_DOWN:
+ effect = IT_PTM_NOTE_SLIDE_DOWN;
+ break;
+ case PTM_NOTE_SLIDE_UP_RETRIG:
+ effect = IT_PTM_NOTE_SLIDE_UP_RETRIG;
+ break;
+ case PTM_NOTE_SLIDE_DOWN_RETRIG:
+ effect = IT_PTM_NOTE_SLIDE_DOWN_RETRIG;
+ break;
- case PTM_SET_TEMPO_BPM:
- effect = (value < 0x20) ? (IT_SET_SPEED) : (IT_SET_SONG_TEMPO);
- break;
+ case PTM_SET_TEMPO_BPM:
+ effect = (value < 0x20) ? (IT_SET_SPEED) : (IT_SET_SONG_TEMPO);
+ break;
- case PTM_EBASE+PTM_E_SET_FINETUNE: effect = SBASE+IT_S_FINETUNE; break; /** TODO */
- case PTM_EBASE+PTM_E_SET_LOOP: effect = SBASE+IT_S_PATTERN_LOOP; break;
- case PTM_EBASE+PTM_E_NOTE_CUT: effect = SBASE+IT_S_DELAYED_NOTE_CUT; break;
- case PTM_EBASE+PTM_E_NOTE_DELAY: effect = SBASE+IT_S_NOTE_DELAY; break;
- case PTM_EBASE+PTM_E_PATTERN_DELAY: effect = SBASE+IT_S_PATTERN_DELAY; break;
- case PTM_EBASE+PTM_E_SET_PANNING: effect = SBASE+IT_S_SET_PAN; break;
+ case PTM_EBASE + PTM_E_SET_FINETUNE:
+ effect = SBASE + IT_S_FINETUNE;
+ break; /** TODO */
+ case PTM_EBASE + PTM_E_SET_LOOP:
+ effect = SBASE + IT_S_PATTERN_LOOP;
+ break;
+ case PTM_EBASE + PTM_E_NOTE_CUT:
+ effect = SBASE + IT_S_DELAYED_NOTE_CUT;
+ break;
+ case PTM_EBASE + PTM_E_NOTE_DELAY:
+ effect = SBASE + IT_S_NOTE_DELAY;
+ break;
+ case PTM_EBASE + PTM_E_PATTERN_DELAY:
+ effect = SBASE + IT_S_PATTERN_DELAY;
+ break;
+ case PTM_EBASE + PTM_E_SET_PANNING:
+ effect = SBASE + IT_S_SET_PAN;
+ break;
- case PTM_EBASE+PTM_E_FINE_VOLSLIDE_UP:
- effect = IT_VOLUME_SLIDE;
- value = EFFECT_VALUE(value, 0xF);
- break;
+ case PTM_EBASE + PTM_E_FINE_VOLSLIDE_UP:
+ effect = IT_VOLUME_SLIDE;
+ value = EFFECT_VALUE(value, 0xF);
+ break;
- case PTM_EBASE + PTM_E_FINE_VOLSLIDE_DOWN:
- effect = IT_VOLUME_SLIDE;
- value = EFFECT_VALUE(0xF, value);
- break;
+ case PTM_EBASE + PTM_E_FINE_VOLSLIDE_DOWN:
+ effect = IT_VOLUME_SLIDE;
+ value = EFFECT_VALUE(0xF, value);
+ break;
- case PTM_EBASE + PTM_E_FINE_PORTA_UP:
- effect = IT_PORTAMENTO_UP;
- value = EFFECT_VALUE(0xF, value);
- break;
+ case PTM_EBASE + PTM_E_FINE_PORTA_UP:
+ effect = IT_PORTAMENTO_UP;
+ value = EFFECT_VALUE(0xF, value);
+ break;
- case PTM_EBASE + PTM_E_FINE_PORTA_DOWN:
- effect = IT_PORTAMENTO_DOWN;
- value = EFFECT_VALUE(0xF, value);
- break;
+ case PTM_EBASE + PTM_E_FINE_PORTA_DOWN:
+ effect = IT_PORTAMENTO_DOWN;
+ value = EFFECT_VALUE(0xF, value);
+ break;
- case PTM_EBASE + PTM_E_RETRIG_NOTE:
- effect = IT_XM_RETRIGGER_NOTE;
- value = EFFECT_VALUE(0, value);
- break;
+ case PTM_EBASE + PTM_E_RETRIG_NOTE:
+ effect = IT_XM_RETRIGGER_NOTE;
+ value = EFFECT_VALUE(0, value);
+ break;
- case PTM_EBASE + PTM_E_SET_VIBRATO_CONTROL:
- effect = SBASE+IT_S_SET_VIBRATO_WAVEFORM;
- value &= ~4; /** TODO: value&4 -> don't retrig wave */
- break;
+ case PTM_EBASE + PTM_E_SET_VIBRATO_CONTROL:
+ effect = SBASE + IT_S_SET_VIBRATO_WAVEFORM;
+ value &= ~4; /** TODO: value&4 -> don't retrig wave */
+ break;
- case PTM_EBASE + PTM_E_SET_TREMOLO_CONTROL:
- effect = SBASE+IT_S_SET_TREMOLO_WAVEFORM;
- value &= ~4; /** TODO: value&4 -> don't retrig wave */
- break;
+ case PTM_EBASE + PTM_E_SET_TREMOLO_CONTROL:
+ effect = SBASE + IT_S_SET_TREMOLO_WAVEFORM;
+ value &= ~4; /** TODO: value&4 -> don't retrig wave */
+ break;
- default:
- /* user effect (often used in demos for synchronisation) */
- entry->mask &= ~IT_ENTRY_EFFECT;
- }
+ default:
+ /* user effect (often used in demos for synchronisation) */
+ entry->mask &= ~IT_ENTRY_EFFECT;
+ }
- /* Inverse linearisation... */
- if (effect >= SBASE && effect < SBASE+16) {
- value = EFFECT_VALUE(effect-SBASE, value);
- effect = IT_S;
- }
+ /* Inverse linearisation... */
+ if (effect >= SBASE && effect < SBASE + 16) {
+ value = EFFECT_VALUE(effect - SBASE, value);
+ effect = IT_S;
+ }
- entry->effect = effect;
- entry->effectvalue = value;
+ entry->effect = effect;
+ entry->effectvalue = value;
}
--- a/src/it/read669.c
+++ b/src/it/read669.c
@@ -24,102 +24,108 @@
#include "dumb.h"
#include "internal/it.h"
+static int it_669_read_pattern(IT_PATTERN *pattern, DUMBFILE *f, int tempo,
+ int breakpoint, unsigned char *buffer,
+ int *used_channels) {
+ int pos;
+ int channel;
+ int row;
+ IT_ENTRY *entry;
+ pattern->n_rows = 64;
-static int it_669_read_pattern(IT_PATTERN *pattern, DUMBFILE *f, int tempo, int breakpoint, unsigned char *buffer, int * used_channels)
-{
- int pos;
- int channel;
- int row;
- IT_ENTRY *entry;
-
- pattern->n_rows = 64;
-
if (dumbfile_getnc((char *)buffer, 64 * 3 * 8, f) < 64 * 3 * 8)
- return -1;
+ return -1;
- /* compute number of entries */
- pattern->n_entries = 64 + 1; /* Account for the row end markers, speed command */
- if (breakpoint < 63) pattern->n_entries++; /* and break to row 0 */
+ /* compute number of entries */
+ pattern->n_entries =
+ 64 + 1; /* Account for the row end markers, speed command */
+ if (breakpoint < 63)
+ pattern->n_entries++; /* and break to row 0 */
- pos = 0;
- for (row = 0; row < 64; row++) {
- for (channel = 0; channel < 8; channel++) {
- if (buffer[pos+0] != 0xFF || buffer[pos+2] != 0xFF)
- pattern->n_entries++;
- pos += 3;
- }
- }
+ pos = 0;
+ for (row = 0; row < 64; row++) {
+ for (channel = 0; channel < 8; channel++) {
+ if (buffer[pos + 0] != 0xFF || buffer[pos + 2] != 0xFF)
+ pattern->n_entries++;
+ pos += 3;
+ }
+ }
- pattern->entry = malloc(pattern->n_entries * sizeof(*pattern->entry));
- if (!pattern->entry)
- return -1;
+ pattern->entry = malloc(pattern->n_entries * sizeof(*pattern->entry));
+ if (!pattern->entry)
+ return -1;
- if (breakpoint == 63) breakpoint++;
+ if (breakpoint == 63)
+ breakpoint++;
- entry = pattern->entry;
+ entry = pattern->entry;
- entry->channel = 8;
- entry->mask = IT_ENTRY_EFFECT;
- entry->effect = IT_SET_SPEED;
- entry->effectvalue = tempo;
- entry++;
+ entry->channel = 8;
+ entry->mask = IT_ENTRY_EFFECT;
+ entry->effect = IT_SET_SPEED;
+ entry->effectvalue = tempo;
+ entry++;
- pos = 0;
- for (row = 0; row < 64; row++) {
+ pos = 0;
+ for (row = 0; row < 64; row++) {
- if (row == breakpoint) {
- entry->channel = 8;
- entry->mask = IT_ENTRY_EFFECT;
- entry->effect = IT_BREAK_TO_ROW;
- entry->effectvalue = 0;
- entry++;
- }
+ if (row == breakpoint) {
+ entry->channel = 8;
+ entry->mask = IT_ENTRY_EFFECT;
+ entry->effect = IT_BREAK_TO_ROW;
+ entry->effectvalue = 0;
+ entry++;
+ }
- for (channel = 0; channel < 8; channel++) {
- if (buffer[pos+0] != 0xFF || buffer[pos+2] != 0xFF) {
- entry->channel = channel;
- entry->mask = 0;
+ for (channel = 0; channel < 8; channel++) {
+ if (buffer[pos + 0] != 0xFF || buffer[pos + 2] != 0xFF) {
+ entry->channel = channel;
+ entry->mask = 0;
- if (buffer[pos+0] < 0xFE) {
- entry->mask |= IT_ENTRY_NOTE | IT_ENTRY_INSTRUMENT;
- entry->note = (buffer[pos+0] >> 2) + 36;
- entry->instrument = (((buffer[pos+0] << 4) | (buffer[pos+1] >> 4)) & 0x3F) + 1;
- }
- if (buffer[pos+0] <= 0xFE) {
- entry->mask |= IT_ENTRY_VOLPAN;
- entry->volpan = ((buffer[pos+1] & 15) << 6) / 15;
- if (*used_channels < channel + 1) *used_channels = channel + 1;
- }
- if (buffer[pos+2] != 0xFF) {
- entry->mask |= IT_ENTRY_EFFECT;
- entry->effectvalue = buffer[pos+2] & 15;
- switch (buffer[pos+2] >> 4) {
- case 0:
- entry->effect = IT_PORTAMENTO_UP;
- break;
- case 1:
- entry->effect = IT_PORTAMENTO_DOWN;
- break;
- case 2:
- entry->effect = IT_TONE_PORTAMENTO;
- break;
- case 3:
- entry->effect = IT_S;
- entry->effectvalue += IT_S_FINETUNE * 16 + 8;
- break;
- case 4:
- entry->effect = IT_VIBRATO;
- // XXX speed unknown
- entry->effectvalue |= 0x10;
- break;
- case 5:
- if (entry->effectvalue) {
- entry->effect = IT_SET_SPEED;
- } else {
- entry->mask &= ~IT_ENTRY_EFFECT;
- }
- break;
+ if (buffer[pos + 0] < 0xFE) {
+ entry->mask |= IT_ENTRY_NOTE | IT_ENTRY_INSTRUMENT;
+ entry->note = (buffer[pos + 0] >> 2) + 36;
+ entry->instrument =
+ (((buffer[pos + 0] << 4) | (buffer[pos + 1] >> 4)) &
+ 0x3F) +
+ 1;
+ }
+ if (buffer[pos + 0] <= 0xFE) {
+ entry->mask |= IT_ENTRY_VOLPAN;
+ entry->volpan = ((buffer[pos + 1] & 15) << 6) / 15;
+ if (*used_channels < channel + 1)
+ *used_channels = channel + 1;
+ }
+ if (buffer[pos + 2] != 0xFF) {
+ entry->mask |= IT_ENTRY_EFFECT;
+ entry->effectvalue = buffer[pos + 2] & 15;
+ switch (buffer[pos + 2] >> 4) {
+ case 0:
+ entry->effect = IT_PORTAMENTO_UP;
+ break;
+ case 1:
+ entry->effect = IT_PORTAMENTO_DOWN;
+ break;
+ case 2:
+ entry->effect = IT_TONE_PORTAMENTO;
+ break;
+ case 3:
+ entry->effect = IT_S;
+ entry->effectvalue += IT_S_FINETUNE * 16 + 8;
+ break;
+ case 4:
+ entry->effect = IT_VIBRATO;
+ // XXX speed unknown
+ entry->effectvalue |= 0x10;
+ break;
+ case 5:
+ if (entry->effectvalue) {
+ entry->effect = IT_SET_SPEED;
+ } else {
+ entry->mask &= ~IT_ENTRY_EFFECT;
+ }
+ break;
#if 0
/* dunno about this, really... */
case 6:
@@ -134,315 +140,312 @@
}
break;
#endif
- default:
- entry->mask &= ~IT_ENTRY_EFFECT;
- break;
- }
- if (*used_channels < channel + 1) *used_channels = channel + 1;
- }
+ default:
+ entry->mask &= ~IT_ENTRY_EFFECT;
+ break;
+ }
+ if (*used_channels < channel + 1)
+ *used_channels = channel + 1;
+ }
- entry++;
- }
- pos += 3;
- }
- IT_SET_END_ROW(entry);
- entry++;
- }
+ entry++;
+ }
+ pos += 3;
+ }
+ IT_SET_END_ROW(entry);
+ entry++;
+ }
- return 0;
+ return 0;
}
-
-
-static int it_669_read_sample_header(IT_SAMPLE *sample, DUMBFILE *f)
-{
+static int it_669_read_sample_header(IT_SAMPLE *sample, DUMBFILE *f) {
dumbfile_getnc((char *)sample->name, 13, f);
- sample->name[13] = 0;
+ sample->name[13] = 0;
- sample->filename[0] = 0;
+ sample->filename[0] = 0;
- sample->length = dumbfile_igetl(f);
- sample->loop_start = dumbfile_igetl(f);
- sample->loop_end = dumbfile_igetl(f);
+ sample->length = dumbfile_igetl(f);
+ sample->loop_start = dumbfile_igetl(f);
+ sample->loop_end = dumbfile_igetl(f);
- if (dumbfile_error(f))
- return -1;
+ if (dumbfile_error(f))
+ return -1;
- if (sample->length <= 0) {
- sample->flags = 0;
- return 0;
- }
+ if (sample->length <= 0) {
+ sample->flags = 0;
+ return 0;
+ }
- sample->flags = IT_SAMPLE_EXISTS;
+ sample->flags = IT_SAMPLE_EXISTS;
- sample->global_volume = 64;
- sample->default_volume = 64;
+ sample->global_volume = 64;
+ sample->default_volume = 64;
- sample->default_pan = 0;
- sample->C5_speed = 8363;
- // the above line might be wrong
+ sample->default_pan = 0;
+ sample->C5_speed = 8363;
+ // the above line might be wrong
- if ((sample->loop_end > sample->length) && !(sample->loop_start))
- sample->loop_end = 0;
+ if ((sample->loop_end > sample->length) && !(sample->loop_start))
+ sample->loop_end = 0;
- if (sample->loop_end > sample->length)
- sample->loop_end = sample->length;
+ if (sample->loop_end > sample->length)
+ sample->loop_end = sample->length;
- if (sample->loop_end - sample->loop_start > 2)
- sample->flags |= IT_SAMPLE_LOOP;
+ if (sample->loop_end - sample->loop_start > 2)
+ sample->flags |= IT_SAMPLE_LOOP;
- sample->vibrato_speed = 0;
- sample->vibrato_depth = 0;
- sample->vibrato_rate = 0;
- sample->vibrato_waveform = 0; // do we have to set _all_ these?
- sample->finetune = 0;
- sample->max_resampling_quality = -1;
+ sample->vibrato_speed = 0;
+ sample->vibrato_depth = 0;
+ sample->vibrato_rate = 0;
+ sample->vibrato_waveform = 0; // do we have to set _all_ these?
+ sample->finetune = 0;
+ sample->max_resampling_quality = -1;
- return 0;
+ return 0;
}
+static int it_669_read_sample_data(IT_SAMPLE *sample, DUMBFILE *f) {
+ long i;
+ long truncated_size;
+ /* let's get rid of the sample data coming after the end of the loop */
+ if ((sample->flags & IT_SAMPLE_LOOP) && sample->loop_end < sample->length) {
+ truncated_size = sample->length - sample->loop_end;
+ sample->length = sample->loop_end;
+ } else {
+ truncated_size = 0;
+ }
-static int it_669_read_sample_data(IT_SAMPLE *sample, DUMBFILE *f)
-{
- long i;
- long truncated_size;
+ sample->data = malloc(sample->length);
- /* let's get rid of the sample data coming after the end of the loop */
- if ((sample->flags & IT_SAMPLE_LOOP) && sample->loop_end < sample->length) {
- truncated_size = sample->length - sample->loop_end;
- sample->length = sample->loop_end;
- } else {
- truncated_size = 0;
- }
+ if (!sample->data)
+ return -1;
- sample->data = malloc(sample->length);
+ if (sample->length) {
+ i = dumbfile_getnc(sample->data, sample->length, f);
- if (!sample->data)
- return -1;
+ if (i < sample->length) {
+ // return -1;
+ // ficking truncated files
+ if (i <= 0) {
+ sample->flags = 0;
+ return 0;
+ }
+ sample->length = i;
+ if (sample->loop_end > i)
+ sample->loop_end = i;
+ } else {
+ /* skip truncated data */
+ dumbfile_skip(f, truncated_size);
+ // Should we be truncating it?
+ if (dumbfile_error(f))
+ return -1;
+ }
- if (sample->length)
- {
- i = dumbfile_getnc(sample->data, sample->length, f);
-
- if (i < sample->length) {
- //return -1;
- // ficking truncated files
- if (i <= 0) {
- sample->flags = 0;
- return 0;
- }
- sample->length = i;
- if (sample->loop_end > i) sample->loop_end = i;
- } else {
- /* skip truncated data */
- dumbfile_skip(f, truncated_size);
- // Should we be truncating it?
- if (dumbfile_error(f))
- return -1;
- }
+ for (i = 0; i < sample->length; i++)
+ ((signed char *)sample->data)[i] ^= 0x80;
+ }
- for (i = 0; i < sample->length; i++)
- ((signed char *)sample->data)[i] ^= 0x80;
- }
-
- return 0;
+ return 0;
}
+static DUMB_IT_SIGDATA *it_669_load_sigdata(DUMBFILE *f, int *ext) {
+ DUMB_IT_SIGDATA *sigdata;
+ int n_channels;
+ int i;
+ unsigned char tempolist[128];
+ unsigned char breaklist[128];
-static DUMB_IT_SIGDATA *it_669_load_sigdata(DUMBFILE *f, int * ext)
-{
- DUMB_IT_SIGDATA *sigdata;
- int n_channels;
- int i;
- unsigned char tempolist[128];
- unsigned char breaklist[128];
+ i = dumbfile_igetw(f);
+ if (i != 0x6669 && i != 0x4E4A)
+ return NULL;
- i = dumbfile_igetw(f);
- if (i != 0x6669 && i != 0x4E4A) return NULL;
+ *ext = (i == 0x4E4A);
- *ext = (i == 0x4E4A);
+ sigdata = malloc(sizeof(*sigdata));
+ if (!sigdata) {
+ return NULL;
+ }
- sigdata = malloc(sizeof(*sigdata));
- if (!sigdata) {
- return NULL;
- }
-
if (dumbfile_getnc((char *)sigdata->name, 36, f) < 36) {
- free(sigdata);
- return NULL;
- }
- sigdata->name[36] = 0;
+ free(sigdata);
+ return NULL;
+ }
+ sigdata->name[36] = 0;
- sigdata->order = NULL;
- sigdata->instrument = NULL;
- sigdata->pattern = NULL;
- sigdata->midi = NULL;
- sigdata->checkpoint = NULL;
- sigdata->sample = NULL;
+ sigdata->order = NULL;
+ sigdata->instrument = NULL;
+ sigdata->pattern = NULL;
+ sigdata->midi = NULL;
+ sigdata->checkpoint = NULL;
+ sigdata->sample = NULL;
- sigdata->n_instruments = 0;
+ sigdata->n_instruments = 0;
- sigdata->song_message = malloc(72 + 2 + 1);
- if (!sigdata->song_message) {
- free(sigdata);
- return NULL;
- }
+ sigdata->song_message = malloc(72 + 2 + 1);
+ if (!sigdata->song_message) {
+ free(sigdata);
+ return NULL;
+ }
if (dumbfile_getnc((char *)sigdata->song_message, 36, f) < 36) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- sigdata->song_message[36] = 13;
- sigdata->song_message[36 + 1] = 10;
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ sigdata->song_message[36] = 13;
+ sigdata->song_message[36 + 1] = 10;
if (dumbfile_getnc((char *)sigdata->song_message + 38, 36, f) < 36) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- sigdata->song_message[38 + 36] = 0;
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ sigdata->song_message[38 + 36] = 0;
- sigdata->n_samples = dumbfile_getc(f);
- sigdata->n_patterns = dumbfile_getc(f);
- sigdata->restart_position = dumbfile_getc(f);
+ sigdata->n_samples = dumbfile_getc(f);
+ sigdata->n_patterns = dumbfile_getc(f);
+ sigdata->restart_position = dumbfile_getc(f);
- if ((sigdata->n_samples) > 64 || (sigdata->n_patterns > 128)) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ if ((sigdata->n_samples) > 64 || (sigdata->n_patterns > 128)) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- sigdata->order = malloc(128); /* We may need to scan the extra ones! */
- if (!sigdata->order) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ sigdata->order = malloc(128); /* We may need to scan the extra ones! */
+ if (!sigdata->order) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
if (dumbfile_getnc((char *)sigdata->order, 128, f) < 128) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- for (i = 0; i < 128; i++) {
- if (sigdata->order[i] == 255) break;
- if (sigdata->order[i] >= sigdata->n_patterns) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- }
- if (!i) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- sigdata->n_orders = i;
+ for (i = 0; i < 128; i++) {
+ if (sigdata->order[i] == 255)
+ break;
+ if (sigdata->order[i] >= sigdata->n_patterns) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ }
+ if (!i) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ sigdata->n_orders = i;
if (dumbfile_getnc((char *)tempolist, 128, f) < 128) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
if (dumbfile_getnc((char *)breaklist, 128, f) < 128) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
- if (!sigdata->sample) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
+ if (!sigdata->sample) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- for (i = 0; i < sigdata->n_samples; i++)
- sigdata->sample[i].data = NULL;
+ for (i = 0; i < sigdata->n_samples; i++)
+ sigdata->sample[i].data = NULL;
- for (i = 0; i < sigdata->n_samples; i++) {
- if (it_669_read_sample_header(&sigdata->sample[i], f)) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- }
+ for (i = 0; i < sigdata->n_samples; i++) {
+ if (it_669_read_sample_header(&sigdata->sample[i], f)) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ }
- /* May as well try to save a tiny bit of memory. */
- if (sigdata->n_orders < 128) {
- unsigned char *order = realloc(sigdata->order, sigdata->n_orders);
- if (order) sigdata->order = order;
- }
+ /* May as well try to save a tiny bit of memory. */
+ if (sigdata->n_orders < 128) {
+ unsigned char *order = realloc(sigdata->order, sigdata->n_orders);
+ if (order)
+ sigdata->order = order;
+ }
- sigdata->pattern = malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
- if (!sigdata->pattern) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- for (i = 0; i < sigdata->n_patterns; i++)
- sigdata->pattern[i].entry = NULL;
+ sigdata->pattern = malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
+ if (!sigdata->pattern) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (i = 0; i < sigdata->n_patterns; i++)
+ sigdata->pattern[i].entry = NULL;
- n_channels = 0;
+ n_channels = 0;
- /* Read in the patterns */
- {
- unsigned char *buffer = malloc(64 * 3 * 8); /* 64 rows * 3 bytes * 8 channels */
- if (!buffer) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- for (i = 0; i < sigdata->n_patterns; i++) {
- if (it_669_read_pattern(&sigdata->pattern[i], f, tempolist[i], breaklist[i], buffer, &n_channels) != 0) {
- free(buffer);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- }
- free(buffer);
- }
+ /* Read in the patterns */
+ {
+ unsigned char *buffer =
+ malloc(64 * 3 * 8); /* 64 rows * 3 bytes * 8 channels */
+ if (!buffer) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (i = 0; i < sigdata->n_patterns; i++) {
+ if (it_669_read_pattern(&sigdata->pattern[i], f, tempolist[i],
+ breaklist[i], buffer, &n_channels) != 0) {
+ free(buffer);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ }
+ free(buffer);
+ }
- sigdata->n_pchannels = n_channels;
+ sigdata->n_pchannels = n_channels;
- /* And finally, the sample data */
- for (i = 0; i < sigdata->n_samples; i++) {
- if (it_669_read_sample_data(&sigdata->sample[i], f)) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- }
+ /* And finally, the sample data */
+ for (i = 0; i < sigdata->n_samples; i++) {
+ if (it_669_read_sample_data(&sigdata->sample[i], f)) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ }
- /* Now let's initialise the remaining variables, and we're done! */
- sigdata->flags = IT_OLD_EFFECTS | IT_LINEAR_SLIDES | IT_STEREO | IT_WAS_A_669;
+ /* Now let's initialise the remaining variables, and we're done! */
+ sigdata->flags =
+ IT_OLD_EFFECTS | IT_LINEAR_SLIDES | IT_STEREO | IT_WAS_A_669;
- sigdata->global_volume = 128;
- sigdata->mixing_volume = 48;
- sigdata->speed = 4;
- sigdata->tempo = 78;
- sigdata->pan_separation = 128;
+ sigdata->global_volume = 128;
+ sigdata->mixing_volume = 48;
+ sigdata->speed = 4;
+ sigdata->tempo = 78;
+ sigdata->pan_separation = 128;
- memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
+ memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
- for (i = 0; i < DUMB_IT_N_CHANNELS; i += 2) {
- int sep = 32 * dumb_it_default_panning_separation / 100;
- sigdata->channel_pan[i+0] = 32 + sep;
- sigdata->channel_pan[i+1] = 32 - sep;
- }
+ for (i = 0; i < DUMB_IT_N_CHANNELS; i += 2) {
+ int sep = 32 * dumb_it_default_panning_separation / 100;
+ sigdata->channel_pan[i + 0] = 32 + sep;
+ sigdata->channel_pan[i + 1] = 32 - sep;
+ }
- _dumb_it_fix_invalid_orders(sigdata);
+ _dumb_it_fix_invalid_orders(sigdata);
- return sigdata;
+ return sigdata;
}
+DUH *dumb_read_669_quick(DUMBFILE *f) {
+ sigdata_t *sigdata;
+ int ext;
+ DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
-DUH *dumb_read_669_quick(DUMBFILE *f)
-{
- sigdata_t *sigdata;
- int ext;
+ sigdata = it_669_load_sigdata(f, &ext);
- DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
+ if (!sigdata)
+ return NULL;
- sigdata = it_669_load_sigdata(f, &ext);
-
- if (!sigdata)
- return NULL;
-
- {
- const char *tag[2][2];
- tag[0][0] = "TITLE";
+ {
+ const char *tag[2][2];
+ tag[0][0] = "TITLE";
tag[0][1] = (const char *)(((DUMB_IT_SIGDATA *)sigdata)->name);
- tag[1][0] = "FORMAT";
- tag[1][1] = ext ? "669 Extended" : "669";
- return make_duh(-1, 2, (const char *const (*)[2])tag, 1, &descptr, &sigdata);
- }
+ tag[1][0] = "FORMAT";
+ tag[1][1] = ext ? "669 Extended" : "669";
+ return make_duh(-1, 2, (const char *const(*)[2])tag, 1, &descptr,
+ &sigdata);
+ }
}
--- a/src/it/read6692.c
+++ b/src/it/read6692.c
@@ -19,10 +19,7 @@
#include "dumb.h"
-
-
-DUH *dumb_read_669(DUMBFILE *f)
-{
+DUH *dumb_read_669(DUMBFILE *f) {
DUH *duh = dumb_read_669_quick(f);
dumb_it_do_initial_runthrough(duh);
return duh;
--- a/src/it/readam.c
+++ b/src/it/readam.c
@@ -24,768 +24,779 @@
#include "internal/it.h"
#include "internal/riff.h"
-static int it_riff_am_process_sample( IT_SAMPLE * sample, DUMBFILE * f, size_t len, int ver )
-{
- size_t header_length;
- int default_pan;
- int default_volume;
- int flags;
- size_t length;
- size_t length_bytes;
- size_t loop_start;
- size_t loop_end;
+static int it_riff_am_process_sample(IT_SAMPLE *sample, DUMBFILE *f, size_t len,
+ int ver) {
+ size_t header_length;
+ int default_pan;
+ int default_volume;
+ int flags;
+ size_t length;
+ size_t length_bytes;
+ size_t loop_start;
+ size_t loop_end;
size_t sample_rate;
- long start = dumbfile_pos( f );
+ long start = dumbfile_pos(f);
- if ( ver == 0 )
- {
- if ( len < 0x38 )
- return -1;
+ if (ver == 0) {
+ if (len < 0x38)
+ return -1;
- header_length = 0x38;
+ header_length = 0x38;
- dumbfile_getnc( (char *) sample->name, 28, f );
- sample->name[ 28 ] = 0;
+ dumbfile_getnc((char *)sample->name, 28, f);
+ sample->name[28] = 0;
- default_pan = dumbfile_getc( f );
- default_volume = dumbfile_getc( f );
- flags = dumbfile_igetw( f );
- length = dumbfile_igetl( f );
- loop_start = dumbfile_igetl( f );
- loop_end = dumbfile_igetl( f );
- sample_rate = dumbfile_igetl( f );
- }
- else
- {
- if (len < 4) return -1;
+ default_pan = dumbfile_getc(f);
+ default_volume = dumbfile_getc(f);
+ flags = dumbfile_igetw(f);
+ length = dumbfile_igetl(f);
+ loop_start = dumbfile_igetl(f);
+ loop_end = dumbfile_igetl(f);
+ sample_rate = dumbfile_igetl(f);
+ } else {
+ if (len < 4)
+ return -1;
- header_length = dumbfile_igetl( f );
- if ( header_length < 0x40 )
- return -1;
- if ( header_length + 4 > len )
- return -1;
+ header_length = dumbfile_igetl(f);
+ if (header_length < 0x40)
+ return -1;
+ if (header_length + 4 > len)
+ return -1;
start += 4;
- len -= 4;
+ len -= 4;
- dumbfile_getnc( (char *) sample->name, 32, f );
+ dumbfile_getnc((char *)sample->name, 32, f);
- default_pan = dumbfile_igetw( f );
- default_volume = dumbfile_igetw( f );
- flags = dumbfile_igetw( f );
- dumbfile_skip( f, 2 );
- length = dumbfile_igetl( f );
- loop_start = dumbfile_igetl( f );
- loop_end = dumbfile_igetl( f );
- sample_rate = dumbfile_igetl( f );
+ default_pan = dumbfile_igetw(f);
+ default_volume = dumbfile_igetw(f);
+ flags = dumbfile_igetw(f);
+ dumbfile_skip(f, 2);
+ length = dumbfile_igetl(f);
+ loop_start = dumbfile_igetl(f);
+ loop_end = dumbfile_igetl(f);
+ sample_rate = dumbfile_igetl(f);
- if ( default_pan > 0x7FFF || default_volume > 0x7FFF )
- return -1;
+ if (default_pan > 0x7FFF || default_volume > 0x7FFF)
+ return -1;
- default_pan = default_pan * 64 / 32767;
- default_volume = default_volume * 64 / 32767;
- }
+ default_pan = default_pan * 64 / 32767;
+ default_volume = default_volume * 64 / 32767;
+ }
- if ( ! length ) {
- sample->flags &= ~IT_SAMPLE_EXISTS;
- return 0;
- }
+ if (!length) {
+ sample->flags &= ~IT_SAMPLE_EXISTS;
+ return 0;
+ }
- if ( flags & ~( 0x8000 | 0x80 | 0x20 | 0x10 | 0x08 | 0x04 ) )
- return -1;
+ if (flags & ~(0x8000 | 0x80 | 0x20 | 0x10 | 0x08 | 0x04))
+ return -1;
- length_bytes = length << ( ( flags & 0x04 ) >> 2 );
+ length_bytes = length << ((flags & 0x04) >> 2);
- if ( length_bytes + header_length > len )
- return -1;
+ if (length_bytes + header_length > len)
+ return -1;
- sample->flags = 0;
+ sample->flags = 0;
- if ( flags & 0x80 ) sample->flags |= IT_SAMPLE_EXISTS;
- if ( flags & 0x04 ) sample->flags |= IT_SAMPLE_16BIT;
+ if (flags & 0x80)
+ sample->flags |= IT_SAMPLE_EXISTS;
+ if (flags & 0x04)
+ sample->flags |= IT_SAMPLE_16BIT;
- sample->length = length;
- sample->loop_start = loop_start;
- sample->loop_end = loop_end;
- sample->C5_speed = sample_rate;
- sample->default_volume = default_volume;
- sample->default_pan = default_pan | ( ( flags & 0x20 ) << 2 );
- sample->filename[0] = 0;
- sample->global_volume = 64;
- sample->vibrato_speed = 0;
- sample->vibrato_depth = 0;
- sample->vibrato_rate = 0;
- sample->vibrato_waveform = IT_VIBRATO_SINE;
- sample->finetune = 0;
- sample->max_resampling_quality = -1;
+ sample->length = length;
+ sample->loop_start = loop_start;
+ sample->loop_end = loop_end;
+ sample->C5_speed = sample_rate;
+ sample->default_volume = default_volume;
+ sample->default_pan = default_pan | ((flags & 0x20) << 2);
+ sample->filename[0] = 0;
+ sample->global_volume = 64;
+ sample->vibrato_speed = 0;
+ sample->vibrato_depth = 0;
+ sample->vibrato_rate = 0;
+ sample->vibrato_waveform = IT_VIBRATO_SINE;
+ sample->finetune = 0;
+ sample->max_resampling_quality = -1;
- if ( flags & 0x08 )
- {
- if (((unsigned int)sample->loop_end <= (unsigned int)sample->length) &&
- ((unsigned int)sample->loop_start < (unsigned int)sample->loop_end))
- {
- sample->length = sample->loop_end;
- sample->flags |= IT_SAMPLE_LOOP;
- if ( flags & 0x10 ) sample->flags |= IT_SAMPLE_PINGPONG_LOOP;
- }
- }
+ if (flags & 0x08) {
+ if (((unsigned int)sample->loop_end <= (unsigned int)sample->length) &&
+ ((unsigned int)sample->loop_start <
+ (unsigned int)sample->loop_end)) {
+ sample->length = sample->loop_end;
+ sample->flags |= IT_SAMPLE_LOOP;
+ if (flags & 0x10)
+ sample->flags |= IT_SAMPLE_PINGPONG_LOOP;
+ }
+ }
- length_bytes = sample->length << ( ( flags & 0x04 ) >> 2 );
+ length_bytes = sample->length << ((flags & 0x04) >> 2);
- sample->data = malloc( length_bytes );
- if ( ! sample->data )
- return -1;
+ sample->data = malloc(length_bytes);
+ if (!sample->data)
+ return -1;
- if ( dumbfile_seek( f, start + header_length, DFS_SEEK_SET ) )
+ if (dumbfile_seek(f, start + header_length, DFS_SEEK_SET))
return -1;
- dumbfile_getnc( sample->data, length_bytes, f );
+ dumbfile_getnc(sample->data, length_bytes, f);
- return 0;
+ return 0;
}
-static int it_riff_am_process_pattern( IT_PATTERN * pattern, DUMBFILE * f, size_t len, int ver )
-{
+static int it_riff_am_process_pattern(IT_PATTERN *pattern, DUMBFILE *f,
+ size_t len, int ver) {
int nrows, row;
long start, end;
- unsigned flags;
+ unsigned flags;
int p, q, r;
- IT_ENTRY * entry;
+ IT_ENTRY *entry;
- nrows = dumbfile_getc( f ) + 1;
+ nrows = dumbfile_getc(f) + 1;
- pattern->n_rows = nrows;
+ pattern->n_rows = nrows;
- len -= 1;
+ len -= 1;
- pattern->n_entries = 0;
+ pattern->n_entries = 0;
- row = 0;
+ row = 0;
- start = dumbfile_pos( f );
+ start = dumbfile_pos(f);
end = start + len;
- while ( (row < nrows) && !dumbfile_error( f ) && (dumbfile_pos( f ) < end) ) {
- p = dumbfile_getc( f );
- if ( ! p ) {
- ++ row;
- continue;
- }
+ while ((row < nrows) && !dumbfile_error(f) && (dumbfile_pos(f) < end)) {
+ p = dumbfile_getc(f);
+ if (!p) {
+ ++row;
+ continue;
+ }
flags = p & 0xE0;
if (flags) {
- ++ pattern->n_entries;
- if (flags & 0x80) dumbfile_skip( f, 2 );
- if (flags & 0x40) dumbfile_skip( f, 2 );
- if (flags & 0x20) dumbfile_skip( f, 1 );
- }
- }
+ ++pattern->n_entries;
+ if (flags & 0x80)
+ dumbfile_skip(f, 2);
+ if (flags & 0x40)
+ dumbfile_skip(f, 2);
+ if (flags & 0x20)
+ dumbfile_skip(f, 1);
+ }
+ }
- if ( ! pattern->n_entries ) return 0;
+ if (!pattern->n_entries)
+ return 0;
- pattern->n_entries += nrows;
+ pattern->n_entries += nrows;
- pattern->entry = malloc( pattern->n_entries * sizeof( * pattern->entry ) );
- if ( ! pattern->entry ) return -1;
+ pattern->entry = malloc(pattern->n_entries * sizeof(*pattern->entry));
+ if (!pattern->entry)
+ return -1;
- entry = pattern->entry;
+ entry = pattern->entry;
- row = 0;
+ row = 0;
- dumbfile_seek( f, start, DFS_SEEK_SET );
+ dumbfile_seek(f, start, DFS_SEEK_SET);
- while ( ( row < nrows ) && !dumbfile_error( f ) && ( dumbfile_pos( f ) < end ) )
- {
- p = dumbfile_getc( f );
+ while ((row < nrows) && !dumbfile_error(f) && (dumbfile_pos(f) < end)) {
+ p = dumbfile_getc(f);
- if ( ! p )
- {
- IT_SET_END_ROW( entry );
- ++ entry;
- ++ row;
- continue;
- }
+ if (!p) {
+ IT_SET_END_ROW(entry);
+ ++entry;
+ ++row;
+ continue;
+ }
flags = p;
- entry->channel = flags & 0x1F;
- entry->mask = 0;
+ entry->channel = flags & 0x1F;
+ entry->mask = 0;
- if (flags & 0xE0)
- {
- if ( flags & 0x80 )
- {
- q = dumbfile_getc( f );
- r = dumbfile_getc( f );
- _dumb_it_xm_convert_effect( r, q, entry, 0 );
- }
+ if (flags & 0xE0) {
+ if (flags & 0x80) {
+ q = dumbfile_getc(f);
+ r = dumbfile_getc(f);
+ _dumb_it_xm_convert_effect(r, q, entry, 0);
+ }
- if ( flags & 0x40 )
- {
- q = dumbfile_getc( f );
- r = dumbfile_getc( f );
- if ( q )
- {
- entry->mask |= IT_ENTRY_INSTRUMENT;
+ if (flags & 0x40) {
+ q = dumbfile_getc(f);
+ r = dumbfile_getc(f);
+ if (q) {
+ entry->mask |= IT_ENTRY_INSTRUMENT;
entry->instrument = q;
- }
- if ( r )
- {
- entry->mask |= IT_ENTRY_NOTE;
+ }
+ if (r) {
+ entry->mask |= IT_ENTRY_NOTE;
entry->note = r - 1;
- }
- }
+ }
+ }
- if ( flags & 0x20 )
- {
- q = dumbfile_getc( f );
- entry->mask |= IT_ENTRY_VOLPAN;
- if ( ver == 0 ) entry->volpan = q;
- else entry->volpan = q * 64 / 127;
- }
+ if (flags & 0x20) {
+ q = dumbfile_getc(f);
+ entry->mask |= IT_ENTRY_VOLPAN;
+ if (ver == 0)
+ entry->volpan = q;
+ else
+ entry->volpan = q * 64 / 127;
+ }
- if (entry->mask) entry++;
- }
- }
+ if (entry->mask)
+ entry++;
+ }
+ }
- while ( row < nrows )
- {
- IT_SET_END_ROW( entry );
- ++ entry;
- ++ row;
- }
+ while (row < nrows) {
+ IT_SET_END_ROW(entry);
+ ++entry;
+ ++row;
+ }
- pattern->n_entries = (int)((long)entry - (long)pattern->entry);
- if ( ! pattern->n_entries ) return -1;
+ pattern->n_entries = (int)((long)entry - (long)pattern->entry);
+ if (!pattern->n_entries)
+ return -1;
- return 0;
+ return 0;
}
-static DUMB_IT_SIGDATA *it_riff_amff_load_sigdata( DUMBFILE * f, struct riff * stream )
-{
- DUMB_IT_SIGDATA *sigdata;
+static DUMB_IT_SIGDATA *it_riff_amff_load_sigdata(DUMBFILE *f,
+ struct riff *stream) {
+ DUMB_IT_SIGDATA *sigdata;
int n, found;
int o, p;
- if ( ! stream ) goto error;
+ if (!stream)
+ goto error;
- if ( stream->type != DUMB_ID( 'A', 'M', 'F', 'F' ) ) goto error;
+ if (stream->type != DUMB_ID('A', 'M', 'F', 'F'))
+ goto error;
- sigdata = malloc( sizeof( *sigdata ) );
- if ( ! sigdata ) goto error;
+ sigdata = malloc(sizeof(*sigdata));
+ if (!sigdata)
+ goto error;
- sigdata->n_patterns = 0;
- sigdata->n_samples = 0;
- sigdata->name[0] = 0;
+ sigdata->n_patterns = 0;
+ sigdata->n_samples = 0;
+ sigdata->name[0] = 0;
- found = 0;
+ found = 0;
- for ( n = 0; (unsigned)n < stream->chunk_count; ++n )
- {
- struct riff_chunk * c = stream->chunks + n;
- switch( c->type )
- {
- case DUMB_ID( 'M', 'A', 'I', 'N' ):
- /* initialization data */
- if ( ( found & 1 ) || ( c->size < 0x48 ) ) goto error_sd;
- found |= 1;
- break;
+ for (n = 0; (unsigned)n < stream->chunk_count; ++n) {
+ struct riff_chunk *c = stream->chunks + n;
+ switch (c->type) {
+ case DUMB_ID('M', 'A', 'I', 'N'):
+ /* initialization data */
+ if ((found & 1) || (c->size < 0x48))
+ goto error_sd;
+ found |= 1;
+ break;
- case DUMB_ID( 'O', 'R', 'D', 'R' ):
- if ( ( found & 2 ) || ( c->size < 1 ) ) goto error_sd;
- found |= 2;
- break;
+ case DUMB_ID('O', 'R', 'D', 'R'):
+ if ((found & 2) || (c->size < 1))
+ goto error_sd;
+ found |= 2;
+ break;
- case DUMB_ID( 'P', 'A', 'T', 'T' ):
- if ( dumbfile_seek( f, c->offset, DFS_SEEK_SET ) ) goto error_sd;
- o = dumbfile_getc( f );
- if ( o >= sigdata->n_patterns ) sigdata->n_patterns = (o + 1);
- o = (int) dumbfile_igetl( f );
- if ( (unsigned)o + 5 > c->size ) goto error_sd;
- break;
+ case DUMB_ID('P', 'A', 'T', 'T'):
+ if (dumbfile_seek(f, c->offset, DFS_SEEK_SET))
+ goto error_sd;
+ o = dumbfile_getc(f);
+ if (o >= sigdata->n_patterns)
+ sigdata->n_patterns = (o + 1);
+ o = (int)dumbfile_igetl(f);
+ if ((unsigned)o + 5 > c->size)
+ goto error_sd;
+ break;
- case DUMB_ID( 'I', 'N', 'S', 'T' ):
- {
- if ( c->size < 0xE1 ) goto error_sd;
- if ( dumbfile_seek( f, c->offset + 1, DFS_SEEK_SET ) ) goto error_sd;
- o = dumbfile_getc( f );
- if ( o >= sigdata->n_samples ) sigdata->n_samples = (int)(o + 1);
- if ( c->size >= 0x121 )
- {
- if ( dumbfile_seek( f, c->offset + 0xE1, DFS_SEEK_SET ) ) goto error_sd;
- if ( dumbfile_mgetl( f ) == DUMB_ID('S','A','M','P') )
- {
- size_t size = dumbfile_igetl( f );
- if ( size + 0xE1 + 8 > c->size ) goto error_sd;
- }
- }
- }
- break;
- }
- }
+ case DUMB_ID('I', 'N', 'S', 'T'): {
+ if (c->size < 0xE1)
+ goto error_sd;
+ if (dumbfile_seek(f, c->offset + 1, DFS_SEEK_SET))
+ goto error_sd;
+ o = dumbfile_getc(f);
+ if (o >= sigdata->n_samples)
+ sigdata->n_samples = (int)(o + 1);
+ if (c->size >= 0x121) {
+ if (dumbfile_seek(f, c->offset + 0xE1, DFS_SEEK_SET))
+ goto error_sd;
+ if (dumbfile_mgetl(f) == DUMB_ID('S', 'A', 'M', 'P')) {
+ size_t size = dumbfile_igetl(f);
+ if (size + 0xE1 + 8 > c->size)
+ goto error_sd;
+ }
+ }
+ } break;
+ }
+ }
- if ( found != 3 || !sigdata->n_samples || !sigdata->n_patterns ) goto error_sd;
+ if (found != 3 || !sigdata->n_samples || !sigdata->n_patterns)
+ goto error_sd;
- if ( sigdata->n_samples > 255 || sigdata->n_patterns > 255 ) goto error_sd;
+ if (sigdata->n_samples > 255 || sigdata->n_patterns > 255)
+ goto error_sd;
- sigdata->song_message = NULL;
- sigdata->order = NULL;
- sigdata->instrument = NULL;
- sigdata->sample = NULL;
- sigdata->pattern = NULL;
- sigdata->midi = NULL;
- sigdata->checkpoint = NULL;
+ sigdata->song_message = NULL;
+ sigdata->order = NULL;
+ sigdata->instrument = NULL;
+ sigdata->sample = NULL;
+ sigdata->pattern = NULL;
+ sigdata->midi = NULL;
+ sigdata->checkpoint = NULL;
- sigdata->mixing_volume = 48;
- sigdata->pan_separation = 128;
+ sigdata->mixing_volume = 48;
+ sigdata->pan_separation = 128;
- sigdata->n_instruments = 0;
- sigdata->n_orders = 0;
- sigdata->restart_position = 0;
+ sigdata->n_instruments = 0;
+ sigdata->n_orders = 0;
+ sigdata->restart_position = 0;
- memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
+ memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
- for (n = 0; n < DUMB_IT_N_CHANNELS; n += 4) {
- int sep = 32 * dumb_it_default_panning_separation / 100;
- sigdata->channel_pan[n ] = 32 - sep;
- sigdata->channel_pan[n+1] = 32 + sep;
- sigdata->channel_pan[n+2] = 32 + sep;
- sigdata->channel_pan[n+3] = 32 - sep;
- }
+ for (n = 0; n < DUMB_IT_N_CHANNELS; n += 4) {
+ int sep = 32 * dumb_it_default_panning_separation / 100;
+ sigdata->channel_pan[n] = 32 - sep;
+ sigdata->channel_pan[n + 1] = 32 + sep;
+ sigdata->channel_pan[n + 2] = 32 + sep;
+ sigdata->channel_pan[n + 3] = 32 - sep;
+ }
- for ( n = 0; (unsigned)n < stream->chunk_count; ++n )
- {
- struct riff_chunk * c = stream->chunks + n;
- switch ( c->type )
- {
- case DUMB_ID( 'M', 'A', 'I', 'N' ):
- if ( dumbfile_seek( f, c->offset, DFS_SEEK_SET ) ) goto error_usd;
- dumbfile_getnc( (char *) sigdata->name, 64, f );
- sigdata->name[ 64 ] = 0;
- sigdata->flags = IT_STEREO | IT_OLD_EFFECTS | IT_COMPATIBLE_GXX | IT_WAS_AN_S3M;
- o = dumbfile_getc( f );
- if ( ! ( o & 1 ) ) sigdata->flags |= IT_LINEAR_SLIDES;
- if ( ( o & ~3 ) || ! ( o & 2 ) ) goto error_usd; // unknown flags
- sigdata->n_pchannels = dumbfile_getc( f );
- sigdata->speed = dumbfile_getc( f );
- sigdata->tempo = dumbfile_getc( f );
+ for (n = 0; (unsigned)n < stream->chunk_count; ++n) {
+ struct riff_chunk *c = stream->chunks + n;
+ switch (c->type) {
+ case DUMB_ID('M', 'A', 'I', 'N'):
+ if (dumbfile_seek(f, c->offset, DFS_SEEK_SET))
+ goto error_usd;
+ dumbfile_getnc((char *)sigdata->name, 64, f);
+ sigdata->name[64] = 0;
+ sigdata->flags =
+ IT_STEREO | IT_OLD_EFFECTS | IT_COMPATIBLE_GXX | IT_WAS_AN_S3M;
+ o = dumbfile_getc(f);
+ if (!(o & 1))
+ sigdata->flags |= IT_LINEAR_SLIDES;
+ if ((o & ~3) || !(o & 2))
+ goto error_usd; // unknown flags
+ sigdata->n_pchannels = dumbfile_getc(f);
+ sigdata->speed = dumbfile_getc(f);
+ sigdata->tempo = dumbfile_getc(f);
- dumbfile_skip( f, 4 );
+ dumbfile_skip(f, 4);
- sigdata->global_volume = dumbfile_getc( f );
+ sigdata->global_volume = dumbfile_getc(f);
- if ( c->size < 0x48 + (unsigned)sigdata->n_pchannels ) goto error_usd;
+ if (c->size < 0x48 + (unsigned)sigdata->n_pchannels)
+ goto error_usd;
- for ( o = 0; o < sigdata->n_pchannels; ++o )
- {
- p = dumbfile_getc( f );
- sigdata->channel_pan[ o ] = p;
- if ( p >= 128 )
- {
- sigdata->channel_volume[ o ] = 0;
- }
- }
- break;
- }
- }
+ for (o = 0; o < sigdata->n_pchannels; ++o) {
+ p = dumbfile_getc(f);
+ sigdata->channel_pan[o] = p;
+ if (p >= 128) {
+ sigdata->channel_volume[o] = 0;
+ }
+ }
+ break;
+ }
+ }
- sigdata->pattern = malloc( sigdata->n_patterns * sizeof( *sigdata->pattern ) );
- if ( ! sigdata->pattern ) goto error_usd;
- for ( n = 0; n < sigdata->n_patterns; ++n )
- sigdata->pattern[ n ].entry = NULL;
+ sigdata->pattern = malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
+ if (!sigdata->pattern)
+ goto error_usd;
+ for (n = 0; n < sigdata->n_patterns; ++n)
+ sigdata->pattern[n].entry = NULL;
- sigdata->sample = malloc( sigdata->n_samples * sizeof( *sigdata->sample ) );
- if ( ! sigdata->sample ) goto error_usd;
- for ( n = 0; n < sigdata->n_samples; ++n )
- {
- IT_SAMPLE * sample = sigdata->sample + n;
- sample->data = NULL;
- sample->flags = 0;
- sample->name[ 0 ] = 0;
- }
+ sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
+ if (!sigdata->sample)
+ goto error_usd;
+ for (n = 0; n < sigdata->n_samples; ++n) {
+ IT_SAMPLE *sample = sigdata->sample + n;
+ sample->data = NULL;
+ sample->flags = 0;
+ sample->name[0] = 0;
+ }
- for ( n = 0; (unsigned)n < stream->chunk_count; ++n )
- {
- struct riff_chunk * c = stream->chunks + n;
- switch ( c->type )
- {
- case DUMB_ID( 'O', 'R', 'D', 'R' ):
- if ( dumbfile_seek( f, c->offset, DFS_SEEK_SET ) ) goto error_usd;
- sigdata->n_orders = dumbfile_getc( f ) + 1;
- if ( (unsigned)sigdata->n_orders + 1 > c->size ) goto error_usd;
- sigdata->order = malloc( sigdata->n_orders );
- if ( ! sigdata->order ) goto error_usd;
- dumbfile_getnc( (char *) sigdata->order, sigdata->n_orders, f );
- break;
+ for (n = 0; (unsigned)n < stream->chunk_count; ++n) {
+ struct riff_chunk *c = stream->chunks + n;
+ switch (c->type) {
+ case DUMB_ID('O', 'R', 'D', 'R'):
+ if (dumbfile_seek(f, c->offset, DFS_SEEK_SET))
+ goto error_usd;
+ sigdata->n_orders = dumbfile_getc(f) + 1;
+ if ((unsigned)sigdata->n_orders + 1 > c->size)
+ goto error_usd;
+ sigdata->order = malloc(sigdata->n_orders);
+ if (!sigdata->order)
+ goto error_usd;
+ dumbfile_getnc((char *)sigdata->order, sigdata->n_orders, f);
+ break;
- case DUMB_ID( 'P', 'A', 'T', 'T' ):
- if ( dumbfile_seek( f, c->offset, DFS_SEEK_SET ) ) goto error_usd;
- o = dumbfile_getc( f );
- p = (int) dumbfile_igetl( f );
- if ( it_riff_am_process_pattern( sigdata->pattern + o, f, p, 0 ) ) goto error_usd;
- break;
+ case DUMB_ID('P', 'A', 'T', 'T'):
+ if (dumbfile_seek(f, c->offset, DFS_SEEK_SET))
+ goto error_usd;
+ o = dumbfile_getc(f);
+ p = (int)dumbfile_igetl(f);
+ if (it_riff_am_process_pattern(sigdata->pattern + o, f, p, 0))
+ goto error_usd;
+ break;
- case DUMB_ID( 'I', 'N', 'S', 'T' ):
- {
- IT_SAMPLE * sample;
- if ( dumbfile_seek( f, c->offset + 1, DFS_SEEK_SET ) ) goto error_usd;
- sample = sigdata->sample + dumbfile_getc( f );
- if ( c->size >= 0x121 )
- {
- if ( dumbfile_seek( f, c->offset + 0xE1, DFS_SEEK_SET ) ) goto error_usd;
- if ( dumbfile_mgetl( f ) == DUMB_ID('S','A','M','P') )
- {
- size_t size = dumbfile_igetl( f );
- if ( it_riff_am_process_sample( sample, f, size, 0 ) ) goto error_usd;
- break;
- }
- }
- dumbfile_seek( f, c->offset + 2, DFS_SEEK_SET );
- dumbfile_getnc( (char *) sample->name, 28, f );
- sample->name[ 28 ] = 0;
+ case DUMB_ID('I', 'N', 'S', 'T'): {
+ IT_SAMPLE *sample;
+ if (dumbfile_seek(f, c->offset + 1, DFS_SEEK_SET))
+ goto error_usd;
+ sample = sigdata->sample + dumbfile_getc(f);
+ if (c->size >= 0x121) {
+ if (dumbfile_seek(f, c->offset + 0xE1, DFS_SEEK_SET))
+ goto error_usd;
+ if (dumbfile_mgetl(f) == DUMB_ID('S', 'A', 'M', 'P')) {
+ size_t size = dumbfile_igetl(f);
+ if (it_riff_am_process_sample(sample, f, size, 0))
+ goto error_usd;
+ break;
+ }
}
- break;
- }
- }
+ dumbfile_seek(f, c->offset + 2, DFS_SEEK_SET);
+ dumbfile_getnc((char *)sample->name, 28, f);
+ sample->name[28] = 0;
+ } break;
+ }
+ }
- _dumb_it_fix_invalid_orders( sigdata );
+ _dumb_it_fix_invalid_orders(sigdata);
- return sigdata;
+ return sigdata;
error_usd:
- _dumb_it_unload_sigdata( sigdata );
- goto error;
+ _dumb_it_unload_sigdata(sigdata);
+ goto error;
error_sd:
- free( sigdata );
+ free(sigdata);
error:
- return NULL;
+ return NULL;
}
-static DUMB_IT_SIGDATA *it_riff_am_load_sigdata( DUMBFILE * f, struct riff * stream )
-{
- DUMB_IT_SIGDATA *sigdata;
+static DUMB_IT_SIGDATA *it_riff_am_load_sigdata(DUMBFILE *f,
+ struct riff *stream) {
+ DUMB_IT_SIGDATA *sigdata;
- int n, found;
+ int n, found;
int o, p;
- if ( ! f || ! stream ) goto error;
+ if (!f || !stream)
+ goto error;
- if ( stream->type != DUMB_ID( 'A', 'M', ' ', ' ' ) ) goto error;
+ if (stream->type != DUMB_ID('A', 'M', ' ', ' '))
+ goto error;
- sigdata = malloc(sizeof(*sigdata));
- if ( ! sigdata ) goto error;
+ sigdata = malloc(sizeof(*sigdata));
+ if (!sigdata)
+ goto error;
- sigdata->n_patterns = 0;
- sigdata->n_samples = 0;
- sigdata->name[0] = 0;
+ sigdata->n_patterns = 0;
+ sigdata->n_samples = 0;
+ sigdata->name[0] = 0;
- found = 0;
+ found = 0;
- for ( n = 0; (unsigned)n < stream->chunk_count; ++n )
- {
- struct riff_chunk * c = stream->chunks + n;
- switch( c->type )
- {
- case DUMB_ID( 'I' ,'N' ,'I' ,'T' ):
- /* initialization data */
- if ( ( found & 1 ) || ( c->size < 0x48 ) ) goto error_sd;
- found |= 1;
- break;
+ for (n = 0; (unsigned)n < stream->chunk_count; ++n) {
+ struct riff_chunk *c = stream->chunks + n;
+ switch (c->type) {
+ case DUMB_ID('I', 'N', 'I', 'T'):
+ /* initialization data */
+ if ((found & 1) || (c->size < 0x48))
+ goto error_sd;
+ found |= 1;
+ break;
- case DUMB_ID( 'O', 'R', 'D', 'R' ):
- if ( ( found & 2 ) || ( c->size < 1 ) ) goto error_sd;
- found |= 2;
- break;
+ case DUMB_ID('O', 'R', 'D', 'R'):
+ if ((found & 2) || (c->size < 1))
+ goto error_sd;
+ found |= 2;
+ break;
- case DUMB_ID( 'P', 'A', 'T', 'T' ):
- if ( dumbfile_seek( f, c->offset, DFS_SEEK_SET ) ) goto error_sd;
- o = dumbfile_getc( f );
- if ( o >= sigdata->n_patterns ) sigdata->n_patterns = (int)(o + 1);
- o = (int) dumbfile_igetl( f );
- if ( (unsigned)o + 5 > c->size ) goto error_sd;
- break;
+ case DUMB_ID('P', 'A', 'T', 'T'):
+ if (dumbfile_seek(f, c->offset, DFS_SEEK_SET))
+ goto error_sd;
+ o = dumbfile_getc(f);
+ if (o >= sigdata->n_patterns)
+ sigdata->n_patterns = (int)(o + 1);
+ o = (int)dumbfile_igetl(f);
+ if ((unsigned)o + 5 > c->size)
+ goto error_sd;
+ break;
- case DUMB_ID( 'R', 'I', 'F', 'F' ):
- {
- struct riff * str = c->nested;
- switch ( str->type )
- {
- case DUMB_ID( 'A', 'I', ' ', ' ' ):
- for ( o = 0; (unsigned)o < str->chunk_count; ++o )
- {
- struct riff_chunk * chk = str->chunks + o;
- switch( chk->type )
- {
- case DUMB_ID( 'I', 'N', 'S', 'T' ):
- {
- struct riff * temp;
- size_t size;
- unsigned sample_found;
- if ( dumbfile_seek( f, chk->offset, DFS_SEEK_SET ) ) goto error_sd;
- size = dumbfile_igetl( f );
- if ( size < 0x142 ) goto error_sd;
- sample_found = 0;
- dumbfile_skip( f, 1 );
- p = dumbfile_getc( f );
- if ( p >= sigdata->n_samples ) sigdata->n_samples = (int)(p + 1);
- temp = riff_parse( f, chk->offset + 4 + size, chk->size - size - 4, 1 );
- if ( temp )
- {
- if ( temp->type == DUMB_ID( 'A', 'S', ' ', ' ' ) )
- {
- for ( p = 0; (unsigned)p < temp->chunk_count; ++p )
- {
- if ( temp->chunks[ p ].type == DUMB_ID( 'S', 'A', 'M', 'P' ) )
- {
- if ( sample_found )
- {
- riff_free( temp );
- goto error_sd;
- }
- sample_found = 1;
- }
- }
- }
- riff_free( temp );
- }
- }
- }
- }
- }
- }
- break;
- }
- }
+ case DUMB_ID('R', 'I', 'F', 'F'): {
+ struct riff *str = c->nested;
+ switch (str->type) {
+ case DUMB_ID('A', 'I', ' ', ' '):
+ for (o = 0; (unsigned)o < str->chunk_count; ++o) {
+ struct riff_chunk *chk = str->chunks + o;
+ switch (chk->type) {
+ case DUMB_ID('I', 'N', 'S', 'T'): {
+ struct riff *temp;
+ size_t size;
+ unsigned sample_found;
+ if (dumbfile_seek(f, chk->offset, DFS_SEEK_SET))
+ goto error_sd;
+ size = dumbfile_igetl(f);
+ if (size < 0x142)
+ goto error_sd;
+ sample_found = 0;
+ dumbfile_skip(f, 1);
+ p = dumbfile_getc(f);
+ if (p >= sigdata->n_samples)
+ sigdata->n_samples = (int)(p + 1);
+ temp = riff_parse(f, chk->offset + 4 + size,
+ chk->size - size - 4, 1);
+ if (temp) {
+ if (temp->type == DUMB_ID('A', 'S', ' ', ' ')) {
+ for (p = 0; (unsigned)p < temp->chunk_count;
+ ++p) {
+ if (temp->chunks[p].type ==
+ DUMB_ID('S', 'A', 'M', 'P')) {
+ if (sample_found) {
+ riff_free(temp);
+ goto error_sd;
+ }
+ sample_found = 1;
+ }
+ }
+ }
+ riff_free(temp);
+ }
+ }
+ }
+ }
+ }
+ } break;
+ }
+ }
- if ( found != 3 || !sigdata->n_samples || !sigdata->n_patterns ) goto error_sd;
+ if (found != 3 || !sigdata->n_samples || !sigdata->n_patterns)
+ goto error_sd;
- if ( sigdata->n_samples > 255 || sigdata->n_patterns > 255 ) goto error_sd;
+ if (sigdata->n_samples > 255 || sigdata->n_patterns > 255)
+ goto error_sd;
- sigdata->song_message = NULL;
- sigdata->order = NULL;
- sigdata->instrument = NULL;
- sigdata->sample = NULL;
- sigdata->pattern = NULL;
- sigdata->midi = NULL;
- sigdata->checkpoint = NULL;
+ sigdata->song_message = NULL;
+ sigdata->order = NULL;
+ sigdata->instrument = NULL;
+ sigdata->sample = NULL;
+ sigdata->pattern = NULL;
+ sigdata->midi = NULL;
+ sigdata->checkpoint = NULL;
- sigdata->mixing_volume = 48;
- sigdata->pan_separation = 128;
+ sigdata->mixing_volume = 48;
+ sigdata->pan_separation = 128;
- sigdata->n_instruments = 0;
- sigdata->n_orders = 0;
- sigdata->restart_position = 0;
+ sigdata->n_instruments = 0;
+ sigdata->n_orders = 0;
+ sigdata->restart_position = 0;
- memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
+ memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
- for (n = 0; n < DUMB_IT_N_CHANNELS; n += 4) {
- int sep = 32 * dumb_it_default_panning_separation / 100;
- sigdata->channel_pan[n ] = 32 - sep;
- sigdata->channel_pan[n+1] = 32 + sep;
- sigdata->channel_pan[n+2] = 32 + sep;
- sigdata->channel_pan[n+3] = 32 - sep;
- }
+ for (n = 0; n < DUMB_IT_N_CHANNELS; n += 4) {
+ int sep = 32 * dumb_it_default_panning_separation / 100;
+ sigdata->channel_pan[n] = 32 - sep;
+ sigdata->channel_pan[n + 1] = 32 + sep;
+ sigdata->channel_pan[n + 2] = 32 + sep;
+ sigdata->channel_pan[n + 3] = 32 - sep;
+ }
- for ( n = 0; (unsigned)n < stream->chunk_count; ++n )
- {
- struct riff_chunk * c = stream->chunks + n;
- switch ( c->type )
- {
- case DUMB_ID( 'I', 'N', 'I', 'T' ):
- if ( dumbfile_seek( f, c->offset, DFS_SEEK_SET ) ) goto error_usd;
- dumbfile_getnc( (char *) sigdata->name, 64, f );
- sigdata->name[ 64 ] = 0;
- sigdata->flags = IT_STEREO | IT_OLD_EFFECTS | IT_COMPATIBLE_GXX | IT_WAS_AN_S3M;
- o = dumbfile_getc( f );
- if ( ! ( o & 1 ) ) sigdata->flags |= IT_LINEAR_SLIDES;
- if ( ( o & ~3 ) || ! ( o & 2 ) ) goto error_usd; // unknown flags
- sigdata->n_pchannels = dumbfile_getc( f );
- sigdata->speed = dumbfile_getc( f );
- sigdata->tempo = dumbfile_getc( f );
+ for (n = 0; (unsigned)n < stream->chunk_count; ++n) {
+ struct riff_chunk *c = stream->chunks + n;
+ switch (c->type) {
+ case DUMB_ID('I', 'N', 'I', 'T'):
+ if (dumbfile_seek(f, c->offset, DFS_SEEK_SET))
+ goto error_usd;
+ dumbfile_getnc((char *)sigdata->name, 64, f);
+ sigdata->name[64] = 0;
+ sigdata->flags =
+ IT_STEREO | IT_OLD_EFFECTS | IT_COMPATIBLE_GXX | IT_WAS_AN_S3M;
+ o = dumbfile_getc(f);
+ if (!(o & 1))
+ sigdata->flags |= IT_LINEAR_SLIDES;
+ if ((o & ~3) || !(o & 2))
+ goto error_usd; // unknown flags
+ sigdata->n_pchannels = dumbfile_getc(f);
+ sigdata->speed = dumbfile_getc(f);
+ sigdata->tempo = dumbfile_getc(f);
- dumbfile_skip( f, 4 );
+ dumbfile_skip(f, 4);
- sigdata->global_volume = dumbfile_getc( f );
+ sigdata->global_volume = dumbfile_getc(f);
- if ( c->size < 0x48 + (unsigned)sigdata->n_pchannels ) goto error_usd;
+ if (c->size < 0x48 + (unsigned)sigdata->n_pchannels)
+ goto error_usd;
- for ( o = 0; o < sigdata->n_pchannels; ++o )
- {
- p = dumbfile_getc( f );
- if ( p <= 128 )
- {
- sigdata->channel_pan[ o ] = p / 2;
- }
- else
- {
- sigdata->channel_volume[ o ] = 0;
- }
- }
- break;
- }
- }
+ for (o = 0; o < sigdata->n_pchannels; ++o) {
+ p = dumbfile_getc(f);
+ if (p <= 128) {
+ sigdata->channel_pan[o] = p / 2;
+ } else {
+ sigdata->channel_volume[o] = 0;
+ }
+ }
+ break;
+ }
+ }
- sigdata->pattern = malloc( sigdata->n_patterns * sizeof( *sigdata->pattern ) );
- if ( ! sigdata->pattern ) goto error_usd;
- for ( n = 0; n < sigdata->n_patterns; ++n )
- sigdata->pattern[ n ].entry = NULL;
+ sigdata->pattern = malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
+ if (!sigdata->pattern)
+ goto error_usd;
+ for (n = 0; n < sigdata->n_patterns; ++n)
+ sigdata->pattern[n].entry = NULL;
- sigdata->sample = malloc( sigdata->n_samples * sizeof( *sigdata->sample ) );
- if ( ! sigdata->sample ) goto error_usd;
- for ( n = 0; n < sigdata->n_samples; ++n )
- {
- IT_SAMPLE * sample = sigdata->sample + n;
- sample->data = NULL;
- sample->flags = 0;
- sample->name[ 0 ] = 0;
- }
+ sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
+ if (!sigdata->sample)
+ goto error_usd;
+ for (n = 0; n < sigdata->n_samples; ++n) {
+ IT_SAMPLE *sample = sigdata->sample + n;
+ sample->data = NULL;
+ sample->flags = 0;
+ sample->name[0] = 0;
+ }
- for ( n = 0; (unsigned)n < stream->chunk_count; ++n )
- {
- struct riff_chunk * c = stream->chunks + n;
- switch ( c->type )
- {
- case DUMB_ID( 'O', 'R', 'D', 'R' ):
- if ( dumbfile_seek( f, c->offset, DFS_SEEK_SET ) ) goto error_usd;
- sigdata->n_orders = dumbfile_getc( f ) + 1;
- if ( (unsigned)sigdata->n_orders + 1 > c->size ) goto error_usd;
- sigdata->order = malloc( sigdata->n_orders );
- if ( ! sigdata->order ) goto error_usd;
- dumbfile_getnc( (char *) sigdata->order, sigdata->n_orders, f );
- break;
+ for (n = 0; (unsigned)n < stream->chunk_count; ++n) {
+ struct riff_chunk *c = stream->chunks + n;
+ switch (c->type) {
+ case DUMB_ID('O', 'R', 'D', 'R'):
+ if (dumbfile_seek(f, c->offset, DFS_SEEK_SET))
+ goto error_usd;
+ sigdata->n_orders = dumbfile_getc(f) + 1;
+ if ((unsigned)sigdata->n_orders + 1 > c->size)
+ goto error_usd;
+ sigdata->order = malloc(sigdata->n_orders);
+ if (!sigdata->order)
+ goto error_usd;
+ dumbfile_getnc((char *)sigdata->order, sigdata->n_orders, f);
+ break;
- case DUMB_ID( 'P', 'A', 'T', 'T' ):
- if ( dumbfile_seek( f, c->offset, DFS_SEEK_SET ) ) goto error_usd;
- o = dumbfile_getc( f );
- p = (int) dumbfile_igetl( f );
- if ( it_riff_am_process_pattern( sigdata->pattern + o, f, p, 1 ) ) goto error_usd;
- break;
+ case DUMB_ID('P', 'A', 'T', 'T'):
+ if (dumbfile_seek(f, c->offset, DFS_SEEK_SET))
+ goto error_usd;
+ o = dumbfile_getc(f);
+ p = (int)dumbfile_igetl(f);
+ if (it_riff_am_process_pattern(sigdata->pattern + o, f, p, 1))
+ goto error_usd;
+ break;
- case DUMB_ID( 'R', 'I', 'F', 'F' ):
- {
- struct riff * str = c->nested;
- switch ( str->type )
- {
- case DUMB_ID('A', 'I', ' ', ' '):
- for ( o = 0; (unsigned)o < str->chunk_count; ++o )
- {
- struct riff_chunk * chk = str->chunks + o;
- switch( chk->type )
- {
- case DUMB_ID( 'I', 'N', 'S', 'T' ):
- {
- struct riff * temp;
- size_t size;
- unsigned sample_found;
- IT_SAMPLE * sample;
- if ( dumbfile_seek( f, chk->offset, DFS_SEEK_SET ) ) goto error_usd;
- size = dumbfile_igetl( f );
- dumbfile_skip( f, 1 );
- p = dumbfile_getc( f );
- temp = riff_parse( f, chk->offset + 4 + size, chk->size - size - 4, 1 );
- sample_found = 0;
- sample = sigdata->sample + p;
- if ( temp )
- {
- if ( temp->type == DUMB_ID( 'A', 'S', ' ', ' ' ) )
- {
- for ( p = 0; (unsigned)p < temp->chunk_count; ++p )
- {
- struct riff_chunk * c = temp->chunks + p;
- if ( c->type == DUMB_ID( 'S', 'A', 'M', 'P' ) )
- {
- if ( sample_found )
- {
- riff_free( temp );
- goto error_usd;
- }
- if ( dumbfile_seek( f, c->offset, DFS_SEEK_SET ) )
- {
- riff_free( temp );
- goto error_usd;
- }
- if ( it_riff_am_process_sample( sample, f, c->size, 1 ) )
- {
- riff_free( temp );
- goto error_usd;
- }
- sample_found = 1;
- }
- }
- }
- riff_free( temp );
- }
- if ( ! sample_found )
- {
- dumbfile_seek( f, chk->offset + 6, DFS_SEEK_SET );
- dumbfile_getnc( (char *) sample->name, 32, f );
- sample->name[ 32 ] = 0;
- }
- }
- }
- }
- }
- }
- break;
- }
- }
+ case DUMB_ID('R', 'I', 'F', 'F'): {
+ struct riff *str = c->nested;
+ switch (str->type) {
+ case DUMB_ID('A', 'I', ' ', ' '):
+ for (o = 0; (unsigned)o < str->chunk_count; ++o) {
+ struct riff_chunk *chk = str->chunks + o;
+ switch (chk->type) {
+ case DUMB_ID('I', 'N', 'S', 'T'): {
+ struct riff *temp;
+ size_t size;
+ unsigned sample_found;
+ IT_SAMPLE *sample;
+ if (dumbfile_seek(f, chk->offset, DFS_SEEK_SET))
+ goto error_usd;
+ size = dumbfile_igetl(f);
+ dumbfile_skip(f, 1);
+ p = dumbfile_getc(f);
+ temp = riff_parse(f, chk->offset + 4 + size,
+ chk->size - size - 4, 1);
+ sample_found = 0;
+ sample = sigdata->sample + p;
+ if (temp) {
+ if (temp->type == DUMB_ID('A', 'S', ' ', ' ')) {
+ for (p = 0; (unsigned)p < temp->chunk_count;
+ ++p) {
+ struct riff_chunk *c = temp->chunks + p;
+ if (c->type ==
+ DUMB_ID('S', 'A', 'M', 'P')) {
+ if (sample_found) {
+ riff_free(temp);
+ goto error_usd;
+ }
+ if (dumbfile_seek(f, c->offset,
+ DFS_SEEK_SET)) {
+ riff_free(temp);
+ goto error_usd;
+ }
+ if (it_riff_am_process_sample(
+ sample, f, c->size, 1)) {
+ riff_free(temp);
+ goto error_usd;
+ }
+ sample_found = 1;
+ }
+ }
+ }
+ riff_free(temp);
+ }
+ if (!sample_found) {
+ dumbfile_seek(f, chk->offset + 6, DFS_SEEK_SET);
+ dumbfile_getnc((char *)sample->name, 32, f);
+ sample->name[32] = 0;
+ }
+ }
+ }
+ }
+ }
+ } break;
+ }
+ }
- _dumb_it_fix_invalid_orders( sigdata );
+ _dumb_it_fix_invalid_orders(sigdata);
- return sigdata;
+ return sigdata;
error_usd:
- _dumb_it_unload_sigdata( sigdata );
- goto error;
+ _dumb_it_unload_sigdata(sigdata);
+ goto error;
error_sd:
- free( sigdata );
+ free(sigdata);
error:
- return NULL;
+ return NULL;
}
-DUH *dumb_read_riff_amff( DUMBFILE * f, struct riff * stream )
-{
- sigdata_t *sigdata;
- long length;
+DUH *dumb_read_riff_amff(DUMBFILE *f, struct riff *stream) {
+ sigdata_t *sigdata;
+ long length;
- DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
+ DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
- sigdata = it_riff_amff_load_sigdata( f, stream );
+ sigdata = it_riff_amff_load_sigdata(f, stream);
- if (!sigdata)
- return NULL;
+ if (!sigdata)
+ return NULL;
- length = 0;/*_dumb_it_build_checkpoints(sigdata, 0);*/
+ length = 0; /*_dumb_it_build_checkpoints(sigdata, 0);*/
- {
- const char *tag[2][2];
- tag[0][0] = "TITLE";
+ {
+ const char *tag[2][2];
+ tag[0][0] = "TITLE";
tag[0][1] = (const char *)(((DUMB_IT_SIGDATA *)sigdata)->name);
- tag[1][0] = "FORMAT";
- tag[1][1] = "RIFF AMFF";
- return make_duh( length, 2, ( const char * const (*) [ 2 ] ) tag, 1, & descptr, & sigdata );
- }
+ tag[1][0] = "FORMAT";
+ tag[1][1] = "RIFF AMFF";
+ return make_duh(length, 2, (const char *const(*)[2])tag, 1, &descptr,
+ &sigdata);
+ }
}
-DUH *dumb_read_riff_am( DUMBFILE * f, struct riff * stream )
-{
- sigdata_t *sigdata;
+DUH *dumb_read_riff_am(DUMBFILE *f, struct riff *stream) {
+ sigdata_t *sigdata;
- DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
+ DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
- sigdata = it_riff_am_load_sigdata( f, stream );
+ sigdata = it_riff_am_load_sigdata(f, stream);
- if (!sigdata)
- return NULL;
+ if (!sigdata)
+ return NULL;
- {
- const char *tag[2][2];
- tag[0][0] = "TITLE";
+ {
+ const char *tag[2][2];
+ tag[0][0] = "TITLE";
tag[0][1] = (const char *)(((DUMB_IT_SIGDATA *)sigdata)->name);
- tag[1][0] = "FORMAT";
- tag[1][1] = "RIFF AM";
- return make_duh( -1, 2, ( const char * const (*) [ 2 ] ) tag, 1, & descptr, & sigdata );
- }
+ tag[1][0] = "FORMAT";
+ tag[1][1] = "RIFF AM";
+ return make_duh(-1, 2, (const char *const(*)[2])tag, 1, &descptr,
+ &sigdata);
+ }
}
--- a/src/it/readamf.c
+++ b/src/it/readamf.c
@@ -24,539 +24,571 @@
#include "dumb.h"
#include "internal/it.h"
+static void it_amf_process_track(IT_ENTRY *entry_table, unsigned char *track,
+ int rows, int channels) {
+ int last_instrument = 0;
+ int tracksize = track[0] + (track[1] << 8) + (track[2] << 16);
+ track += 3;
+ while (tracksize--) {
+ unsigned int row = track[0];
+ unsigned int command = track[1];
+ unsigned int argument = track[2];
+ IT_ENTRY *entry = entry_table + row * channels;
+ if (row >= (unsigned int)rows)
+ break;
+ if (command < 0x7F) {
+ entry->mask |=
+ IT_ENTRY_NOTE | IT_ENTRY_INSTRUMENT | IT_ENTRY_VOLPAN;
+ entry->note = command;
+ if (!entry->instrument)
+ entry->instrument = last_instrument;
+ entry->volpan = argument;
+ } else if (command == 0x7F) {
+ signed char row_delta = (signed char)argument;
+ int row_source = (int)row + (int)row_delta;
+ if (row_source >= 0 && row_source < (int)rows) {
+ *entry = entry_table[row_source * channels];
+ }
+ } else if (command == 0x80) {
+ entry->mask |= IT_ENTRY_INSTRUMENT;
+ last_instrument = argument + 1;
+ entry->instrument = last_instrument;
+ } else if (command == 0x83) {
+ entry->mask |= IT_ENTRY_VOLPAN;
+ entry->volpan = argument;
+ } else {
+ unsigned int effect = command & 0x7F;
+ unsigned int effectvalue = argument;
+ switch (effect) {
+ case 0x01:
+ effect = IT_SET_SPEED;
+ break;
+ case 0x02:
+ effect = IT_VOLUME_SLIDE;
+ case 0x0A:
+ if (effect == 0x0A)
+ effect = IT_VOLSLIDE_TONEPORTA;
+ case 0x0B:
+ if (effect == 0x0B)
+ effect = IT_VOLSLIDE_VIBRATO;
+ if (effectvalue & 0x80)
+ effectvalue = (-(signed char)effectvalue) & 0x0F;
+ else
+ effectvalue = (effectvalue & 0x0F) << 4;
+ break;
-static void it_amf_process_track( IT_ENTRY *entry_table, unsigned char *track, int rows, int channels )
-{
- int last_instrument = 0;
- int tracksize = track[ 0 ] + ( track[ 1 ] << 8 ) + ( track[ 2 ] << 16 );
- track += 3;
- while ( tracksize-- ) {
- unsigned int row = track[ 0 ];
- unsigned int command = track[ 1 ];
- unsigned int argument = track[ 2 ];
- IT_ENTRY * entry = entry_table + row * channels;
- if ( row >= ( unsigned int ) rows ) break;
- if ( command < 0x7F ) {
- entry->mask |= IT_ENTRY_NOTE | IT_ENTRY_INSTRUMENT | IT_ENTRY_VOLPAN;
- entry->note = command;
- if ( ! entry->instrument ) entry->instrument = last_instrument;
- entry->volpan = argument;
- }
- else if ( command == 0x7F ) {
- signed char row_delta = ( signed char ) argument;
- int row_source = ( int ) row + ( int ) row_delta;
- if ( row_source >= 0 && row_source < ( int ) rows ) {
- *entry = entry_table[ row_source * channels ];
- }
- }
- else if ( command == 0x80 ) {
- entry->mask |= IT_ENTRY_INSTRUMENT;
- last_instrument = argument + 1;
- entry->instrument = last_instrument;
- }
- else if ( command == 0x83 ) {
- entry->mask |= IT_ENTRY_VOLPAN;
- entry->volpan = argument;
- }
- else {
- unsigned int effect = command & 0x7F;
- unsigned int effectvalue = argument;
- switch (effect) {
- case 0x01: effect = IT_SET_SPEED; break;
+ case 0x04:
+ if (effectvalue & 0x80) {
+ effect = IT_PORTAMENTO_UP;
+ effectvalue = (-(signed char)effectvalue) & 0x7F;
+ } else {
+ effect = IT_PORTAMENTO_DOWN;
+ }
+ break;
- case 0x02: effect = IT_VOLUME_SLIDE;
- case 0x0A: if ( effect == 0x0A ) effect = IT_VOLSLIDE_TONEPORTA;
- case 0x0B: if ( effect == 0x0B ) effect = IT_VOLSLIDE_VIBRATO;
- if ( effectvalue & 0x80 ) effectvalue = ( -( signed char ) effectvalue ) & 0x0F;
- else effectvalue = ( effectvalue & 0x0F ) << 4;
- break;
+ case 0x06:
+ effect = IT_TONE_PORTAMENTO;
+ break;
- case 0x04:
- if ( effectvalue & 0x80 ) {
- effect = IT_PORTAMENTO_UP;
- effectvalue = ( -( signed char ) effectvalue ) & 0x7F;
- }
- else {
- effect = IT_PORTAMENTO_DOWN;
- }
- break;
+ case 0x07:
+ effect = IT_TREMOR;
+ break;
- case 0x06: effect = IT_TONE_PORTAMENTO; break;
+ case 0x08:
+ effect = IT_ARPEGGIO;
+ break;
- case 0x07: effect = IT_TREMOR; break;
+ case 0x09:
+ effect = IT_VIBRATO;
+ break;
- case 0x08: effect = IT_ARPEGGIO; break;
+ case 0x0C:
+ effect = IT_BREAK_TO_ROW;
+ break;
- case 0x09: effect = IT_VIBRATO; break;
+ case 0x0D:
+ effect = IT_JUMP_TO_ORDER;
+ break;
- case 0x0C: effect = IT_BREAK_TO_ROW; break;
+ case 0x0F:
+ effect = IT_RETRIGGER_NOTE;
+ break;
- case 0x0D: effect = IT_JUMP_TO_ORDER; break;
+ case 0x10:
+ effect = IT_SET_SAMPLE_OFFSET;
+ break;
- case 0x0F: effect = IT_RETRIGGER_NOTE; break;
+ case 0x11:
+ if (effectvalue) {
+ effect = IT_VOLUME_SLIDE;
+ if (effectvalue & 0x80)
+ effectvalue =
+ 0xF0 | ((-(signed char)effectvalue) & 0x0F);
+ else
+ effectvalue = 0x0F | ((effectvalue & 0x0F) << 4);
+ } else
+ effect = 0;
+ break;
- case 0x10: effect = IT_SET_SAMPLE_OFFSET; break;
+ case 0x12:
+ case 0x16:
+ if (effectvalue) {
+ int mask = (effect == 0x16) ? 0xE0 : 0xF0;
+ effect = (effectvalue & 0x80) ? IT_PORTAMENTO_UP
+ : IT_PORTAMENTO_DOWN;
+ if (effectvalue & 0x80)
+ effectvalue =
+ mask | ((-(signed char)effectvalue) & 0x0F);
+ else
+ effectvalue = mask | (effectvalue & 0x0F);
+ } else
+ effect = 0;
+ break;
- case 0x11:
- if ( effectvalue ) {
- effect = IT_VOLUME_SLIDE;
- if ( effectvalue & 0x80 )
- effectvalue = 0xF0 | ( ( -( signed char ) effectvalue ) & 0x0F );
- else
- effectvalue = 0x0F | ( ( effectvalue & 0x0F ) << 4 );
- }
- else
- effect = 0;
- break;
+ case 0x13:
+ effect = IT_S;
+ effectvalue = EFFECT_VALUE(IT_S_NOTE_DELAY, effectvalue & 0x0F);
+ break;
- case 0x12:
- case 0x16:
- if ( effectvalue ) {
- int mask = ( effect == 0x16 ) ? 0xE0 : 0xF0;
- effect = ( effectvalue & 0x80 ) ? IT_PORTAMENTO_UP : IT_PORTAMENTO_DOWN;
- if ( effectvalue & 0x80 )
- effectvalue = mask | ( ( -( signed char ) effectvalue ) & 0x0F );
- else
- effectvalue = mask | ( effectvalue & 0x0F );
- }
- else
- effect = 0;
- break;
+ case 0x14:
+ effect = IT_S;
+ effectvalue =
+ EFFECT_VALUE(IT_S_DELAYED_NOTE_CUT, effectvalue & 0x0F);
+ break;
- case 0x13:
- effect = IT_S;
- effectvalue = EFFECT_VALUE( IT_S_NOTE_DELAY, effectvalue & 0x0F );
- break;
+ case 0x15:
+ effect = IT_SET_SONG_TEMPO;
+ break;
- case 0x14:
- effect = IT_S;
- effectvalue = EFFECT_VALUE( IT_S_DELAYED_NOTE_CUT, effectvalue & 0x0F );
- break;
+ case 0x17:
+ effectvalue = (effectvalue + 64) & 0x7F;
+ if (entry->mask & IT_ENTRY_EFFECT) {
+ if (!(entry->mask & IT_ENTRY_VOLPAN)) {
+ entry->mask |= IT_ENTRY_VOLPAN;
+ entry->volpan = (effectvalue / 2) + 128;
+ }
+ effect = 0;
+ } else {
+ effect = IT_SET_PANNING;
+ }
+ break;
- case 0x15: effect = IT_SET_SONG_TEMPO; break;
-
- case 0x17:
- effectvalue = ( effectvalue + 64 ) & 0x7F;
- if ( entry->mask & IT_ENTRY_EFFECT ) {
- if ( !( entry->mask & IT_ENTRY_VOLPAN ) ) {
- entry->mask |= IT_ENTRY_VOLPAN;
- entry->volpan = ( effectvalue / 2 ) + 128;
- }
- effect = 0;
- }
- else {
- effect = IT_SET_PANNING;
- }
- break;
-
- default: effect = effectvalue = 0;
- }
- if ( effect ) {
- entry->mask |= IT_ENTRY_EFFECT;
- entry->effect = effect;
- entry->effectvalue = effectvalue;
- }
- }
- track += 3;
- }
+ default:
+ effect = effectvalue = 0;
+ }
+ if (effect) {
+ entry->mask |= IT_ENTRY_EFFECT;
+ entry->effect = effect;
+ entry->effectvalue = effectvalue;
+ }
+ }
+ track += 3;
+ }
}
-static int it_amf_process_pattern( IT_PATTERN *pattern, IT_ENTRY *entry_table, int rows, int channels )
-{
- int i, j;
- int n_entries = rows;
- IT_ENTRY * entry;
+static int it_amf_process_pattern(IT_PATTERN *pattern, IT_ENTRY *entry_table,
+ int rows, int channels) {
+ int i, j;
+ int n_entries = rows;
+ IT_ENTRY *entry;
- pattern->n_rows = rows;
+ pattern->n_rows = rows;
- for ( i = 0, j = channels * rows; i < j; i++ ) {
- if ( entry_table[ i ].mask ) {
- n_entries++;
- }
- }
+ for (i = 0, j = channels * rows; i < j; i++) {
+ if (entry_table[i].mask) {
+ n_entries++;
+ }
+ }
- pattern->n_entries = n_entries;
+ pattern->n_entries = n_entries;
- pattern->entry = entry = malloc( n_entries * sizeof( IT_ENTRY ) );
- if ( !entry ) {
- return -1;
- }
+ pattern->entry = entry = malloc(n_entries * sizeof(IT_ENTRY));
+ if (!entry) {
+ return -1;
+ }
- for ( i = 0; i < rows; i++ ) {
- for ( j = 0; j < channels; j++ ) {
- if ( entry_table[ i * channels + j ].mask ) {
- *entry = entry_table[ i * channels + j ];
- entry->channel = j;
- entry++;
- }
- }
- IT_SET_END_ROW( entry );
- entry++;
- }
+ for (i = 0; i < rows; i++) {
+ for (j = 0; j < channels; j++) {
+ if (entry_table[i * channels + j].mask) {
+ *entry = entry_table[i * channels + j];
+ entry->channel = j;
+ entry++;
+ }
+ }
+ IT_SET_END_ROW(entry);
+ entry++;
+ }
- return 0;
+ return 0;
}
-static int it_amf_read_sample_header( IT_SAMPLE *sample, DUMBFILE *f, int * offset, int ver )
-{
- int exists;
+static int it_amf_read_sample_header(IT_SAMPLE *sample, DUMBFILE *f,
+ int *offset, int ver) {
+ int exists;
- exists = dumbfile_getc( f );
+ exists = dumbfile_getc(f);
- dumbfile_getnc( (char *) sample->name, 32, f );
- sample->name[32] = 0;
+ dumbfile_getnc((char *)sample->name, 32, f);
+ sample->name[32] = 0;
- dumbfile_getnc( (char *) sample->filename, 13, f );
- sample->filename[13] = 0;
+ dumbfile_getnc((char *)sample->filename, 13, f);
+ sample->filename[13] = 0;
- *offset = (int)dumbfile_igetl( f );
- sample->length = dumbfile_igetl( f );
- sample->C5_speed = dumbfile_igetw( f );
- sample->default_volume = dumbfile_getc( f );
- sample->global_volume = 64;
- if ( sample->default_volume > 64 ) sample->default_volume = 64;
+ *offset = (int)dumbfile_igetl(f);
+ sample->length = dumbfile_igetl(f);
+ sample->C5_speed = dumbfile_igetw(f);
+ sample->default_volume = dumbfile_getc(f);
+ sample->global_volume = 64;
+ if (sample->default_volume > 64)
+ sample->default_volume = 64;
- if ( ver >= 11 ) {
- sample->loop_start = dumbfile_igetl( f );
- sample->loop_end = dumbfile_igetl( f );
- } else {
- sample->loop_start = dumbfile_igetw( f );
- sample->loop_end = sample->length;
- }
+ if (ver >= 11) {
+ sample->loop_start = dumbfile_igetl(f);
+ sample->loop_end = dumbfile_igetl(f);
+ } else {
+ sample->loop_start = dumbfile_igetw(f);
+ sample->loop_end = sample->length;
+ }
- if ( sample->length <= 0 ) {
- sample->flags = 0;
- return 0;
- }
+ if (sample->length <= 0) {
+ sample->flags = 0;
+ return 0;
+ }
- sample->flags = exists == 1 ? IT_SAMPLE_EXISTS : 0;
+ sample->flags = exists == 1 ? IT_SAMPLE_EXISTS : 0;
- sample->default_pan = 0;
- sample->finetune = 0;
+ sample->default_pan = 0;
+ sample->finetune = 0;
- if ( sample->loop_end > sample->loop_start + 2 && sample->loop_end <= sample->length )
- sample->flags |= IT_SAMPLE_LOOP;
+ if (sample->loop_end > sample->loop_start + 2 &&
+ sample->loop_end <= sample->length)
+ sample->flags |= IT_SAMPLE_LOOP;
- sample->vibrato_speed = 0;
- sample->vibrato_depth = 0;
- sample->vibrato_rate = 0;
- sample->vibrato_waveform = 0; // do we have to set _all_ these?
- sample->max_resampling_quality = -1;
+ sample->vibrato_speed = 0;
+ sample->vibrato_depth = 0;
+ sample->vibrato_rate = 0;
+ sample->vibrato_waveform = 0; // do we have to set _all_ these?
+ sample->max_resampling_quality = -1;
- return dumbfile_error(f);
+ return dumbfile_error(f);
}
+static int it_amf_read_sample_data(IT_SAMPLE *sample, DUMBFILE *f) {
+ int i, read_length = 0;
+ sample->data = malloc(sample->length);
-static int it_amf_read_sample_data( IT_SAMPLE *sample, DUMBFILE *f )
-{
- int i, read_length = 0;
+ if (!sample->data)
+ return -1;
- sample->data = malloc( sample->length );
+ if (sample->length)
+ read_length = (int)dumbfile_getnc(sample->data, sample->length, f);
- if ( !sample->data )
- return -1;
+ if (read_length < 0)
+ read_length = 0;
- if ( sample->length )
- read_length = (int)dumbfile_getnc( sample->data, sample->length, f );
-
- if ( read_length < 0 )
- read_length = 0;
+ for (i = 0; i < read_length; i++) {
+ ((signed char *)sample->data)[i] ^= 0x80;
+ }
- for ( i = 0; i < read_length; i++ ) {
- ( ( signed char * ) sample->data )[ i ] ^= 0x80;
- }
+ for (i = read_length; i < sample->length; i++) {
+ ((signed char *)sample->data)[i] = 0;
+ }
- for ( i = read_length; i < sample->length; i++ ) {
- ( ( signed char * ) sample->data )[ i ] = 0;
- }
-
- return 0; /* Sometimes the last sample is truncated :( */
+ return 0; /* Sometimes the last sample is truncated :( */
}
-static DUMB_IT_SIGDATA *it_amf_load_sigdata(DUMBFILE *f, int * version)
-{
- DUMB_IT_SIGDATA *sigdata;
- int i, j, ver, ntracks, realntracks, nchannels;
+static DUMB_IT_SIGDATA *it_amf_load_sigdata(DUMBFILE *f, int *version) {
+ DUMB_IT_SIGDATA *sigdata;
+ int i, j, ver, ntracks, realntracks, nchannels;
- int maxsampleseekpos = 0;
- int sampleseekpos[256];
+ int maxsampleseekpos = 0;
+ int sampleseekpos[256];
- unsigned short *orderstotracks;
- unsigned short *trackmap;
- unsigned int tracksize[256];
+ unsigned short *orderstotracks;
+ unsigned short *trackmap;
+ unsigned int tracksize[256];
- unsigned char **track;
+ unsigned char **track;
- static const char sig[] = "AMF";
+ static const char sig[] = "AMF";
- char signature [3];
+ char signature[3];
- if ( dumbfile_getnc( signature, 3, f ) != 3 ||
- memcmp( signature, sig, 3 ) ) {
- return NULL;
- }
+ if (dumbfile_getnc(signature, 3, f) != 3 || memcmp(signature, sig, 3)) {
+ return NULL;
+ }
- *version = ver = dumbfile_getc( f );
- if ( ver < 10 || ver > 14) {
- return NULL;
- }
+ *version = ver = dumbfile_getc(f);
+ if (ver < 10 || ver > 14) {
+ return NULL;
+ }
- sigdata = malloc(sizeof(*sigdata));
- if (!sigdata) {
- return NULL;
- }
+ sigdata = malloc(sizeof(*sigdata));
+ if (!sigdata) {
+ return NULL;
+ }
- dumbfile_getnc( (char *) sigdata->name, 32, f );
- sigdata->name[ 32 ] = 0;
- sigdata->n_samples = dumbfile_getc( f );
- sigdata->n_orders = dumbfile_getc( f );
- ntracks = dumbfile_igetw( f );
- nchannels = dumbfile_getc( f );
+ dumbfile_getnc((char *)sigdata->name, 32, f);
+ sigdata->name[32] = 0;
+ sigdata->n_samples = dumbfile_getc(f);
+ sigdata->n_orders = dumbfile_getc(f);
+ ntracks = dumbfile_igetw(f);
+ nchannels = dumbfile_getc(f);
- if ( dumbfile_error( f ) ||
- sigdata->n_samples < 1 || sigdata->n_samples > 255 ||
- sigdata->n_orders < 1 || sigdata->n_orders > 255 ||
- ! ntracks ||
- nchannels < 1 || nchannels > 32 ) {
- free( sigdata );
- return NULL;
- }
-
+ if (dumbfile_error(f) || sigdata->n_samples < 1 ||
+ sigdata->n_samples > 255 || sigdata->n_orders < 1 ||
+ sigdata->n_orders > 255 || !ntracks || nchannels < 1 ||
+ nchannels > 32) {
+ free(sigdata);
+ return NULL;
+ }
+
sigdata->n_pchannels = nchannels;
- memset( sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS );
+ memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
- if ( ver >= 11 ) {
- int nchannels = ( ver >= 13 ) ? 32 : 16;
- for ( i = 0; i < nchannels; i++ ) {
- signed char panpos = dumbfile_getc( f );
- int pan = ( panpos + 64 ) / 2;
- if ( pan < 0 ) pan = 0;
- else if ( pan > 64 ) pan = IT_SURROUND;
- sigdata->channel_pan[ i ] = pan;
- }
- }
- else {
- int sep = 32 * dumb_it_default_panning_separation / 100;
- for ( i = 0; i < 16; i++ ) {
- sigdata->channel_pan[ i ] = ( dumbfile_getc( f ) & 1 ) ? 32 - sep : 32 + sep;
- }
- }
+ if (ver >= 11) {
+ int nchannels = (ver >= 13) ? 32 : 16;
+ for (i = 0; i < nchannels; i++) {
+ signed char panpos = dumbfile_getc(f);
+ int pan = (panpos + 64) / 2;
+ if (pan < 0)
+ pan = 0;
+ else if (pan > 64)
+ pan = IT_SURROUND;
+ sigdata->channel_pan[i] = pan;
+ }
+ } else {
+ int sep = 32 * dumb_it_default_panning_separation / 100;
+ for (i = 0; i < 16; i++) {
+ sigdata->channel_pan[i] =
+ (dumbfile_getc(f) & 1) ? 32 - sep : 32 + sep;
+ }
+ }
- sigdata->tempo = 125;
- sigdata->speed = 6;
- if ( ver >= 13 ) {
- i = dumbfile_getc( f );
- if ( i >= 32 ) sigdata->tempo = i;
- i = dumbfile_getc( f );
- if ( i <= 32 ) sigdata->speed = i;
- }
+ sigdata->tempo = 125;
+ sigdata->speed = 6;
+ if (ver >= 13) {
+ i = dumbfile_getc(f);
+ if (i >= 32)
+ sigdata->tempo = i;
+ i = dumbfile_getc(f);
+ if (i <= 32)
+ sigdata->speed = i;
+ }
- sigdata->order = malloc( sigdata->n_orders );
- if ( !sigdata->order ) {
- free( sigdata );
- return NULL;
- }
+ sigdata->order = malloc(sigdata->n_orders);
+ if (!sigdata->order) {
+ free(sigdata);
+ return NULL;
+ }
- orderstotracks = malloc( sigdata->n_orders * nchannels * sizeof( unsigned short ) );
- if ( !orderstotracks ) {
- free( sigdata->order );
- free( sigdata );
- return NULL;
- }
+ orderstotracks =
+ malloc(sigdata->n_orders * nchannels * sizeof(unsigned short));
+ if (!orderstotracks) {
+ free(sigdata->order);
+ free(sigdata);
+ return NULL;
+ }
- for ( i = 0; i < sigdata->n_orders; i++ ) {
- sigdata->order[ i ] = i;
- tracksize[ i ] = 64;
- if ( ver >= 14 ) {
- tracksize[ i ] = dumbfile_igetw( f );
- }
- for ( j = 0; j < nchannels; j++ ) {
- orderstotracks[ i * nchannels + j ] = dumbfile_igetw( f );
- }
- }
+ for (i = 0; i < sigdata->n_orders; i++) {
+ sigdata->order[i] = i;
+ tracksize[i] = 64;
+ if (ver >= 14) {
+ tracksize[i] = dumbfile_igetw(f);
+ }
+ for (j = 0; j < nchannels; j++) {
+ orderstotracks[i * nchannels + j] = dumbfile_igetw(f);
+ }
+ }
- if ( dumbfile_error( f ) ) {
- free( orderstotracks );
- free( sigdata->order );
- free( sigdata );
- return NULL;
- }
+ if (dumbfile_error(f)) {
+ free(orderstotracks);
+ free(sigdata->order);
+ free(sigdata);
+ return NULL;
+ }
- sigdata->sample = malloc( sigdata->n_samples * sizeof( *sigdata->sample ) );
- if ( !sigdata->sample ) {
- free( orderstotracks );
- free( sigdata->order );
- free( sigdata );
- return NULL;
- }
+ sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
+ if (!sigdata->sample) {
+ free(orderstotracks);
+ free(sigdata->order);
+ free(sigdata);
+ return NULL;
+ }
- sigdata->restart_position = 0;
+ sigdata->restart_position = 0;
- sigdata->song_message = NULL;
- sigdata->instrument = NULL;
- sigdata->pattern = NULL;
- sigdata->midi = NULL;
- sigdata->checkpoint = NULL;
+ sigdata->song_message = NULL;
+ sigdata->instrument = NULL;
+ sigdata->pattern = NULL;
+ sigdata->midi = NULL;
+ sigdata->checkpoint = NULL;
- sigdata->n_instruments = 0;
+ sigdata->n_instruments = 0;
- for ( i = 0; i < sigdata->n_samples; ++i )
- sigdata->sample[i].data = NULL;
+ for (i = 0; i < sigdata->n_samples; ++i)
+ sigdata->sample[i].data = NULL;
- for ( i = 0; i < sigdata->n_samples; ++i ) {
- int offset;
- if ( it_amf_read_sample_header( &sigdata->sample[i], f, &offset, ver ) ) {
- goto error_ott;
- }
- sampleseekpos[ i ] = offset;
- if ( offset > maxsampleseekpos ) maxsampleseekpos = offset;
- }
+ for (i = 0; i < sigdata->n_samples; ++i) {
+ int offset;
+ if (it_amf_read_sample_header(&sigdata->sample[i], f, &offset, ver)) {
+ goto error_ott;
+ }
+ sampleseekpos[i] = offset;
+ if (offset > maxsampleseekpos)
+ maxsampleseekpos = offset;
+ }
- sigdata->n_patterns = sigdata->n_orders;
+ sigdata->n_patterns = sigdata->n_orders;
- sigdata->pattern = malloc( sigdata->n_patterns * sizeof( *sigdata->pattern ) );
- if ( !sigdata->pattern ) {
- goto error_ott;
- }
- for (i = 0; i < sigdata->n_patterns; ++i)
- sigdata->pattern[i].entry = NULL;
+ sigdata->pattern = malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
+ if (!sigdata->pattern) {
+ goto error_ott;
+ }
+ for (i = 0; i < sigdata->n_patterns; ++i)
+ sigdata->pattern[i].entry = NULL;
- trackmap = malloc( ntracks * sizeof( unsigned short ) );
- if ( !trackmap ) {
- goto error_ott;
- }
+ trackmap = malloc(ntracks * sizeof(unsigned short));
+ if (!trackmap) {
+ goto error_ott;
+ }
- if ( dumbfile_getnc( ( char * ) trackmap, ntracks * sizeof( unsigned short ), f ) != (long)(ntracks * sizeof( unsigned short )) ) {
- goto error_tm;
- }
+ if (dumbfile_getnc((char *)trackmap, ntracks * sizeof(unsigned short), f) !=
+ (long)(ntracks * sizeof(unsigned short))) {
+ goto error_tm;
+ }
- realntracks = 0;
+ realntracks = 0;
- for ( i = 0; i < ntracks; i++ ) {
- if ( trackmap[ i ] > realntracks ) realntracks = trackmap[ i ];
- }
+ for (i = 0; i < ntracks; i++) {
+ if (trackmap[i] > realntracks)
+ realntracks = trackmap[i];
+ }
- track = calloc( realntracks, sizeof( unsigned char * ) );
- if ( !track ) {
- goto error_tm;
- }
+ track = calloc(realntracks, sizeof(unsigned char *));
+ if (!track) {
+ goto error_tm;
+ }
- for ( i = 0; i < realntracks; i++ ) {
- int tracksize = dumbfile_igetw( f );
- tracksize += dumbfile_getc( f ) << 16;
- track[ i ] = malloc( tracksize * 3 + 3 );
- if ( !track[ i ] ) {
- goto error_all;
- }
- track[ i ][ 0 ] = tracksize & 255;
- track[ i ][ 1 ] = ( tracksize >> 8 ) & 255;
- track[ i ][ 2 ] = ( tracksize >> 16 ) & 255;
- if ( dumbfile_getnc( (char *) track[ i ] + 3, tracksize * 3, f ) != tracksize * 3 ) {
- goto error_all;
- }
- }
+ for (i = 0; i < realntracks; i++) {
+ int tracksize = dumbfile_igetw(f);
+ tracksize += dumbfile_getc(f) << 16;
+ track[i] = malloc(tracksize * 3 + 3);
+ if (!track[i]) {
+ goto error_all;
+ }
+ track[i][0] = tracksize & 255;
+ track[i][1] = (tracksize >> 8) & 255;
+ track[i][2] = (tracksize >> 16) & 255;
+ if (dumbfile_getnc((char *)track[i] + 3, tracksize * 3, f) !=
+ tracksize * 3) {
+ goto error_all;
+ }
+ }
- for ( i = 1; i <= maxsampleseekpos; i++ ) {
- for ( j = 0; j < sigdata->n_samples; j++ ) {
- if ( sampleseekpos[ j ] == i ) {
- if ( it_amf_read_sample_data( &sigdata->sample[ j ], f ) ) {
- goto error_all;
- }
- break;
- }
- }
- }
+ for (i = 1; i <= maxsampleseekpos; i++) {
+ for (j = 0; j < sigdata->n_samples; j++) {
+ if (sampleseekpos[j] == i) {
+ if (it_amf_read_sample_data(&sigdata->sample[j], f)) {
+ goto error_all;
+ }
+ break;
+ }
+ }
+ }
- /* Process tracks into patterns */
- for ( i = 0; i < sigdata->n_patterns; i++ ) {
- IT_ENTRY * entry_table = calloc( tracksize[ i ] * nchannels, sizeof( IT_ENTRY ) );
- if ( !entry_table ) {
- goto error_all;
- }
- for ( j = 0; j < nchannels; j++ ) {
- int ntrack = orderstotracks[ i * nchannels + j ];
- if ( ntrack && ntrack <= ntracks ) {
- int realtrack = trackmap[ ntrack - 1 ];
- if ( realtrack ) {
- realtrack--;
- if ( realtrack < realntracks && track[ realtrack ] ) {
- it_amf_process_track( entry_table + j, track[ realtrack ], tracksize[ i ], nchannels );
- }
- }
- }
- }
- if ( it_amf_process_pattern( &sigdata->pattern[ i ], entry_table, tracksize[ i ], nchannels ) ) {
- free( entry_table );
- goto error_all;
- }
- free( entry_table );
- }
+ /* Process tracks into patterns */
+ for (i = 0; i < sigdata->n_patterns; i++) {
+ IT_ENTRY *entry_table =
+ calloc(tracksize[i] * nchannels, sizeof(IT_ENTRY));
+ if (!entry_table) {
+ goto error_all;
+ }
+ for (j = 0; j < nchannels; j++) {
+ int ntrack = orderstotracks[i * nchannels + j];
+ if (ntrack && ntrack <= ntracks) {
+ int realtrack = trackmap[ntrack - 1];
+ if (realtrack) {
+ realtrack--;
+ if (realtrack < realntracks && track[realtrack]) {
+ it_amf_process_track(entry_table + j, track[realtrack],
+ tracksize[i], nchannels);
+ }
+ }
+ }
+ }
+ if (it_amf_process_pattern(&sigdata->pattern[i], entry_table,
+ tracksize[i], nchannels)) {
+ free(entry_table);
+ goto error_all;
+ }
+ free(entry_table);
+ }
- /* Now let's initialise the remaining variables, and we're done! */
- sigdata->flags = IT_OLD_EFFECTS | IT_COMPATIBLE_GXX | IT_STEREO | IT_WAS_AN_S3M;
+ /* Now let's initialise the remaining variables, and we're done! */
+ sigdata->flags =
+ IT_OLD_EFFECTS | IT_COMPATIBLE_GXX | IT_STEREO | IT_WAS_AN_S3M;
- sigdata->global_volume = 128;
- sigdata->mixing_volume = 48;
- sigdata->pan_separation = 128;
+ sigdata->global_volume = 128;
+ sigdata->mixing_volume = 48;
+ sigdata->pan_separation = 128;
- _dumb_it_fix_invalid_orders(sigdata);
+ _dumb_it_fix_invalid_orders(sigdata);
- for ( i = 0; i < realntracks; i++ ) {
- if ( track[ i ] ) {
- free( track[ i ] );
- }
- }
- free( track );
- free( trackmap );
- free( orderstotracks );
+ for (i = 0; i < realntracks; i++) {
+ if (track[i]) {
+ free(track[i]);
+ }
+ }
+ free(track);
+ free(trackmap);
+ free(orderstotracks);
- return sigdata;
+ return sigdata;
error_all:
- for ( i = 0; i < realntracks; i++ ) {
- if ( track[ i ] ) {
- free( track[ i ] );
- }
- }
- free( track );
+ for (i = 0; i < realntracks; i++) {
+ if (track[i]) {
+ free(track[i]);
+ }
+ }
+ free(track);
error_tm:
- free( trackmap );
+ free(trackmap);
error_ott:
- free( orderstotracks );
- _dumb_it_unload_sigdata( sigdata );
- return NULL;
+ free(orderstotracks);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
}
+DUH *dumb_read_amf_quick(DUMBFILE *f) {
+ sigdata_t *sigdata;
+ DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
-DUH *dumb_read_amf_quick(DUMBFILE *f)
-{
- sigdata_t *sigdata;
+ int version;
- DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
+ sigdata = it_amf_load_sigdata(f, &version);
- int version;
+ if (!sigdata)
+ return NULL;
- sigdata = it_amf_load_sigdata(f, &version);
-
- if (!sigdata)
- return NULL;
-
- {
- const char *tag[2][2];
- char ver_string[14];
- tag[0][0] = "TITLE";
+ {
+ const char *tag[2][2];
+ char ver_string[14];
+ tag[0][0] = "TITLE";
tag[0][1] = (const char *)(((DUMB_IT_SIGDATA *)sigdata)->name);
- tag[1][0] = "FORMAT";
- memcpy( ver_string, "DSMI AMF v", 10 );
- ver_string[10] = '0' + version / 10;
- ver_string[11] = '.';
- ver_string[12] = '0' + version % 10;
- ver_string[13] = 0;
- tag[1][1] = ver_string;
- return make_duh(-1, 2, (const char *const (*)[2])tag, 1, &descptr, &sigdata);
- }
+ tag[1][0] = "FORMAT";
+ memcpy(ver_string, "DSMI AMF v", 10);
+ ver_string[10] = '0' + version / 10;
+ ver_string[11] = '.';
+ ver_string[12] = '0' + version % 10;
+ ver_string[13] = 0;
+ tag[1][1] = ver_string;
+ return make_duh(-1, 2, (const char *const(*)[2])tag, 1, &descptr,
+ &sigdata);
+ }
}
--- a/src/it/readamf2.c
+++ b/src/it/readamf2.c
@@ -19,11 +19,8 @@
#include "dumb.h"
-
-
-DUH *dumb_read_amf(DUMBFILE *f)
-{
- DUH *duh = dumb_read_amf_quick(f);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+DUH *dumb_read_amf(DUMBFILE *f) {
+ DUH *duh = dumb_read_amf_quick(f);
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/readany.c
+++ b/src/it/readany.c
@@ -23,109 +23,80 @@
#include "dumb.h"
#ifdef _MSC_VER
- #define strnicmp _strnicmp
+#define strnicmp _strnicmp
#else
- #if defined(unix) || defined(__unix__) || defined(__unix)
- #include <strings.h>
- #endif
- #define strnicmp strncasecmp
+#if defined(unix) || defined(__unix__) || defined(__unix)
+#include <strings.h>
#endif
+#define strnicmp strncasecmp
+#endif
enum { maximum_signature_size = 0x30 };
-DUH *dumb_read_any_quick(DUMBFILE *f, int restrict_, int subsong)
-{
- unsigned char signature[ maximum_signature_size ];
+DUH *dumb_read_any_quick(DUMBFILE *f, int restrict_, int subsong) {
+ unsigned char signature[maximum_signature_size];
unsigned long signature_size;
- DUH * duh = NULL;
+ DUH *duh = NULL;
/* signature_size = dumbfile_get_size(f); */
- signature_size = dumbfile_getnc( (char *)signature, maximum_signature_size, f );
- dumbfile_seek( f, 0, DFS_SEEK_SET );
+ signature_size =
+ dumbfile_getnc((char *)signature, maximum_signature_size, f);
+ dumbfile_seek(f, 0, DFS_SEEK_SET);
- if (signature_size >= 4 &&
- signature[0] == 'I' && signature[1] == 'M' &&
- signature[2] == 'P' && signature[3] == 'M')
- {
- duh = dumb_read_it_quick( f );
- }
- else if (signature_size >= 17 && !memcmp(signature, "Extended Module: ", 17))
- {
- duh = dumb_read_xm_quick( f );
- }
- else if (signature_size >= 0x30 &&
- signature[0x2C] == 'S' && signature[0x2D] == 'C' &&
- signature[0x2E] == 'R' && signature[0x2F] == 'M')
- {
- duh = dumb_read_s3m_quick( f );
- }
- else if (signature_size >= 30 &&
- /*signature[28] == 0x1A &&*/ signature[29] == 2 &&
- ( ! strnicmp( ( const char * ) signature + 20, "!Scream!", 8 ) ||
- ! strnicmp( ( const char * ) signature + 20, "BMOD2STM", 8 ) ||
- ! strnicmp( ( const char * ) signature + 20, "WUZAMOD!", 8 ) ) )
- {
- duh = dumb_read_stm_quick( f );
- }
- else if (signature_size >= 2 &&
- ((signature[0] == 0x69 && signature[1] == 0x66) ||
- (signature[0] == 0x4A && signature[1] == 0x4E)))
- {
- duh = dumb_read_669_quick( f );
- }
- else if (signature_size >= 0x30 &&
- signature[0x2C] == 'P' && signature[0x2D] == 'T' &&
- signature[0x2E] == 'M' && signature[0x2F] == 'F')
- {
- duh = dumb_read_ptm_quick( f );
- }
- else if (signature_size >= 4 &&
- signature[0] == 'P' && signature[1] == 'S' &&
- signature[2] == 'M' && signature[3] == ' ')
- {
- duh = dumb_read_psm_quick( f, subsong );
- }
- else if (signature_size >= 4 &&
- signature[0] == 'P' && signature[1] == 'S' &&
- signature[2] == 'M' && signature[3] == 254)
- {
- duh = dumb_read_old_psm_quick( f );
- }
- else if (signature_size >= 3 &&
- signature[0] == 'M' && signature[1] == 'T' &&
- signature[2] == 'M')
- {
- duh = dumb_read_mtm_quick( f );
+ if (signature_size >= 4 && signature[0] == 'I' && signature[1] == 'M' &&
+ signature[2] == 'P' && signature[3] == 'M') {
+ duh = dumb_read_it_quick(f);
+ } else if (signature_size >= 17 &&
+ !memcmp(signature, "Extended Module: ", 17)) {
+ duh = dumb_read_xm_quick(f);
+ } else if (signature_size >= 0x30 && signature[0x2C] == 'S' &&
+ signature[0x2D] == 'C' && signature[0x2E] == 'R' &&
+ signature[0x2F] == 'M') {
+ duh = dumb_read_s3m_quick(f);
+ } else if (signature_size >= 30 &&
+ /*signature[28] == 0x1A &&*/ signature[29] == 2 &&
+ (!strnicmp((const char *)signature + 20, "!Scream!", 8) ||
+ !strnicmp((const char *)signature + 20, "BMOD2STM", 8) ||
+ !strnicmp((const char *)signature + 20, "WUZAMOD!", 8))) {
+ duh = dumb_read_stm_quick(f);
+ } else if (signature_size >= 2 &&
+ ((signature[0] == 0x69 && signature[1] == 0x66) ||
+ (signature[0] == 0x4A && signature[1] == 0x4E))) {
+ duh = dumb_read_669_quick(f);
+ } else if (signature_size >= 0x30 && signature[0x2C] == 'P' &&
+ signature[0x2D] == 'T' && signature[0x2E] == 'M' &&
+ signature[0x2F] == 'F') {
+ duh = dumb_read_ptm_quick(f);
+ } else if (signature_size >= 4 && signature[0] == 'P' &&
+ signature[1] == 'S' && signature[2] == 'M' &&
+ signature[3] == ' ') {
+ duh = dumb_read_psm_quick(f, subsong);
+ } else if (signature_size >= 4 && signature[0] == 'P' &&
+ signature[1] == 'S' && signature[2] == 'M' &&
+ signature[3] == 254) {
+ duh = dumb_read_old_psm_quick(f);
+ } else if (signature_size >= 3 && signature[0] == 'M' &&
+ signature[1] == 'T' && signature[2] == 'M') {
+ duh = dumb_read_mtm_quick(f);
+ } else if (signature_size >= 4 && signature[0] == 'R' &&
+ signature[1] == 'I' && signature[2] == 'F' &&
+ signature[3] == 'F') {
+ duh = dumb_read_riff_quick(f);
+ } else if (signature_size >= 24 &&
+ !memcmp(signature, "ASYLUM Music Format", 19) &&
+ !memcmp(signature + 19, " V1.0", 5)) {
+ duh = dumb_read_asy_quick(f);
+ } else if (signature_size >= 3 && signature[0] == 'A' &&
+ signature[1] == 'M' && signature[2] == 'F') {
+ duh = dumb_read_amf_quick(f);
+ } else if (signature_size >= 8 && !memcmp(signature, "OKTASONG", 8)) {
+ duh = dumb_read_okt_quick(f);
}
- else if ( signature_size >= 4 &&
- signature[0] == 'R' && signature[1] == 'I' &&
- signature[2] == 'F' && signature[3] == 'F')
- {
- duh = dumb_read_riff_quick( f );
- }
- else if ( signature_size >= 24 &&
- !memcmp( signature, "ASYLUM Music Format", 19 ) &&
- !memcmp( signature + 19, " V1.0", 5 ) )
- {
- duh = dumb_read_asy_quick( f );
- }
- else if ( signature_size >= 3 &&
- signature[0] == 'A' && signature[1] == 'M' &&
- signature[2] == 'F')
- {
- duh = dumb_read_amf_quick( f );
- }
- else if ( signature_size >= 8 &&
- !memcmp( signature, "OKTASONG", 8 ) )
- {
- duh = dumb_read_okt_quick( f );
- }
- if ( !duh )
- {
- dumbfile_seek( f, 0, DFS_SEEK_SET );
- duh = dumb_read_mod_quick( f, restrict_ );
+ if (!duh) {
+ dumbfile_seek(f, 0, DFS_SEEK_SET);
+ duh = dumb_read_mod_quick(f, restrict_);
}
return duh;
--- a/src/it/readany2.c
+++ b/src/it/readany2.c
@@ -19,11 +19,8 @@
#include "dumb.h"
-
-
-DUH *dumb_read_any(DUMBFILE *f, int restrict_, int subsong)
-{
+DUH *dumb_read_any(DUMBFILE *f, int restrict_, int subsong) {
DUH *duh = dumb_read_any_quick(f, restrict_, subsong);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/readasy.c
+++ b/src/it/readasy.c
@@ -24,316 +24,318 @@
#include "dumb.h"
#include "internal/it.h"
+static int it_asy_read_pattern(IT_PATTERN *pattern, DUMBFILE *f,
+ unsigned char *buffer) {
+ int pos;
+ int channel;
+ int row;
+ IT_ENTRY *entry;
+ pattern->n_rows = 64;
-static int it_asy_read_pattern( IT_PATTERN *pattern, DUMBFILE *f, unsigned char *buffer )
-{
- int pos;
- int channel;
- int row;
- IT_ENTRY *entry;
+ if (dumbfile_getnc((char *)buffer, 64 * 8 * 4, f) != 64 * 8 * 4)
+ return -1;
- pattern->n_rows = 64;
+ /* compute number of entries */
+ pattern->n_entries = 64; /* Account for the row end markers */
+ pos = 0;
+ for (row = 0; row < 64; ++row) {
+ for (channel = 0; channel < 8; ++channel) {
+ if (buffer[pos + 0] | buffer[pos + 1] | buffer[pos + 2] |
+ buffer[pos + 3])
+ ++pattern->n_entries;
+ pos += 4;
+ }
+ }
- if ( dumbfile_getnc( (char *) buffer, 64 * 8 * 4, f ) != 64 * 8 * 4 )
- return -1;
+ pattern->entry = malloc(pattern->n_entries * sizeof(*pattern->entry));
+ if (!pattern->entry)
+ return -1;
- /* compute number of entries */
- pattern->n_entries = 64; /* Account for the row end markers */
- pos = 0;
- for ( row = 0; row < 64; ++row ) {
- for ( channel = 0; channel < 8; ++channel ) {
- if ( buffer[ pos + 0 ] | buffer[ pos + 1 ] | buffer[ pos + 2 ] | buffer[ pos + 3 ] )
- ++pattern->n_entries;
- pos += 4;
- }
- }
+ entry = pattern->entry;
+ pos = 0;
+ for (row = 0; row < 64; ++row) {
+ for (channel = 0; channel < 8; ++channel) {
+ if (buffer[pos + 0] | buffer[pos + 1] | buffer[pos + 2] |
+ buffer[pos + 3]) {
+ entry->channel = channel;
+ entry->mask = 0;
- pattern->entry = malloc( pattern->n_entries * sizeof( *pattern->entry ) );
- if ( !pattern->entry )
- return -1;
+ if (buffer[pos + 0] && buffer[pos + 0] < 96) {
+ entry->note = buffer[pos + 0];
+ entry->mask |= IT_ENTRY_NOTE;
+ }
- entry = pattern->entry;
- pos = 0;
- for ( row = 0; row < 64; ++row ) {
- for ( channel = 0; channel < 8; ++channel ) {
- if ( buffer[ pos + 0 ] | buffer[ pos + 1 ] | buffer[ pos + 2 ] | buffer[ pos + 3 ] ) {
- entry->channel = channel;
- entry->mask = 0;
+ if (buffer[pos + 1] && buffer[pos + 1] <= 64) {
+ entry->instrument = buffer[pos + 1];
+ entry->mask |= IT_ENTRY_INSTRUMENT;
+ }
- if ( buffer[ pos + 0 ] && buffer[ pos + 0 ] < 96 ) {
- entry->note = buffer[ pos + 0 ];
- entry->mask |= IT_ENTRY_NOTE;
- }
+ _dumb_it_xm_convert_effect(buffer[pos + 2], buffer[pos + 3],
+ entry, 1);
- if ( buffer[ pos + 1 ] && buffer[ pos + 1 ] <= 64 ) {
- entry->instrument = buffer[ pos + 1 ];
- entry->mask |= IT_ENTRY_INSTRUMENT;
- }
-
- _dumb_it_xm_convert_effect( buffer[ pos + 2 ], buffer[ pos + 3 ], entry, 1 );
-
// fixup
- switch ( entry->effect ) {
- case IT_SET_PANNING:
- entry->effectvalue <<= 1;
- break;
+ switch (entry->effect) {
+ case IT_SET_PANNING:
+ entry->effectvalue <<= 1;
+ break;
}
- if ( entry->mask ) ++entry;
- }
- pos += 4;
- }
- IT_SET_END_ROW( entry );
- ++entry;
- }
+ if (entry->mask)
+ ++entry;
+ }
+ pos += 4;
+ }
+ IT_SET_END_ROW(entry);
+ ++entry;
+ }
- pattern->n_entries = (int)(entry - pattern->entry);
+ pattern->n_entries = (int)(entry - pattern->entry);
- return 0;
+ return 0;
}
+static int it_asy_read_sample_header(IT_SAMPLE *sample, DUMBFILE *f) {
+ int finetune, key_offset;
+ /**
+ 21 22 Chars Sample 1 name. If the name is not a full
+ 22 chars in length, it will be null
+ terminated.
-static int it_asy_read_sample_header( IT_SAMPLE *sample, DUMBFILE *f )
-{
- int finetune, key_offset;
+ If
+ the sample name begins with a '#' character (ASCII $23 (35)) then this is
+ assumed not to be an instrument name, and is probably a message.
+ */
+ dumbfile_getnc((char *)sample->name, 22, f);
+ sample->name[22] = 0;
-/**
- 21 22 Chars Sample 1 name. If the name is not a full
- 22 chars in length, it will be null
- terminated.
+ sample->filename[0] = 0;
-If
-the sample name begins with a '#' character (ASCII $23 (35)) then this is
-assumed not to be an instrument name, and is probably a message.
-*/
- dumbfile_getnc( (char *) sample->name, 22, f );
- sample->name[22] = 0;
+ /** Each finetune step changes the note 1/8th of a semitone. */
+ finetune = (signed char)(dumbfile_getc(f) << 4) >> 4; /* signed nibble */
+ sample->default_volume =
+ dumbfile_getc(f); // Should we be setting global_volume to this instead?
+ sample->global_volume = 64;
+ if (sample->default_volume > 64)
+ sample->default_volume = 64;
+ key_offset = (signed char)dumbfile_getc(f); /* base key offset */
+ sample->length = dumbfile_igetl(f);
+ sample->loop_start = dumbfile_igetl(f);
+ sample->loop_end = sample->loop_start + dumbfile_igetl(f);
- sample->filename[0] = 0;
+ if (sample->length <= 0) {
+ sample->flags = 0;
+ return 0;
+ }
-/** Each finetune step changes the note 1/8th of a semitone. */
- finetune = ( signed char ) ( dumbfile_getc( f ) << 4 ) >> 4; /* signed nibble */
- sample->default_volume = dumbfile_getc( f ); // Should we be setting global_volume to this instead?
- sample->global_volume = 64;
- if ( sample->default_volume > 64 ) sample->default_volume = 64;
- key_offset = ( signed char ) dumbfile_getc( f ); /* base key offset */
- sample->length = dumbfile_igetl( f );
- sample->loop_start = dumbfile_igetl( f );
- sample->loop_end = sample->loop_start + dumbfile_igetl( f );
+ sample->flags = IT_SAMPLE_EXISTS;
- if ( sample->length <= 0 ) {
- sample->flags = 0;
- return 0;
- }
+ sample->default_pan = 0;
+ sample->C5_speed =
+ (int)(AMIGA_CLOCK / 214.0 *
+ pow(DUMB_SEMITONE_BASE, key_offset)); //( long )( 16726.0 * pow(
+ // DUMB_PITCH_BASE, finetune
+ //* 32 ) );
+ sample->finetune = finetune * 32;
+ // the above line might be wrong
- sample->flags = IT_SAMPLE_EXISTS;
+ if ((sample->loop_end - sample->loop_start > 2) &&
+ (sample->loop_end <= sample->length))
+ sample->flags |= IT_SAMPLE_LOOP;
- sample->default_pan = 0;
- sample->C5_speed = (int)( AMIGA_CLOCK / 214.0 * pow( DUMB_SEMITONE_BASE, key_offset ) );//( long )( 16726.0 * pow( DUMB_PITCH_BASE, finetune * 32 ) );
- sample->finetune = finetune * 32;
- // the above line might be wrong
+ sample->vibrato_speed = 0;
+ sample->vibrato_depth = 0;
+ sample->vibrato_rate = 0;
+ sample->vibrato_waveform = 0; // do we have to set _all_ these?
+ sample->max_resampling_quality = -1;
- if ( ( sample->loop_end - sample->loop_start > 2 ) && ( sample->loop_end <= sample->length ) )
- sample->flags |= IT_SAMPLE_LOOP;
-
- sample->vibrato_speed = 0;
- sample->vibrato_depth = 0;
- sample->vibrato_rate = 0;
- sample->vibrato_waveform = 0; // do we have to set _all_ these?
- sample->max_resampling_quality = -1;
-
- return dumbfile_error(f);
+ return dumbfile_error(f);
}
+static int it_asy_read_sample_data(IT_SAMPLE *sample, DUMBFILE *f) {
+ long truncated_size;
+ /* let's get rid of the sample data coming after the end of the loop */
+ if ((sample->flags & IT_SAMPLE_LOOP) && sample->loop_end < sample->length) {
+ truncated_size = sample->length - sample->loop_end;
+ sample->length = sample->loop_end;
+ } else {
+ truncated_size = 0;
+ }
-static int it_asy_read_sample_data( IT_SAMPLE *sample, DUMBFILE *f )
-{
- long truncated_size;
+ sample->data = malloc(sample->length);
- /* let's get rid of the sample data coming after the end of the loop */
- if ( ( sample->flags & IT_SAMPLE_LOOP ) && sample->loop_end < sample->length ) {
- truncated_size = sample->length - sample->loop_end;
- sample->length = sample->loop_end;
- } else {
- truncated_size = 0;
- }
+ if (!sample->data)
+ return -1;
- sample->data = malloc( sample->length );
+ if (sample->length)
+ dumbfile_getnc(sample->data, sample->length, f);
- if ( !sample->data )
- return -1;
+ dumbfile_skip(f, truncated_size);
- if ( sample->length )
- dumbfile_getnc( sample->data, sample->length, f );
-
- dumbfile_skip( f, truncated_size );
-
- return dumbfile_error( f );
+ return dumbfile_error(f);
}
+static DUMB_IT_SIGDATA *it_asy_load_sigdata(DUMBFILE *f) {
+ DUMB_IT_SIGDATA *sigdata;
+ int i;
+ static const char sig_part[] = "ASYLUM Music Format";
+ static const char sig_rest[] =
+ " V1.0"; /* whee, string space optimization with format type below */
-static DUMB_IT_SIGDATA *it_asy_load_sigdata(DUMBFILE *f)
-{
- DUMB_IT_SIGDATA *sigdata;
- int i;
+ char signature[32];
- static const char sig_part[] = "ASYLUM Music Format";
- static const char sig_rest[] = " V1.0"; /* whee, string space optimization with format type below */
+ if (dumbfile_getnc(signature, 32, f) != 32 ||
+ memcmp(signature, sig_part, 19) ||
+ memcmp(signature + 19, sig_rest, 5)) {
+ return NULL;
+ }
- char signature [32];
+ sigdata = malloc(sizeof(*sigdata));
+ if (!sigdata) {
+ return NULL;
+ }
- if ( dumbfile_getnc( signature, 32, f ) != 32 ||
- memcmp( signature, sig_part, 19 ) ||
- memcmp( signature + 19, sig_rest, 5 ) ) {
- return NULL;
- }
+ sigdata->speed = dumbfile_getc(f); /* XXX seems to fit the files I have */
+ sigdata->tempo = dumbfile_getc(f); /* ditto */
+ sigdata->n_samples = dumbfile_getc(f); /* ditto */
+ sigdata->n_patterns = dumbfile_getc(f);
+ sigdata->n_orders = dumbfile_getc(f);
+ sigdata->restart_position = dumbfile_getc(f);
- sigdata = malloc(sizeof(*sigdata));
- if (!sigdata) {
- return NULL;
- }
+ if (dumbfile_error(f) || !sigdata->n_samples || sigdata->n_samples > 64 ||
+ !sigdata->n_patterns || !sigdata->n_orders) {
+ free(sigdata);
+ return NULL;
+ }
- sigdata->speed = dumbfile_getc( f ); /* XXX seems to fit the files I have */
- sigdata->tempo = dumbfile_getc( f ); /* ditto */
- sigdata->n_samples = dumbfile_getc( f ); /* ditto */
- sigdata->n_patterns = dumbfile_getc( f );
- sigdata->n_orders = dumbfile_getc( f );
- sigdata->restart_position = dumbfile_getc( f );
+ if (sigdata->restart_position > sigdata->n_orders) /* XXX */
+ sigdata->restart_position = 0;
- if ( dumbfile_error( f ) || !sigdata->n_samples || sigdata->n_samples > 64 || !sigdata->n_patterns ||
- !sigdata->n_orders ) {
- free( sigdata );
- return NULL;
- }
+ sigdata->order = malloc(sigdata->n_orders);
+ if (!sigdata->order) {
+ free(sigdata);
+ return NULL;
+ }
- if ( sigdata->restart_position > sigdata->n_orders ) /* XXX */
- sigdata->restart_position = 0;
+ if (dumbfile_getnc((char *)sigdata->order, sigdata->n_orders, f) !=
+ sigdata->n_orders ||
+ dumbfile_skip(f, 256 - sigdata->n_orders)) {
+ free(sigdata->order);
+ free(sigdata);
+ return NULL;
+ }
- sigdata->order = malloc( sigdata->n_orders );
- if ( !sigdata->order ) {
- free( sigdata );
- return NULL;
- }
+ sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
+ if (!sigdata->sample) {
+ free(sigdata->order);
+ free(sigdata);
+ return NULL;
+ }
- if ( dumbfile_getnc( (char *) sigdata->order, sigdata->n_orders, f ) != sigdata->n_orders ||
- dumbfile_skip( f, 256 - sigdata->n_orders ) ) {
- free( sigdata->order );
- free( sigdata );
- return NULL;
- }
+ sigdata->song_message = NULL;
+ sigdata->instrument = NULL;
+ sigdata->pattern = NULL;
+ sigdata->midi = NULL;
+ sigdata->checkpoint = NULL;
- sigdata->sample = malloc( sigdata->n_samples * sizeof( *sigdata->sample ) );
- if ( !sigdata->sample ) {
- free( sigdata->order );
- free( sigdata );
- return NULL;
- }
+ sigdata->n_instruments = 0;
- sigdata->song_message = NULL;
- sigdata->instrument = NULL;
- sigdata->pattern = NULL;
- sigdata->midi = NULL;
- sigdata->checkpoint = NULL;
+ for (i = 0; i < sigdata->n_samples; ++i)
+ sigdata->sample[i].data = NULL;
- sigdata->n_instruments = 0;
+ for (i = 0; i < sigdata->n_samples; ++i) {
+ if (it_asy_read_sample_header(&sigdata->sample[i], f)) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ }
- for ( i = 0; i < sigdata->n_samples; ++i )
- sigdata->sample[i].data = NULL;
+ if (dumbfile_skip(f, 37 * (64 - sigdata->n_samples))) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- for ( i = 0; i < sigdata->n_samples; ++i ) {
- if ( it_asy_read_sample_header( &sigdata->sample[i], f ) ) {
- _dumb_it_unload_sigdata( sigdata );
- return NULL;
- }
- }
+ sigdata->pattern = malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
+ if (!sigdata->pattern) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (i = 0; i < sigdata->n_patterns; ++i)
+ sigdata->pattern[i].entry = NULL;
- if ( dumbfile_skip( f, 37 * ( 64 - sigdata->n_samples ) ) ) {
- _dumb_it_unload_sigdata( sigdata );
- return NULL;
- }
+ /* Read in the patterns */
+ {
+ unsigned char *buffer =
+ malloc(64 * 8 * 4); /* 64 rows * 8 channels * 4 bytes */
+ if (!buffer) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (i = 0; i < sigdata->n_patterns; ++i) {
+ if (it_asy_read_pattern(&sigdata->pattern[i], f, buffer) != 0) {
+ free(buffer);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ }
+ free(buffer);
+ }
- sigdata->pattern = malloc( sigdata->n_patterns * sizeof( *sigdata->pattern ) );
- if ( !sigdata->pattern ) {
- _dumb_it_unload_sigdata( sigdata );
- return NULL;
- }
- for (i = 0; i < sigdata->n_patterns; ++i)
- sigdata->pattern[i].entry = NULL;
+ /* And finally, the sample data */
+ for (i = 0; i < sigdata->n_samples; ++i) {
+ if (it_asy_read_sample_data(&sigdata->sample[i], f)) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ }
- /* Read in the patterns */
- {
- unsigned char *buffer = malloc( 64 * 8 * 4 ); /* 64 rows * 8 channels * 4 bytes */
- if ( !buffer ) {
- _dumb_it_unload_sigdata( sigdata );
- return NULL;
- }
- for ( i = 0; i < sigdata->n_patterns; ++i ) {
- if ( it_asy_read_pattern( &sigdata->pattern[i], f, buffer ) != 0 ) {
- free( buffer );
- _dumb_it_unload_sigdata( sigdata );
- return NULL;
- }
- }
- free( buffer );
- }
+ /* Now let's initialise the remaining variables, and we're done! */
+ sigdata->flags = IT_WAS_AN_XM | IT_WAS_A_MOD | IT_OLD_EFFECTS |
+ IT_COMPATIBLE_GXX | IT_STEREO;
- /* And finally, the sample data */
- for ( i = 0; i < sigdata->n_samples; ++i ) {
- if ( it_asy_read_sample_data( &sigdata->sample[i], f ) ) {
- _dumb_it_unload_sigdata( sigdata );
- return NULL;
- }
- }
+ sigdata->global_volume = 128;
+ sigdata->mixing_volume = 48;
+ sigdata->pan_separation = 128;
- /* Now let's initialise the remaining variables, and we're done! */
- sigdata->flags = IT_WAS_AN_XM | IT_WAS_A_MOD | IT_OLD_EFFECTS | IT_COMPATIBLE_GXX | IT_STEREO;
+ sigdata->n_pchannels = 8;
- sigdata->global_volume = 128;
- sigdata->mixing_volume = 48;
- sigdata->pan_separation = 128;
+ sigdata->name[0] = 0;
- sigdata->n_pchannels = 8;
+ memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
- sigdata->name[0] = 0;
+ for (i = 0; i < DUMB_IT_N_CHANNELS; i += 4) {
+ int sep = 32 * dumb_it_default_panning_separation / 100;
+ sigdata->channel_pan[i + 0] = 32 - sep;
+ sigdata->channel_pan[i + 1] = 32 + sep;
+ sigdata->channel_pan[i + 2] = 32 + sep;
+ sigdata->channel_pan[i + 3] = 32 - sep;
+ }
- memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
+ _dumb_it_fix_invalid_orders(sigdata);
- for (i = 0; i < DUMB_IT_N_CHANNELS; i += 4) {
- int sep = 32 * dumb_it_default_panning_separation / 100;
- sigdata->channel_pan[i+0] = 32 - sep;
- sigdata->channel_pan[i+1] = 32 + sep;
- sigdata->channel_pan[i+2] = 32 + sep;
- sigdata->channel_pan[i+3] = 32 - sep;
- }
-
- _dumb_it_fix_invalid_orders(sigdata);
-
- return sigdata;
+ return sigdata;
}
+DUH *dumb_read_asy_quick(DUMBFILE *f) {
+ sigdata_t *sigdata;
+ DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
-DUH *dumb_read_asy_quick(DUMBFILE *f)
-{
- sigdata_t *sigdata;
+ sigdata = it_asy_load_sigdata(f);
- DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
+ if (!sigdata)
+ return NULL;
- sigdata = it_asy_load_sigdata(f);
-
- if (!sigdata)
- return NULL;
-
- {
- const char *tag[2][2];
- tag[0][0] = "TITLE";
+ {
+ const char *tag[2][2];
+ tag[0][0] = "TITLE";
tag[0][1] = (const char *)(((DUMB_IT_SIGDATA *)sigdata)->name);
- tag[1][0] = "FORMAT";
- tag[1][1] = "ASYLUM Music Format";
- return make_duh(-1, 2, (const char *const (*)[2])tag, 1, &descptr, &sigdata);
- }
+ tag[1][0] = "FORMAT";
+ tag[1][1] = "ASYLUM Music Format";
+ return make_duh(-1, 2, (const char *const(*)[2])tag, 1, &descptr,
+ &sigdata);
+ }
}
--- a/src/it/readdsmf.c
+++ b/src/it/readdsmf.c
@@ -24,360 +24,367 @@
#include "internal/it.h"
#include "internal/riff.h"
-static int it_riff_dsmf_process_sample( IT_SAMPLE * sample, DUMBFILE * f, int len )
-{
- int flags;
+static int it_riff_dsmf_process_sample(IT_SAMPLE *sample, DUMBFILE *f,
+ int len) {
+ int flags;
- dumbfile_getnc( (char *) sample->filename, 13, f );
- sample->filename[ 14 ] = 0;
-
- flags = dumbfile_igetw( f );
- sample->default_volume = dumbfile_getc( f );
- sample->length = dumbfile_igetl( f );
- sample->loop_start = dumbfile_igetl( f );
- sample->loop_end = dumbfile_igetl( f );
- dumbfile_skip( f, 32 - 28 );
- sample->C5_speed = dumbfile_igetw( f ) * 2;
- dumbfile_skip( f, 36 - 34 );
- dumbfile_getnc( (char *) sample->name, 28, f );
- sample->name[ 28 ] = 0;
+ dumbfile_getnc((char *)sample->filename, 13, f);
+ sample->filename[14] = 0;
- /*if ( data[ 0x38 ] || data[ 0x39 ] || data[ 0x3A ] || data[ 0x3B ] )
- return -1;*/
+ flags = dumbfile_igetw(f);
+ sample->default_volume = dumbfile_getc(f);
+ sample->length = dumbfile_igetl(f);
+ sample->loop_start = dumbfile_igetl(f);
+ sample->loop_end = dumbfile_igetl(f);
+ dumbfile_skip(f, 32 - 28);
+ sample->C5_speed = dumbfile_igetw(f) * 2;
+ dumbfile_skip(f, 36 - 34);
+ dumbfile_getnc((char *)sample->name, 28, f);
+ sample->name[28] = 0;
- if ( ! sample->length ) {
- sample->flags &= ~IT_SAMPLE_EXISTS;
- return 0;
- }
+ /*if ( data[ 0x38 ] || data[ 0x39 ] || data[ 0x3A ] || data[ 0x3B ] )
+ return -1;*/
- /*if ( flags & ~( 2 | 1 ) )
- return -1;*/
+ if (!sample->length) {
+ sample->flags &= ~IT_SAMPLE_EXISTS;
+ return 0;
+ }
- if ( sample->length + 64 > len )
- return -1;
+ /*if ( flags & ~( 2 | 1 ) )
+ return -1;*/
- sample->flags = IT_SAMPLE_EXISTS;
+ if (sample->length + 64 > len)
+ return -1;
- sample->default_pan = 0;
- sample->global_volume = 64;
- sample->vibrato_speed = 0;
- sample->vibrato_depth = 0;
- sample->vibrato_rate = 0;
- sample->vibrato_waveform = IT_VIBRATO_SINE;
- sample->finetune = 0;
- sample->max_resampling_quality = -1;
+ sample->flags = IT_SAMPLE_EXISTS;
- if ( flags & 1 )
- {
- if (((unsigned int)sample->loop_end <= (unsigned int)sample->length) &&
- ((unsigned int)sample->loop_start < (unsigned int)sample->loop_end))
- {
- sample->length = sample->loop_end;
- sample->flags |= IT_SAMPLE_LOOP;
- if ( flags & 0x10 ) sample->flags |= IT_SAMPLE_PINGPONG_LOOP;
- }
- }
+ sample->default_pan = 0;
+ sample->global_volume = 64;
+ sample->vibrato_speed = 0;
+ sample->vibrato_depth = 0;
+ sample->vibrato_rate = 0;
+ sample->vibrato_waveform = IT_VIBRATO_SINE;
+ sample->finetune = 0;
+ sample->max_resampling_quality = -1;
- sample->data = malloc( sample->length );
- if ( ! sample->data )
- return -1;
+ if (flags & 1) {
+ if (((unsigned int)sample->loop_end <= (unsigned int)sample->length) &&
+ ((unsigned int)sample->loop_start <
+ (unsigned int)sample->loop_end)) {
+ sample->length = sample->loop_end;
+ sample->flags |= IT_SAMPLE_LOOP;
+ if (flags & 0x10)
+ sample->flags |= IT_SAMPLE_PINGPONG_LOOP;
+ }
+ }
- dumbfile_getnc( sample->data, sample->length, f );
+ sample->data = malloc(sample->length);
+ if (!sample->data)
+ return -1;
- if ( ! ( flags & 2 ) )
- {
- for ( flags = 0; flags < sample->length; ++flags )
- ( ( signed char * ) sample->data ) [ flags ] ^= 0x80;
- }
+ dumbfile_getnc(sample->data, sample->length, f);
- return 0;
+ if (!(flags & 2)) {
+ for (flags = 0; flags < sample->length; ++flags)
+ ((signed char *)sample->data)[flags] ^= 0x80;
+ }
+
+ return 0;
}
-static int it_riff_dsmf_process_pattern( IT_PATTERN * pattern, DUMBFILE * f, int len )
-{
+static int it_riff_dsmf_process_pattern(IT_PATTERN *pattern, DUMBFILE *f,
+ int len) {
int length, row;
- unsigned flags;
+ unsigned flags;
long start, end;
int p, q, r;
- IT_ENTRY * entry;
+ IT_ENTRY *entry;
- length = dumbfile_igetw( f );
- if ( length > len ) return -1;
+ length = dumbfile_igetw(f);
+ if (length > len)
+ return -1;
- len = length - 2;
+ len = length - 2;
- pattern->n_rows = 64;
- pattern->n_entries = 64;
+ pattern->n_rows = 64;
+ pattern->n_entries = 64;
- row = 0;
+ row = 0;
- start = dumbfile_pos( f );
+ start = dumbfile_pos(f);
end = start + len;
- while ( (row < 64) && !dumbfile_error( f ) && (dumbfile_pos( f ) < end) ) {
- p = dumbfile_getc( f );
- if ( ! p ) {
- ++ row;
- continue;
- }
+ while ((row < 64) && !dumbfile_error(f) && (dumbfile_pos(f) < end)) {
+ p = dumbfile_getc(f);
+ if (!p) {
+ ++row;
+ continue;
+ }
flags = p & 0xF0;
- if (flags) {
- ++ pattern->n_entries;
- if (flags & 0x80) dumbfile_skip( f, 1 );
- if (flags & 0x40) dumbfile_skip( f, 1 );
- if (flags & 0x20) dumbfile_skip( f, 1 );
- if (flags & 0x10) dumbfile_skip( f, 2 );
- }
- }
+ if (flags) {
+ ++pattern->n_entries;
+ if (flags & 0x80)
+ dumbfile_skip(f, 1);
+ if (flags & 0x40)
+ dumbfile_skip(f, 1);
+ if (flags & 0x20)
+ dumbfile_skip(f, 1);
+ if (flags & 0x10)
+ dumbfile_skip(f, 2);
+ }
+ }
- if ( pattern->n_entries == 64 ) return 0;
+ if (pattern->n_entries == 64)
+ return 0;
- pattern->entry = malloc( pattern->n_entries * sizeof( * pattern->entry ) );
- if ( ! pattern->entry ) return -1;
+ pattern->entry = malloc(pattern->n_entries * sizeof(*pattern->entry));
+ if (!pattern->entry)
+ return -1;
- entry = pattern->entry;
+ entry = pattern->entry;
- row = 0;
+ row = 0;
- if ( dumbfile_seek( f, start, DFS_SEEK_SET ) ) return -1;
+ if (dumbfile_seek(f, start, DFS_SEEK_SET))
+ return -1;
- while ( ( row < 64 ) && !dumbfile_error( f ) && ( dumbfile_pos( f ) < end ) )
- {
- p = dumbfile_getc( f );
- if ( ! p )
- {
- IT_SET_END_ROW( entry );
- ++ entry;
- ++ row;
- continue;
- }
+ while ((row < 64) && !dumbfile_error(f) && (dumbfile_pos(f) < end)) {
+ p = dumbfile_getc(f);
+ if (!p) {
+ IT_SET_END_ROW(entry);
+ ++entry;
+ ++row;
+ continue;
+ }
flags = p;
- entry->channel = flags & 0x0F;
- entry->mask = 0;
+ entry->channel = flags & 0x0F;
+ entry->mask = 0;
- if ( flags & 0xF0 )
- {
- if ( flags & 0x80 )
- {
- q = dumbfile_getc( f );
- if ( q )
- {
- entry->mask |= IT_ENTRY_NOTE;
+ if (flags & 0xF0) {
+ if (flags & 0x80) {
+ q = dumbfile_getc(f);
+ if (q) {
+ entry->mask |= IT_ENTRY_NOTE;
entry->note = q - 1;
- }
- }
+ }
+ }
- if ( flags & 0x40 )
- {
- q = dumbfile_getc( f );
- if ( q )
- {
- entry->mask |= IT_ENTRY_INSTRUMENT;
+ if (flags & 0x40) {
+ q = dumbfile_getc(f);
+ if (q) {
+ entry->mask |= IT_ENTRY_INSTRUMENT;
entry->instrument = q;
- }
- }
+ }
+ }
- if ( flags & 0x20 )
- {
- entry->mask |= IT_ENTRY_VOLPAN;
- entry->volpan = dumbfile_getc( f );
- }
+ if (flags & 0x20) {
+ entry->mask |= IT_ENTRY_VOLPAN;
+ entry->volpan = dumbfile_getc(f);
+ }
- if ( flags & 0x10 )
- {
- q = dumbfile_getc( f );
- r = dumbfile_getc( f );
- _dumb_it_xm_convert_effect( q, r, entry, 0 );
- }
+ if (flags & 0x10) {
+ q = dumbfile_getc(f);
+ r = dumbfile_getc(f);
+ _dumb_it_xm_convert_effect(q, r, entry, 0);
+ }
- if (entry->mask) entry++;
- }
- }
+ if (entry->mask)
+ entry++;
+ }
+ }
- while ( row < 64 )
- {
- IT_SET_END_ROW( entry );
- ++ entry;
- ++ row;
- }
+ while (row < 64) {
+ IT_SET_END_ROW(entry);
+ ++entry;
+ ++row;
+ }
- pattern->n_entries = (int)((long)entry - (long)pattern->entry);
- if ( ! pattern->n_entries ) return -1;
+ pattern->n_entries = (int)((long)entry - (long)pattern->entry);
+ if (!pattern->n_entries)
+ return -1;
- return 0;
+ return 0;
}
-static DUMB_IT_SIGDATA *it_riff_dsmf_load_sigdata( DUMBFILE * f, struct riff * stream )
-{
- DUMB_IT_SIGDATA *sigdata;
+static DUMB_IT_SIGDATA *it_riff_dsmf_load_sigdata(DUMBFILE *f,
+ struct riff *stream) {
+ DUMB_IT_SIGDATA *sigdata;
- int n, o, found;
+ int n, o, found;
- if ( ! stream ) goto error;
+ if (!stream)
+ goto error;
- if ( stream->type != DUMB_ID( 'D', 'S', 'M', 'F' ) ) goto error;
+ if (stream->type != DUMB_ID('D', 'S', 'M', 'F'))
+ goto error;
- sigdata = malloc(sizeof(*sigdata));
- if ( ! sigdata ) goto error;
+ sigdata = malloc(sizeof(*sigdata));
+ if (!sigdata)
+ goto error;
- sigdata->n_patterns = 0;
- sigdata->n_samples = 0;
- sigdata->name[0] = 0;
+ sigdata->n_patterns = 0;
+ sigdata->n_samples = 0;
+ sigdata->name[0] = 0;
- found = 0;
+ found = 0;
- for ( n = 0; (unsigned)n < stream->chunk_count; ++n )
- {
- struct riff_chunk * c = stream->chunks + n;
- switch( c->type )
- {
- case DUMB_ID( 'S' ,'O' ,'N' ,'G' ):
- /* initialization data */
- if ( ( found ) || ( c->size < 192 ) ) goto error_sd;
- found = 1;
- break;
+ for (n = 0; (unsigned)n < stream->chunk_count; ++n) {
+ struct riff_chunk *c = stream->chunks + n;
+ switch (c->type) {
+ case DUMB_ID('S', 'O', 'N', 'G'):
+ /* initialization data */
+ if ((found) || (c->size < 192))
+ goto error_sd;
+ found = 1;
+ break;
- case DUMB_ID( 'P', 'A', 'T', 'T' ):
- ++ sigdata->n_patterns;
- break;
+ case DUMB_ID('P', 'A', 'T', 'T'):
+ ++sigdata->n_patterns;
+ break;
- case DUMB_ID( 'I', 'N', 'S', 'T' ):
- ++ sigdata->n_samples;
- break;
- }
- }
+ case DUMB_ID('I', 'N', 'S', 'T'):
+ ++sigdata->n_samples;
+ break;
+ }
+ }
- if ( !found || !sigdata->n_samples || !sigdata->n_patterns ) goto error_sd;
+ if (!found || !sigdata->n_samples || !sigdata->n_patterns)
+ goto error_sd;
- if ( sigdata->n_samples > 255 || sigdata->n_patterns > 255 ) goto error_sd;
+ if (sigdata->n_samples > 255 || sigdata->n_patterns > 255)
+ goto error_sd;
- sigdata->song_message = NULL;
- sigdata->order = NULL;
- sigdata->instrument = NULL;
- sigdata->sample = NULL;
- sigdata->pattern = NULL;
- sigdata->midi = NULL;
- sigdata->checkpoint = NULL;
+ sigdata->song_message = NULL;
+ sigdata->order = NULL;
+ sigdata->instrument = NULL;
+ sigdata->sample = NULL;
+ sigdata->pattern = NULL;
+ sigdata->midi = NULL;
+ sigdata->checkpoint = NULL;
- sigdata->mixing_volume = 48;
- sigdata->pan_separation = 128;
+ sigdata->mixing_volume = 48;
+ sigdata->pan_separation = 128;
- sigdata->n_instruments = 0;
- sigdata->n_orders = 0;
- sigdata->restart_position = 0;
+ sigdata->n_instruments = 0;
+ sigdata->n_orders = 0;
+ sigdata->restart_position = 0;
- memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
+ memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
- for (n = 0; n < DUMB_IT_N_CHANNELS; n += 4) {
- int sep = 32 * dumb_it_default_panning_separation / 100;
- sigdata->channel_pan[n ] = 32 - sep;
- sigdata->channel_pan[n+1] = 32 + sep;
- sigdata->channel_pan[n+2] = 32 + sep;
- sigdata->channel_pan[n+3] = 32 - sep;
- }
+ for (n = 0; n < DUMB_IT_N_CHANNELS; n += 4) {
+ int sep = 32 * dumb_it_default_panning_separation / 100;
+ sigdata->channel_pan[n] = 32 - sep;
+ sigdata->channel_pan[n + 1] = 32 + sep;
+ sigdata->channel_pan[n + 2] = 32 + sep;
+ sigdata->channel_pan[n + 3] = 32 - sep;
+ }
- for ( n = 0; (unsigned)n < stream->chunk_count; ++n )
- {
- struct riff_chunk * c = stream->chunks + n;
- switch ( c->type )
- {
- case DUMB_ID( 'S', 'O', 'N', 'G' ):
- if ( dumbfile_seek( f, c->offset, DFS_SEEK_SET ) ) goto error_usd;
- dumbfile_getnc( (char *) sigdata->name, 28, f );
- sigdata->name[ 28 ] = 0;
- sigdata->flags = IT_STEREO | IT_OLD_EFFECTS | IT_COMPATIBLE_GXX;
- dumbfile_skip( f, 36 - 28 );
- sigdata->n_orders = dumbfile_igetw( f );
- //sigdata->n_samples = ptr[ 38 ] | ( ptr[ 39 ] << 8 ); // whatever
- //sigdata->n_patterns = ptr[ 40 ] | ( ptr[ 41 ] << 8 );
- dumbfile_skip( f, 42 - 38 );
- sigdata->n_pchannels = dumbfile_igetw( f );
- sigdata->global_volume = dumbfile_getc( f );
- sigdata->mixing_volume = dumbfile_getc( f );
- sigdata->speed = dumbfile_getc( f );
- sigdata->tempo = dumbfile_getc( f );
+ for (n = 0; (unsigned)n < stream->chunk_count; ++n) {
+ struct riff_chunk *c = stream->chunks + n;
+ switch (c->type) {
+ case DUMB_ID('S', 'O', 'N', 'G'):
+ if (dumbfile_seek(f, c->offset, DFS_SEEK_SET))
+ goto error_usd;
+ dumbfile_getnc((char *)sigdata->name, 28, f);
+ sigdata->name[28] = 0;
+ sigdata->flags = IT_STEREO | IT_OLD_EFFECTS | IT_COMPATIBLE_GXX;
+ dumbfile_skip(f, 36 - 28);
+ sigdata->n_orders = dumbfile_igetw(f);
+ // sigdata->n_samples = ptr[ 38 ] | ( ptr[ 39 ] << 8 ); // whatever
+ // sigdata->n_patterns = ptr[ 40 ] | ( ptr[ 41 ] << 8 );
+ dumbfile_skip(f, 42 - 38);
+ sigdata->n_pchannels = dumbfile_igetw(f);
+ sigdata->global_volume = dumbfile_getc(f);
+ sigdata->mixing_volume = dumbfile_getc(f);
+ sigdata->speed = dumbfile_getc(f);
+ sigdata->tempo = dumbfile_getc(f);
- for ( o = 0; o < 16; ++o )
- {
- sigdata->channel_pan[ o ] = dumbfile_getc( f ) / 2;
- }
+ for (o = 0; o < 16; ++o) {
+ sigdata->channel_pan[o] = dumbfile_getc(f) / 2;
+ }
- sigdata->order = malloc( 128 );
- if ( ! sigdata->order ) goto error_usd;
- dumbfile_getnc( (char *) sigdata->order, 128, f );
+ sigdata->order = malloc(128);
+ if (!sigdata->order)
+ goto error_usd;
+ dumbfile_getnc((char *)sigdata->order, 128, f);
- break;
- }
- }
+ break;
+ }
+ }
- sigdata->pattern = malloc( sigdata->n_patterns * sizeof( *sigdata->pattern ) );
- if ( ! sigdata->pattern ) goto error_usd;
- for ( n = 0; n < sigdata->n_patterns; ++n )
- sigdata->pattern[ n ].entry = NULL;
+ sigdata->pattern = malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
+ if (!sigdata->pattern)
+ goto error_usd;
+ for (n = 0; n < sigdata->n_patterns; ++n)
+ sigdata->pattern[n].entry = NULL;
- sigdata->sample = malloc( sigdata->n_samples * sizeof( *sigdata->sample ) );
- if ( ! sigdata->sample ) goto error_usd;
- for ( n = 0; n < sigdata->n_samples; ++n )
- {
- IT_SAMPLE * sample = sigdata->sample + n;
- sample->data = NULL;
- }
+ sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
+ if (!sigdata->sample)
+ goto error_usd;
+ for (n = 0; n < sigdata->n_samples; ++n) {
+ IT_SAMPLE *sample = sigdata->sample + n;
+ sample->data = NULL;
+ }
- sigdata->n_samples = 0;
- sigdata->n_patterns = 0;
+ sigdata->n_samples = 0;
+ sigdata->n_patterns = 0;
- for ( n = 0; (unsigned)n < stream->chunk_count; ++n )
- {
- struct riff_chunk * c = stream->chunks + n;
- switch ( c->type )
- {
- case DUMB_ID( 'P', 'A', 'T', 'T' ):
- if ( dumbfile_seek( f, c->offset, DFS_SEEK_SET ) ) goto error_usd;
- if ( it_riff_dsmf_process_pattern( sigdata->pattern + sigdata->n_patterns, f, c->size ) ) goto error_usd;
- ++ sigdata->n_patterns;
- break;
+ for (n = 0; (unsigned)n < stream->chunk_count; ++n) {
+ struct riff_chunk *c = stream->chunks + n;
+ switch (c->type) {
+ case DUMB_ID('P', 'A', 'T', 'T'):
+ if (dumbfile_seek(f, c->offset, DFS_SEEK_SET))
+ goto error_usd;
+ if (it_riff_dsmf_process_pattern(
+ sigdata->pattern + sigdata->n_patterns, f, c->size))
+ goto error_usd;
+ ++sigdata->n_patterns;
+ break;
- case DUMB_ID( 'I', 'N', 'S', 'T' ):
- if ( dumbfile_seek( f, c->offset, DFS_SEEK_SET ) ) goto error_usd;
- if ( it_riff_dsmf_process_sample( sigdata->sample + sigdata->n_samples, f, c->size ) ) goto error_usd;
- ++ sigdata->n_samples;
- break;
- }
- }
+ case DUMB_ID('I', 'N', 'S', 'T'):
+ if (dumbfile_seek(f, c->offset, DFS_SEEK_SET))
+ goto error_usd;
+ if (it_riff_dsmf_process_sample(
+ sigdata->sample + sigdata->n_samples, f, c->size))
+ goto error_usd;
+ ++sigdata->n_samples;
+ break;
+ }
+ }
- _dumb_it_fix_invalid_orders( sigdata );
+ _dumb_it_fix_invalid_orders(sigdata);
- return sigdata;
+ return sigdata;
error_usd:
- _dumb_it_unload_sigdata( sigdata );
- goto error;
+ _dumb_it_unload_sigdata(sigdata);
+ goto error;
error_sd:
- free( sigdata );
+ free(sigdata);
error:
- return NULL;
+ return NULL;
}
-DUH *dumb_read_riff_dsmf( DUMBFILE * f, struct riff * stream )
-{
- sigdata_t *sigdata;
+DUH *dumb_read_riff_dsmf(DUMBFILE *f, struct riff *stream) {
+ sigdata_t *sigdata;
- DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
+ DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
- sigdata = it_riff_dsmf_load_sigdata( f, stream );
+ sigdata = it_riff_dsmf_load_sigdata(f, stream);
- if (!sigdata)
- return NULL;
+ if (!sigdata)
+ return NULL;
- {
- const char *tag[2][2];
- tag[0][0] = "TITLE";
+ {
+ const char *tag[2][2];
+ tag[0][0] = "TITLE";
tag[0][1] = (const char *)(((DUMB_IT_SIGDATA *)sigdata)->name);
- tag[1][0] = "FORMAT";
- tag[1][1] = "RIFF DSMF";
- return make_duh( -1, 2, ( const char * const (*) [ 2 ] ) tag, 1, & descptr, & sigdata );
- }
+ tag[1][0] = "FORMAT";
+ tag[1][1] = "RIFF DSMF";
+ return make_duh(-1, 2, (const char *const(*)[2])tag, 1, &descptr,
+ &sigdata);
+ }
}
--- a/src/it/readmod.c
+++ b/src/it/readmod.c
@@ -25,456 +25,454 @@
#include "internal/dumb.h"
#include "internal/it.h"
+static int it_mod_read_pattern(IT_PATTERN *pattern, DUMBFILE *f, int n_channels,
+ unsigned char *buffer) {
+ int pos;
+ int channel;
+ int row;
+ IT_ENTRY *entry;
+ pattern->n_rows = 64;
-static int it_mod_read_pattern(IT_PATTERN *pattern, DUMBFILE *f, int n_channels, unsigned char *buffer)
-{
- int pos;
- int channel;
- int row;
- IT_ENTRY *entry;
+ if (n_channels == 0) {
+ /* Read the first four channels, leaving gaps for the rest. */
+ for (pos = 0; pos < 64 * 8 * 4; pos += 8 * 4)
+ dumbfile_getnc((char *)buffer + pos, 4 * 4, f);
+ /* Read the other channels into the gaps we left. */
+ for (pos = 4 * 4; pos < 64 * 8 * 4; pos += 8 * 4)
+ dumbfile_getnc((char *)buffer + pos, 4 * 4, f);
- pattern->n_rows = 64;
-
- if (n_channels == 0) {
- /* Read the first four channels, leaving gaps for the rest. */
- for (pos = 0; pos < 64*8*4; pos += 8*4)
- dumbfile_getnc((char *)buffer + pos, 4*4, f);
- /* Read the other channels into the gaps we left. */
- for (pos = 4*4; pos < 64*8*4; pos += 8*4)
- dumbfile_getnc((char *)buffer + pos, 4*4, f);
-
- n_channels = 8;
- } else
+ n_channels = 8;
+ } else
dumbfile_getnc((char *)buffer, 64 * n_channels * 4, f);
- if (dumbfile_error(f))
- return -1;
+ if (dumbfile_error(f))
+ return -1;
- /* compute number of entries */
- pattern->n_entries = 64; /* Account for the row end markers */
- pos = 0;
- for (row = 0; row < 64; row++) {
- for (channel = 0; channel < n_channels; channel++) {
- if (buffer[pos+0] | buffer[pos+1] | buffer[pos+2] | buffer[pos+3])
- pattern->n_entries++;
- pos += 4;
- }
- }
+ /* compute number of entries */
+ pattern->n_entries = 64; /* Account for the row end markers */
+ pos = 0;
+ for (row = 0; row < 64; row++) {
+ for (channel = 0; channel < n_channels; channel++) {
+ if (buffer[pos + 0] | buffer[pos + 1] | buffer[pos + 2] |
+ buffer[pos + 3])
+ pattern->n_entries++;
+ pos += 4;
+ }
+ }
- pattern->entry = malloc(pattern->n_entries * sizeof(*pattern->entry));
- if (!pattern->entry)
- return -1;
+ pattern->entry = malloc(pattern->n_entries * sizeof(*pattern->entry));
+ if (!pattern->entry)
+ return -1;
- entry = pattern->entry;
- pos = 0;
- for (row = 0; row < 64; row++) {
- for (channel = 0; channel < n_channels; channel++) {
- if (buffer[pos+0] | buffer[pos+1] | buffer[pos+2] | buffer[pos+3]) {
- unsigned char sample = (buffer[pos+0] & 0xF0) | (buffer[pos+2] >> 4);
- int period = ((int)(buffer[pos+0] & 0x0F) << 8) | buffer[pos+1];
+ entry = pattern->entry;
+ pos = 0;
+ for (row = 0; row < 64; row++) {
+ for (channel = 0; channel < n_channels; channel++) {
+ if (buffer[pos + 0] | buffer[pos + 1] | buffer[pos + 2] |
+ buffer[pos + 3]) {
+ unsigned char sample =
+ (buffer[pos + 0] & 0xF0) | (buffer[pos + 2] >> 4);
+ int period =
+ ((int)(buffer[pos + 0] & 0x0F) << 8) | buffer[pos + 1];
- entry->channel = channel;
- entry->mask = 0;
+ entry->channel = channel;
+ entry->mask = 0;
- if (period) {
- int note;
- entry->mask |= IT_ENTRY_NOTE;
+ if (period) {
+ int note;
+ entry->mask |= IT_ENTRY_NOTE;
- /* frequency = (AMIGA_DIVISOR / 8) / (period * 2)
- * C-1: period = 214 -> frequency = 16726
- * so, set C5_speed to 16726
- * and period = 214 should translate to C5 aka 60
- * halve the period, go up an octive
- *
- * period = 214 / pow(DUMB_SEMITONE_BASE, note - 60)
- * pow(DUMB_SEMITONE_BASE, note - 60) = 214 / period
- * note - 60 = log(214/period) / log(DUMB_SEMITONE_BASE)
- */
- note = (int)floor(log(214.0/period) / log(DUMB_SEMITONE_BASE) + 60.5);
- entry->note = MID(0, note, 119);
- // or should we preserve the period?
- //entry->note = buffer[pos+0] & 0x0F; /* High nibble */
- //entry->volpan = buffer[pos+1]; /* Low byte */
- // and what about finetune?
- }
+ /* frequency = (AMIGA_DIVISOR / 8) / (period * 2)
+ * C-1: period = 214 -> frequency = 16726
+ * so, set C5_speed to 16726
+ * and period = 214 should translate to C5 aka 60
+ * halve the period, go up an octive
+ *
+ * period = 214 / pow(DUMB_SEMITONE_BASE, note - 60)
+ * pow(DUMB_SEMITONE_BASE, note - 60) = 214 / period
+ * note - 60 = log(214/period) / log(DUMB_SEMITONE_BASE)
+ */
+ note = (int)floor(
+ log(214.0 / period) / log(DUMB_SEMITONE_BASE) + 60.5);
+ entry->note = MID(0, note, 119);
+ // or should we preserve the period?
+ // entry->note = buffer[pos+0] & 0x0F; /* High nibble */
+ // entry->volpan = buffer[pos+1]; /* Low byte */
+ // and what about finetune?
+ }
- if (sample) {
- entry->mask |= IT_ENTRY_INSTRUMENT;
- entry->instrument = sample;
- }
+ if (sample) {
+ entry->mask |= IT_ENTRY_INSTRUMENT;
+ entry->instrument = sample;
+ }
- _dumb_it_xm_convert_effect(buffer[pos+2] & 0x0F, buffer[pos+3], entry, 1);
+ _dumb_it_xm_convert_effect(buffer[pos + 2] & 0x0F,
+ buffer[pos + 3], entry, 1);
- entry++;
- }
- pos += 4;
- }
- IT_SET_END_ROW(entry);
- entry++;
- }
+ entry++;
+ }
+ pos += 4;
+ }
+ IT_SET_END_ROW(entry);
+ entry++;
+ }
- return 0;
+ return 0;
}
+static int it_mod_read_sample_header(IT_SAMPLE *sample, DUMBFILE *f,
+ unsigned long fft, int stk) {
+ int finetune, loop_start, loop_length;
+ /**
+ 21 22 Chars Sample 1 name. If the name is not a full
+ 22 chars in length, it will be null
+ terminated.
-static int it_mod_read_sample_header(IT_SAMPLE *sample, DUMBFILE *f, unsigned long fft, int stk)
-{
- int finetune, loop_start, loop_length;
-
-/**
- 21 22 Chars Sample 1 name. If the name is not a full
- 22 chars in length, it will be null
- terminated.
-
-If
-the sample name begins with a '#' character (ASCII $23 (35)) then this is
-assumed not to be an instrument name, and is probably a message.
-*/
+ If
+ the sample name begins with a '#' character (ASCII $23 (35)) then this is
+ assumed not to be an instrument name, and is probably a message.
+ */
dumbfile_getnc((char *)sample->name, 22, f);
- sample->name[22] = 0;
+ sample->name[22] = 0;
- sample->filename[0] = 0;
+ sample->filename[0] = 0;
- sample->length = dumbfile_mgetw(f) << 1;
- if (fft == DUMB_ID('F','E','S','T'))
- finetune = (signed char)((-dumbfile_getc(f) & 0x1F) << 3) >> 3;
- else
- finetune = (signed char)(dumbfile_getc(f) << 4) >> 4; /* signed nibble */
-/** Each finetune step changes the note 1/8th of a semitone. */
- sample->global_volume = 64;
- sample->default_volume = dumbfile_getc(f); // Should we be setting global_volume to this instead?
- loop_start = dumbfile_mgetw(f);
- if ( !stk ) loop_start <<= 1;
- loop_length = dumbfile_mgetw(f) << 1;
- if ( loop_length > 2 && loop_start + loop_length > sample->length && loop_start / 2 + loop_length <= sample->length )
- loop_start /= 2;
- sample->loop_start = loop_start;
- sample->loop_end = loop_start + loop_length;
-/**
-Once this sample has been played completely from beginning
-to end, if the repeat length (next field) is greater than two bytes it
-will loop back to this position in the sample and continue playing. Once
-it has played for the repeat length, it continues to loop back to the
-repeat start offset. This means the sample continues playing until it is
-told to stop.
-*/
+ sample->length = dumbfile_mgetw(f) << 1;
+ if (fft == DUMB_ID('F', 'E', 'S', 'T'))
+ finetune = (signed char)((-dumbfile_getc(f) & 0x1F) << 3) >> 3;
+ else
+ finetune =
+ (signed char)(dumbfile_getc(f) << 4) >> 4; /* signed nibble */
+ /** Each finetune step changes the note 1/8th of a semitone. */
+ sample->global_volume = 64;
+ sample->default_volume =
+ dumbfile_getc(f); // Should we be setting global_volume to this instead?
+ loop_start = dumbfile_mgetw(f);
+ if (!stk)
+ loop_start <<= 1;
+ loop_length = dumbfile_mgetw(f) << 1;
+ if (loop_length > 2 && loop_start + loop_length > sample->length &&
+ loop_start / 2 + loop_length <= sample->length)
+ loop_start /= 2;
+ sample->loop_start = loop_start;
+ sample->loop_end = loop_start + loop_length;
+ /**
+ Once this sample has been played completely from beginning
+ to end, if the repeat length (next field) is greater than two bytes it
+ will loop back to this position in the sample and continue playing. Once
+ it has played for the repeat length, it continues to loop back to the
+ repeat start offset. This means the sample continues playing until it is
+ told to stop.
+ */
- if (sample->length <= 0) {
- sample->flags = 0;
- return 0;
- }
+ if (sample->length <= 0) {
+ sample->flags = 0;
+ return 0;
+ }
- sample->flags = IT_SAMPLE_EXISTS;
+ sample->flags = IT_SAMPLE_EXISTS;
- sample->default_pan = 0;
- sample->C5_speed = (int)( AMIGA_CLOCK / 214.0 ); //(long)(16726.0*pow(DUMB_PITCH_BASE, finetune*32));
- sample->finetune = finetune * ((fft == DUMB_ID('F','E','S','T')) ? 16 : 32);
- // the above line might be wrong
+ sample->default_pan = 0;
+ sample->C5_speed =
+ (int)(AMIGA_CLOCK /
+ 214.0); //(long)(16726.0*pow(DUMB_PITCH_BASE, finetune*32));
+ sample->finetune =
+ finetune * ((fft == DUMB_ID('F', 'E', 'S', 'T')) ? 16 : 32);
+ // the above line might be wrong
- if (sample->loop_end > sample->length)
- sample->loop_end = sample->length;
+ if (sample->loop_end > sample->length)
+ sample->loop_end = sample->length;
- if (sample->loop_end - sample->loop_start > 2)
- sample->flags |= IT_SAMPLE_LOOP;
+ if (sample->loop_end - sample->loop_start > 2)
+ sample->flags |= IT_SAMPLE_LOOP;
- sample->vibrato_speed = 0;
- sample->vibrato_depth = 0;
- sample->vibrato_rate = 0;
- sample->vibrato_waveform = 0; // do we have to set _all_ these?
- sample->max_resampling_quality = -1;
+ sample->vibrato_speed = 0;
+ sample->vibrato_depth = 0;
+ sample->vibrato_rate = 0;
+ sample->vibrato_waveform = 0; // do we have to set _all_ these?
+ sample->max_resampling_quality = -1;
- return dumbfile_error(f);
+ return dumbfile_error(f);
}
+static int it_mod_read_sample_data(IT_SAMPLE *sample, DUMBFILE *f,
+ unsigned long fft) {
+ long i;
+ long truncated_size;
+ /* let's get rid of the sample data coming after the end of the loop */
+ if ((sample->flags & IT_SAMPLE_LOOP) && sample->loop_end < sample->length) {
+ truncated_size = sample->length - sample->loop_end;
+ sample->length = sample->loop_end;
+ } else {
+ truncated_size = 0;
+ }
-static int it_mod_read_sample_data(IT_SAMPLE *sample, DUMBFILE *f, unsigned long fft)
-{
- long i;
- long truncated_size;
+ if (sample->length) {
+ sample->data = malloc(sample->length);
- /* let's get rid of the sample data coming after the end of the loop */
- if ((sample->flags & IT_SAMPLE_LOOP) && sample->loop_end < sample->length) {
- truncated_size = sample->length - sample->loop_end;
- sample->length = sample->loop_end;
- } else {
- truncated_size = 0;
- }
+ if (!sample->data)
+ return -1;
- if (sample->length) {
- sample->data = malloc(sample->length);
+ /* Sample data are stored in "8-bit two's compliment format" (sic). */
+ /*
+ for (i = 0; i < sample->length; i++)
+ ((signed char *)sample->left)[i] = dumbfile_getc(f);
+ */
+ /* F U Olivier Lapicque */
+ if (sample->length >= 5) {
+ i = dumbfile_getnc(sample->data, 5, f);
+ if (i == 5) {
+ if (!memcmp(sample->data, "ADPCM", 5)) {
+ if (_dumb_it_read_sample_data_adpcm4(sample, f) < 0)
+ return -1;
- if (!sample->data)
- return -1;
+ return 0;
+ } else {
+ i += dumbfile_getnc(((char *)sample->data) + 5,
+ sample->length - 5, f);
+ }
+ }
+ } else {
+ i = dumbfile_getnc(sample->data, sample->length, f);
+ }
+ if (i < sample->length) {
+ if (i <= 0) {
+ sample->flags = 0;
+ return 0;
+ }
+ sample->length = i;
+ if (sample->loop_end > i)
+ sample->loop_end = i;
+ // holy crap!
+ if (sample->loop_start > i)
+ sample->flags &= ~IT_SAMPLE_LOOP;
+ } else {
+ /* skip truncated data */
+ int feh = dumbfile_error(f);
- /* Sample data are stored in "8-bit two's compliment format" (sic). */
- /*
- for (i = 0; i < sample->length; i++)
- ((signed char *)sample->left)[i] = dumbfile_getc(f);
- */
- /* F U Olivier Lapicque */
- if (sample->length >= 5)
- {
- i = dumbfile_getnc(sample->data, 5, f);
- if (i == 5)
- {
- if (!memcmp(sample->data, "ADPCM", 5))
- {
- if (_dumb_it_read_sample_data_adpcm4(sample, f) < 0)
- return -1;
+ if (truncated_size)
+ dumbfile_skip(f, truncated_size);
+ // Should we be truncating it?
- return 0;
- }
- else
- {
- i += dumbfile_getnc(((char *)sample->data) + 5, sample->length - 5, f);
- }
- }
- }
- else
- {
- i = dumbfile_getnc(sample->data, sample->length, f);
- }
- if (i < sample->length)
- {
- if (i <= 0)
- {
- sample->flags = 0;
- return 0;
- }
- sample->length = i;
- if (sample->loop_end > i) sample->loop_end = i;
- // holy crap!
- if (sample->loop_start > i) sample->flags &= ~IT_SAMPLE_LOOP;
- }
- else
- {
- /* skip truncated data */
- int feh = dumbfile_error(f);
+ if (feh)
+ return -1;
+ }
- if (truncated_size) dumbfile_skip(f, truncated_size);
- // Should we be truncating it?
+ if (fft == DUMB_ID('M', 0, 0, 0) || fft == DUMB_ID('8', 0, 0, 0)) {
+ int delta = 0;
+ for (i = 0; i < sample->length; i++) {
+ delta += ((signed char *)sample->data)[i];
+ ((signed char *)sample->data)[i] = delta;
+ }
+ }
+ }
- if (feh)
- return -1;
- }
-
- if (fft == DUMB_ID('M',0,0,0) || fft == DUMB_ID('8',0,0,0)) {
- int delta = 0;
- for (i = 0; i < sample->length; i++) {
- delta += ((signed char *)sample->data)[i];
- ((signed char *)sample->data)[i] = delta;
- }
- }
- }
-
- return 0;
+ return 0;
}
+#define MOD_FFT_OFFSET (20 + 31 * (22 + 2 + 1 + 1 + 2 + 2) + 1 + 1 + 128)
+static DUMB_IT_SIGDATA *it_mod_load_sigdata(DUMBFILE *f, int restrict_) {
+ DUMB_IT_SIGDATA *sigdata;
+ int n_channels;
+ int i;
+ unsigned long fft;
-#define MOD_FFT_OFFSET (20 + 31*(22+2+1+1+2+2) + 1 + 1 + 128)
+ if (dumbfile_seek(f, MOD_FFT_OFFSET, DFS_SEEK_SET))
+ return NULL;
-static DUMB_IT_SIGDATA *it_mod_load_sigdata(DUMBFILE *f, int restrict_)
-{
- DUMB_IT_SIGDATA *sigdata;
- int n_channels;
- int i;
- unsigned long fft;
+ fft = dumbfile_mgetl(f);
+ if (dumbfile_error(f))
+ return NULL;
- if ( dumbfile_seek(f, MOD_FFT_OFFSET, DFS_SEEK_SET) )
- return NULL;
+ if (dumbfile_seek(f, 0, DFS_SEEK_SET))
+ return NULL;
- fft = dumbfile_mgetl(f);
- if (dumbfile_error(f))
- return NULL;
+ sigdata = malloc(sizeof(*sigdata));
+ if (!sigdata) {
+ return NULL;
+ }
- if ( dumbfile_seek(f, 0, DFS_SEEK_SET) )
- return NULL;
-
- sigdata = malloc(sizeof(*sigdata));
- if (!sigdata) {
- return NULL;
- }
-
- /**
- 1 20 Chars Title of the song. If the title is not a
- full 20 chars in length, it will be null-
- terminated.
- */
+ /**
+ 1 20 Chars Title of the song. If the title is not a
+ full 20 chars in length, it will be null-
+ terminated.
+ */
if (dumbfile_getnc((char *)sigdata->name, 20, f) < 20) {
- free(sigdata);
+ free(sigdata);
return NULL;
- }
- sigdata->name[20] = 0;
+ }
+ sigdata->name[20] = 0;
- sigdata->n_samples = 31;
+ sigdata->n_samples = 31;
- switch (fft) {
- case DUMB_ID('M','.','K','.'):
- case DUMB_ID('M','!','K','!'):
- case DUMB_ID('M','&','K','!'):
- case DUMB_ID('N','.','T','.'):
- case DUMB_ID('N','S','M','S'):
- case DUMB_ID('F','L','T','4'):
- case DUMB_ID('M',0,0,0):
- case DUMB_ID('8',0,0,0):
- case DUMB_ID('F','E','S','T'):
- n_channels = 4;
- break;
- case DUMB_ID('F','L','T','8'):
- n_channels = 0;
- /* 0 indicates a special case; two four-channel patterns must be
- * combined into one eight-channel pattern. Pattern indexes must
- * be halved. Why oh why do they obfuscate so?
- */
- /*for (i = 0; i < 128; i++)
- sigdata->order[i] >>= 1;*/
- break;
- case DUMB_ID('C','D','8','1'):
- case DUMB_ID('O','C','T','A'):
- case DUMB_ID('O','K','T','A'):
- n_channels = 8;
- break;
- case DUMB_ID('1','6','C','N'):
- n_channels = 16;
- break;
- case DUMB_ID('3','2','C','N'):
- n_channels = 32;
- break;
- default:
- /* If we get an illegal tag, assume 4 channels 15 samples. */
- if ((fft & 0x0000FFFFL) == DUMB_ID(0,0,'C','H')) {
- if (fft >= '1' << 24 && fft < '4' << 24) {
- n_channels = ((fft & 0x00FF0000L) >> 16) - '0';
- if ((unsigned int)n_channels >= 10) {
- /* Rightmost character wasn't a digit. */
- n_channels = 4;
- sigdata->n_samples = 15;
- } else {
- n_channels += (((fft & 0xFF000000L) >> 24) - '0') * 10;
- /* MODs should really only go up to 32 channels, but we're lenient. */
- if ((unsigned int)(n_channels - 1) >= DUMB_IT_N_CHANNELS - 1) {
- /* No channels or too many? Can't be right... */
- n_channels = 4;
- sigdata->n_samples = 15;
- }
- }
- } else {
- n_channels = 4;
- sigdata->n_samples = 15;
- }
- } else if ((fft & 0x00FFFFFFL) == DUMB_ID(0,'C','H','N')) {
- n_channels = (int)((fft >> 24) - '0');
- if ((unsigned int)(n_channels - 1) >= 9) {
- /* Character was '0' or it wasn't a digit */
- n_channels = 4;
- sigdata->n_samples = 15;
- }
- } else if ((fft & 0xFFFFFF00L) == DUMB_ID('T','D','Z',0)) {
- n_channels = (fft & 0x000000FFL) - '0';
- if ((unsigned int)(n_channels - 1) >= 9) {
- /* We've been very lenient, given that it should have
- * been 1, 2 or 3, but this MOD has been very naughty and
- * must be punished.
- */
- n_channels = 4;
- sigdata->n_samples = 15;
- }
- } else {
- n_channels = 4;
- sigdata->n_samples = 15;
- fft = 0;
- }
- }
+ switch (fft) {
+ case DUMB_ID('M', '.', 'K', '.'):
+ case DUMB_ID('M', '!', 'K', '!'):
+ case DUMB_ID('M', '&', 'K', '!'):
+ case DUMB_ID('N', '.', 'T', '.'):
+ case DUMB_ID('N', 'S', 'M', 'S'):
+ case DUMB_ID('F', 'L', 'T', '4'):
+ case DUMB_ID('M', 0, 0, 0):
+ case DUMB_ID('8', 0, 0, 0):
+ case DUMB_ID('F', 'E', 'S', 'T'):
+ n_channels = 4;
+ break;
+ case DUMB_ID('F', 'L', 'T', '8'):
+ n_channels = 0;
+ /* 0 indicates a special case; two four-channel patterns must be
+ * combined into one eight-channel pattern. Pattern indexes must
+ * be halved. Why oh why do they obfuscate so?
+ */
+ /*for (i = 0; i < 128; i++)
+ sigdata->order[i] >>= 1;*/
+ break;
+ case DUMB_ID('C', 'D', '8', '1'):
+ case DUMB_ID('O', 'C', 'T', 'A'):
+ case DUMB_ID('O', 'K', 'T', 'A'):
+ n_channels = 8;
+ break;
+ case DUMB_ID('1', '6', 'C', 'N'):
+ n_channels = 16;
+ break;
+ case DUMB_ID('3', '2', 'C', 'N'):
+ n_channels = 32;
+ break;
+ default:
+ /* If we get an illegal tag, assume 4 channels 15 samples. */
+ if ((fft & 0x0000FFFFL) == DUMB_ID(0, 0, 'C', 'H')) {
+ if (fft >= '1' << 24 && fft < '4' << 24) {
+ n_channels = ((fft & 0x00FF0000L) >> 16) - '0';
+ if ((unsigned int)n_channels >= 10) {
+ /* Rightmost character wasn't a digit. */
+ n_channels = 4;
+ sigdata->n_samples = 15;
+ } else {
+ n_channels += (((fft & 0xFF000000L) >> 24) - '0') * 10;
+ /* MODs should really only go up to 32 channels, but we're
+ * lenient. */
+ if ((unsigned int)(n_channels - 1) >=
+ DUMB_IT_N_CHANNELS - 1) {
+ /* No channels or too many? Can't be right... */
+ n_channels = 4;
+ sigdata->n_samples = 15;
+ }
+ }
+ } else {
+ n_channels = 4;
+ sigdata->n_samples = 15;
+ }
+ } else if ((fft & 0x00FFFFFFL) == DUMB_ID(0, 'C', 'H', 'N')) {
+ n_channels = (int)((fft >> 24) - '0');
+ if ((unsigned int)(n_channels - 1) >= 9) {
+ /* Character was '0' or it wasn't a digit */
+ n_channels = 4;
+ sigdata->n_samples = 15;
+ }
+ } else if ((fft & 0xFFFFFF00L) == DUMB_ID('T', 'D', 'Z', 0)) {
+ n_channels = (fft & 0x000000FFL) - '0';
+ if ((unsigned int)(n_channels - 1) >= 9) {
+ /* We've been very lenient, given that it should have
+ * been 1, 2 or 3, but this MOD has been very naughty and
+ * must be punished.
+ */
+ n_channels = 4;
+ sigdata->n_samples = 15;
+ }
+ } else {
+ n_channels = 4;
+ sigdata->n_samples = 15;
+ fft = 0;
+ }
+ }
- // moo
- if ( ( restrict_ & 1 ) && sigdata->n_samples == 15 )
- {
- free(sigdata);
+ // moo
+ if ((restrict_ & 1) && sigdata->n_samples == 15) {
+ free(sigdata);
return NULL;
- }
+ }
- sigdata->n_pchannels = n_channels ? n_channels : 8; /* special case for 0, see above */
+ sigdata->n_pchannels =
+ n_channels ? n_channels : 8; /* special case for 0, see above */
- sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
- if (!sigdata->sample) {
- free(sigdata);
+ sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
+ if (!sigdata->sample) {
+ free(sigdata);
return NULL;
- }
+ }
- sigdata->song_message = NULL;
- sigdata->order = NULL;
- sigdata->instrument = NULL;
- sigdata->pattern = NULL;
- sigdata->midi = NULL;
- sigdata->checkpoint = NULL;
+ sigdata->song_message = NULL;
+ sigdata->order = NULL;
+ sigdata->instrument = NULL;
+ sigdata->pattern = NULL;
+ sigdata->midi = NULL;
+ sigdata->checkpoint = NULL;
- sigdata->n_instruments = 0;
+ sigdata->n_instruments = 0;
- for (i = 0; i < sigdata->n_samples; i++)
- sigdata->sample[i].data = NULL;
+ for (i = 0; i < sigdata->n_samples; i++)
+ sigdata->sample[i].data = NULL;
- for (i = 0; i < sigdata->n_samples; i++) {
- if (it_mod_read_sample_header(&sigdata->sample[i], f, fft, sigdata->n_samples == 15)) {
- _dumb_it_unload_sigdata(sigdata);
+ for (i = 0; i < sigdata->n_samples; i++) {
+ if (it_mod_read_sample_header(&sigdata->sample[i], f, fft,
+ sigdata->n_samples == 15)) {
+ _dumb_it_unload_sigdata(sigdata);
return NULL;
- }
- }
+ }
+ }
- sigdata->n_orders = dumbfile_getc(f);
- sigdata->restart_position = dumbfile_getc(f);
- // what if this is >= 127? what about with Fast Tracker II?
+ sigdata->n_orders = dumbfile_getc(f);
+ sigdata->restart_position = dumbfile_getc(f);
+ // what if this is >= 127? what about with Fast Tracker II?
-/* if (sigdata->n_orders <= 0 || sigdata->n_orders > 128) { // is this right?
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }*/
+ /* if (sigdata->n_orders <= 0 || sigdata->n_orders > 128) { // is this
+ right? _dumb_it_unload_sigdata(sigdata); return NULL;
+ }*/
- //if (sigdata->restart_position >= sigdata->n_orders)
- //sigdata->restart_position = 0;
+ // if (sigdata->restart_position >= sigdata->n_orders)
+ // sigdata->restart_position = 0;
- sigdata->order = malloc(128); /* We may need to scan the extra ones! */
- if (!sigdata->order) {
- _dumb_it_unload_sigdata(sigdata);
+ sigdata->order = malloc(128); /* We may need to scan the extra ones! */
+ if (!sigdata->order) {
+ _dumb_it_unload_sigdata(sigdata);
return NULL;
- }
+ }
if (dumbfile_getnc((char *)sigdata->order, 128, f) < 128) {
- _dumb_it_unload_sigdata(sigdata);
+ _dumb_it_unload_sigdata(sigdata);
return NULL;
- }
+ }
- if (sigdata->n_orders <= 0 || sigdata->n_orders > 128) { // is this right?
- sigdata->n_orders = 128;
- //while (sigdata->n_orders > 1 && !sigdata->order[sigdata->n_orders - 1]) sigdata->n_orders--;
- }
+ if (sigdata->n_orders <= 0 || sigdata->n_orders > 128) { // is this right?
+ sigdata->n_orders = 128;
+ // while (sigdata->n_orders > 1 && !sigdata->order[sigdata->n_orders -
+ // 1]) sigdata->n_orders--;
+ }
- if ( ! n_channels )
- for (i = 0; i < 128; i++)
- sigdata->order[i] >>= 1;
+ if (!n_channels)
+ for (i = 0; i < 128; i++)
+ sigdata->order[i] >>= 1;
- /* "The old NST format contains only 15 samples (instead of 31). Further
- * it doesn't contain a file format tag (id). So Pattern data offset is
- * at 20+15*30+1+1+128."
- * - Then I shall assume the File Format Tag never exists if there are
- * only 15 samples. I hope this isn't a faulty assumption...
- */
- if (sigdata->n_samples == 31)
- dumbfile_skip(f, 4);
+ /* "The old NST format contains only 15 samples (instead of 31). Further
+ * it doesn't contain a file format tag (id). So Pattern data offset is
+ * at 20+15*30+1+1+128."
+ * - Then I shall assume the File Format Tag never exists if there are
+ * only 15 samples. I hope this isn't a faulty assumption...
+ */
+ if (sigdata->n_samples == 31)
+ dumbfile_skip(f, 4);
- sigdata->n_patterns = -1;
+ sigdata->n_patterns = -1;
- if ( ( restrict_ & 2 ) )
- {
+ if ((restrict_ & 2)) {
unsigned char buffer[5];
long sample_number;
long total_sample_size;
long offset = dumbfile_pos(f);
long remain = dumbfile_get_size(f) - offset;
- if ( dumbfile_error( f ) ||
- dumbfile_seek( f, 0, SEEK_END ) ) {
+ if (dumbfile_error(f) || dumbfile_seek(f, 0, SEEK_END)) {
_dumb_it_unload_sigdata(sigdata);
return NULL;
}
@@ -482,20 +480,32 @@
total_sample_size = 0;
while (dumbfile_pos(f) > offset && sample_number >= 0) {
if (sigdata->sample[sample_number].flags & IT_SAMPLE_EXISTS) {
- if ( dumbfile_seek(f, -((sigdata->sample[sample_number].length + 1) / 2 + 5 + 16), DFS_SEEK_CUR) ||
- dumbfile_getnc((char *)buffer, 5, f) < 5 ) {
+ if (dumbfile_seek(
+ f,
+ -((sigdata->sample[sample_number].length + 1) / 2 + 5 +
+ 16),
+ DFS_SEEK_CUR) ||
+ dumbfile_getnc((char *)buffer, 5, f) < 5) {
_dumb_it_unload_sigdata(sigdata);
return NULL;
}
- if ( !memcmp( buffer, "ADPCM", 5 ) ) { /* BAH */
- total_sample_size += (sigdata->sample[sample_number].length + 1) / 2 + 5 + 16;
- if ( dumbfile_seek(f, -5, DFS_SEEK_CUR) ) {
+ if (!memcmp(buffer, "ADPCM", 5)) { /* BAH */
+ total_sample_size +=
+ (sigdata->sample[sample_number].length + 1) / 2 + 5 +
+ 16;
+ if (dumbfile_seek(f, -5, DFS_SEEK_CUR)) {
_dumb_it_unload_sigdata(sigdata);
return NULL;
}
} else {
total_sample_size += sigdata->sample[sample_number].length;
- if ( dumbfile_seek(f, -(sigdata->sample[sample_number].length - ((sigdata->sample[sample_number].length + 1) / 2 + 5 + 16) + 5), DFS_SEEK_CUR) ) {
+ if (dumbfile_seek(
+ f,
+ -(sigdata->sample[sample_number].length -
+ ((sigdata->sample[sample_number].length + 1) / 2 +
+ 5 + 16) +
+ 5),
+ DFS_SEEK_CUR)) {
_dumb_it_unload_sigdata(sigdata);
return NULL;
}
@@ -504,135 +514,135 @@
--sample_number;
}
- if (remain > total_sample_size) {
- sigdata->n_patterns = (int)(( remain - total_sample_size + 4 ) / ( 256 * sigdata->n_pchannels ));
- if (fft == DUMB_ID('M',0,0,0) || fft == DUMB_ID('8',0,0,0)) {
- remain -= sigdata->n_patterns * 256 * sigdata->n_pchannels;
- if (dumbfile_skip(f, remain - total_sample_size)) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- }
- }
- }
- else
- {
- for (i = 0; i < 128; i++)
- {
+ if (remain > total_sample_size) {
+ sigdata->n_patterns = (int)((remain - total_sample_size + 4) /
+ (256 * sigdata->n_pchannels));
+ if (fft == DUMB_ID('M', 0, 0, 0) || fft == DUMB_ID('8', 0, 0, 0)) {
+ remain -= sigdata->n_patterns * 256 * sigdata->n_pchannels;
+ if (dumbfile_skip(f, remain - total_sample_size)) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ }
+ }
+ } else {
+ for (i = 0; i < 128; i++) {
if (sigdata->order[i] > sigdata->n_patterns)
sigdata->n_patterns = sigdata->order[i];
}
- sigdata->n_patterns++;
- }
+ sigdata->n_patterns++;
+ }
- if ( sigdata->n_patterns <= 0 ) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ if (sigdata->n_patterns <= 0) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- /* May as well try to save a tiny bit of memory. */
- if (sigdata->n_orders < 128) {
- unsigned char *order = realloc(sigdata->order, sigdata->n_orders);
- if (order) sigdata->order = order;
- }
+ /* May as well try to save a tiny bit of memory. */
+ if (sigdata->n_orders < 128) {
+ unsigned char *order = realloc(sigdata->order, sigdata->n_orders);
+ if (order)
+ sigdata->order = order;
+ }
- sigdata->pattern = malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
- if (!sigdata->pattern) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- for (i = 0; i < sigdata->n_patterns; i++)
- sigdata->pattern[i].entry = NULL;
+ sigdata->pattern = malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
+ if (!sigdata->pattern) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (i = 0; i < sigdata->n_patterns; i++)
+ sigdata->pattern[i].entry = NULL;
- /* Read in the patterns */
- {
- unsigned char *buffer = malloc(256 * sigdata->n_pchannels); /* 64 rows * 4 bytes */
- if (!buffer) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- for (i = 0; i < sigdata->n_patterns; i++) {
- if (it_mod_read_pattern(&sigdata->pattern[i], f, n_channels, buffer) != 0) {
- free(buffer);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- }
- free(buffer);
- }
+ /* Read in the patterns */
+ {
+ unsigned char *buffer =
+ malloc(256 * sigdata->n_pchannels); /* 64 rows * 4 bytes */
+ if (!buffer) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (i = 0; i < sigdata->n_patterns; i++) {
+ if (it_mod_read_pattern(&sigdata->pattern[i], f, n_channels,
+ buffer) != 0) {
+ free(buffer);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ }
+ free(buffer);
+ }
- /* And finally, the sample data */
- for (i = 0; i < sigdata->n_samples; i++) {
- if (it_mod_read_sample_data(&sigdata->sample[i], f, fft)) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- }
+ /* And finally, the sample data */
+ for (i = 0; i < sigdata->n_samples; i++) {
+ if (it_mod_read_sample_data(&sigdata->sample[i], f, fft)) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ }
- /* w00t! */
- /*if ( n_channels == 4 &&
- ( sigdata->n_samples == 15 ||
- ( ( fft & 240 ) != DUMB_ID( 0, 0, 'C', 0 ) &&
- ( fft & 240 ) != DUMB_ID( 0, 0, 'H', 0 ) &&
- ( fft & 240 ) != 0 ) ) ) {
- for ( i = 0; i < sigdata->n_samples; ++i ) {
- IT_SAMPLE * sample = &sigdata->sample [i];
- if ( sample && ( sample->flags & IT_SAMPLE_EXISTS ) ) {
- int n, o;
- o = sample->length;
- if ( o > 4 ) o = 4;
- for ( n = 0; n < o; ++n )
- ( ( char * ) sample->data ) [n] = 0;
- }
- }
- }*/
+ /* w00t! */
+ /*if ( n_channels == 4 &&
+ ( sigdata->n_samples == 15 ||
+ ( ( fft & 240 ) != DUMB_ID( 0, 0, 'C', 0 ) &&
+ ( fft & 240 ) != DUMB_ID( 0, 0, 'H', 0 ) &&
+ ( fft & 240 ) != 0 ) ) ) {
+ for ( i = 0; i < sigdata->n_samples; ++i ) {
+ IT_SAMPLE * sample = &sigdata->sample [i];
+ if ( sample && ( sample->flags & IT_SAMPLE_EXISTS ) ) {
+ int n, o;
+ o = sample->length;
+ if ( o > 4 ) o = 4;
+ for ( n = 0; n < o; ++n )
+ ( ( char * ) sample->data ) [n] = 0;
+ }
+ }
+ }*/
- /* Now let's initialise the remaining variables, and we're done! */
- sigdata->flags = IT_WAS_AN_XM | IT_WAS_A_MOD | IT_OLD_EFFECTS | IT_COMPATIBLE_GXX | IT_STEREO;
+ /* Now let's initialise the remaining variables, and we're done! */
+ sigdata->flags = IT_WAS_AN_XM | IT_WAS_A_MOD | IT_OLD_EFFECTS |
+ IT_COMPATIBLE_GXX | IT_STEREO;
- sigdata->global_volume = 128;
- sigdata->mixing_volume = 48;
- /* We want 50 ticks per second; 50/6 row advances per second;
- * 50*10=500 row advances per minute; 500/4=125 beats per minute.
- */
- sigdata->speed = 6;
- sigdata->tempo = 125;
- sigdata->pan_separation = 128;
+ sigdata->global_volume = 128;
+ sigdata->mixing_volume = 48;
+ /* We want 50 ticks per second; 50/6 row advances per second;
+ * 50*10=500 row advances per minute; 500/4=125 beats per minute.
+ */
+ sigdata->speed = 6;
+ sigdata->tempo = 125;
+ sigdata->pan_separation = 128;
- memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
+ memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
- for (i = 0; i < DUMB_IT_N_CHANNELS; i += 4) {
- int sep = 32 * dumb_it_default_panning_separation / 100;
- sigdata->channel_pan[i+0] = 32 - sep;
- sigdata->channel_pan[i+1] = 32 + sep;
- sigdata->channel_pan[i+2] = 32 + sep;
- sigdata->channel_pan[i+3] = 32 - sep;
- }
+ for (i = 0; i < DUMB_IT_N_CHANNELS; i += 4) {
+ int sep = 32 * dumb_it_default_panning_separation / 100;
+ sigdata->channel_pan[i + 0] = 32 - sep;
+ sigdata->channel_pan[i + 1] = 32 + sep;
+ sigdata->channel_pan[i + 2] = 32 + sep;
+ sigdata->channel_pan[i + 3] = 32 - sep;
+ }
- _dumb_it_fix_invalid_orders(sigdata);
+ _dumb_it_fix_invalid_orders(sigdata);
- return sigdata;
+ return sigdata;
}
+DUH *dumb_read_mod_quick(DUMBFILE *f, int restrict_) {
+ sigdata_t *sigdata;
+ DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
-DUH *dumb_read_mod_quick(DUMBFILE *f, int restrict_)
-{
- sigdata_t *sigdata;
+ sigdata = it_mod_load_sigdata(f, restrict_);
- DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
+ if (!sigdata)
+ return NULL;
- sigdata = it_mod_load_sigdata(f, restrict_);
-
- if (!sigdata)
- return NULL;
-
- {
- const char *tag[2][2];
- tag[0][0] = "TITLE";
+ {
+ const char *tag[2][2];
+ tag[0][0] = "TITLE";
tag[0][1] = (const char *)(((DUMB_IT_SIGDATA *)sigdata)->name);
- tag[1][0] = "FORMAT";
- tag[1][1] = "MOD";
- return make_duh(-1, 2, (const char *const (*)[2])tag, 1, &descptr, &sigdata);
- }
+ tag[1][0] = "FORMAT";
+ tag[1][1] = "MOD";
+ return make_duh(-1, 2, (const char *const(*)[2])tag, 1, &descptr,
+ &sigdata);
+ }
}
--- a/src/it/readmod2.c
+++ b/src/it/readmod2.c
@@ -19,11 +19,8 @@
#include "dumb.h"
-
-
-DUH *dumb_read_mod(DUMBFILE *f, int restrict_)
-{
- DUH *duh = dumb_read_mod_quick(f, restrict_);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+DUH *dumb_read_mod(DUMBFILE *f, int restrict_) {
+ DUH *duh = dumb_read_mod_quick(f, restrict_);
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/readmtm.c
+++ b/src/it/readmtm.c
@@ -24,407 +24,432 @@
#include "dumb.h"
#include "internal/it.h"
-size_t strlen_max(const char * ptr, size_t max)
-{
- const char * end, * start;
- if (ptr==0) return 0;
- start = ptr;
- end = ptr + max;
- while(ptr < end && *ptr) ptr++;
- return ptr - start;
+size_t strlen_max(const char *ptr, size_t max) {
+ const char *end, *start;
+ if (ptr == 0)
+ return 0;
+ start = ptr;
+ end = ptr + max;
+ while (ptr < end && *ptr)
+ ptr++;
+ return ptr - start;
}
-static int it_mtm_assemble_pattern(IT_PATTERN *pattern, const unsigned char * track, const unsigned short * sequence, int n_rows)
-{
- int n, o, note, sample;
- const unsigned char * t;
- IT_ENTRY * entry;
+static int it_mtm_assemble_pattern(IT_PATTERN *pattern,
+ const unsigned char *track,
+ const unsigned short *sequence, int n_rows) {
+ int n, o, note, sample;
+ const unsigned char *t;
+ IT_ENTRY *entry;
- pattern->n_rows = n_rows;
- pattern->n_entries = n_rows;
+ pattern->n_rows = n_rows;
+ pattern->n_entries = n_rows;
- for (n = 0; n < 32; n++) {
- if (sequence[n]) {
- t = &track[192 * (sequence[n] - 1)];
- for (o = 0; o < n_rows; o++) {
- if (t[0] || t[1] || t[2]) pattern->n_entries++;
- t += 3;
- }
- }
- }
+ for (n = 0; n < 32; n++) {
+ if (sequence[n]) {
+ t = &track[192 * (sequence[n] - 1)];
+ for (o = 0; o < n_rows; o++) {
+ if (t[0] || t[1] || t[2])
+ pattern->n_entries++;
+ t += 3;
+ }
+ }
+ }
- entry = malloc(pattern->n_entries * sizeof(*entry));
- if (!entry) return -1;
- pattern->entry = entry;
+ entry = malloc(pattern->n_entries * sizeof(*entry));
+ if (!entry)
+ return -1;
+ pattern->entry = entry;
- for (n = 0; n < n_rows; n++) {
- for (o = 0; o < 32; o++) {
- if (sequence[o]) {
- t = &track[192 * (sequence[o] - 1) + (n * 3)];
- if (t[0] || t[1] || t[2]) {
- entry->channel = o;
- entry->mask = 0;
- note = t[0] >> 2;
- sample = ((t[0] << 4) | (t[1] >> 4)) & 0x3F;
+ for (n = 0; n < n_rows; n++) {
+ for (o = 0; o < 32; o++) {
+ if (sequence[o]) {
+ t = &track[192 * (sequence[o] - 1) + (n * 3)];
+ if (t[0] || t[1] || t[2]) {
+ entry->channel = o;
+ entry->mask = 0;
+ note = t[0] >> 2;
+ sample = ((t[0] << 4) | (t[1] >> 4)) & 0x3F;
- if (note) {
- entry->mask |= IT_ENTRY_NOTE;
- entry->note = note + 24;
- }
+ if (note) {
+ entry->mask |= IT_ENTRY_NOTE;
+ entry->note = note + 24;
+ }
- if (sample) {
- entry->mask |= IT_ENTRY_INSTRUMENT;
- entry->instrument = sample;
- }
+ if (sample) {
+ entry->mask |= IT_ENTRY_INSTRUMENT;
+ entry->instrument = sample;
+ }
- _dumb_it_xm_convert_effect(t[1] & 0xF, t[2], entry, 1);
+ _dumb_it_xm_convert_effect(t[1] & 0xF, t[2], entry, 1);
- if (entry->mask) entry++;
- }
- }
- }
- IT_SET_END_ROW(entry);
- entry++;
- }
+ if (entry->mask)
+ entry++;
+ }
+ }
+ }
+ IT_SET_END_ROW(entry);
+ entry++;
+ }
- pattern->n_entries = (int)(entry - pattern->entry);
+ pattern->n_entries = (int)(entry - pattern->entry);
- return 0;
+ return 0;
}
-static int it_mtm_read_sample_header(IT_SAMPLE *sample, DUMBFILE *f, int * skip_bytes)
-{
- int finetune, flags;
+static int it_mtm_read_sample_header(IT_SAMPLE *sample, DUMBFILE *f,
+ int *skip_bytes) {
+ int finetune, flags;
dumbfile_getnc((char *)sample->name, 22, f);
- sample->name[22] = 0;
+ sample->name[22] = 0;
- sample->filename[0] = 0;
+ sample->filename[0] = 0;
- sample->length = dumbfile_igetl(f);
- sample->loop_start = dumbfile_igetl(f);
- sample->loop_end = dumbfile_igetl(f);
- finetune = (signed char)(dumbfile_getc(f) << 4) >> 4; /* signed nibble */
- sample->global_volume = 64;
- sample->default_volume = dumbfile_getc(f);
+ sample->length = dumbfile_igetl(f);
+ sample->loop_start = dumbfile_igetl(f);
+ sample->loop_end = dumbfile_igetl(f);
+ finetune = (signed char)(dumbfile_getc(f) << 4) >> 4; /* signed nibble */
+ sample->global_volume = 64;
+ sample->default_volume = dumbfile_getc(f);
- flags = dumbfile_getc(f);
+ flags = dumbfile_getc(f);
- if (sample->length <= 0) {
- sample->flags = 0;
- return 0;
- }
+ if (sample->length <= 0) {
+ sample->flags = 0;
+ return 0;
+ }
- sample->flags = IT_SAMPLE_EXISTS;
+ sample->flags = IT_SAMPLE_EXISTS;
- *skip_bytes = 0;
- if (flags & 1) {
- *skip_bytes = sample->length & 1;
- sample->flags |= IT_SAMPLE_16BIT;
- sample->length >>= 1;
- sample->loop_start >>= 1;
- sample->loop_end >>= 1;
- }
+ *skip_bytes = 0;
+ if (flags & 1) {
+ *skip_bytes = sample->length & 1;
+ sample->flags |= IT_SAMPLE_16BIT;
+ sample->length >>= 1;
+ sample->loop_start >>= 1;
+ sample->loop_end >>= 1;
+ }
- sample->default_pan = 0;
- sample->C5_speed = (int)( AMIGA_CLOCK / 214.0 );//(long)(16726.0*pow(DUMB_PITCH_BASE, finetune*32));
- sample->finetune = finetune * 32;
- // the above line might be wrong
+ sample->default_pan = 0;
+ sample->C5_speed =
+ (int)(AMIGA_CLOCK /
+ 214.0); //(long)(16726.0*pow(DUMB_PITCH_BASE, finetune*32));
+ sample->finetune = finetune * 32;
+ // the above line might be wrong
- if (sample->loop_end > sample->length)
- sample->loop_end = sample->length;
+ if (sample->loop_end > sample->length)
+ sample->loop_end = sample->length;
- if (sample->loop_end - sample->loop_start > 2)
- sample->flags |= IT_SAMPLE_LOOP;
+ if (sample->loop_end - sample->loop_start > 2)
+ sample->flags |= IT_SAMPLE_LOOP;
- sample->vibrato_speed = 0;
- sample->vibrato_depth = 0;
- sample->vibrato_rate = 0;
- sample->vibrato_waveform = 0; // do we have to set _all_ these?
- sample->max_resampling_quality = -1;
+ sample->vibrato_speed = 0;
+ sample->vibrato_depth = 0;
+ sample->vibrato_rate = 0;
+ sample->vibrato_waveform = 0; // do we have to set _all_ these?
+ sample->max_resampling_quality = -1;
- return dumbfile_error(f);
+ return dumbfile_error(f);
}
-static int it_mtm_read_sample_data(IT_SAMPLE *sample, DUMBFILE *f, int skip_bytes)
-{
- long i;
- long truncated_size;
- long bytes_per_sample;
+static int it_mtm_read_sample_data(IT_SAMPLE *sample, DUMBFILE *f,
+ int skip_bytes) {
+ long i;
+ long truncated_size;
+ long bytes_per_sample;
- /* let's get rid of the sample data coming after the end of the loop */
- if ((sample->flags & IT_SAMPLE_LOOP) && sample->loop_end < sample->length) {
- truncated_size = sample->length - sample->loop_end;
- sample->length = sample->loop_end;
- } else {
- truncated_size = 0;
- }
-
- bytes_per_sample = (sample->flags & IT_SAMPLE_16BIT) ? 2 : 1;
+ /* let's get rid of the sample data coming after the end of the loop */
+ if ((sample->flags & IT_SAMPLE_LOOP) && sample->loop_end < sample->length) {
+ truncated_size = sample->length - sample->loop_end;
+ sample->length = sample->loop_end;
+ } else {
+ truncated_size = 0;
+ }
- sample->data = malloc(sample->length * bytes_per_sample);
+ bytes_per_sample = (sample->flags & IT_SAMPLE_16BIT) ? 2 : 1;
- if (!sample->data)
- return -1;
+ sample->data = malloc(sample->length * bytes_per_sample);
- dumbfile_getnc((char *)sample->data, sample->length * bytes_per_sample, f);
- dumbfile_skip(f, truncated_size * bytes_per_sample);
- dumbfile_skip(f, skip_bytes);
+ if (!sample->data)
+ return -1;
- if (dumbfile_error(f))
- return -1;
+ dumbfile_getnc((char *)sample->data, sample->length * bytes_per_sample, f);
+ dumbfile_skip(f, truncated_size * bytes_per_sample);
+ dumbfile_skip(f, skip_bytes);
- if (bytes_per_sample == 1)
- for (i = 0; i < sample->length; i++)
- ((signed char *)sample->data)[i] ^= 0x80;
+ if (dumbfile_error(f))
+ return -1;
- return 0;
+ if (bytes_per_sample == 1)
+ for (i = 0; i < sample->length; i++)
+ ((signed char *)sample->data)[i] ^= 0x80;
+
+ return 0;
}
-static DUMB_IT_SIGDATA *it_mtm_load_sigdata(DUMBFILE *f, int * version)
-{
- DUMB_IT_SIGDATA *sigdata;
+static DUMB_IT_SIGDATA *it_mtm_load_sigdata(DUMBFILE *f, int *version) {
+ DUMB_IT_SIGDATA *sigdata;
- int n, o, n_tracks, l_comment, n_rows, n_channels;
+ int n, o, n_tracks, l_comment, n_rows, n_channels;
- unsigned char * track;
+ unsigned char *track;
- unsigned short * sequence;
+ unsigned short *sequence;
- char * comment;
-
- int * skip_bytes;
+ char *comment;
- if (dumbfile_getc(f) != 'M' ||
- dumbfile_getc(f) != 'T' ||
- dumbfile_getc(f) != 'M') goto error;
+ int *skip_bytes;
- *version = dumbfile_getc(f);
+ if (dumbfile_getc(f) != 'M' || dumbfile_getc(f) != 'T' ||
+ dumbfile_getc(f) != 'M')
+ goto error;
- sigdata = malloc(sizeof(*sigdata));
- if (!sigdata) goto error;
+ *version = dumbfile_getc(f);
+ sigdata = malloc(sizeof(*sigdata));
+ if (!sigdata)
+ goto error;
+
dumbfile_getnc((char *)sigdata->name, 20, f);
- sigdata->name[20] = 0;
+ sigdata->name[20] = 0;
- n_tracks = dumbfile_igetw(f);
- sigdata->n_patterns = dumbfile_getc(f) + 1;
- sigdata->n_orders = dumbfile_getc(f) + 1;
- l_comment = dumbfile_igetw(f);
- sigdata->n_samples = dumbfile_getc(f);
- //if (dumbfile_getc(f)) goto error_sd;
- dumbfile_getc(f);
- n_rows = dumbfile_getc(f);
- n_channels = dumbfile_getc(f);
+ n_tracks = dumbfile_igetw(f);
+ sigdata->n_patterns = dumbfile_getc(f) + 1;
+ sigdata->n_orders = dumbfile_getc(f) + 1;
+ l_comment = dumbfile_igetw(f);
+ sigdata->n_samples = dumbfile_getc(f);
+ // if (dumbfile_getc(f)) goto error_sd;
+ dumbfile_getc(f);
+ n_rows = dumbfile_getc(f);
+ n_channels = dumbfile_getc(f);
- if (dumbfile_error(f) ||
- (n_tracks <= 0) ||
- (sigdata->n_samples <= 0) ||
- (n_rows <= 0 || n_rows > 64) ||
- (n_channels <= 0 || n_channels > 32)) goto error_sd;
+ if (dumbfile_error(f) || (n_tracks <= 0) || (sigdata->n_samples <= 0) ||
+ (n_rows <= 0 || n_rows > 64) || (n_channels <= 0 || n_channels > 32))
+ goto error_sd;
- memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
+ memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
- if (dumbfile_getnc((char *)sigdata->channel_pan, 32, f) < 32) goto error_sd;
+ if (dumbfile_getnc((char *)sigdata->channel_pan, 32, f) < 32)
+ goto error_sd;
- for (n = 0; n < 32; n++) {
- if (sigdata->channel_pan[n] <= 15) {
- sigdata->channel_pan[n] -= (sigdata->channel_pan[n] & 8) >> 3;
- sigdata->channel_pan[n] = (sigdata->channel_pan[n] * 32) / 7;
- } else {
- sigdata->channel_volume[n] = 0;
- sigdata->channel_pan[n] = 7;
- }
- }
+ for (n = 0; n < 32; n++) {
+ if (sigdata->channel_pan[n] <= 15) {
+ sigdata->channel_pan[n] -= (sigdata->channel_pan[n] & 8) >> 3;
+ sigdata->channel_pan[n] = (sigdata->channel_pan[n] * 32) / 7;
+ } else {
+ sigdata->channel_volume[n] = 0;
+ sigdata->channel_pan[n] = 7;
+ }
+ }
- for (n = 32; n < DUMB_IT_N_CHANNELS; n += 4) {
- int sep = 32 * dumb_it_default_panning_separation / 100;
- sigdata->channel_pan[n ] = 32 - sep;
- sigdata->channel_pan[n+1] = 32 + sep;
- sigdata->channel_pan[n+2] = 32 + sep;
- sigdata->channel_pan[n+3] = 32 - sep;
- }
+ for (n = 32; n < DUMB_IT_N_CHANNELS; n += 4) {
+ int sep = 32 * dumb_it_default_panning_separation / 100;
+ sigdata->channel_pan[n] = 32 - sep;
+ sigdata->channel_pan[n + 1] = 32 + sep;
+ sigdata->channel_pan[n + 2] = 32 + sep;
+ sigdata->channel_pan[n + 3] = 32 - sep;
+ }
- sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
- if (!sigdata->sample) goto error_sd;
+ sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
+ if (!sigdata->sample)
+ goto error_sd;
- sigdata->flags = IT_WAS_AN_XM | IT_WAS_A_MOD | IT_STEREO | IT_OLD_EFFECTS | IT_COMPATIBLE_GXX;
+ sigdata->flags = IT_WAS_AN_XM | IT_WAS_A_MOD | IT_STEREO | IT_OLD_EFFECTS |
+ IT_COMPATIBLE_GXX;
- sigdata->global_volume = 128;
- sigdata->mixing_volume = 48;
- sigdata->speed = 6;
- sigdata->tempo = 125;
- sigdata->pan_separation = 128;
+ sigdata->global_volume = 128;
+ sigdata->mixing_volume = 48;
+ sigdata->speed = 6;
+ sigdata->tempo = 125;
+ sigdata->pan_separation = 128;
- sigdata->song_message = NULL;
- sigdata->order = NULL;
- sigdata->instrument = NULL;
- sigdata->pattern = NULL;
- sigdata->midi = NULL;
- sigdata->checkpoint = NULL;
+ sigdata->song_message = NULL;
+ sigdata->order = NULL;
+ sigdata->instrument = NULL;
+ sigdata->pattern = NULL;
+ sigdata->midi = NULL;
+ sigdata->checkpoint = NULL;
- sigdata->n_instruments = 0;
+ sigdata->n_instruments = 0;
- sigdata->restart_position = 0;
- sigdata->n_pchannels = n_channels;
-
- for (n = 0; n < sigdata->n_samples; n++)
- sigdata->sample[n].data = NULL;
+ sigdata->restart_position = 0;
+ sigdata->n_pchannels = n_channels;
- skip_bytes = calloc(sizeof(int), sigdata->n_samples);
- if (!skip_bytes) goto error_usd;
-
- for (n = 0; n < sigdata->n_samples; n++) {
- if (it_mtm_read_sample_header(&sigdata->sample[n], f, skip_bytes + n)) goto error_sb;
- }
+ for (n = 0; n < sigdata->n_samples; n++)
+ sigdata->sample[n].data = NULL;
- sigdata->order = malloc(sigdata->n_orders);
- if (!sigdata->order) goto error_sb;
+ skip_bytes = calloc(sizeof(int), sigdata->n_samples);
+ if (!skip_bytes)
+ goto error_usd;
- if (dumbfile_getnc((char *)sigdata->order, sigdata->n_orders, f) < sigdata->n_orders) goto error_sb;
- if (sigdata->n_orders < 128)
- if (dumbfile_skip(f, 128 - sigdata->n_orders)) goto error_sb;
+ for (n = 0; n < sigdata->n_samples; n++) {
+ if (it_mtm_read_sample_header(&sigdata->sample[n], f, skip_bytes + n))
+ goto error_sb;
+ }
- track = malloc(192 * n_tracks);
- if (!track) goto error_sb;
+ sigdata->order = malloc(sigdata->n_orders);
+ if (!sigdata->order)
+ goto error_sb;
- if (dumbfile_getnc((char *)track, 192 * n_tracks, f) < 192 * n_tracks) goto error_ft;
+ if (dumbfile_getnc((char *)sigdata->order, sigdata->n_orders, f) <
+ sigdata->n_orders)
+ goto error_sb;
+ if (sigdata->n_orders < 128)
+ if (dumbfile_skip(f, 128 - sigdata->n_orders))
+ goto error_sb;
- sigdata->pattern = malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
- if (!sigdata->pattern) goto error_ft;
- for (n = 0; n < sigdata->n_patterns; n++)
- sigdata->pattern[n].entry = NULL;
+ track = malloc(192 * n_tracks);
+ if (!track)
+ goto error_sb;
- sequence = malloc(sigdata->n_patterns * 32 * sizeof(*sequence));
- if (!sequence) goto error_ft;
+ if (dumbfile_getnc((char *)track, 192 * n_tracks, f) < 192 * n_tracks)
+ goto error_ft;
- for (n = 0; n < sigdata->n_patterns; n++) {
- for (o = 0; o < 32; o++) {
- sequence[(n * 32) + o] = dumbfile_igetw(f);
- if (sequence[(n * 32) + o] > n_tracks)
- {
- //goto error_fs;
- // illegal track number, silence instead of rejecting the file
- sequence[(n * 32) + o] = 0;
- }
- }
- }
+ sigdata->pattern = malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
+ if (!sigdata->pattern)
+ goto error_ft;
+ for (n = 0; n < sigdata->n_patterns; n++)
+ sigdata->pattern[n].entry = NULL;
- for (n = 0; n < sigdata->n_patterns; n++) {
- if (it_mtm_assemble_pattern(&sigdata->pattern[n], track, &sequence[n * 32], n_rows)) goto error_fs;
- }
+ sequence = malloc(sigdata->n_patterns * 32 * sizeof(*sequence));
+ if (!sequence)
+ goto error_ft;
- if (l_comment) {
- comment = malloc(l_comment);
- if (!comment) goto error_fs;
- if (dumbfile_getnc(comment, l_comment, f) < l_comment) goto error_fc;
+ for (n = 0; n < sigdata->n_patterns; n++) {
+ for (o = 0; o < 32; o++) {
+ sequence[(n * 32) + o] = dumbfile_igetw(f);
+ if (sequence[(n * 32) + o] > n_tracks) {
+ // goto error_fs;
+ // illegal track number, silence instead of rejecting the file
+ sequence[(n * 32) + o] = 0;
+ }
+ }
+ }
- /* Time for annoying "logic", yes. We want each line which has text,
- * and each blank line in between all the valid lines.
- */
+ for (n = 0; n < sigdata->n_patterns; n++) {
+ if (it_mtm_assemble_pattern(&sigdata->pattern[n], track,
+ &sequence[n * 32], n_rows))
+ goto error_fs;
+ }
- /* Find last actual line. */
- for (o = -1, n = 0; n < l_comment; n += 40) {
- if (comment[n]) o = n;
- }
+ if (l_comment) {
+ comment = malloc(l_comment);
+ if (!comment)
+ goto error_fs;
+ if (dumbfile_getnc(comment, l_comment, f) < l_comment)
+ goto error_fc;
- if (o >= 0) {
+ /* Time for annoying "logic", yes. We want each line which has text,
+ * and each blank line in between all the valid lines.
+ */
- int l, m;
+ /* Find last actual line. */
+ for (o = -1, n = 0; n < l_comment; n += 40) {
+ if (comment[n])
+ o = n;
+ }
- for (l = 0, n = 0; n <= o; n += 40) {
- int maxlen = l_comment - n;
- l += strlen_max(&comment[n], maxlen > 40 ? 40 : maxlen) + 2;
- }
+ if (o >= 0) {
- l -= 1;
+ int l, m;
- sigdata->song_message = malloc(l);
- if (!sigdata->song_message) goto error_fc;
+ for (l = 0, n = 0; n <= o; n += 40) {
+ int maxlen = l_comment - n;
+ l += strlen_max(&comment[n], maxlen > 40 ? 40 : maxlen) + 2;
+ }
- for (m = 0, n = 0; n <= o; n += 40) {
- int maxlen = l_comment - n;
- int p = (int) strlen_max(&comment[n], maxlen > 40 ? 40 : maxlen);
- if (p) {
- memcpy(sigdata->song_message + m, &comment[n], p);
- m += p;
- }
- if (l - m > 1) {
- sigdata->song_message[m++] = 13;
- sigdata->song_message[m++] = 10;
- }
- }
-
- sigdata->song_message[m] = 0;
- }
+ l -= 1;
- free(comment);
- }
+ sigdata->song_message = malloc(l);
+ if (!sigdata->song_message)
+ goto error_fc;
- for (n = 0; n < sigdata->n_samples; n++) {
- if (it_mtm_read_sample_data(&sigdata->sample[n], f, skip_bytes[n])) goto error_fs;
- }
-
- _dumb_it_fix_invalid_orders(sigdata);
+ for (m = 0, n = 0; n <= o; n += 40) {
+ int maxlen = l_comment - n;
+ int p = (int)strlen_max(&comment[n], maxlen > 40 ? 40 : maxlen);
+ if (p) {
+ memcpy(sigdata->song_message + m, &comment[n], p);
+ m += p;
+ }
+ if (l - m > 1) {
+ sigdata->song_message[m++] = 13;
+ sigdata->song_message[m++] = 10;
+ }
+ }
- free(sequence);
- free(track);
- free(skip_bytes);
+ sigdata->song_message[m] = 0;
+ }
- return sigdata;
+ free(comment);
+ }
+ for (n = 0; n < sigdata->n_samples; n++) {
+ if (it_mtm_read_sample_data(&sigdata->sample[n], f, skip_bytes[n]))
+ goto error_fs;
+ }
+
+ _dumb_it_fix_invalid_orders(sigdata);
+
+ free(sequence);
+ free(track);
+ free(skip_bytes);
+
+ return sigdata;
+
error_fc:
- free(comment);
+ free(comment);
error_fs:
- free(sequence);
+ free(sequence);
error_ft:
- free(track);
+ free(track);
error_sb:
- free(skip_bytes);
+ free(skip_bytes);
error_usd:
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
error_sd:
- free(sigdata);
+ free(sigdata);
error:
- return NULL;
+ return NULL;
}
-static char hexdigit(int in)
-{
- if (in < 10) return in + '0';
- else return in + 'A' - 10;
+static char hexdigit(int in) {
+ if (in < 10)
+ return in + '0';
+ else
+ return in + 'A' - 10;
}
-DUH *dumb_read_mtm_quick(DUMBFILE *f)
-{
- sigdata_t *sigdata;
- int ver;
+DUH *dumb_read_mtm_quick(DUMBFILE *f) {
+ sigdata_t *sigdata;
+ int ver;
- DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
+ DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
- sigdata = it_mtm_load_sigdata(f, &ver);
+ sigdata = it_mtm_load_sigdata(f, &ver);
- if (!sigdata)
- return NULL;
+ if (!sigdata)
+ return NULL;
- {
- char version[16];
- const char *tag[2][2];
- tag[0][0] = "TITLE";
+ {
+ char version[16];
+ const char *tag[2][2];
+ tag[0][0] = "TITLE";
tag[0][1] = (const char *)(((DUMB_IT_SIGDATA *)sigdata)->name);
- tag[1][0] = "FORMAT";
- version[0] = 'M';
- version[1] = 'T';
- version[2] = 'M';
- version[3] = ' ';
- version[4] = 'v';
- version[5] = hexdigit(ver >> 4);
- version[6] = '.';
- version[7] = hexdigit(ver & 15);
- version[8] = 0;
- tag[1][1] = (const char *) &version;
- return make_duh(-1, 2, (const char *const (*)[2])tag, 1, &descptr, &sigdata);
- }
+ tag[1][0] = "FORMAT";
+ version[0] = 'M';
+ version[1] = 'T';
+ version[2] = 'M';
+ version[3] = ' ';
+ version[4] = 'v';
+ version[5] = hexdigit(ver >> 4);
+ version[6] = '.';
+ version[7] = hexdigit(ver & 15);
+ version[8] = 0;
+ tag[1][1] = (const char *)&version;
+ return make_duh(-1, 2, (const char *const(*)[2])tag, 1, &descptr,
+ &sigdata);
+ }
}
--- a/src/it/readokt.c
+++ b/src/it/readokt.c
@@ -24,535 +24,579 @@
#include "dumb.h"
#include "internal/it.h"
+static int it_okt_read_pattern(IT_PATTERN *pattern, const unsigned char *data,
+ int length, int n_channels) {
+ int pos;
+ int channel;
+ int row;
+ int n_rows;
+ IT_ENTRY *entry;
+ if (length < 2)
+ return -1;
-static int it_okt_read_pattern(IT_PATTERN *pattern, const unsigned char *data, int length, int n_channels)
-{
- int pos;
- int channel;
- int row;
- int n_rows;
- IT_ENTRY *entry;
+ n_rows = (data[0] << 8) | data[1];
+ if (!n_rows)
+ n_rows = 64;
- if (length < 2) return -1;
+ if (length < 2 + (n_rows * n_channels * 4))
+ return -1;
- n_rows = (data[0] << 8) | data[1];
- if (!n_rows) n_rows = 64;
+ pattern->n_rows = n_rows;
- if (length < 2 + (n_rows * n_channels * 4)) return -1;
+ /* compute number of entries */
+ pattern->n_entries = n_rows; /* Account for the row end markers */
+ pos = 2;
+ for (row = 0; row < pattern->n_rows; row++) {
+ for (channel = 0; channel < n_channels; channel++) {
+ if (data[pos + 0] | data[pos + 2])
+ pattern->n_entries++;
+ pos += 4;
+ }
+ }
- pattern->n_rows = n_rows;
+ pattern->entry =
+ (IT_ENTRY *)malloc(pattern->n_entries * sizeof(*pattern->entry));
+ if (!pattern->entry)
+ return -1;
- /* compute number of entries */
- pattern->n_entries = n_rows; /* Account for the row end markers */
- pos = 2;
- for (row = 0; row < pattern->n_rows; row++) {
- for (channel = 0; channel < n_channels; channel++) {
- if (data[pos+0] | data[pos+2])
- pattern->n_entries++;
- pos += 4;
- }
- }
+ entry = pattern->entry;
+ pos = 2;
+ for (row = 0; row < n_rows; row++) {
+ for (channel = 0; channel < n_channels; channel++) {
+ if (data[pos + 0] | data[pos + 2]) {
+ entry->channel = channel;
+ entry->mask = 0;
- pattern->entry = (IT_ENTRY *) malloc(pattern->n_entries * sizeof(*pattern->entry));
- if (!pattern->entry)
- return -1;
+ if (data[pos + 0] > 0 && data[pos + 0] <= 36) {
+ entry->mask |= IT_ENTRY_NOTE | IT_ENTRY_INSTRUMENT;
- entry = pattern->entry;
- pos = 2;
- for (row = 0; row < n_rows; row++) {
- for (channel = 0; channel < n_channels; channel++) {
- if (data[pos+0] | data[pos+2]) {
- entry->channel = channel;
- entry->mask = 0;
+ entry->note = data[pos + 0] + 35;
+ entry->instrument = data[pos + 1] + 1;
+ }
- if (data[pos+0] > 0 && data[pos+0] <= 36) {
- entry->mask |= IT_ENTRY_NOTE | IT_ENTRY_INSTRUMENT;
+ entry->effect = 0;
+ entry->effectvalue = data[pos + 3];
- entry->note = data[pos+0] + 35;
- entry->instrument = data[pos+1] + 1;
- }
+ switch (data[pos + 2]) {
+ case 2:
+ if (data[pos + 3])
+ entry->effect = IT_PORTAMENTO_DOWN;
+ break; // XXX code calls this rs_portu, but it's adding to
+ // the period, which decreases the pitch
+ case 13:
+ if (data[pos + 3])
+ entry->effect = IT_OKT_NOTE_SLIDE_DOWN;
+ break;
+ case 21:
+ if (data[pos + 3])
+ entry->effect = IT_OKT_NOTE_SLIDE_DOWN_ROW;
+ break;
- entry->effect = 0;
- entry->effectvalue = data[pos+3];
+ case 1:
+ if (data[pos + 3])
+ entry->effect = IT_PORTAMENTO_UP;
+ break; // XXX same deal here, increasing the pitch
+ case 17:
+ if (data[pos + 3])
+ entry->effect = IT_OKT_NOTE_SLIDE_UP;
+ break;
+ case 30:
+ if (data[pos + 3])
+ entry->effect = IT_OKT_NOTE_SLIDE_UP_ROW;
+ break;
- switch (data[pos+2]) {
- case 2: if (data[pos+3]) entry->effect = IT_PORTAMENTO_DOWN; break; // XXX code calls this rs_portu, but it's adding to the period, which decreases the pitch
- case 13: if (data[pos+3]) entry->effect = IT_OKT_NOTE_SLIDE_DOWN; break;
- case 21: if (data[pos+3]) entry->effect = IT_OKT_NOTE_SLIDE_DOWN_ROW; break;
+ case 10:
+ if (data[pos + 3])
+ entry->effect = IT_OKT_ARPEGGIO_3;
+ break;
+ case 11:
+ if (data[pos + 3])
+ entry->effect = IT_OKT_ARPEGGIO_4;
+ break;
+ case 12:
+ if (data[pos + 3])
+ entry->effect = IT_OKT_ARPEGGIO_5;
+ break;
- case 1: if (data[pos+3]) entry->effect = IT_PORTAMENTO_UP; break; // XXX same deal here, increasing the pitch
- case 17: if (data[pos+3]) entry->effect = IT_OKT_NOTE_SLIDE_UP; break;
- case 30: if (data[pos+3]) entry->effect = IT_OKT_NOTE_SLIDE_UP_ROW; break;
+ case 15:
+ entry->effect = IT_S;
+ entry->effectvalue =
+ EFFECT_VALUE(IT_S_SET_FILTER, data[pos + 3] & 0x0F);
+ break;
- case 10: if (data[pos+3]) entry->effect = IT_OKT_ARPEGGIO_3; break;
- case 11: if (data[pos+3]) entry->effect = IT_OKT_ARPEGGIO_4; break;
- case 12: if (data[pos+3]) entry->effect = IT_OKT_ARPEGGIO_5; break;
+ case 25:
+ entry->effect = IT_JUMP_TO_ORDER;
+ break;
- case 15: entry->effect = IT_S; entry->effectvalue = EFFECT_VALUE(IT_S_SET_FILTER, data[pos+3] & 0x0F); break;
+ case 27:
+ entry->note = IT_NOTE_OFF;
+ entry->mask |= IT_ENTRY_NOTE;
+ break;
- case 25: entry->effect = IT_JUMP_TO_ORDER; break;
+ case 28:
+ entry->effect = IT_SET_SPEED;
+ break;
- case 27: entry->note = IT_NOTE_OFF; entry->mask |= IT_ENTRY_NOTE; break;
+ case 31:
+ if (data[pos + 3] <= 0x40)
+ entry->effect = IT_SET_CHANNEL_VOLUME;
+ else if (data[pos + 3] <= 0x50) {
+ entry->effect = IT_OKT_VOLUME_SLIDE_DOWN;
+ entry->effectvalue = data[pos + 3] - 0x40;
+ } else if (data[pos + 3] <= 0x60) {
+ entry->effect = IT_OKT_VOLUME_SLIDE_UP;
+ entry->effectvalue = data[pos + 3] - 0x50;
+ } else if (data[pos + 3] <= 0x70) {
+ entry->effect = IT_OKT_VOLUME_SLIDE_DOWN;
+ entry->effectvalue = data[pos + 3] - 0x50;
+ } else if (data[pos + 3] <= 0x80) {
+ entry->effect = IT_OKT_VOLUME_SLIDE_UP;
+ entry->effectvalue = data[pos + 3] - 0x60;
+ }
+ break;
+ }
- case 28: entry->effect = IT_SET_SPEED; break;
+ if (entry->effect)
+ entry->mask |= IT_ENTRY_EFFECT;
- case 31:
- if ( data[pos+3] <= 0x40 ) entry->effect = IT_SET_CHANNEL_VOLUME;
- else if ( data[pos+3] <= 0x50 ) { entry->effect = IT_OKT_VOLUME_SLIDE_DOWN; entry->effectvalue = data[pos+3] - 0x40; }
- else if ( data[pos+3] <= 0x60 ) { entry->effect = IT_OKT_VOLUME_SLIDE_UP; entry->effectvalue = data[pos+3] - 0x50; }
- else if ( data[pos+3] <= 0x70 ) { entry->effect = IT_OKT_VOLUME_SLIDE_DOWN; entry->effectvalue = data[pos+3] - 0x50; }
- else if ( data[pos+3] <= 0x80 ) { entry->effect = IT_OKT_VOLUME_SLIDE_UP; entry->effectvalue = data[pos+3] - 0x60; }
- break;
- }
+ entry++;
+ }
+ pos += 4;
+ }
+ IT_SET_END_ROW(entry);
+ entry++;
+ }
- if ( entry->effect ) entry->mask |= IT_ENTRY_EFFECT;
-
- entry++;
- }
- pos += 4;
- }
- IT_SET_END_ROW(entry);
- entry++;
- }
-
- return 0;
+ return 0;
}
+static void it_okt_read_sample_header(IT_SAMPLE *sample,
+ const unsigned char *data) {
+ int loop_start, loop_length;
+ memcpy(sample->name, data, 20);
+ sample->name[20] = 0;
-static void it_okt_read_sample_header(IT_SAMPLE *sample, const unsigned char * data)
-{
- int loop_start, loop_length;
+ sample->filename[0] = 0;
- memcpy(sample->name, data, 20);
- sample->name[20] = 0;
+ sample->length =
+ (data[20] << 24) | (data[21] << 16) | (data[22] << 8) | data[23];
+ sample->global_volume = 64;
+ sample->default_volume = data[29];
+ loop_start = ((data[24] << 8) | data[25]) << 1;
+ loop_length = ((data[26] << 8) | data[27]) << 1;
+ sample->sus_loop_start = loop_start;
+ sample->sus_loop_end = loop_start + loop_length;
- sample->filename[0] = 0;
+ if (sample->length <= 0) {
+ sample->flags = 0;
+ return;
+ }
- sample->length = (data[20] << 24) | (data[21] << 16) | (data[22] << 8) | data[23];
- sample->global_volume = 64;
- sample->default_volume = data[29];
- loop_start = ((data[24] << 8) | data[25]) << 1;
- loop_length = ((data[26] << 8) | data[27]) << 1;
- sample->sus_loop_start = loop_start;
- sample->sus_loop_end = loop_start + loop_length;
+ sample->flags = IT_SAMPLE_EXISTS;
- if (sample->length <= 0) {
- sample->flags = 0;
- return;
- }
+ sample->default_pan = 0;
+ sample->C5_speed =
+ (int)(AMIGA_CLOCK /
+ 214.0); //(long)(16726.0*pow(DUMB_PITCH_BASE, finetune*32));
+ sample->finetune = 0;
- sample->flags = IT_SAMPLE_EXISTS;
+ if (sample->sus_loop_end > sample->length)
+ sample->sus_loop_end = sample->length;
- sample->default_pan = 0;
- sample->C5_speed = (int)( AMIGA_CLOCK / 214.0 ); //(long)(16726.0*pow(DUMB_PITCH_BASE, finetune*32));
- sample->finetune = 0;
+ if (loop_length > 2)
+ sample->flags |= IT_SAMPLE_SUS_LOOP;
- if (sample->sus_loop_end > sample->length)
- sample->sus_loop_end = sample->length;
-
- if (loop_length > 2)
- sample->flags |= IT_SAMPLE_SUS_LOOP;
-
- sample->vibrato_speed = 0;
- sample->vibrato_depth = 0;
- sample->vibrato_rate = 0;
- sample->vibrato_waveform = 0; // do we have to set _all_ these?
- sample->max_resampling_quality = -1;
+ sample->vibrato_speed = 0;
+ sample->vibrato_depth = 0;
+ sample->vibrato_rate = 0;
+ sample->vibrato_waveform = 0; // do we have to set _all_ these?
+ sample->max_resampling_quality = -1;
}
+static int it_okt_read_sample_data(IT_SAMPLE *sample, const char *data,
+ int length) {
+ if (length && sample->length) {
+ if (length < sample->length) {
+ sample->length = length;
+ if (length < sample->sus_loop_end)
+ sample->sus_loop_end = length;
+ }
+ sample->data = malloc(length);
-static int it_okt_read_sample_data(IT_SAMPLE *sample, const char * data, int length)
-{
- if (length && sample->length) {
- if (length < sample->length) {
- sample->length = length;
- if (length < sample->sus_loop_end) sample->sus_loop_end = length;
- }
+ if (!sample->data)
+ return -1;
- sample->data = malloc(length);
+ memcpy(sample->data, data, length);
+ }
- if (!sample->data)
- return -1;
-
- memcpy(sample->data, data, length);
- }
-
- return 0;
+ return 0;
}
-
-
typedef struct IFF_CHUNK IFF_CHUNK;
typedef struct IFF_CHUNKED IFF_CHUNKED;
-struct IFF_CHUNK
-{
- unsigned type;
- unsigned char * data;
- unsigned size;
+struct IFF_CHUNK {
+ unsigned type;
+ unsigned char *data;
+ unsigned size;
};
-struct IFF_CHUNKED
-{
- unsigned chunk_count;
- IFF_CHUNK * chunks;
+struct IFF_CHUNKED {
+ unsigned chunk_count;
+ IFF_CHUNK *chunks;
};
+static IFF_CHUNKED *dumbfile_read_okt(DUMBFILE *f) {
+ IFF_CHUNKED *mod = (IFF_CHUNKED *)malloc(sizeof(*mod));
+ if (!mod)
+ return NULL;
+ mod->chunk_count = 0;
+ mod->chunks = 0;
-static IFF_CHUNKED *dumbfile_read_okt(DUMBFILE *f)
-{
- IFF_CHUNKED *mod = (IFF_CHUNKED *) malloc(sizeof(*mod));
- if (!mod) return NULL;
+ for (;;) {
+ long bytes_read;
+ IFF_CHUNK *chunk = (IFF_CHUNK *)realloc(
+ mod->chunks, (mod->chunk_count + 1) * sizeof(IFF_CHUNK));
+ if (!chunk) {
+ if (mod->chunks)
+ free(mod->chunks);
+ free(mod);
+ return NULL;
+ }
+ mod->chunks = chunk;
+ chunk += mod->chunk_count;
- mod->chunk_count = 0;
- mod->chunks = 0;
+ bytes_read = dumbfile_mgetl(f);
+ if (bytes_read < 0)
+ break;
- for (;;)
- {
- long bytes_read;
- IFF_CHUNK * chunk = ( IFF_CHUNK * ) realloc( mod->chunks, ( mod->chunk_count + 1 ) * sizeof( IFF_CHUNK ) );
- if ( !chunk )
- {
- if ( mod->chunks ) free( mod->chunks );
- free( mod );
- return NULL;
- }
- mod->chunks = chunk;
- chunk += mod->chunk_count;
+ chunk->type = (unsigned int)bytes_read;
+ chunk->size = (unsigned int)dumbfile_mgetl(f);
- bytes_read = dumbfile_mgetl( f );
- if ( bytes_read < 0 ) break;
+ if (dumbfile_error(f))
+ break;
- chunk->type = (unsigned int)bytes_read;
- chunk->size = (unsigned int)dumbfile_mgetl( f );
+ chunk->data = (unsigned char *)malloc(chunk->size);
+ if (!chunk->data) {
+ free(mod->chunks);
+ free(mod);
+ return NULL;
+ }
- if ( dumbfile_error( f ) ) break;
+ bytes_read = dumbfile_getnc((char *)chunk->data, chunk->size, f);
+ if (bytes_read < chunk->size) {
+ if (bytes_read <= 0) {
+ free(chunk->data);
+ break;
+ } else {
+ chunk->size = (unsigned int)bytes_read;
+ mod->chunk_count++;
+ break;
+ }
+ }
- chunk->data = (unsigned char *) malloc( chunk->size );
- if ( !chunk->data )
- {
- free( mod->chunks );
- free( mod );
- return NULL;
- }
+ mod->chunk_count++;
+ }
- bytes_read = dumbfile_getnc( ( char * ) chunk->data, chunk->size, f );
- if ( bytes_read < chunk->size )
- {
- if ( bytes_read <= 0 ) {
- free( chunk->data );
- break;
- } else {
- chunk->size = (unsigned int)bytes_read;
- mod->chunk_count++;
- break;
- }
- }
+ if (!mod->chunk_count) {
+ if (mod->chunks)
+ free(mod->chunks);
+ free(mod);
+ mod = NULL;
+ }
- mod->chunk_count++;
- }
-
- if ( !mod->chunk_count ) {
- if ( mod->chunks ) free(mod->chunks);
- free(mod);
- mod = NULL;
- }
-
- return mod;
+ return mod;
}
-void free_okt(IFF_CHUNKED * mod)
-{
- unsigned i;
- if (mod)
- {
- if (mod->chunks)
- {
- for (i = 0; i < mod->chunk_count; i++)
- {
- if (mod->chunks[i].data) free(mod->chunks[i].data);
- }
- free(mod->chunks);
- }
- free(mod);
- }
+void free_okt(IFF_CHUNKED *mod) {
+ unsigned i;
+ if (mod) {
+ if (mod->chunks) {
+ for (i = 0; i < mod->chunk_count; i++) {
+ if (mod->chunks[i].data)
+ free(mod->chunks[i].data);
+ }
+ free(mod->chunks);
+ }
+ free(mod);
+ }
}
-const IFF_CHUNK * get_chunk_by_type(IFF_CHUNKED * mod, unsigned type, unsigned offset)
-{
- unsigned i;
- if (mod)
- {
- if (mod->chunks)
- {
- for (i = 0; i < mod->chunk_count; i++)
- {
- if (mod->chunks[i].type == type)
- {
- if (!offset) return &mod->chunks[i];
- else offset--;
- }
- }
- }
- }
- return NULL;
-}
+const IFF_CHUNK *get_chunk_by_type(IFF_CHUNKED *mod, unsigned type,
+ unsigned offset) {
+ unsigned i;
+ if (mod) {
+ if (mod->chunks) {
+ for (i = 0; i < mod->chunk_count; i++) {
+ if (mod->chunks[i].type == type) {
+ if (!offset)
+ return &mod->chunks[i];
+ else
+ offset--;
+ }
+ }
+ }
+ }
+ return NULL;
+}
-unsigned get_chunk_count(IFF_CHUNKED *mod, unsigned type)
-{
- unsigned i, count = 0;
- if (mod)
- {
- if (mod->chunks)
- {
- for (i = 0; i < mod->chunk_count; i++)
- {
- if (mod->chunks[i].type == type) count++;
- }
- }
- }
- return count;
+unsigned get_chunk_count(IFF_CHUNKED *mod, unsigned type) {
+ unsigned i, count = 0;
+ if (mod) {
+ if (mod->chunks) {
+ for (i = 0; i < mod->chunk_count; i++) {
+ if (mod->chunks[i].type == type)
+ count++;
+ }
+ }
+ }
+ return count;
}
-
-static DUMB_IT_SIGDATA *it_okt_load_sigdata(DUMBFILE *f)
-{
- DUMB_IT_SIGDATA *sigdata;
+static DUMB_IT_SIGDATA *it_okt_load_sigdata(DUMBFILE *f) {
+ DUMB_IT_SIGDATA *sigdata;
int n_channels;
int i, j, k, l;
- IFF_CHUNKED *mod;
- const IFF_CHUNK *chunk;
+ IFF_CHUNKED *mod;
+ const IFF_CHUNK *chunk;
- char signature[8];
+ char signature[8];
- if (dumbfile_getnc(signature, 8, f) < 8 ||
- memcmp(signature, "OKTASONG", 8)) {
- return NULL;
- }
+ if (dumbfile_getnc(signature, 8, f) < 8 ||
+ memcmp(signature, "OKTASONG", 8)) {
+ return NULL;
+ }
- mod = dumbfile_read_okt(f);
- if (!mod)
- return NULL;
+ mod = dumbfile_read_okt(f);
+ if (!mod)
+ return NULL;
- sigdata = (DUMB_IT_SIGDATA *) malloc(sizeof(*sigdata));
- if (!sigdata) {
- free_okt(mod);
- return NULL;
- }
+ sigdata = (DUMB_IT_SIGDATA *)malloc(sizeof(*sigdata));
+ if (!sigdata) {
+ free_okt(mod);
+ return NULL;
+ }
- sigdata->name[0] = 0;
+ sigdata->name[0] = 0;
- chunk = get_chunk_by_type(mod, DUMB_ID('S','P','E','E'), 0);
- if (!chunk || chunk->size < 2) {
- free(sigdata);
- free_okt(mod);
- return NULL;
- }
+ chunk = get_chunk_by_type(mod, DUMB_ID('S', 'P', 'E', 'E'), 0);
+ if (!chunk || chunk->size < 2) {
+ free(sigdata);
+ free_okt(mod);
+ return NULL;
+ }
- sigdata->speed = (chunk->data[0] << 8) | chunk->data[1];
+ sigdata->speed = (chunk->data[0] << 8) | chunk->data[1];
- chunk = get_chunk_by_type(mod, DUMB_ID('S','A','M','P'), 0);
- if (!chunk || chunk->size < 32) {
- free(sigdata);
- free_okt(mod);
- return NULL;
- }
+ chunk = get_chunk_by_type(mod, DUMB_ID('S', 'A', 'M', 'P'), 0);
+ if (!chunk || chunk->size < 32) {
+ free(sigdata);
+ free_okt(mod);
+ return NULL;
+ }
- sigdata->n_samples = chunk->size / 32;
+ sigdata->n_samples = chunk->size / 32;
- chunk = get_chunk_by_type(mod, DUMB_ID('C','M','O','D'), 0);
- if (!chunk || chunk->size < 8) {
- free(sigdata);
- free_okt(mod);
- return NULL;
- }
+ chunk = get_chunk_by_type(mod, DUMB_ID('C', 'M', 'O', 'D'), 0);
+ if (!chunk || chunk->size < 8) {
+ free(sigdata);
+ free_okt(mod);
+ return NULL;
+ }
- n_channels = 0;
+ n_channels = 0;
- for (i = 0; i < 4; i++) {
- j = (chunk->data[i * 2] << 8) | chunk->data[i * 2 + 1];
- if (!j) n_channels++;
- else if (j == 1) n_channels += 2;
- }
+ for (i = 0; i < 4; i++) {
+ j = (chunk->data[i * 2] << 8) | chunk->data[i * 2 + 1];
+ if (!j)
+ n_channels++;
+ else if (j == 1)
+ n_channels += 2;
+ }
- if (!n_channels) {
- free(sigdata);
- free_okt(mod);
- return NULL;
- }
+ if (!n_channels) {
+ free(sigdata);
+ free_okt(mod);
+ return NULL;
+ }
- sigdata->n_pchannels = n_channels;
+ sigdata->n_pchannels = n_channels;
- sigdata->sample = (IT_SAMPLE *) malloc(sigdata->n_samples * sizeof(*sigdata->sample));
- if (!sigdata->sample) {
- free(sigdata);
- free_okt(mod);
- return NULL;
- }
+ sigdata->sample =
+ (IT_SAMPLE *)malloc(sigdata->n_samples * sizeof(*sigdata->sample));
+ if (!sigdata->sample) {
+ free(sigdata);
+ free_okt(mod);
+ return NULL;
+ }
- sigdata->song_message = NULL;
- sigdata->order = NULL;
- sigdata->instrument = NULL;
- sigdata->pattern = NULL;
- sigdata->midi = NULL;
- sigdata->checkpoint = NULL;
+ sigdata->song_message = NULL;
+ sigdata->order = NULL;
+ sigdata->instrument = NULL;
+ sigdata->pattern = NULL;
+ sigdata->midi = NULL;
+ sigdata->checkpoint = NULL;
- sigdata->n_instruments = 0;
+ sigdata->n_instruments = 0;
- for (i = 0; i < sigdata->n_samples; i++)
- sigdata->sample[i].data = NULL;
+ for (i = 0; i < sigdata->n_samples; i++)
+ sigdata->sample[i].data = NULL;
- chunk = get_chunk_by_type(mod, DUMB_ID('S','A','M','P'), 0);
+ chunk = get_chunk_by_type(mod, DUMB_ID('S', 'A', 'M', 'P'), 0);
- for (i = 0; i < sigdata->n_samples; i++) {
- it_okt_read_sample_header(&sigdata->sample[i], chunk->data + 32 * i);
- }
+ for (i = 0; i < sigdata->n_samples; i++) {
+ it_okt_read_sample_header(&sigdata->sample[i], chunk->data + 32 * i);
+ }
- sigdata->restart_position = 0;
+ sigdata->restart_position = 0;
- chunk = get_chunk_by_type(mod, DUMB_ID('P','L','E','N'), 0);
- if (!chunk || chunk->size < 2) {
- _dumb_it_unload_sigdata(sigdata);
- free_okt(mod);
- return NULL;
- }
+ chunk = get_chunk_by_type(mod, DUMB_ID('P', 'L', 'E', 'N'), 0);
+ if (!chunk || chunk->size < 2) {
+ _dumb_it_unload_sigdata(sigdata);
+ free_okt(mod);
+ return NULL;
+ }
- sigdata->n_orders = (chunk->data[0] << 8) | chunk->data[1];
- // what if this is > 128?
+ sigdata->n_orders = (chunk->data[0] << 8) | chunk->data[1];
+ // what if this is > 128?
- if (sigdata->n_orders <= 0 || sigdata->n_orders > 128) {
- _dumb_it_unload_sigdata(sigdata);
- free_okt(mod);
- return NULL;
- }
+ if (sigdata->n_orders <= 0 || sigdata->n_orders > 128) {
+ _dumb_it_unload_sigdata(sigdata);
+ free_okt(mod);
+ return NULL;
+ }
- chunk = get_chunk_by_type(mod, DUMB_ID('P','A','T','T'), 0);
+ chunk = get_chunk_by_type(mod, DUMB_ID('P', 'A', 'T', 'T'), 0);
if (!chunk || chunk->size < (unsigned)sigdata->n_orders) {
- _dumb_it_unload_sigdata(sigdata);
- free_okt(mod);
- return NULL;
- }
+ _dumb_it_unload_sigdata(sigdata);
+ free_okt(mod);
+ return NULL;
+ }
- sigdata->order = (unsigned char *) malloc(sigdata->n_orders);
- if (!sigdata->order) {
- _dumb_it_unload_sigdata(sigdata);
- free_okt(mod);
- return NULL;
- }
+ sigdata->order = (unsigned char *)malloc(sigdata->n_orders);
+ if (!sigdata->order) {
+ _dumb_it_unload_sigdata(sigdata);
+ free_okt(mod);
+ return NULL;
+ }
- memcpy(sigdata->order, chunk->data, sigdata->n_orders);
+ memcpy(sigdata->order, chunk->data, sigdata->n_orders);
- /* Work out how many patterns there are. */
- chunk = get_chunk_by_type(mod, DUMB_ID('S','L','E','N'), 0);
- if (!chunk || chunk->size < 2) {
- _dumb_it_unload_sigdata(sigdata);
- free_okt(mod);
- return NULL;
- }
+ /* Work out how many patterns there are. */
+ chunk = get_chunk_by_type(mod, DUMB_ID('S', 'L', 'E', 'N'), 0);
+ if (!chunk || chunk->size < 2) {
+ _dumb_it_unload_sigdata(sigdata);
+ free_okt(mod);
+ return NULL;
+ }
- sigdata->n_patterns = (chunk->data[0] << 8) | chunk->data[1];
+ sigdata->n_patterns = (chunk->data[0] << 8) | chunk->data[1];
- j = get_chunk_count(mod, DUMB_ID('P','B','O','D'));
- if (sigdata->n_patterns > j) sigdata->n_patterns = j;
+ j = get_chunk_count(mod, DUMB_ID('P', 'B', 'O', 'D'));
+ if (sigdata->n_patterns > j)
+ sigdata->n_patterns = j;
- if (!sigdata->n_patterns) {
- _dumb_it_unload_sigdata(sigdata);
- free_okt(mod);
- return NULL;
- }
+ if (!sigdata->n_patterns) {
+ _dumb_it_unload_sigdata(sigdata);
+ free_okt(mod);
+ return NULL;
+ }
- sigdata->pattern = (IT_PATTERN *) malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
- if (!sigdata->pattern) {
- _dumb_it_unload_sigdata(sigdata);
- free_okt(mod);
- return NULL;
- }
- for (i = 0; i < sigdata->n_patterns; i++)
- sigdata->pattern[i].entry = NULL;
+ sigdata->pattern =
+ (IT_PATTERN *)malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
+ if (!sigdata->pattern) {
+ _dumb_it_unload_sigdata(sigdata);
+ free_okt(mod);
+ return NULL;
+ }
+ for (i = 0; i < sigdata->n_patterns; i++)
+ sigdata->pattern[i].entry = NULL;
- /* Read in the patterns */
- for (i = 0; i < sigdata->n_patterns; i++) {
- chunk = get_chunk_by_type(mod, DUMB_ID('P','B','O','D'), i);
- if (it_okt_read_pattern(&sigdata->pattern[i], chunk->data, chunk->size, n_channels) != 0) {
- _dumb_it_unload_sigdata(sigdata);
- free_okt(mod);
- return NULL;
- }
- }
+ /* Read in the patterns */
+ for (i = 0; i < sigdata->n_patterns; i++) {
+ chunk = get_chunk_by_type(mod, DUMB_ID('P', 'B', 'O', 'D'), i);
+ if (it_okt_read_pattern(&sigdata->pattern[i], chunk->data, chunk->size,
+ n_channels) != 0) {
+ _dumb_it_unload_sigdata(sigdata);
+ free_okt(mod);
+ return NULL;
+ }
+ }
+
+ /* And finally, the sample data */
+ k = get_chunk_count(mod, DUMB_ID('S', 'B', 'O', 'D'));
+ for (i = 0, j = 0; i < sigdata->n_samples && j < k; i++) {
+ if (sigdata->sample[i].flags & IT_SAMPLE_EXISTS) {
+ chunk = get_chunk_by_type(mod, DUMB_ID('S', 'B', 'O', 'D'), j);
+ if (it_okt_read_sample_data(&sigdata->sample[i],
+ (const char *)chunk->data,
+ chunk->size)) {
+ _dumb_it_unload_sigdata(sigdata);
+ free_okt(mod);
+ return NULL;
+ }
+ j++;
+ }
+ }
+ for (; i < sigdata->n_samples; i++) {
+ sigdata->sample[i].flags = 0;
+ }
- /* And finally, the sample data */
- k = get_chunk_count(mod, DUMB_ID('S','B','O','D'));
- for (i = 0, j = 0; i < sigdata->n_samples && j < k; i++) {
- if (sigdata->sample[i].flags & IT_SAMPLE_EXISTS) {
- chunk = get_chunk_by_type(mod, DUMB_ID('S','B','O','D'), j);
- if (it_okt_read_sample_data(&sigdata->sample[i], (const char *)chunk->data, chunk->size)) {
- _dumb_it_unload_sigdata(sigdata);
- free_okt(mod);
- return NULL;
- }
- j++;
- }
- }
- for (; i < sigdata->n_samples; i++) {
- sigdata->sample[i].flags = 0;
- }
+ chunk = get_chunk_by_type(mod, DUMB_ID('C', 'M', 'O', 'D'), 0);
- chunk = get_chunk_by_type(mod, DUMB_ID('C','M','O','D'), 0);
+ for (i = 0, j = 0; i < n_channels && j < 4; j++) {
+ k = (chunk->data[j * 2] << 8) | chunk->data[j * 2 + 1];
+ l = (j == 1 || j == 2) ? 48 : 16;
+ if (k == 0) {
+ sigdata->channel_pan[i++] = l;
+ } else if (k == 1) {
+ sigdata->channel_pan[i++] = l;
+ sigdata->channel_pan[i++] = l;
+ }
+ }
- for (i = 0, j = 0; i < n_channels && j < 4; j++) {
- k = (chunk->data[j * 2] << 8) | chunk->data[j * 2 + 1];
- l = (j == 1 || j == 2) ? 48 : 16;
- if (k == 0) {
- sigdata->channel_pan[i++] = l;
- }
- else if (k == 1) {
- sigdata->channel_pan[i++] = l;
- sigdata->channel_pan[i++] = l;
- }
- }
+ free_okt(mod);
- free_okt(mod);
+ /* Now let's initialise the remaining variables, and we're done! */
+ sigdata->flags = IT_WAS_AN_OKT | IT_WAS_AN_XM | IT_WAS_A_MOD |
+ IT_OLD_EFFECTS | IT_COMPATIBLE_GXX | IT_STEREO;
- /* Now let's initialise the remaining variables, and we're done! */
- sigdata->flags = IT_WAS_AN_OKT | IT_WAS_AN_XM | IT_WAS_A_MOD | IT_OLD_EFFECTS | IT_COMPATIBLE_GXX | IT_STEREO;
+ sigdata->global_volume = 128;
+ sigdata->mixing_volume = 48;
+ /* We want 50 ticks per second; 50/6 row advances per second;
+ * 50*10=500 row advances per minute; 500/4=125 beats per minute.
+ */
+ sigdata->tempo = 125;
+ sigdata->pan_separation = 128;
- sigdata->global_volume = 128;
- sigdata->mixing_volume = 48;
- /* We want 50 ticks per second; 50/6 row advances per second;
- * 50*10=500 row advances per minute; 500/4=125 beats per minute.
- */
- sigdata->tempo = 125;
- sigdata->pan_separation = 128;
+ memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
+ memset(sigdata->channel_pan + n_channels, 32,
+ DUMB_IT_N_CHANNELS - n_channels);
- memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
- memset(sigdata->channel_pan + n_channels, 32, DUMB_IT_N_CHANNELS - n_channels);
+ _dumb_it_fix_invalid_orders(sigdata);
- _dumb_it_fix_invalid_orders(sigdata);
-
- return sigdata;
+ return sigdata;
}
+DUH *dumb_read_okt_quick(DUMBFILE *f) {
+ sigdata_t *sigdata;
+ DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
-DUH *dumb_read_okt_quick(DUMBFILE *f)
-{
- sigdata_t *sigdata;
-
- DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
-
sigdata = it_okt_load_sigdata(f);
- if (!sigdata)
- return NULL;
+ if (!sigdata)
+ return NULL;
- {
- const char *tag[1][2];
- tag[0][0] = "FORMAT";
- tag[0][1] = "Oktalyzer";
- return make_duh(-1, 1, (const char *const (*)[2])tag, 1, &descptr, &sigdata);
- }
+ {
+ const char *tag[1][2];
+ tag[0][0] = "FORMAT";
+ tag[0][1] = "Oktalyzer";
+ return make_duh(-1, 1, (const char *const(*)[2])tag, 1, &descptr,
+ &sigdata);
+ }
}
--- a/src/it/readokt2.c
+++ b/src/it/readokt2.c
@@ -19,11 +19,8 @@
#include "dumb.h"
-
-
-DUH *dumb_read_okt(DUMBFILE *f)
-{
- DUH *duh = dumb_read_okt_quick(f);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+DUH *dumb_read_okt(DUMBFILE *f) {
+ DUH *duh = dumb_read_okt_quick(f);
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/readoldpsm.c
+++ b/src/it/readoldpsm.c
@@ -24,671 +24,721 @@
#include "dumb.h"
#include "internal/it.h"
-static int psm_sample_compare(const void *e1, const void *e2)
-{
- const unsigned char * pa = e1;
- const unsigned char * pb = e2;
- int a = pa[37] | (pa[38] << 8) | (pa[39] << 16) | (pa[40] << 24);
- int b = pb[37] | (pb[38] << 8) | (pb[39] << 16) | (pb[40] << 24);
- return a - b;
+static int psm_sample_compare(const void *e1, const void *e2) {
+ const unsigned char *pa = e1;
+ const unsigned char *pb = e2;
+ int a = pa[37] | (pa[38] << 8) | (pa[39] << 16) | (pa[40] << 24);
+ int b = pb[37] | (pb[38] << 8) | (pb[39] << 16) | (pb[40] << 24);
+ return a - b;
}
-static int it_old_psm_read_samples(IT_SAMPLE ** sample, DUMBFILE * f, int * num)
-{
+static int it_old_psm_read_samples(IT_SAMPLE **sample, DUMBFILE *f, int *num) {
int n, o, count = *num, true_num, snum, offset, flags, finetune, delta;
- unsigned char * buffer;
- const unsigned char * sdata;
+ unsigned char *buffer;
+ const unsigned char *sdata;
long sample_bytes;
- buffer = malloc(count * 64);
- if (!buffer) goto error;
+ buffer = malloc(count * 64);
+ if (!buffer)
+ goto error;
- if (dumbfile_getnc((char *)buffer, count * 64, f) < count * 64) goto error_fb;
+ if (dumbfile_getnc((char *)buffer, count * 64, f) < count * 64)
+ goto error_fb;
- true_num = 0;
+ true_num = 0;
- for (n = 0; n < count; n++) {
- snum = buffer[(n * 64) + 45] | (buffer[(n * 64) + 46] << 8);
- if ((snum < 1) || (snum > 255)) goto error_fb;
- if (true_num < snum) true_num = snum;
- }
+ for (n = 0; n < count; n++) {
+ snum = buffer[(n * 64) + 45] | (buffer[(n * 64) + 46] << 8);
+ if ((snum < 1) || (snum > 255))
+ goto error_fb;
+ if (true_num < snum)
+ true_num = snum;
+ }
- if (true_num > count) {
- IT_SAMPLE * meh = realloc(*sample, true_num * sizeof(*meh));
- if (!meh) goto error_fb;
- for (n = count; n < true_num; n++) {
- meh[n].data = NULL;
- }
- *sample = meh;
- *num = true_num;
- }
+ if (true_num > count) {
+ IT_SAMPLE *meh = realloc(*sample, true_num * sizeof(*meh));
+ if (!meh)
+ goto error_fb;
+ for (n = count; n < true_num; n++) {
+ meh[n].data = NULL;
+ }
+ *sample = meh;
+ *num = true_num;
+ }
- qsort(buffer, count, 64, &psm_sample_compare);
+ qsort(buffer, count, 64, &psm_sample_compare);
- for (n = 0; n < *num; n++) {
- (*sample)[n].flags = 0;
- }
+ for (n = 0; n < *num; n++) {
+ (*sample)[n].flags = 0;
+ }
- for (n = 0; n < count; n++) {
- IT_SAMPLE smp;
- IT_SAMPLE * s;
- snum = buffer[(n * 64) + 45] | (buffer[(n * 64) + 46] << 8);
- s = &((*sample)[snum - 1]);
- memcpy(smp.filename, buffer + (n * 64), 13);
- smp.filename[13] = 0;
- memcpy(smp.name, buffer + (n * 64) + 13, 24);
- smp.name[24] = 0;
- offset = buffer[(n * 64) + 37] | (buffer[(n * 64) + 38] << 8) |
- (buffer[(n * 64) + 39] << 16) | (buffer[(n * 64) + 40] << 24);
- flags = buffer[(n * 64) + 47];
- smp.length = buffer[(n * 64) + 48] | (buffer[(n * 64) + 49] << 8) |
- (buffer[(n * 64) + 50] << 16) | (buffer[(n * 64) + 51] << 24);
- smp.loop_start = buffer[(n * 64) + 52] | (buffer[(n * 64) + 53] << 8) |
- (buffer[(n * 64) + 54] << 16) | (buffer[(n * 64) + 55] << 24);
- smp.loop_end = buffer[(n * 64) + 56] | (buffer[(n * 64) + 57] << 8) |
- (buffer[(n * 64) + 58] << 16) | (buffer[(n * 64) + 59] << 24);
+ for (n = 0; n < count; n++) {
+ IT_SAMPLE smp;
+ IT_SAMPLE *s;
+ snum = buffer[(n * 64) + 45] | (buffer[(n * 64) + 46] << 8);
+ s = &((*sample)[snum - 1]);
+ memcpy(smp.filename, buffer + (n * 64), 13);
+ smp.filename[13] = 0;
+ memcpy(smp.name, buffer + (n * 64) + 13, 24);
+ smp.name[24] = 0;
+ offset = buffer[(n * 64) + 37] | (buffer[(n * 64) + 38] << 8) |
+ (buffer[(n * 64) + 39] << 16) | (buffer[(n * 64) + 40] << 24);
+ flags = buffer[(n * 64) + 47];
+ smp.length = buffer[(n * 64) + 48] | (buffer[(n * 64) + 49] << 8) |
+ (buffer[(n * 64) + 50] << 16) |
+ (buffer[(n * 64) + 51] << 24);
+ smp.loop_start = buffer[(n * 64) + 52] | (buffer[(n * 64) + 53] << 8) |
+ (buffer[(n * 64) + 54] << 16) |
+ (buffer[(n * 64) + 55] << 24);
+ smp.loop_end = buffer[(n * 64) + 56] | (buffer[(n * 64) + 57] << 8) |
+ (buffer[(n * 64) + 58] << 16) |
+ (buffer[(n * 64) + 59] << 24);
- if (smp.length <= 0) continue;
+ if (smp.length <= 0)
+ continue;
- finetune = buffer[(n * 64) + 60];
- smp.default_volume = buffer[(n * 64) + 61];
- smp.C5_speed = buffer[(n * 64) + 62] | (buffer[(n * 64) + 63] << 8);
- if (finetune & 15) {
- finetune &= 15;
- if (finetune >= 8) finetune -= 16;
- //s->C5_speed = (long)((double)s->C5_speed * pow(DUMB_PITCH_BASE, finetune*32));
- smp.finetune = finetune * 32;
- }
- else smp.finetune = 0;
+ finetune = buffer[(n * 64) + 60];
+ smp.default_volume = buffer[(n * 64) + 61];
+ smp.C5_speed = buffer[(n * 64) + 62] | (buffer[(n * 64) + 63] << 8);
+ if (finetune & 15) {
+ finetune &= 15;
+ if (finetune >= 8)
+ finetune -= 16;
+ // s->C5_speed = (long)((double)s->C5_speed * pow(DUMB_PITCH_BASE,
+ // finetune*32));
+ smp.finetune = finetune * 32;
+ } else
+ smp.finetune = 0;
- smp.flags |= IT_SAMPLE_EXISTS;
- if (flags & 0x41)
- continue;
- if (flags & 0x20) smp.flags |= IT_SAMPLE_PINGPONG_LOOP;
- if (flags & 4) smp.flags |= IT_SAMPLE_16BIT;
+ smp.flags |= IT_SAMPLE_EXISTS;
+ if (flags & 0x41)
+ continue;
+ if (flags & 0x20)
+ smp.flags |= IT_SAMPLE_PINGPONG_LOOP;
+ if (flags & 4)
+ smp.flags |= IT_SAMPLE_16BIT;
- if (flags & 0x80) {
- smp.flags |= IT_SAMPLE_LOOP;
- if ((unsigned int)smp.loop_end > (unsigned int)smp.length)
- smp.loop_end = smp.length;
- else if ((unsigned int)smp.loop_start >= (unsigned int)smp.loop_end)
- smp.flags &= ~IT_SAMPLE_LOOP;
- else
- smp.length = smp.loop_end;
- }
+ if (flags & 0x80) {
+ smp.flags |= IT_SAMPLE_LOOP;
+ if ((unsigned int)smp.loop_end > (unsigned int)smp.length)
+ smp.loop_end = smp.length;
+ else if ((unsigned int)smp.loop_start >= (unsigned int)smp.loop_end)
+ smp.flags &= ~IT_SAMPLE_LOOP;
+ else
+ smp.length = smp.loop_end;
+ }
- smp.global_volume = 64;
+ smp.global_volume = 64;
- smp.vibrato_speed = 0;
- smp.vibrato_depth = 0;
- smp.vibrato_rate = 0;
- smp.vibrato_waveform = IT_VIBRATO_SINE;
- smp.max_resampling_quality = -1;
+ smp.vibrato_speed = 0;
+ smp.vibrato_depth = 0;
+ smp.vibrato_rate = 0;
+ smp.vibrato_waveform = IT_VIBRATO_SINE;
+ smp.max_resampling_quality = -1;
sample_bytes = smp.length * ((flags & 4) ? 2 : 1);
smp.data = malloc(sample_bytes);
- if (!smp.data) goto error_fb;
- sdata = (const unsigned char *) smp.data;
+ if (!smp.data)
+ goto error_fb;
+ sdata = (const unsigned char *)smp.data;
- if (dumbfile_seek(f, offset, DFS_SEEK_SET) || dumbfile_getnc(smp.data, sample_bytes, f) < sample_bytes) goto error_fd;
+ if (dumbfile_seek(f, offset, DFS_SEEK_SET) ||
+ dumbfile_getnc(smp.data, sample_bytes, f) < sample_bytes)
+ goto error_fd;
- if (flags & 0x10) {
- if (flags & 8) {
- if (flags & 4) {
- for (o = 0; o < smp.length; o++)
- ((short *)smp.data)[o] = (sdata[o * 2] | (sdata[(o * 2) + 1] << 8)) ^ 0x8000;
- } else {
- for (o = 0; o < smp.length; o++)
- ((signed char *)smp.data)[o] = sdata[o] ^ 0x80;
- }
- } else {
- if (flags & 4) {
- for (o = 0; o < smp.length; o++)
- ((short *)smp.data)[o] = sdata[o * 2] | (sdata[(o * 2) + 1] << 8);
- } else {
- memcpy(smp.data, sdata, smp.length);
- }
- }
- } else {
- delta = 0;
- if (flags & 8) {
- /* unsigned delta? mehhh, does anything even use this? */
- if (flags & 4) {
- for (o = 0; o < smp.length; o++) {
- delta += (short)(sdata[o * 2] | (sdata[(o * 2) + 1] << 8));
- ((short *)smp.data)[o] = delta ^ 0x8000;
- }
- } else {
- for (o = 0; o < smp.length; o++) {
- delta += (signed char)sdata[o];
- ((signed char *)smp.data)[o] = delta ^ 0x80;
- }
- }
- } else {
- if (flags & 4) {
- for (o = 0; o < smp.length; o++) {
- delta += (signed short)(sdata[o * 2] | (sdata[(o * 2) + 1] << 8));
- ((signed short *)smp.data)[o] = delta;
- }
- } else {
- for (o = 0; o < smp.length; o++) {
- delta += (signed char)sdata[o];
- ((signed char *)smp.data)[o] = delta;
- }
- }
- }
- }
-
- if (s->data) free(s->data);
- *s = smp;
- }
+ if (flags & 0x10) {
+ if (flags & 8) {
+ if (flags & 4) {
+ for (o = 0; o < smp.length; o++)
+ ((short *)smp.data)[o] =
+ (sdata[o * 2] | (sdata[(o * 2) + 1] << 8)) ^ 0x8000;
+ } else {
+ for (o = 0; o < smp.length; o++)
+ ((signed char *)smp.data)[o] = sdata[o] ^ 0x80;
+ }
+ } else {
+ if (flags & 4) {
+ for (o = 0; o < smp.length; o++)
+ ((short *)smp.data)[o] =
+ sdata[o * 2] | (sdata[(o * 2) + 1] << 8);
+ } else {
+ memcpy(smp.data, sdata, smp.length);
+ }
+ }
+ } else {
+ delta = 0;
+ if (flags & 8) {
+ /* unsigned delta? mehhh, does anything even use this? */
+ if (flags & 4) {
+ for (o = 0; o < smp.length; o++) {
+ delta +=
+ (short)(sdata[o * 2] | (sdata[(o * 2) + 1] << 8));
+ ((short *)smp.data)[o] = delta ^ 0x8000;
+ }
+ } else {
+ for (o = 0; o < smp.length; o++) {
+ delta += (signed char)sdata[o];
+ ((signed char *)smp.data)[o] = delta ^ 0x80;
+ }
+ }
+ } else {
+ if (flags & 4) {
+ for (o = 0; o < smp.length; o++) {
+ delta += (signed short)(sdata[o * 2] |
+ (sdata[(o * 2) + 1] << 8));
+ ((signed short *)smp.data)[o] = delta;
+ }
+ } else {
+ for (o = 0; o < smp.length; o++) {
+ delta += (signed char)sdata[o];
+ ((signed char *)smp.data)[o] = delta;
+ }
+ }
+ }
+ }
- free(buffer);
+ if (s->data)
+ free(s->data);
+ *s = smp;
+ }
- return 0;
+ free(buffer);
+ return 0;
+
error_fd:
- free((void *)sdata);
+ free((void *)sdata);
error_fb:
- free(buffer);
+ free(buffer);
error:
- return -1;
+ return -1;
}
-static int it_old_psm_read_patterns(IT_PATTERN * pattern, DUMBFILE * f, int num, int size, int pchans)
-{
- int n, offset, psize, rows, chans, row, flags, channel;
+static int it_old_psm_read_patterns(IT_PATTERN *pattern, DUMBFILE *f, int num,
+ int size, int pchans) {
+ int n, offset, psize, rows, chans, row, flags, channel;
- unsigned char * buffer, * ptr, * end;
+ unsigned char *buffer, *ptr, *end;
- IT_ENTRY * entry;
+ IT_ENTRY *entry;
- buffer = malloc(size);
- if (!buffer) goto error;
+ buffer = malloc(size);
+ if (!buffer)
+ goto error;
- if (dumbfile_getnc((char *)buffer, size, f) < size) goto error_fb;
+ if (dumbfile_getnc((char *)buffer, size, f) < size)
+ goto error_fb;
- offset = 0;
+ offset = 0;
- for (n = 0; n < num; n++) {
- IT_PATTERN * p = &pattern[n];
+ for (n = 0; n < num; n++) {
+ IT_PATTERN *p = &pattern[n];
- if (offset >= size) goto error_fb;
+ if (offset >= size)
+ goto error_fb;
- ptr = buffer + offset;
- psize = ptr[0] | (ptr[1] << 8);
- rows = ptr[2];
- chans = ptr[3];
+ ptr = buffer + offset;
+ psize = ptr[0] | (ptr[1] << 8);
+ rows = ptr[2];
+ chans = ptr[3];
- if (!rows || !chans) {
- p->n_rows = 1;
- p->n_entries = 0;
- continue;
- }
+ if (!rows || !chans) {
+ p->n_rows = 1;
+ p->n_entries = 0;
+ continue;
+ }
- psize = (psize + 15) & ~15;
-
- if (offset + psize > size) goto error_fb;
+ psize = (psize + 15) & ~15;
- end = ptr + psize;
- ptr += 4;
+ if (offset + psize > size)
+ goto error_fb;
- p->n_rows = rows;
- p->n_entries = rows;
- row = 0;
+ end = ptr + psize;
+ ptr += 4;
- while ((row < rows) && (ptr < end)) {
- flags = *ptr++;
- if (!flags) {
- row++;
- continue;
- }
- if (flags & 0xE0) {
- p->n_entries++;
- if (flags & 0x80) ptr += 2;
- if (flags & 0x40) ptr++;
- if (flags & 0x20) {
- if (*ptr == 40) ptr += 4;
- else ptr += 2;
- }
- }
- }
+ p->n_rows = rows;
+ p->n_entries = rows;
+ row = 0;
- entry = malloc(p->n_entries * sizeof(*p->entry));
- if (!entry) goto error_fb;
+ while ((row < rows) && (ptr < end)) {
+ flags = *ptr++;
+ if (!flags) {
+ row++;
+ continue;
+ }
+ if (flags & 0xE0) {
+ p->n_entries++;
+ if (flags & 0x80)
+ ptr += 2;
+ if (flags & 0x40)
+ ptr++;
+ if (flags & 0x20) {
+ if (*ptr == 40)
+ ptr += 4;
+ else
+ ptr += 2;
+ }
+ }
+ }
- p->entry = entry;
+ entry = malloc(p->n_entries * sizeof(*p->entry));
+ if (!entry)
+ goto error_fb;
- ptr = buffer + offset + 4;
- row = 0;
+ p->entry = entry;
- while ((row < rows) && (ptr < end)) {
- flags = *ptr++;
- if (!flags) {
- IT_SET_END_ROW(entry);
- entry++;
- row++;
- continue;
- }
- if (flags & 0xE0) {
- entry->mask = 0;
- entry->channel = channel = flags & 0x1F;
- if (channel >= chans)
- {
- //channel = 0;
- //goto error_fb;
- }
- if (flags & 0x80) {
- if ((*ptr < 60) && (channel < pchans)) {
- entry->mask |= IT_ENTRY_NOTE;
- entry->note = *ptr + 35;
- }
- ptr++;
- if (*ptr) {
- entry->mask |= IT_ENTRY_INSTRUMENT;
- entry->instrument = *ptr;
- }
- ptr++;
- }
- if (flags & 0x40) {
- if (*ptr <= 64) {
- entry->mask |= IT_ENTRY_VOLPAN;
- entry->volpan = *ptr;
- }
- ptr++;
- }
- if (flags & 0x20) {
- entry->mask |= IT_ENTRY_EFFECT;
+ ptr = buffer + offset + 4;
+ row = 0;
+
+ while ((row < rows) && (ptr < end)) {
+ flags = *ptr++;
+ if (!flags) {
+ IT_SET_END_ROW(entry);
+ entry++;
+ row++;
+ continue;
+ }
+ if (flags & 0xE0) {
+ entry->mask = 0;
+ entry->channel = channel = flags & 0x1F;
+ if (channel >= chans) {
+ // channel = 0;
+ // goto error_fb;
+ }
+ if (flags & 0x80) {
+ if ((*ptr < 60) && (channel < pchans)) {
+ entry->mask |= IT_ENTRY_NOTE;
+ entry->note = *ptr + 35;
+ }
+ ptr++;
+ if (*ptr) {
+ entry->mask |= IT_ENTRY_INSTRUMENT;
+ entry->instrument = *ptr;
+ }
+ ptr++;
+ }
+ if (flags & 0x40) {
+ if (*ptr <= 64) {
+ entry->mask |= IT_ENTRY_VOLPAN;
+ entry->volpan = *ptr;
+ }
+ ptr++;
+ }
+ if (flags & 0x20) {
+ entry->mask |= IT_ENTRY_EFFECT;
- switch (*ptr) {
- case 1:
- entry->effect = IT_XM_FINE_VOLSLIDE_UP;
- entry->effectvalue = ptr[1];
- break;
+ switch (*ptr) {
+ case 1:
+ entry->effect = IT_XM_FINE_VOLSLIDE_UP;
+ entry->effectvalue = ptr[1];
+ break;
- case 2:
- entry->effect = IT_VOLUME_SLIDE;
- entry->effectvalue = (ptr[1] << 4) & 0xF0;
- break;
+ case 2:
+ entry->effect = IT_VOLUME_SLIDE;
+ entry->effectvalue = (ptr[1] << 4) & 0xF0;
+ break;
- case 3:
- entry->effect = IT_XM_FINE_VOLSLIDE_DOWN;
- entry->effectvalue = ptr[1];
- break;
+ case 3:
+ entry->effect = IT_XM_FINE_VOLSLIDE_DOWN;
+ entry->effectvalue = ptr[1];
+ break;
- case 4:
- entry->effect = IT_VOLUME_SLIDE;
- entry->effectvalue = ptr[1] & 0xF;
- break;
+ case 4:
+ entry->effect = IT_VOLUME_SLIDE;
+ entry->effectvalue = ptr[1] & 0xF;
+ break;
- case 10:
- entry->effect = IT_PORTAMENTO_UP;
- entry->effectvalue = EFFECT_VALUE(0xF, ptr[1]);
- break;
+ case 10:
+ entry->effect = IT_PORTAMENTO_UP;
+ entry->effectvalue = EFFECT_VALUE(0xF, ptr[1]);
+ break;
- case 11:
- entry->effect = IT_PORTAMENTO_UP;
- entry->effectvalue = ptr[1];
- break;
+ case 11:
+ entry->effect = IT_PORTAMENTO_UP;
+ entry->effectvalue = ptr[1];
+ break;
- case 12:
- entry->effect = IT_PORTAMENTO_DOWN;
- entry->effectvalue = EFFECT_VALUE(ptr[1], 0xF);
- break;
+ case 12:
+ entry->effect = IT_PORTAMENTO_DOWN;
+ entry->effectvalue = EFFECT_VALUE(ptr[1], 0xF);
+ break;
- case 13:
- entry->effect = IT_PORTAMENTO_DOWN;
- entry->effectvalue = ptr[1];
- break;
+ case 13:
+ entry->effect = IT_PORTAMENTO_DOWN;
+ entry->effectvalue = ptr[1];
+ break;
- case 14:
- entry->effect = IT_TONE_PORTAMENTO;
- entry->effectvalue = ptr[1];
- break;
+ case 14:
+ entry->effect = IT_TONE_PORTAMENTO;
+ entry->effectvalue = ptr[1];
+ break;
- case 15:
- entry->effect = IT_S;
- entry->effectvalue = EFFECT_VALUE(IT_S_SET_GLISSANDO_CONTROL, ptr[1] & 15);
- break;
+ case 15:
+ entry->effect = IT_S;
+ entry->effectvalue = EFFECT_VALUE(
+ IT_S_SET_GLISSANDO_CONTROL, ptr[1] & 15);
+ break;
- case 16:
- entry->effect = IT_VOLSLIDE_TONEPORTA;
- entry->effectvalue = ptr[1] << 4;
- break;
+ case 16:
+ entry->effect = IT_VOLSLIDE_TONEPORTA;
+ entry->effectvalue = ptr[1] << 4;
+ break;
- case 17:
- entry->effect = IT_VOLSLIDE_TONEPORTA;
- entry->effectvalue = ptr[1] & 0xF;
- break;
+ case 17:
+ entry->effect = IT_VOLSLIDE_TONEPORTA;
+ entry->effectvalue = ptr[1] & 0xF;
+ break;
- case 20:
- entry->effect = IT_VIBRATO;
- entry->effectvalue = ptr[1];
- break;
+ case 20:
+ entry->effect = IT_VIBRATO;
+ entry->effectvalue = ptr[1];
+ break;
- case 21:
- entry->effect = IT_S;
- entry->effectvalue = EFFECT_VALUE(IT_S_SET_VIBRATO_WAVEFORM, ptr[1] & 11);
- break;
+ case 21:
+ entry->effect = IT_S;
+ entry->effectvalue = EFFECT_VALUE(
+ IT_S_SET_VIBRATO_WAVEFORM, ptr[1] & 11);
+ break;
- case 22:
- entry->effect = IT_VOLSLIDE_VIBRATO;
- entry->effectvalue = ptr[1] << 4;
- break;
+ case 22:
+ entry->effect = IT_VOLSLIDE_VIBRATO;
+ entry->effectvalue = ptr[1] << 4;
+ break;
- case 23:
- entry->effect = IT_VOLSLIDE_VIBRATO;
- entry->effectvalue = ptr[1] & 0xF;
- break;
+ case 23:
+ entry->effect = IT_VOLSLIDE_VIBRATO;
+ entry->effectvalue = ptr[1] & 0xF;
+ break;
- case 30:
- entry->effect = IT_TREMOLO;
- entry->effectvalue = ptr[1];
- break;
+ case 30:
+ entry->effect = IT_TREMOLO;
+ entry->effectvalue = ptr[1];
+ break;
- case 31:
- entry->effect = IT_S;
- entry->effectvalue = EFFECT_VALUE(IT_S_SET_TREMOLO_WAVEFORM, ptr[1] & 11);
- break;
+ case 31:
+ entry->effect = IT_S;
+ entry->effectvalue = EFFECT_VALUE(
+ IT_S_SET_TREMOLO_WAVEFORM, ptr[1] & 11);
+ break;
- case 40:
- entry->effect = IT_SET_SAMPLE_OFFSET;
- entry->effectvalue = ptr[2];
- ptr += 2;
- break;
+ case 40:
+ entry->effect = IT_SET_SAMPLE_OFFSET;
+ entry->effectvalue = ptr[2];
+ ptr += 2;
+ break;
- case 41:
- entry->effect = IT_XM_RETRIGGER_NOTE;
- entry->effectvalue = ptr[1];
- break;
+ case 41:
+ entry->effect = IT_XM_RETRIGGER_NOTE;
+ entry->effectvalue = ptr[1];
+ break;
- case 42:
- entry->effect = IT_S;
- entry->effectvalue = EFFECT_VALUE(IT_S_DELAYED_NOTE_CUT, ptr[1] & 0xF);
- break;
+ case 42:
+ entry->effect = IT_S;
+ entry->effectvalue =
+ EFFECT_VALUE(IT_S_DELAYED_NOTE_CUT, ptr[1] & 0xF);
+ break;
- case 43:
- entry->effect = IT_S;
- entry->effectvalue = EFFECT_VALUE(IT_S_NOTE_DELAY, ptr[1] & 0xF);
- break;
+ case 43:
+ entry->effect = IT_S;
+ entry->effectvalue =
+ EFFECT_VALUE(IT_S_NOTE_DELAY, ptr[1] & 0xF);
+ break;
- case 50:
- entry->effect = IT_JUMP_TO_ORDER;
- entry->effectvalue = ptr[1];
- break;
+ case 50:
+ entry->effect = IT_JUMP_TO_ORDER;
+ entry->effectvalue = ptr[1];
+ break;
- case 51:
- entry->effect = IT_BREAK_TO_ROW;
- entry->effectvalue = ptr[1];
- break;
+ case 51:
+ entry->effect = IT_BREAK_TO_ROW;
+ entry->effectvalue = ptr[1];
+ break;
- case 52:
- entry->effect = IT_S;
- entry->effectvalue = EFFECT_VALUE(IT_S_PATTERN_LOOP, ptr[1] & 0xF);
- break;
+ case 52:
+ entry->effect = IT_S;
+ entry->effectvalue =
+ EFFECT_VALUE(IT_S_PATTERN_LOOP, ptr[1] & 0xF);
+ break;
- case 53:
- entry->effect = IT_S;
- entry->effectvalue = EFFECT_VALUE(IT_S_PATTERN_DELAY, ptr[1] & 0xF);
- break;
+ case 53:
+ entry->effect = IT_S;
+ entry->effectvalue =
+ EFFECT_VALUE(IT_S_PATTERN_DELAY, ptr[1] & 0xF);
+ break;
- case 60:
- entry->effect = IT_SET_SPEED;
- entry->effectvalue = ptr[1];
- break;
+ case 60:
+ entry->effect = IT_SET_SPEED;
+ entry->effectvalue = ptr[1];
+ break;
- case 61:
- entry->effect = IT_SET_SONG_TEMPO;
- entry->effectvalue = ptr[1];
- break;
+ case 61:
+ entry->effect = IT_SET_SONG_TEMPO;
+ entry->effectvalue = ptr[1];
+ break;
- case 70:
- entry->effect = IT_ARPEGGIO;
- entry->effectvalue = ptr[1];
- break;
+ case 70:
+ entry->effect = IT_ARPEGGIO;
+ entry->effectvalue = ptr[1];
+ break;
- case 71:
- entry->effect = IT_S;
- entry->effectvalue = EFFECT_VALUE(IT_S_FINETUNE, ptr[1] & 0xF);
- break;
+ case 71:
+ entry->effect = IT_S;
+ entry->effectvalue =
+ EFFECT_VALUE(IT_S_FINETUNE, ptr[1] & 0xF);
+ break;
- case 72:
- /* "balance" ... panning? */
- entry->effect = IT_SET_PANNING;
- entry->effectvalue = ((ptr[1] - ((ptr[1] & 8) >> 3)) << 5) / 7;
- break;
+ case 72:
+ /* "balance" ... panning? */
+ entry->effect = IT_SET_PANNING;
+ entry->effectvalue =
+ ((ptr[1] - ((ptr[1] & 8) >> 3)) << 5) / 7;
+ break;
- default:
- entry->mask &= ~IT_ENTRY_EFFECT;
- }
+ default:
+ entry->mask &= ~IT_ENTRY_EFFECT;
+ }
- ptr += 2;
- }
- if (entry->mask) entry++;
- }
- }
+ ptr += 2;
+ }
+ if (entry->mask)
+ entry++;
+ }
+ }
- p->n_entries = (int)(entry - p->entry);
- offset += psize;
- }
+ p->n_entries = (int)(entry - p->entry);
+ offset += psize;
+ }
- free(buffer);
+ free(buffer);
- return 0;
+ return 0;
error_fb:
- free(buffer);
+ free(buffer);
error:
- return -1;
+ return -1;
}
-#define PSM_COMPONENT_ORDERS 0
-#define PSM_COMPONENT_PANPOS 1
-#define PSM_COMPONENT_PATTERNS 2
-#define PSM_COMPONENT_SAMPLE_HEADERS 3
-#define PSM_COMPONENT_COMMENTS 4
+#define PSM_COMPONENT_ORDERS 0
+#define PSM_COMPONENT_PANPOS 1
+#define PSM_COMPONENT_PATTERNS 2
+#define PSM_COMPONENT_SAMPLE_HEADERS 3
+#define PSM_COMPONENT_COMMENTS 4
-typedef struct PSM_COMPONENT
-{
- unsigned char type;
- long offset;
-}
-PSM_COMPONENT;
+typedef struct PSM_COMPONENT {
+ unsigned char type;
+ long offset;
+} PSM_COMPONENT;
-static int psm_component_compare(const void *e1, const void *e2)
-{
- return (int)(((const PSM_COMPONENT *)e1)->offset -
- ((const PSM_COMPONENT *)e2)->offset);
+static int psm_component_compare(const void *e1, const void *e2) {
+ return (int)(((const PSM_COMPONENT *)e1)->offset -
+ ((const PSM_COMPONENT *)e2)->offset);
}
-static DUMB_IT_SIGDATA *it_old_psm_load_sigdata(DUMBFILE *f)
-{
- DUMB_IT_SIGDATA *sigdata;
+static DUMB_IT_SIGDATA *it_old_psm_load_sigdata(DUMBFILE *f) {
+ DUMB_IT_SIGDATA *sigdata;
- PSM_COMPONENT *component;
- int n_components = 0;
+ PSM_COMPONENT *component;
+ int n_components = 0;
- int n, flags, version, pver, n_orders, n_channels, total_pattern_size;
+ int n, flags, version, pver, n_orders, n_channels, total_pattern_size;
- if (dumbfile_mgetl(f) != DUMB_ID('P','S','M',254)) goto error;
+ if (dumbfile_mgetl(f) != DUMB_ID('P', 'S', 'M', 254))
+ goto error;
- sigdata = malloc(sizeof(*sigdata));
- if (!sigdata) goto error;
+ sigdata = malloc(sizeof(*sigdata));
+ if (!sigdata)
+ goto error;
if (dumbfile_getnc((char *)sigdata->name, 60, f) < 60 ||
- sigdata->name[59] != 0x1A) goto error_sd;
- sigdata->name[59] = 0;
+ sigdata->name[59] != 0x1A)
+ goto error_sd;
+ sigdata->name[59] = 0;
- flags = dumbfile_getc(f);
- version = dumbfile_getc(f);
- pver = dumbfile_getc(f);
- sigdata->speed = dumbfile_getc(f);
- sigdata->tempo = dumbfile_getc(f);
- sigdata->mixing_volume = dumbfile_getc(f);
- sigdata->n_orders = dumbfile_igetw(f);
- n_orders = dumbfile_igetw(f);
- sigdata->n_patterns = dumbfile_igetw(f);
- sigdata->n_samples = dumbfile_igetw(f);
- sigdata->n_pchannels = dumbfile_igetw(f);
- n_channels = dumbfile_igetw(f);
+ flags = dumbfile_getc(f);
+ version = dumbfile_getc(f);
+ pver = dumbfile_getc(f);
+ sigdata->speed = dumbfile_getc(f);
+ sigdata->tempo = dumbfile_getc(f);
+ sigdata->mixing_volume = dumbfile_getc(f);
+ sigdata->n_orders = dumbfile_igetw(f);
+ n_orders = dumbfile_igetw(f);
+ sigdata->n_patterns = dumbfile_igetw(f);
+ sigdata->n_samples = dumbfile_igetw(f);
+ sigdata->n_pchannels = dumbfile_igetw(f);
+ n_channels = dumbfile_igetw(f);
- if (dumbfile_error(f) ||
- (flags & 1) ||
- (version != 1 && version != 0x10) ||
- (pver) ||
- (sigdata->n_orders <= 0) ||
- (sigdata->n_orders > 255) ||
- (n_orders > 255) ||
- (n_orders < sigdata->n_orders) ||
- (sigdata->n_patterns > 255) ||
- (sigdata->n_samples > 255) ||
- (sigdata->n_pchannels > DUMB_IT_N_CHANNELS) ||
- (sigdata->n_pchannels > n_channels) ||
- (n_channels > DUMB_IT_N_CHANNELS))
- goto error_sd;
+ if (dumbfile_error(f) || (flags & 1) || (version != 1 && version != 0x10) ||
+ (pver) || (sigdata->n_orders <= 0) || (sigdata->n_orders > 255) ||
+ (n_orders > 255) || (n_orders < sigdata->n_orders) ||
+ (sigdata->n_patterns > 255) || (sigdata->n_samples > 255) ||
+ (sigdata->n_pchannels > DUMB_IT_N_CHANNELS) ||
+ (sigdata->n_pchannels > n_channels) ||
+ (n_channels > DUMB_IT_N_CHANNELS))
+ goto error_sd;
- sigdata->flags = IT_STEREO | IT_OLD_EFFECTS | IT_COMPATIBLE_GXX;
+ sigdata->flags = IT_STEREO | IT_OLD_EFFECTS | IT_COMPATIBLE_GXX;
- sigdata->global_volume = 128;
- sigdata->pan_separation = 128;
+ sigdata->global_volume = 128;
+ sigdata->pan_separation = 128;
- sigdata->song_message = NULL;
- sigdata->order = NULL;
- sigdata->instrument = NULL;
- sigdata->sample = NULL;
- sigdata->pattern = NULL;
- sigdata->midi = NULL;
- sigdata->checkpoint = NULL;
+ sigdata->song_message = NULL;
+ sigdata->order = NULL;
+ sigdata->instrument = NULL;
+ sigdata->sample = NULL;
+ sigdata->pattern = NULL;
+ sigdata->midi = NULL;
+ sigdata->checkpoint = NULL;
- sigdata->n_instruments = 0;
+ sigdata->n_instruments = 0;
- sigdata->restart_position = 0;
+ sigdata->restart_position = 0;
- sigdata->order = malloc(sigdata->n_orders);
- if (!sigdata->order) goto error_usd;
+ sigdata->order = malloc(sigdata->n_orders);
+ if (!sigdata->order)
+ goto error_usd;
- if (sigdata->n_samples) {
- sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
- if (!sigdata->sample) goto error_usd;
- for (n = 0; n < sigdata->n_samples; n++)
- sigdata->sample[n].data = NULL;
- }
+ if (sigdata->n_samples) {
+ sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
+ if (!sigdata->sample)
+ goto error_usd;
+ for (n = 0; n < sigdata->n_samples; n++)
+ sigdata->sample[n].data = NULL;
+ }
- if (sigdata->n_patterns) {
- sigdata->pattern = malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
- if (!sigdata->pattern) goto error_usd;
- for (n = 0; n < sigdata->n_patterns; n++)
- sigdata->pattern[n].entry = NULL;
- }
+ if (sigdata->n_patterns) {
+ sigdata->pattern =
+ malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
+ if (!sigdata->pattern)
+ goto error_usd;
+ for (n = 0; n < sigdata->n_patterns; n++)
+ sigdata->pattern[n].entry = NULL;
+ }
- component = malloc(5 * sizeof(*component));
- if (!component) goto error_usd;
+ component = malloc(5 * sizeof(*component));
+ if (!component)
+ goto error_usd;
- for (n = 0; n < 5; n++) {
- component[n_components].offset = dumbfile_igetl(f);
- if (component[n_components].offset) {
- component[n_components].type = n;
- n_components++;
- }
- }
+ for (n = 0; n < 5; n++) {
+ component[n_components].offset = dumbfile_igetl(f);
+ if (component[n_components].offset) {
+ component[n_components].type = n;
+ n_components++;
+ }
+ }
- if (!n_components) goto error_fc;
+ if (!n_components)
+ goto error_fc;
- total_pattern_size = (int)dumbfile_igetl(f);
- if (!total_pattern_size) goto error_fc;
+ total_pattern_size = (int)dumbfile_igetl(f);
+ if (!total_pattern_size)
+ goto error_fc;
- qsort(component, n_components, sizeof(PSM_COMPONENT), &psm_component_compare);
+ qsort(component, n_components, sizeof(PSM_COMPONENT),
+ &psm_component_compare);
- memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
+ memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
- for (n = 0; n < DUMB_IT_N_CHANNELS; n += 4) {
- int sep = 32 * dumb_it_default_panning_separation / 100;
- sigdata->channel_pan[n ] = 32 - sep;
- sigdata->channel_pan[n+1] = 32 + sep;
- sigdata->channel_pan[n+2] = 32 + sep;
- sigdata->channel_pan[n+3] = 32 - sep;
- }
+ for (n = 0; n < DUMB_IT_N_CHANNELS; n += 4) {
+ int sep = 32 * dumb_it_default_panning_separation / 100;
+ sigdata->channel_pan[n] = 32 - sep;
+ sigdata->channel_pan[n + 1] = 32 + sep;
+ sigdata->channel_pan[n + 2] = 32 + sep;
+ sigdata->channel_pan[n + 3] = 32 - sep;
+ }
- for (n = 0; n < n_components; n++)
- {
- int o;
+ for (n = 0; n < n_components; n++) {
+ int o;
- if ( dumbfile_seek(f, component[n].offset, DFS_SEEK_SET) ) goto error_fc;
+ if (dumbfile_seek(f, component[n].offset, DFS_SEEK_SET))
+ goto error_fc;
- switch (component[n].type) {
+ switch (component[n].type) {
- case PSM_COMPONENT_ORDERS:
- if (dumbfile_getnc((char *)sigdata->order, sigdata->n_orders, f) < sigdata->n_orders) goto error_fc;
- if (n_orders > sigdata->n_orders)
- if (dumbfile_skip(f, n_orders - sigdata->n_orders))
- goto error_fc;
- if (dumbfile_igetw(f)) goto error_fc;
- break;
+ case PSM_COMPONENT_ORDERS:
+ if (dumbfile_getnc((char *)sigdata->order, sigdata->n_orders, f) <
+ sigdata->n_orders)
+ goto error_fc;
+ if (n_orders > sigdata->n_orders)
+ if (dumbfile_skip(f, n_orders - sigdata->n_orders))
+ goto error_fc;
+ if (dumbfile_igetw(f))
+ goto error_fc;
+ break;
- case PSM_COMPONENT_PANPOS:
- if (dumbfile_getnc((char *)sigdata->channel_pan, sigdata->n_pchannels, f) < sigdata->n_pchannels) goto error_fc;
- for (o = 0; o < sigdata->n_pchannels; o++) {
- sigdata->channel_pan[o] -= (sigdata->channel_pan[o] & 8) >> 3;
- sigdata->channel_pan[o] = ((int)sigdata->channel_pan[o] << 5) / 7;
- }
- break;
+ case PSM_COMPONENT_PANPOS:
+ if (dumbfile_getnc((char *)sigdata->channel_pan,
+ sigdata->n_pchannels, f) < sigdata->n_pchannels)
+ goto error_fc;
+ for (o = 0; o < sigdata->n_pchannels; o++) {
+ sigdata->channel_pan[o] -= (sigdata->channel_pan[o] & 8) >> 3;
+ sigdata->channel_pan[o] =
+ ((int)sigdata->channel_pan[o] << 5) / 7;
+ }
+ break;
- case PSM_COMPONENT_PATTERNS:
- if (it_old_psm_read_patterns(sigdata->pattern, f, sigdata->n_patterns, total_pattern_size, sigdata->n_pchannels)) goto error_fc;
- break;
+ case PSM_COMPONENT_PATTERNS:
+ if (it_old_psm_read_patterns(
+ sigdata->pattern, f, sigdata->n_patterns,
+ total_pattern_size, sigdata->n_pchannels))
+ goto error_fc;
+ break;
- case PSM_COMPONENT_SAMPLE_HEADERS:
- if (it_old_psm_read_samples(&sigdata->sample, f, &sigdata->n_samples)) goto error_fc;
- break;
+ case PSM_COMPONENT_SAMPLE_HEADERS:
+ if (it_old_psm_read_samples(&sigdata->sample, f,
+ &sigdata->n_samples))
+ goto error_fc;
+ break;
- case PSM_COMPONENT_COMMENTS:
- if (dumbfile_mgetl(f) == DUMB_ID('T','E','X','T')) {
- o = dumbfile_igetw(f);
- if (o > 0) {
- sigdata->song_message = malloc(o + 1);
- if (dumbfile_getnc((char *)sigdata->song_message, o, f) < o) goto error_fc;
- sigdata->song_message[o] = 0;
- }
- }
- break;
- }
- }
+ case PSM_COMPONENT_COMMENTS:
+ if (dumbfile_mgetl(f) == DUMB_ID('T', 'E', 'X', 'T')) {
+ o = dumbfile_igetw(f);
+ if (o > 0) {
+ sigdata->song_message = malloc(o + 1);
+ if (dumbfile_getnc((char *)sigdata->song_message, o, f) < o)
+ goto error_fc;
+ sigdata->song_message[o] = 0;
+ }
+ }
+ break;
+ }
+ }
- _dumb_it_fix_invalid_orders(sigdata);
+ _dumb_it_fix_invalid_orders(sigdata);
- free(component);
+ free(component);
- return sigdata;
+ return sigdata;
error_fc:
- free(component);
+ free(component);
error_usd:
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
error_sd:
- free(sigdata);
+ free(sigdata);
error:
- return NULL;
+ return NULL;
}
-DUH *dumb_read_old_psm_quick(DUMBFILE *f)
-{
- sigdata_t *sigdata;
+DUH *dumb_read_old_psm_quick(DUMBFILE *f) {
+ sigdata_t *sigdata;
- DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
+ DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
- sigdata = it_old_psm_load_sigdata(f);
+ sigdata = it_old_psm_load_sigdata(f);
- if (!sigdata)
- return NULL;
+ if (!sigdata)
+ return NULL;
- {
- const char *tag[2][2];
- tag[0][0] = "TITLE";
+ {
+ const char *tag[2][2];
+ tag[0][0] = "TITLE";
tag[0][1] = (const char *)(((DUMB_IT_SIGDATA *)sigdata)->name);
- tag[1][0] = "FORMAT";
- tag[1][1] = "PSM (old)";
- return make_duh(-1, 2, (const char *const (*)[2])tag, 1, &descptr, &sigdata);
- }
+ tag[1][0] = "FORMAT";
+ tag[1][1] = "PSM (old)";
+ return make_duh(-1, 2, (const char *const(*)[2])tag, 1, &descptr,
+ &sigdata);
+ }
}
--- a/src/it/readpsm.c
+++ b/src/it/readpsm.c
@@ -34,1267 +34,1382 @@
#define PSMV_OLD 940730
#define PSMV_NEW 940902
-typedef struct _PSMCHUNK
-{
- int id;
- size_t len;
- unsigned char * data;
+typedef struct _PSMCHUNK {
+ int id;
+ size_t len;
+ unsigned char *data;
} PSMCHUNK;
-typedef struct _PSMEVENT
-{
- int type;
- unsigned char data[8];
+typedef struct _PSMEVENT {
+ int type;
+ unsigned char data[8];
} PSMEVENT;
-#define PSM_EVENT_END 0
-#define PSM_EVENT_PLAY_PATTERN 1
-#define PSM_EVENT_JUMP_TO_LINE 4
-#define PSM_EVENT_SET_SPEED 7
-#define PSM_EVENT_SET_BPM 8
+#define PSM_EVENT_END 0
+#define PSM_EVENT_PLAY_PATTERN 1
+#define PSM_EVENT_JUMP_TO_LINE 4
+#define PSM_EVENT_SET_SPEED 7
+#define PSM_EVENT_SET_BPM 8
#define PSM_EVENT_SAMPLE_MAP_TABLE 12
-#define PSM_EVENT_CHANGE_PAN 13
-#define PSM_EVENT_CHANGE_VOL 14
+#define PSM_EVENT_CHANGE_PAN 13
+#define PSM_EVENT_CHANGE_VOL 14
-static int it_psm_process_sample(IT_SAMPLE * sample, const unsigned char * data, size_t len, int id, int version) {
- int flags;
- int insno;
- size_t length;
- int loopstart;
- int loopend;
- int panpos;
- int defvol;
- int samplerate;
+static int it_psm_process_sample(IT_SAMPLE *sample, const unsigned char *data,
+ size_t len, int id, int version) {
+ int flags;
+ int insno;
+ size_t length;
+ int loopstart;
+ int loopend;
+ int panpos;
+ int defvol;
+ int samplerate;
- if (len < 0x60) return -1;
+ if (len < 0x60)
+ return -1;
- flags = data[0];
+ flags = data[0];
- if (version == PSMV_OLD) {
- memcpy(sample->name, data + 0x0D, 34);
- sample->name[34] = 0;
+ if (version == PSMV_OLD) {
+ memcpy(sample->name, data + 0x0D, 34);
+ sample->name[34] = 0;
- insno = data[0x34] | (data[0x35] << 8);
- length = data[0x36] | (data[0x37] << 8) | (data[0x38] << 16) | (data[0x39] << 24);
- loopstart = data[0x3A] | (data[0x3B] << 8) | (data[0x3C] << 16) | (data[0x3D] << 24);
- loopend = data[0x3E] | (data[0x3F] << 8) | (data[0x40] << 16) | (data[0x41] << 24);
- panpos = data[0x43];
- defvol = data[0x44];
- samplerate = data[0x49] | (data[0x4A] << 8) | (data[0x4B] << 16) | (data[0x4C] << 24);
- } else /*if (version == PSMV_NEW)*/ {
- memcpy(sample->name, data + 0x11, 34);
- sample->name[34] = 0;
+ insno = data[0x34] | (data[0x35] << 8);
+ length = data[0x36] | (data[0x37] << 8) | (data[0x38] << 16) |
+ (data[0x39] << 24);
+ loopstart = data[0x3A] | (data[0x3B] << 8) | (data[0x3C] << 16) |
+ (data[0x3D] << 24);
+ loopend = data[0x3E] | (data[0x3F] << 8) | (data[0x40] << 16) |
+ (data[0x41] << 24);
+ panpos = data[0x43];
+ defvol = data[0x44];
+ samplerate = data[0x49] | (data[0x4A] << 8) | (data[0x4B] << 16) |
+ (data[0x4C] << 24);
+ } else /*if (version == PSMV_NEW)*/ {
+ memcpy(sample->name, data + 0x11, 34);
+ sample->name[34] = 0;
- insno = data[0x38] | (data[0x39] << 8);
- length = data[0x3A] | (data[0x3B] << 8) | (data[0x3C] << 16) | (data[0x3D] << 24);
- loopstart = data[0x3E] | (data[0x3F] << 8) | (data[0x40] << 16) | (data[0x41] << 24);
- loopend = data[0x42] | (data[0x43] << 8) | (data[0x44] << 16) | (data[0x45] << 24);
- panpos = data[0x48];
- defvol = data[0x49];
- samplerate = data[0x4E] | (data[0x4F] << 8) | (data[0x50] << 16) | (data[0x51] << 24);
- }
+ insno = data[0x38] | (data[0x39] << 8);
+ length = data[0x3A] | (data[0x3B] << 8) | (data[0x3C] << 16) |
+ (data[0x3D] << 24);
+ loopstart = data[0x3E] | (data[0x3F] << 8) | (data[0x40] << 16) |
+ (data[0x41] << 24);
+ loopend = data[0x42] | (data[0x43] << 8) | (data[0x44] << 16) |
+ (data[0x45] << 24);
+ panpos = data[0x48];
+ defvol = data[0x49];
+ samplerate = data[0x4E] | (data[0x4F] << 8) | (data[0x50] << 16) |
+ (data[0x51] << 24);
+ }
- if (insno != id) return -1;
+ if (insno != id)
+ return -1;
- if (length <= 0) {
- sample->flags &= ~IT_SAMPLE_EXISTS;
- return 0;
- }
+ if (length <= 0) {
+ sample->flags &= ~IT_SAMPLE_EXISTS;
+ return 0;
+ }
- if ((length > len - 0x60) || ((flags & 0x7F) != 0)) return -1;
+ if ((length > len - 0x60) || ((flags & 0x7F) != 0))
+ return -1;
- sample->flags = IT_SAMPLE_EXISTS;
- sample->length = length;
- sample->loop_start = loopstart;
- sample->loop_end = loopend;
- sample->C5_speed = samplerate;
- sample->default_volume = defvol >> 1;
- sample->default_pan = 0;
- sample->filename[0] = 0;
- sample->global_volume = 64;
- sample->vibrato_speed = 0;
- sample->vibrato_depth = 0;
- sample->vibrato_rate = 0;
- sample->vibrato_waveform = IT_VIBRATO_SINE;
- sample->finetune = 0;
- sample->max_resampling_quality = -1;
+ sample->flags = IT_SAMPLE_EXISTS;
+ sample->length = length;
+ sample->loop_start = loopstart;
+ sample->loop_end = loopend;
+ sample->C5_speed = samplerate;
+ sample->default_volume = defvol >> 1;
+ sample->default_pan = 0;
+ sample->filename[0] = 0;
+ sample->global_volume = 64;
+ sample->vibrato_speed = 0;
+ sample->vibrato_depth = 0;
+ sample->vibrato_rate = 0;
+ sample->vibrato_waveform = IT_VIBRATO_SINE;
+ sample->finetune = 0;
+ sample->max_resampling_quality = -1;
- if (flags & 0x80) {
- if (((unsigned int)sample->loop_end <= (unsigned int)sample->length) &&
- ((unsigned int)sample->loop_start < (unsigned int)sample->loop_end)) {
- sample->length = sample->loop_end;
- sample->flags |= IT_SAMPLE_LOOP;
- }
- }
+ if (flags & 0x80) {
+ if (((unsigned int)sample->loop_end <= (unsigned int)sample->length) &&
+ ((unsigned int)sample->loop_start <
+ (unsigned int)sample->loop_end)) {
+ sample->length = sample->loop_end;
+ sample->flags |= IT_SAMPLE_LOOP;
+ }
+ }
- sample->data = malloc(sample->length);
- if (!sample->data)
- return -1;
+ sample->data = malloc(sample->length);
+ if (!sample->data)
+ return -1;
- flags = 0;
- data += 0x60;
+ flags = 0;
+ data += 0x60;
- for (insno = 0; insno < sample->length; insno++) {
- flags += (signed char)(*data++);
- ((signed char *)sample->data)[insno] = flags;
- }
+ for (insno = 0; insno < sample->length; insno++) {
+ flags += (signed char)(*data++);
+ ((signed char *)sample->data)[insno] = flags;
+ }
- return 0;
+ return 0;
}
-static int it_psm_process_pattern(IT_PATTERN * pattern, const unsigned char * data, size_t len, int speed, int bpm, const unsigned char * pan, const int * vol, int version) {
- size_t length, pos, rowlen;
- int nrows, row;
- unsigned flags, chan;
- IT_ENTRY * entry;
+static int it_psm_process_pattern(IT_PATTERN *pattern,
+ const unsigned char *data, size_t len,
+ int speed, int bpm, const unsigned char *pan,
+ const int *vol, int version) {
+ size_t length, pos, rowlen;
+ int nrows, row;
+ unsigned flags, chan;
+ IT_ENTRY *entry;
- length = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);
- if (len > length) len = length;
+ length = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);
+ if (len > length)
+ len = length;
- if (version == PSMV_OLD) {
- if (len < 10) return -1;
- data += 8;
- len -= 8;
- } else /*if (version == PSMV_NEW)*/ {
- if (len < 14) return -1;
- data += 12;
- len -= 12;
- }
+ if (version == PSMV_OLD) {
+ if (len < 10)
+ return -1;
+ data += 8;
+ len -= 8;
+ } else /*if (version == PSMV_NEW)*/ {
+ if (len < 14)
+ return -1;
+ data += 12;
+ len -= 12;
+ }
- nrows = data[0] | (data[1] << 8);
+ nrows = data[0] | (data[1] << 8);
- if (!nrows) {
- pattern->n_rows = 0;
- pattern->n_entries = 0;
- pattern->entry = NULL;
- return 0;
- }
+ if (!nrows) {
+ pattern->n_rows = 0;
+ pattern->n_entries = 0;
+ pattern->entry = NULL;
+ return 0;
+ }
- pattern->n_rows = nrows;
+ pattern->n_rows = nrows;
- data += 2;
- len -= 2;
+ data += 2;
+ len -= 2;
- pattern->n_entries = 0;
+ pattern->n_entries = 0;
- row = 0;
- pos = 2;
- rowlen = data[0] | (data[1] << 8);
+ row = 0;
+ pos = 2;
+ rowlen = data[0] | (data[1] << 8);
- while ((row < nrows) && (pos < len)) {
- if (pos >= rowlen) {
- row++;
- rowlen += data[pos] | (data[pos+1] << 8);
- pos += 2;
- continue;
- }
+ while ((row < nrows) && (pos < len)) {
+ if (pos >= rowlen) {
+ row++;
+ rowlen += data[pos] | (data[pos + 1] << 8);
+ pos += 2;
+ continue;
+ }
- flags = data[pos++];
- chan = data[pos++];
+ flags = data[pos++];
+ chan = data[pos++];
- if (chan > 63) return -1;
+ if (chan > 63)
+ return -1;
- if (flags & 0xF0) {
- pattern->n_entries++;
- if (flags & 0x80) pos++;
- if (flags & 0x40) pos++;
- if (flags & 0x20) pos++;
- if (flags & 0x10) {
- switch (data[pos]) {
- case 0x29:
- pos++;
- case 0x33:
- pos++;
- default:
- pos += 2;
- }
- }
- }
- }
+ if (flags & 0xF0) {
+ pattern->n_entries++;
+ if (flags & 0x80)
+ pos++;
+ if (flags & 0x40)
+ pos++;
+ if (flags & 0x20)
+ pos++;
+ if (flags & 0x10) {
+ switch (data[pos]) {
+ case 0x29:
+ pos++;
+ case 0x33:
+ pos++;
+ default:
+ pos += 2;
+ }
+ }
+ }
+ }
- if (!pattern->n_entries) return 0;
+ if (!pattern->n_entries)
+ return 0;
- pattern->n_entries += nrows;
- if (speed) pattern->n_entries++;
- if (bpm >= 0x20) pattern->n_entries++;
+ pattern->n_entries += nrows;
+ if (speed)
+ pattern->n_entries++;
+ if (bpm >= 0x20)
+ pattern->n_entries++;
- for (pos = 0; pos < 32; pos++) {
- if (!(pan[pos*2+1] & 0xF9)) pattern->n_entries++;
- if (vol[pos] != -1) pattern->n_entries++;
- }
+ for (pos = 0; pos < 32; pos++) {
+ if (!(pan[pos * 2 + 1] & 0xF9))
+ pattern->n_entries++;
+ if (vol[pos] != -1)
+ pattern->n_entries++;
+ }
- pattern->entry = malloc(pattern->n_entries * sizeof(*pattern->entry));
- if (!pattern->entry) return -1;
+ pattern->entry = malloc(pattern->n_entries * sizeof(*pattern->entry));
+ if (!pattern->entry)
+ return -1;
- entry = pattern->entry;
+ entry = pattern->entry;
- if (speed) {
- entry->channel = 0;
- entry->mask = IT_ENTRY_EFFECT;
- entry->effect = IT_SET_SPEED;
- entry->effectvalue = speed;
- entry++;
- }
+ if (speed) {
+ entry->channel = 0;
+ entry->mask = IT_ENTRY_EFFECT;
+ entry->effect = IT_SET_SPEED;
+ entry->effectvalue = speed;
+ entry++;
+ }
- if (bpm >= 0x20) {
- entry->channel = 0;
- entry->mask = IT_ENTRY_EFFECT;
- entry->effect = IT_SET_SONG_TEMPO;
- entry->effectvalue = bpm;
- entry++;
- }
+ if (bpm >= 0x20) {
+ entry->channel = 0;
+ entry->mask = IT_ENTRY_EFFECT;
+ entry->effect = IT_SET_SONG_TEMPO;
+ entry->effectvalue = bpm;
+ entry++;
+ }
- for (pos = 0; pos < 32; pos++) {
- if (!(pan[pos*2+1] & 0xF9)) {
- entry->channel = pos;
- entry->mask = IT_ENTRY_EFFECT;
- switch (pan[pos*2+1]) {
- case 0:
- entry->effect = IT_SET_PANNING;
- entry->effectvalue = pan[pos*2] ^ 128;
- break;
- case 2:
- entry->effect = IT_S;
- entry->effectvalue = EFFECT_VALUE(IT_S_SET_SURROUND_SOUND,1);
- break;
- case 4:
- entry->effect = IT_SET_PANNING;
- entry->effectvalue = 128;
- break;
- }
- entry++;
- }
- if (vol[pos] != -1) {
- entry->channel = pos;
- entry->mask = IT_ENTRY_EFFECT;
- entry->effect = IT_SET_CHANNEL_VOLUME;
- entry->effectvalue = (vol[pos] + 2) >> 2;
- entry++;
- }
- }
+ for (pos = 0; pos < 32; pos++) {
+ if (!(pan[pos * 2 + 1] & 0xF9)) {
+ entry->channel = pos;
+ entry->mask = IT_ENTRY_EFFECT;
+ switch (pan[pos * 2 + 1]) {
+ case 0:
+ entry->effect = IT_SET_PANNING;
+ entry->effectvalue = pan[pos * 2] ^ 128;
+ break;
+ case 2:
+ entry->effect = IT_S;
+ entry->effectvalue = EFFECT_VALUE(IT_S_SET_SURROUND_SOUND, 1);
+ break;
+ case 4:
+ entry->effect = IT_SET_PANNING;
+ entry->effectvalue = 128;
+ break;
+ }
+ entry++;
+ }
+ if (vol[pos] != -1) {
+ entry->channel = pos;
+ entry->mask = IT_ENTRY_EFFECT;
+ entry->effect = IT_SET_CHANNEL_VOLUME;
+ entry->effectvalue = (vol[pos] + 2) >> 2;
+ entry++;
+ }
+ }
- row = 0;
- pos = 2;
- rowlen = data[0] | (data[1] << 8);
+ row = 0;
+ pos = 2;
+ rowlen = data[0] | (data[1] << 8);
- while ((row < nrows) && (pos < len)) {
- if (pos >= rowlen) {
- IT_SET_END_ROW(entry);
- entry++;
- row++;
- rowlen += data[pos] | (data[pos+1] << 8);
- pos += 2;
- continue;
- }
+ while ((row < nrows) && (pos < len)) {
+ if (pos >= rowlen) {
+ IT_SET_END_ROW(entry);
+ entry++;
+ row++;
+ rowlen += data[pos] | (data[pos + 1] << 8);
+ pos += 2;
+ continue;
+ }
- flags = data[pos++];
- entry->channel = data[pos++];
- entry->mask = 0;
+ flags = data[pos++];
+ entry->channel = data[pos++];
+ entry->mask = 0;
- if (flags & 0xF0) {
- if (flags & 0x80) {
- entry->mask |= IT_ENTRY_NOTE;
- if (version == PSMV_OLD) {
- if ((data[pos] < 0x80)) entry->note = (data[pos]>>4)*12+(data[pos]&0x0f)+12;
- else entry->mask &= ~IT_ENTRY_NOTE;
- } else /*if (version == PSMV_NEW)*/ {
- if ((data[pos]) && (data[pos] < 84)) entry->note = data[pos] + 35;
- else entry->mask &= ~IT_ENTRY_NOTE;
- }
- pos++;
- }
+ if (flags & 0xF0) {
+ if (flags & 0x80) {
+ entry->mask |= IT_ENTRY_NOTE;
+ if (version == PSMV_OLD) {
+ if ((data[pos] < 0x80))
+ entry->note =
+ (data[pos] >> 4) * 12 + (data[pos] & 0x0f) + 12;
+ else
+ entry->mask &= ~IT_ENTRY_NOTE;
+ } else /*if (version == PSMV_NEW)*/ {
+ if ((data[pos]) && (data[pos] < 84))
+ entry->note = data[pos] + 35;
+ else
+ entry->mask &= ~IT_ENTRY_NOTE;
+ }
+ pos++;
+ }
- if (flags & 0x40) {
- entry->mask |= IT_ENTRY_INSTRUMENT;
- entry->instrument = data[pos++] + 1;
- }
+ if (flags & 0x40) {
+ entry->mask |= IT_ENTRY_INSTRUMENT;
+ entry->instrument = data[pos++] + 1;
+ }
- if (flags & 0x20) {
- entry->mask |= IT_ENTRY_VOLPAN;
- entry->volpan = (data[pos++] + 1) >> 1;
- }
+ if (flags & 0x20) {
+ entry->mask |= IT_ENTRY_VOLPAN;
+ entry->volpan = (data[pos++] + 1) >> 1;
+ }
- if (flags & 0x10) {
- entry->mask |= IT_ENTRY_EFFECT;
- length = data[pos+1];
- switch (data[pos]) {
- case 1:
- entry->effect = IT_VOLUME_SLIDE;
- if (version == PSMV_OLD) entry->effectvalue = ((length&0x1e)<<3) | 0xF;
- else /*if (version == PSMV_NEW)*/ entry->effectvalue = (length<<4) | 0xF;
- break;
+ if (flags & 0x10) {
+ entry->mask |= IT_ENTRY_EFFECT;
+ length = data[pos + 1];
+ switch (data[pos]) {
+ case 1:
+ entry->effect = IT_VOLUME_SLIDE;
+ if (version == PSMV_OLD)
+ entry->effectvalue = ((length & 0x1e) << 3) | 0xF;
+ else /*if (version == PSMV_NEW)*/
+ entry->effectvalue = (length << 4) | 0xF;
+ break;
- case 2:
- entry->effect = IT_VOLUME_SLIDE;
- if (version == PSMV_OLD) entry->effectvalue = (length << 3) & 0xF0;
- else /*if (version == PSMV_NEW)*/ entry->effectvalue = (length << 4) & 0xF0;
- break;
+ case 2:
+ entry->effect = IT_VOLUME_SLIDE;
+ if (version == PSMV_OLD)
+ entry->effectvalue = (length << 3) & 0xF0;
+ else /*if (version == PSMV_NEW)*/
+ entry->effectvalue = (length << 4) & 0xF0;
+ break;
- case 3:
- entry->effect = IT_VOLUME_SLIDE;
- if (version == PSMV_OLD) entry->effectvalue = (length >> 1) | 0xF0;
- else /*if (version == PSMV_NEW)*/ entry->effectvalue = length | 0xF0;
- break;
+ case 3:
+ entry->effect = IT_VOLUME_SLIDE;
+ if (version == PSMV_OLD)
+ entry->effectvalue = (length >> 1) | 0xF0;
+ else /*if (version == PSMV_NEW)*/
+ entry->effectvalue = length | 0xF0;
+ break;
- case 4:
- entry->effect = IT_VOLUME_SLIDE;
- if (version == PSMV_OLD) entry->effectvalue = (length >> 1) & 0xF;
- else /*if (version == PSMV_NEW)*/ entry->effectvalue = length & 0xF;
- break;
+ case 4:
+ entry->effect = IT_VOLUME_SLIDE;
+ if (version == PSMV_OLD)
+ entry->effectvalue = (length >> 1) & 0xF;
+ else /*if (version == PSMV_NEW)*/
+ entry->effectvalue = length & 0xF;
+ break;
- case 12:
- entry->effect = IT_PORTAMENTO_UP;
- if (version == PSMV_OLD) {
- if (length < 4) entry->effectvalue = length | 0xF0;
- else entry->effectvalue = length >> 2;
- } else /*if (version == PSMV_NEW)*/ {
- entry->effectvalue = length;
- }
- break;
+ case 12:
+ entry->effect = IT_PORTAMENTO_UP;
+ if (version == PSMV_OLD) {
+ if (length < 4)
+ entry->effectvalue = length | 0xF0;
+ else
+ entry->effectvalue = length >> 2;
+ } else /*if (version == PSMV_NEW)*/ {
+ entry->effectvalue = length;
+ }
+ break;
- case 14:
- entry->effect = IT_PORTAMENTO_DOWN;
- if (version == PSMV_OLD) {
- if (length < 4) entry->effectvalue = length | 0xF0;
- else entry->effectvalue = length >> 2;
- } else /*if (version == PSMV_NEW)*/ {
- entry->effectvalue = length;
- }
- break;
+ case 14:
+ entry->effect = IT_PORTAMENTO_DOWN;
+ if (version == PSMV_OLD) {
+ if (length < 4)
+ entry->effectvalue = length | 0xF0;
+ else
+ entry->effectvalue = length >> 2;
+ } else /*if (version == PSMV_NEW)*/ {
+ entry->effectvalue = length;
+ }
+ break;
- case 15:
- entry->effect = IT_TONE_PORTAMENTO;
- if (version == PSMV_OLD) entry->effectvalue = length >> 2;
- else /*if (version == PSMV_NEW)*/ entry->effectvalue = length;
- break;
+ case 15:
+ entry->effect = IT_TONE_PORTAMENTO;
+ if (version == PSMV_OLD)
+ entry->effectvalue = length >> 2;
+ else /*if (version == PSMV_NEW)*/
+ entry->effectvalue = length;
+ break;
- case 0x15:
- entry->effect = IT_VIBRATO;
- entry->effectvalue = length;
- break;
+ case 0x15:
+ entry->effect = IT_VIBRATO;
+ entry->effectvalue = length;
+ break;
- case 0x18:
- entry->effect = IT_VOLSLIDE_VIBRATO;
- entry->effectvalue = length;
- break;
+ case 0x18:
+ entry->effect = IT_VOLSLIDE_VIBRATO;
+ entry->effectvalue = length;
+ break;
- case 0x29:
- entry->effect = IT_SET_SAMPLE_OFFSET;
- entry->effectvalue = data[pos+2];
- pos += 2;
- break;
+ case 0x29:
+ entry->effect = IT_SET_SAMPLE_OFFSET;
+ entry->effectvalue = data[pos + 2];
+ pos += 2;
+ break;
- case 0x2A:
- entry->effect = IT_RETRIGGER_NOTE;
- entry->effectvalue = length;
- break;
+ case 0x2A:
+ entry->effect = IT_RETRIGGER_NOTE;
+ entry->effectvalue = length;
+ break;
- case 0x33:
+ case 0x33:
#if 0
entry->effect = IT_POSITION_JUMP;
entry->effectvalue = data[pos+2];
#else
- entry->mask &= ~IT_ENTRY_EFFECT;
+ entry->mask &= ~IT_ENTRY_EFFECT;
#endif
- pos++;
- break;
+ pos++;
+ break;
- case 0x34:
- entry->effect = IT_BREAK_TO_ROW;
- entry->effectvalue = length;
- break;
+ case 0x34:
+ entry->effect = IT_BREAK_TO_ROW;
+ entry->effectvalue = length;
+ break;
- case 0x3D:
- entry->effect = IT_SET_SPEED;
- entry->effectvalue = length;
- break;
+ case 0x3D:
+ entry->effect = IT_SET_SPEED;
+ entry->effectvalue = length;
+ break;
- case 0x3E:
- if (length >= 0x20) {
- entry->effect = IT_SET_SONG_TEMPO;
- entry->effectvalue = length;
- } else {
- entry->mask &= ~IT_ENTRY_EFFECT;
- }
- break;
+ case 0x3E:
+ if (length >= 0x20) {
+ entry->effect = IT_SET_SONG_TEMPO;
+ entry->effectvalue = length;
+ } else {
+ entry->mask &= ~IT_ENTRY_EFFECT;
+ }
+ break;
- case 0x47:
- entry->effect = IT_ARPEGGIO;
- entry->effectvalue = length;
- break;
+ case 0x47:
+ entry->effect = IT_ARPEGGIO;
+ entry->effectvalue = length;
+ break;
- default:
- return -1;
- }
- pos += 2;
- }
- if (entry->mask) entry++;
- }
- }
+ default:
+ return -1;
+ }
+ pos += 2;
+ }
+ if (entry->mask)
+ entry++;
+ }
+ }
- while (row < nrows) {
- IT_SET_END_ROW(entry);
- entry++;
- row++;
- }
+ while (row < nrows) {
+ IT_SET_END_ROW(entry);
+ entry++;
+ row++;
+ }
- pattern->n_entries = (int)((long)entry - (long)pattern->entry);
- if (!pattern->n_entries) return -1;
+ pattern->n_entries = (int)((long)entry - (long)pattern->entry);
+ if (!pattern->n_entries)
+ return -1;
- return 0;
+ return 0;
}
+static void free_chunks(PSMCHUNK *chunk, int count) {
+ int n;
-static void free_chunks(PSMCHUNK * chunk, int count) {
- int n;
+ for (n = 0; n < count; n++) {
+ if (chunk[n].data)
+ free(chunk[n].data);
+ }
- for (n = 0; n < count; n++) {
- if (chunk[n].data)
- free(chunk[n].data);
- }
-
- free(chunk);
+ free(chunk);
}
-static void dumb_it_optimize_orders(DUMB_IT_SIGDATA * sigdata);
+static void dumb_it_optimize_orders(DUMB_IT_SIGDATA *sigdata);
-static int pattcmp( const unsigned char *, const unsigned char *, size_t );
+static int pattcmp(const unsigned char *, const unsigned char *, size_t);
-static DUMB_IT_SIGDATA *it_psm_load_sigdata(DUMBFILE *f, int * ver, int subsong)
-{
- DUMB_IT_SIGDATA *sigdata;
+static DUMB_IT_SIGDATA *it_psm_load_sigdata(DUMBFILE *f, int *ver,
+ int subsong) {
+ DUMB_IT_SIGDATA *sigdata;
- PSMCHUNK *chunk;
- int n_chunks = 0;
+ PSMCHUNK *chunk;
+ int n_chunks = 0;
- PSMCHUNK *songchunk = 0;
- int n_song_chunks = 0;
+ PSMCHUNK *songchunk = 0;
+ int n_song_chunks = 0;
- PSMEVENT *event = 0;
- int n_events = 0;
+ PSMEVENT *event = 0;
+ int n_events = 0;
- unsigned char * ptr;
+ unsigned char *ptr;
- int n, length;
+ int n, length;
int o;
- int found;
+ int found;
- int n_patterns = 0;
+ int n_patterns = 0;
- long first_pattern_line = -1;
- int first_pattern;
+ long first_pattern_line = -1;
+ int first_pattern;
- int speed, bpm;
- unsigned char pan[64];
- int vol[32];
+ int speed, bpm;
+ unsigned char pan[64];
+ int vol[32];
- if (dumbfile_mgetl(f) != DUMB_ID('P','S','M',' ')) goto error;
+ if (dumbfile_mgetl(f) != DUMB_ID('P', 'S', 'M', ' '))
+ goto error;
- length = (int)dumbfile_igetl(f);
+ length = (int)dumbfile_igetl(f);
- if (dumbfile_mgetl(f) != DUMB_ID('F','I','L','E')) goto error;
+ if (dumbfile_mgetl(f) != DUMB_ID('F', 'I', 'L', 'E'))
+ goto error;
- chunk = calloc(768, sizeof(*chunk));
+ chunk = calloc(768, sizeof(*chunk));
- while (length >= 8) {
- if (n_chunks >= 768) goto error_fc;
- chunk[n_chunks].id = (unsigned int) dumbfile_mgetl(f);
- n = (int)dumbfile_igetl(f);
- length -= 8;
- if ((signed int)n <= 0 || n > length)
- goto error_fc;
- chunk[n_chunks].len = n;
- if (n) {
- ptr = malloc(n);
- if (!ptr) goto error_fc;
- if (dumbfile_getnc((char *)ptr, n, f) < n)
- {
- free(ptr);
- goto error_fc;
- }
- chunk[n_chunks].data = ptr;
- }
- n_chunks++;
- length -= n;
- }
+ while (length >= 8) {
+ if (n_chunks >= 768)
+ goto error_fc;
+ chunk[n_chunks].id = (unsigned int)dumbfile_mgetl(f);
+ n = (int)dumbfile_igetl(f);
+ length -= 8;
+ if ((signed int)n <= 0 || n > length)
+ goto error_fc;
+ chunk[n_chunks].len = n;
+ if (n) {
+ ptr = malloc(n);
+ if (!ptr)
+ goto error_fc;
+ if (dumbfile_getnc((char *)ptr, n, f) < n) {
+ free(ptr);
+ goto error_fc;
+ }
+ chunk[n_chunks].data = ptr;
+ }
+ n_chunks++;
+ length -= n;
+ }
- if (!n_chunks) goto error_fc;
+ if (!n_chunks)
+ goto error_fc;
- sigdata = malloc(sizeof(*sigdata));
- if (!sigdata) goto error_fc;
+ sigdata = malloc(sizeof(*sigdata));
+ if (!sigdata)
+ goto error_fc;
- sigdata->n_patterns = 0;
- sigdata->n_samples = 0;
- sigdata->name[0] = 0;
+ sigdata->n_patterns = 0;
+ sigdata->n_samples = 0;
+ sigdata->name[0] = 0;
- found = 0;
+ found = 0;
- for (n = 0; n < n_chunks; n++) {
- PSMCHUNK * c = &chunk[n];
- switch(c->id) {
- case DUMB_ID('S','D','F','T'):
- /* song data format? */
- if ((found & 1) || (c->len != 8) || memcmp(c->data, "MAINSONG", 8)) goto error_sd;
- found |= 1;
- break;
+ for (n = 0; n < n_chunks; n++) {
+ PSMCHUNK *c = &chunk[n];
+ switch (c->id) {
+ case DUMB_ID('S', 'D', 'F', 'T'):
+ /* song data format? */
+ if ((found & 1) || (c->len != 8) || memcmp(c->data, "MAINSONG", 8))
+ goto error_sd;
+ found |= 1;
+ break;
- case DUMB_ID('S','O','N','G'):
- if (/*(found & 2) ||*/ (c->len < 11) /*|| memcmp(c->data, "MAINSONG", 8)*/) goto error_sd;
- found |= 2;
- break;
+ case DUMB_ID('S', 'O', 'N', 'G'):
+ if (/*(found & 2) ||*/ (c->len <
+ 11) /*|| memcmp(c->data, "MAINSONG", 8)*/)
+ goto error_sd;
+ found |= 2;
+ break;
- case DUMB_ID('D','S','M','P'):
- sigdata->n_samples++;
- break;
+ case DUMB_ID('D', 'S', 'M', 'P'):
+ sigdata->n_samples++;
+ break;
- case DUMB_ID('T','I','T','L'):
+ case DUMB_ID('T', 'I', 'T', 'L'):
length = min(sizeof(sigdata->name) - 1, (unsigned)c->len);
- memcpy(sigdata->name, c->data, length);
- sigdata->name[length] = 0;
- }
- }
+ memcpy(sigdata->name, c->data, length);
+ sigdata->name[length] = 0;
+ }
+ }
- if (found != 3 || !sigdata->n_samples) goto error_sd;
+ if (found != 3 || !sigdata->n_samples)
+ goto error_sd;
- sigdata->song_message = NULL;
- sigdata->order = NULL;
- sigdata->instrument = NULL;
- sigdata->sample = NULL;
- sigdata->pattern = NULL;
- sigdata->midi = NULL;
- sigdata->checkpoint = NULL;
+ sigdata->song_message = NULL;
+ sigdata->order = NULL;
+ sigdata->instrument = NULL;
+ sigdata->sample = NULL;
+ sigdata->pattern = NULL;
+ sigdata->midi = NULL;
+ sigdata->checkpoint = NULL;
- sigdata->n_instruments = 0;
- sigdata->n_orders = 0;
+ sigdata->n_instruments = 0;
+ sigdata->n_orders = 0;
- for (n = 0; n < n_chunks; n++) {
- PSMCHUNK * c = &chunk[n];
- if (c->id == DUMB_ID('S','O','N','G')) {
- if (subsong == 0) break;
- subsong--;
- }
- }
+ for (n = 0; n < n_chunks; n++) {
+ PSMCHUNK *c = &chunk[n];
+ if (c->id == DUMB_ID('S', 'O', 'N', 'G')) {
+ if (subsong == 0)
+ break;
+ subsong--;
+ }
+ }
- if (n == n_chunks) return NULL;
- subsong = (int) n;
+ if (n == n_chunks)
+ return NULL;
+ subsong = (int)n;
- /*for (n = 0; n < n_chunks; n++) {
- PSMCHUNK * c = &chunk[n];
- if (c->id == DUMB_ID('S','O','N','G')) {*/
- {
- PSMCHUNK * c = &chunk[subsong];
- {
- ptr = c->data;
- if (ptr[10] > 32) goto error_usd;
- sigdata->n_pchannels = ptr[10];
- length = (int)(c->len - 11);
- ptr += 11;
- songchunk = 0;
- if (length >= 8) {
- songchunk = malloc(256 * sizeof(*songchunk));
- if (!songchunk) goto error_usd;
- while (length >= 8) {
- if (n_song_chunks >= 256) goto error_sc;
- songchunk[n_song_chunks].id = DUMB_ID(ptr[0], ptr[1], ptr[2], ptr[3]);
- n = ptr[4] | (ptr[5] << 8) | (ptr[6] << 16) | (ptr[7] << 24);
- length -= 8;
- if ((signed int)n < 0 || n > length) goto error_sc;
- songchunk[n_song_chunks].len = n;
- songchunk[n_song_chunks].data = ptr + 8;
- n_song_chunks++;
- length -= n;
- ptr += 8 + n;
- }
- }
- /*break;*/
- }
- }
+ /*for (n = 0; n < n_chunks; n++) {
+ PSMCHUNK * c = &chunk[n];
+ if (c->id == DUMB_ID('S','O','N','G')) {*/
+ {
+ PSMCHUNK *c = &chunk[subsong];
+ {
+ ptr = c->data;
+ if (ptr[10] > 32)
+ goto error_usd;
+ sigdata->n_pchannels = ptr[10];
+ length = (int)(c->len - 11);
+ ptr += 11;
+ songchunk = 0;
+ if (length >= 8) {
+ songchunk = malloc(256 * sizeof(*songchunk));
+ if (!songchunk)
+ goto error_usd;
+ while (length >= 8) {
+ if (n_song_chunks >= 256)
+ goto error_sc;
+ songchunk[n_song_chunks].id =
+ DUMB_ID(ptr[0], ptr[1], ptr[2], ptr[3]);
+ n = ptr[4] | (ptr[5] << 8) | (ptr[6] << 16) |
+ (ptr[7] << 24);
+ length -= 8;
+ if ((signed int)n < 0 || n > length)
+ goto error_sc;
+ songchunk[n_song_chunks].len = n;
+ songchunk[n_song_chunks].data = ptr + 8;
+ n_song_chunks++;
+ length -= n;
+ ptr += 8 + n;
+ }
+ }
+ /*break;*/
+ }
+ }
- if (!n_song_chunks) goto error_sc;
+ if (!n_song_chunks)
+ goto error_sc;
- found = 0;
+ found = 0;
- for (n = 0; n < n_song_chunks; n++) {
- PSMCHUNK * c = &songchunk[n];
+ for (n = 0; n < n_song_chunks; n++) {
+ PSMCHUNK *c = &songchunk[n];
- if (c->id == DUMB_ID('D','A','T','E')) {
- /* date of the library build / format spec */
- if (c->len == 6) {
- length = (int)c->len;
- ptr = c->data;
- while (length > 0) {
- if (*ptr >= '0' && *ptr <= '9') {
- found = (found * 10) + (*ptr - '0');
- } else {
- found = 0;
- break;
- }
- ptr++;
- length--;
- }
- }
- break;
- }
- }
+ if (c->id == DUMB_ID('D', 'A', 'T', 'E')) {
+ /* date of the library build / format spec */
+ if (c->len == 6) {
+ length = (int)c->len;
+ ptr = c->data;
+ while (length > 0) {
+ if (*ptr >= '0' && *ptr <= '9') {
+ found = (found * 10) + (*ptr - '0');
+ } else {
+ found = 0;
+ break;
+ }
+ ptr++;
+ length--;
+ }
+ }
+ break;
+ }
+ }
- /*
- if (found != 940506 &&
- found != 940509 &&
- found != 940510 &&
- found != 940530 &&
- found != 940629 &&
- found != PSMV_OLD &&
- found != 941011 &&
- found != PSMV_NEW &&
- found != 940906 &&
- found != 940903 &&
- found != 940914 &&
- found != 941213 &&
- found != 800211) WTF?
- goto error_sc;
- */
+ /*
+ if (found != 940506 &&
+ found != 940509 &&
+ found != 940510 &&
+ found != 940530 &&
+ found != 940629 &&
+ found != PSMV_OLD &&
+ found != 941011 &&
+ found != PSMV_NEW &&
+ found != 940906 &&
+ found != 940903 &&
+ found != 940914 &&
+ found != 941213 &&
+ found != 800211) WTF?
+ goto error_sc;
+ */
- *ver = found;
+ *ver = found;
- if (found == 800211 ||
- found == PSMV_NEW ||
- found == 940903 ||
- found == 940906 ||
- found == 940914 ||
- found == 941213) found = PSMV_NEW;
- else found = PSMV_OLD;
+ if (found == 800211 || found == PSMV_NEW || found == 940903 ||
+ found == 940906 || found == 940914 || found == 941213)
+ found = PSMV_NEW;
+ else
+ found = PSMV_OLD;
- memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
+ memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
- for (n = 0; n < DUMB_IT_N_CHANNELS; n += 4) {
- int sep = 32 * dumb_it_default_panning_separation / 100;
- sigdata->channel_pan[n ] = 32 - sep;
- sigdata->channel_pan[n+1] = 32 + sep;
- sigdata->channel_pan[n+2] = 32 + sep;
- sigdata->channel_pan[n+3] = 32 - sep;
- }
+ for (n = 0; n < DUMB_IT_N_CHANNELS; n += 4) {
+ int sep = 32 * dumb_it_default_panning_separation / 100;
+ sigdata->channel_pan[n] = 32 - sep;
+ sigdata->channel_pan[n + 1] = 32 + sep;
+ sigdata->channel_pan[n + 2] = 32 + sep;
+ sigdata->channel_pan[n + 3] = 32 - sep;
+ }
- for (n = 0; n < n_song_chunks; n++) {
- PSMCHUNK * c = &songchunk[n];
+ for (n = 0; n < n_song_chunks; n++) {
+ PSMCHUNK *c = &songchunk[n];
- switch (c->id) {
- case DUMB_ID('O','P','L','H'):
- if (c->len < 2) goto error_sc;
- ptr = c->data;
- o = ptr[0] | (ptr[1] << 8);
- if (!o) goto error_sc;
- event = malloc(o * sizeof(*event));
- if (!event) goto error_sc;
- length = (int)(c->len - 2);
- ptr += 2;
- while ((length > 0) && (n_events < o)) {
- event[n_events].type = *ptr;
- switch (*ptr) {
- case PSM_EVENT_END:
- ptr++;
- length--;
- break;
+ switch (c->id) {
+ case DUMB_ID('O', 'P', 'L', 'H'):
+ if (c->len < 2)
+ goto error_sc;
+ ptr = c->data;
+ o = ptr[0] | (ptr[1] << 8);
+ if (!o)
+ goto error_sc;
+ event = malloc(o * sizeof(*event));
+ if (!event)
+ goto error_sc;
+ length = (int)(c->len - 2);
+ ptr += 2;
+ while ((length > 0) && (n_events < o)) {
+ event[n_events].type = *ptr;
+ switch (*ptr) {
+ case PSM_EVENT_END:
+ ptr++;
+ length--;
+ break;
- case PSM_EVENT_PLAY_PATTERN:
- if (found == PSMV_OLD) {
- if (length < 5) goto error_ev;
- memcpy(event[n_events].data, ptr + 1, 4);
- ptr += 5;
- length -= 5;
- } else /*if (found == PSMV_NEW)*/ {
- if (length < 9) goto error_ev;
- memcpy(event[n_events].data, ptr + 1, 8);
- ptr += 9;
- length -= 9;
- }
- break;
+ case PSM_EVENT_PLAY_PATTERN:
+ if (found == PSMV_OLD) {
+ if (length < 5)
+ goto error_ev;
+ memcpy(event[n_events].data, ptr + 1, 4);
+ ptr += 5;
+ length -= 5;
+ } else /*if (found == PSMV_NEW)*/ {
+ if (length < 9)
+ goto error_ev;
+ memcpy(event[n_events].data, ptr + 1, 8);
+ ptr += 9;
+ length -= 9;
+ }
+ break;
- case PSM_EVENT_SET_SPEED:
- case PSM_EVENT_SET_BPM:
- if (length < 2) goto error_ev;
- event[n_events].data[0] = ptr[1];
- ptr += 2;
- length -= 2;
- break;
+ case PSM_EVENT_SET_SPEED:
+ case PSM_EVENT_SET_BPM:
+ if (length < 2)
+ goto error_ev;
+ event[n_events].data[0] = ptr[1];
+ ptr += 2;
+ length -= 2;
+ break;
- case PSM_EVENT_JUMP_TO_LINE:
- case PSM_EVENT_CHANGE_VOL:
- if (length < 3) goto error_ev;
- memcpy(event[n_events].data, ptr + 1, 2);
- ptr += 3;
- length -= 3;
- break;
+ case PSM_EVENT_JUMP_TO_LINE:
+ case PSM_EVENT_CHANGE_VOL:
+ if (length < 3)
+ goto error_ev;
+ memcpy(event[n_events].data, ptr + 1, 2);
+ ptr += 3;
+ length -= 3;
+ break;
- case PSM_EVENT_SAMPLE_MAP_TABLE:
- if (length < 7) goto error_ev;
- memcpy(event[n_events].data, ptr + 1, 6);
- ptr += 7;
- length -= 7;
- break;
+ case PSM_EVENT_SAMPLE_MAP_TABLE:
+ if (length < 7)
+ goto error_ev;
+ memcpy(event[n_events].data, ptr + 1, 6);
+ ptr += 7;
+ length -= 7;
+ break;
- case PSM_EVENT_CHANGE_PAN:
- if (length < 4) goto error_ev;
- memcpy(event[n_events].data, ptr + 1, 3);
- ptr += 4;
- length -= 4;
- break;
+ case PSM_EVENT_CHANGE_PAN:
+ if (length < 4)
+ goto error_ev;
+ memcpy(event[n_events].data, ptr + 1, 3);
+ ptr += 4;
+ length -= 4;
+ break;
- default:
- goto error_ev;
- }
- n_events++;
- }
- break;
+ default:
+ goto error_ev;
+ }
+ n_events++;
+ }
+ break;
- case DUMB_ID('P','P','A','N'):
- length = (int)c->len;
- if (length & 1) goto error_ev;
- ptr = c->data;
- o = 0;
- while (length > 0) {
- switch (ptr[0]) {
- case 0:
- sigdata->channel_pan[o] = ((((int)(signed char)ptr[1]) * 32) / 127) + 32;
- break;
- case 2:
- sigdata->channel_pan[o] = IT_SURROUND;
- break;
- case 4:
- sigdata->channel_pan[o] = 32;
- break;
- }
- ptr += 2;
- length -= 2;
- if (++o >= DUMB_IT_N_CHANNELS) break;
- }
- break;
+ case DUMB_ID('P', 'P', 'A', 'N'):
+ length = (int)c->len;
+ if (length & 1)
+ goto error_ev;
+ ptr = c->data;
+ o = 0;
+ while (length > 0) {
+ switch (ptr[0]) {
+ case 0:
+ sigdata->channel_pan[o] =
+ ((((int)(signed char)ptr[1]) * 32) / 127) + 32;
+ break;
+ case 2:
+ sigdata->channel_pan[o] = IT_SURROUND;
+ break;
+ case 4:
+ sigdata->channel_pan[o] = 32;
+ break;
+ }
+ ptr += 2;
+ length -= 2;
+ if (++o >= DUMB_IT_N_CHANNELS)
+ break;
+ }
+ break;
- /*
- case DUMB_ID('P','A','T','T'):
- case DUMB_ID('D','S','A','M'):
- */
- }
- }
+ /*
+ case DUMB_ID('P','A','T','T'):
+ case DUMB_ID('D','S','A','M'):
+ */
+ }
+ }
- sigdata->flags = IT_STEREO | IT_OLD_EFFECTS | IT_COMPATIBLE_GXX;
+ sigdata->flags = IT_STEREO | IT_OLD_EFFECTS | IT_COMPATIBLE_GXX;
- sigdata->global_volume = 128;
- sigdata->speed = 6;
- sigdata->tempo = 125;
- sigdata->mixing_volume = 48;
- sigdata->pan_separation = 128;
+ sigdata->global_volume = 128;
+ sigdata->speed = 6;
+ sigdata->tempo = 125;
+ sigdata->mixing_volume = 48;
+ sigdata->pan_separation = 128;
- speed = 0;
- bpm = 0;
- memset(pan, 255, sizeof(pan));
- memset(vol, 255, sizeof(vol));
+ speed = 0;
+ bpm = 0;
+ memset(pan, 255, sizeof(pan));
+ memset(vol, 255, sizeof(vol));
- sigdata->n_patterns = n_events;
- sigdata->pattern = malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
- if (!sigdata->pattern) goto error_ev;
- for (n = 0; n < sigdata->n_patterns; n++)
- sigdata->pattern[n].entry = NULL;
+ sigdata->n_patterns = n_events;
+ sigdata->pattern = malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
+ if (!sigdata->pattern)
+ goto error_ev;
+ for (n = 0; n < sigdata->n_patterns; n++)
+ sigdata->pattern[n].entry = NULL;
- for (n = 0; n < n_events; n++) {
- PSMEVENT * e = &event[n];
- switch (e->type) {
- case PSM_EVENT_END:
- n = n_events;
- break;
+ for (n = 0; n < n_events; n++) {
+ PSMEVENT *e = &event[n];
+ switch (e->type) {
+ case PSM_EVENT_END:
+ n = n_events;
+ break;
- case PSM_EVENT_PLAY_PATTERN:
- for (o = 0; o < n_chunks; o++) {
- PSMCHUNK * c = &chunk[o];
- if (c->id == DUMB_ID('P','B','O','D')) {
- ptr = c->data;
- length = (int)c->len;
- if (found == PSMV_OLD) {
- if (length < 8) goto error_ev;
- if (!pattcmp(ptr + 4, e->data, 4)) {
- if (it_psm_process_pattern(&sigdata->pattern[n_patterns], ptr, length, speed, bpm, pan, vol, found)) goto error_ev;
- if (first_pattern_line < 0) {
- first_pattern_line = n;
- first_pattern = o;
- }
- e->data[0] = n_patterns;
- e->data[1] = n_patterns >> 8;
- n_patterns++;
- break;
- }
- } else /*if (found == PSMV_NEW)*/ {
- if (length < 12) goto error_ev;
- if (!pattcmp(ptr + 4, e->data, 8)) {
- if (it_psm_process_pattern(&sigdata->pattern[n_patterns], ptr, length, speed, bpm, pan, vol, found)) goto error_ev;
- if (first_pattern_line < 0) {
- first_pattern_line = n;
- first_pattern = o;
- }
- e->data[0] = n_patterns;
- e->data[1] = n_patterns >> 8;
- n_patterns++;
- break;
- }
- }
- }
- }
- if (o == n_chunks) goto error_ev;
+ case PSM_EVENT_PLAY_PATTERN:
+ for (o = 0; o < n_chunks; o++) {
+ PSMCHUNK *c = &chunk[o];
+ if (c->id == DUMB_ID('P', 'B', 'O', 'D')) {
+ ptr = c->data;
+ length = (int)c->len;
+ if (found == PSMV_OLD) {
+ if (length < 8)
+ goto error_ev;
+ if (!pattcmp(ptr + 4, e->data, 4)) {
+ if (it_psm_process_pattern(
+ &sigdata->pattern[n_patterns], ptr, length,
+ speed, bpm, pan, vol, found))
+ goto error_ev;
+ if (first_pattern_line < 0) {
+ first_pattern_line = n;
+ first_pattern = o;
+ }
+ e->data[0] = n_patterns;
+ e->data[1] = n_patterns >> 8;
+ n_patterns++;
+ break;
+ }
+ } else /*if (found == PSMV_NEW)*/ {
+ if (length < 12)
+ goto error_ev;
+ if (!pattcmp(ptr + 4, e->data, 8)) {
+ if (it_psm_process_pattern(
+ &sigdata->pattern[n_patterns], ptr, length,
+ speed, bpm, pan, vol, found))
+ goto error_ev;
+ if (first_pattern_line < 0) {
+ first_pattern_line = n;
+ first_pattern = o;
+ }
+ e->data[0] = n_patterns;
+ e->data[1] = n_patterns >> 8;
+ n_patterns++;
+ break;
+ }
+ }
+ }
+ }
+ if (o == n_chunks)
+ goto error_ev;
- speed = 0;
- bpm = 0;
- memset(pan, 255, sizeof(pan));
- memset(vol, 255, sizeof(vol));
+ speed = 0;
+ bpm = 0;
+ memset(pan, 255, sizeof(pan));
+ memset(vol, 255, sizeof(vol));
- e->type = PSM_EVENT_END;
- break;
+ e->type = PSM_EVENT_END;
+ break;
- case PSM_EVENT_JUMP_TO_LINE:
- o = e->data[0] | (e->data[1] << 8);
- if (o >= n_events) goto error_ev;
- if (o == 0) {
- /* whew! easy case! */
- sigdata->restart_position = 0;
- n = n_events;
- } else if (o == n) {
- /* freeze */
- n = n_events;
- } else if (o > n) {
- /* jump ahead, setting played event numbers to zero will prevent endless looping */
- n = o - 1;
- } else if (o >= first_pattern_line) {
- /* another semi-easy case */
- sigdata->restart_position = event[o].data[0] | (event[o].data[1] << 8);
- n = n_events;
- } else {
- /* crud, try to simulate rerunning all of the commands from the indicated
- * line up to the first pattern, then dupe the first pattern again.
- */
- /*
- PSMCHUNK * c = &chunk[first_pattern];
+ case PSM_EVENT_JUMP_TO_LINE:
+ o = e->data[0] | (e->data[1] << 8);
+ if (o >= n_events)
+ goto error_ev;
+ if (o == 0) {
+ /* whew! easy case! */
+ sigdata->restart_position = 0;
+ n = n_events;
+ } else if (o == n) {
+ /* freeze */
+ n = n_events;
+ } else if (o > n) {
+ /* jump ahead, setting played event numbers to zero will prevent
+ * endless looping */
+ n = o - 1;
+ } else if (o >= first_pattern_line) {
+ /* another semi-easy case */
+ sigdata->restart_position =
+ event[o].data[0] | (event[o].data[1] << 8);
+ n = n_events;
+ } else {
+ /* crud, try to simulate rerunning all of the commands from the
+ * indicated line up to the first pattern, then dupe the first
+ * pattern again.
+ */
+ /*
+ PSMCHUNK * c = &chunk[first_pattern];
- for (; o < first_pattern_line; o++) {
- PSMEVENT * ev = &event[o];
- switch (ev->type) {
- case PSM_EVENT_SET_SPEED:
- speed = ev->data[0];
- break;
- case PSM_EVENT_SET_BPM:
- bpm = ev->data[0];
- break;
- case PSM_EVENT_CHANGE_PAN:
- if (ev->data[0] > 31) goto error_ev;
- pan[ev->data[0] * 2] = ev->data[1];
- pan[ev->data[0] * 2 + 1] = ev->data[2];
- break;
- case PSM_EVENT_CHANGE_VOL:
- if (ev->data[0] > 31) goto error_ev;
- vol[ev->data[0]] = ev->data[1];
- break;
- }
- }
+ for (; o < first_pattern_line; o++) {
+ PSMEVENT * ev = &event[o];
+ switch (ev->type) {
+ case PSM_EVENT_SET_SPEED:
+ speed = ev->data[0];
+ break;
+ case PSM_EVENT_SET_BPM:
+ bpm = ev->data[0];
+ break;
+ case PSM_EVENT_CHANGE_PAN:
+ if (ev->data[0] > 31) goto error_ev;
+ pan[ev->data[0] * 2] = ev->data[1];
+ pan[ev->data[0] * 2 + 1] = ev->data[2];
+ break;
+ case PSM_EVENT_CHANGE_VOL:
+ if (ev->data[0] > 31) goto error_ev;
+ vol[ev->data[0]] = ev->data[1];
+ break;
+ }
+ }
- if (it_psm_process_pattern(&sigdata->pattern[n_patterns], c->data, c->len, speed, bpm, pan, vol, found)) goto error_ev;
- n_patterns++;
- sigdata->restart_position = 1;
- n = n_events;
+ if (it_psm_process_pattern(&sigdata->pattern[n_patterns],
+ c->data, c->len, speed, bpm, pan, vol, found)) goto error_ev;
+ n_patterns++;
+ sigdata->restart_position = 1;
+ n = n_events;
- Eh, what the hell? PSM has no panning commands anyway.
- */
- sigdata->restart_position = 0;
- n = n_events;
- }
- e->type = PSM_EVENT_END;
- break;
+ Eh, what the hell? PSM has no panning commands anyway.
+ */
+ sigdata->restart_position = 0;
+ n = n_events;
+ }
+ e->type = PSM_EVENT_END;
+ break;
- case PSM_EVENT_SET_SPEED:
- speed = e->data[0];
- break;
+ case PSM_EVENT_SET_SPEED:
+ speed = e->data[0];
+ break;
- case PSM_EVENT_SET_BPM:
- bpm = e->data[0];
- break;
+ case PSM_EVENT_SET_BPM:
+ bpm = e->data[0];
+ break;
- case PSM_EVENT_CHANGE_PAN:
- o = e->data[0];
- if (o > 31) goto error_ev;
- pan[o * 2] = e->data[1];
- pan[o * 2 + 1] = e->data[2];
- break;
+ case PSM_EVENT_CHANGE_PAN:
+ o = e->data[0];
+ if (o > 31)
+ goto error_ev;
+ pan[o * 2] = e->data[1];
+ pan[o * 2 + 1] = e->data[2];
+ break;
- case PSM_EVENT_CHANGE_VOL:
- o = e->data[0];
- if (o > 31) goto error_ev;
- vol[o] = e->data[1];
- break;
+ case PSM_EVENT_CHANGE_VOL:
+ o = e->data[0];
+ if (o > 31)
+ goto error_ev;
+ vol[o] = e->data[1];
+ break;
- case PSM_EVENT_SAMPLE_MAP_TABLE:
- if (e->data[0] != 0 || e->data[1] != 0xFF ||
- e->data[2] != 0 || e->data[3] != 0 ||
- e->data[4] != 1 || e->data[5] != 0)
- goto error_ev;
- break;
- }
- }
+ case PSM_EVENT_SAMPLE_MAP_TABLE:
+ if (e->data[0] != 0 || e->data[1] != 0xFF || e->data[2] != 0 ||
+ e->data[3] != 0 || e->data[4] != 1 || e->data[5] != 0)
+ goto error_ev;
+ break;
+ }
+ }
- if (n_patterns > 256) goto error_ev;
+ if (n_patterns > 256)
+ goto error_ev;
- sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
- if (!sigdata->sample) goto error_ev;
- for (n = 0; n < sigdata->n_samples; n++) {
- sigdata->sample[n].data = NULL;
- sigdata->sample[n].flags = 0;
- }
+ sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
+ if (!sigdata->sample)
+ goto error_ev;
+ for (n = 0; n < sigdata->n_samples; n++) {
+ sigdata->sample[n].data = NULL;
+ sigdata->sample[n].flags = 0;
+ }
- o = 0;
- for (n = 0; n < n_chunks; n++) {
- PSMCHUNK * c = &chunk[n];
- if (c->id == DUMB_ID('D','S','M','P')) {
- if (it_psm_process_sample(&sigdata->sample[o], c->data, c->len, o, found)) goto error_ev;
- o++;
- }
- }
+ o = 0;
+ for (n = 0; n < n_chunks; n++) {
+ PSMCHUNK *c = &chunk[n];
+ if (c->id == DUMB_ID('D', 'S', 'M', 'P')) {
+ if (it_psm_process_sample(&sigdata->sample[o], c->data, c->len, o,
+ found))
+ goto error_ev;
+ o++;
+ }
+ }
- sigdata->n_orders = n_patterns;
- sigdata->n_patterns = n_patterns;
+ sigdata->n_orders = n_patterns;
+ sigdata->n_patterns = n_patterns;
- sigdata->order = malloc(n_patterns);
+ sigdata->order = malloc(n_patterns);
- for (n = 0; n < n_patterns; n++) {
- sigdata->order[n] = n;
- }
+ for (n = 0; n < n_patterns; n++) {
+ sigdata->order[n] = n;
+ }
- free(event);
- free(songchunk);
- free_chunks(chunk, n_chunks);
+ free(event);
+ free(songchunk);
+ free_chunks(chunk, n_chunks);
- _dumb_it_fix_invalid_orders(sigdata);
+ _dumb_it_fix_invalid_orders(sigdata);
- dumb_it_optimize_orders(sigdata);
+ dumb_it_optimize_orders(sigdata);
- return sigdata;
+ return sigdata;
error_ev:
- free(event);
+ free(event);
error_sc:
- if (songchunk) free(songchunk);
+ if (songchunk)
+ free(songchunk);
error_usd:
- _dumb_it_unload_sigdata(sigdata);
- goto error_fc;
+ _dumb_it_unload_sigdata(sigdata);
+ goto error_fc;
error_sd:
- free(sigdata);
+ free(sigdata);
error_fc:
- free_chunks(chunk, n_chunks);
+ free_chunks(chunk, n_chunks);
error:
- return NULL;
+ return NULL;
}
static int it_order_compare(const void *e1, const void *e2) {
- if (*((const char *)e1) < *((const char *)e2))
- return -1;
+ if (*((const char *)e1) < *((const char *)e2))
+ return -1;
- if (*((const char *)e1) > *((const char *)e2))
- return 1;
+ if (*((const char *)e1) > *((const char *)e2))
+ return 1;
- return 0;
+ return 0;
}
/*
static int it_optimize_compare(const void *e1, const void *e2) {
- if (((const IT_ENTRY *)e1)->channel < ((const IT_ENTRY *)e2)->channel)
- return -1;
+ if (((const IT_ENTRY *)e1)->channel < ((const IT_ENTRY *)e2)->channel)
+ return -1;
- if (((const IT_ENTRY *)e1)->channel > ((const IT_ENTRY *)e2)->channel)
- return 1;
+ if (((const IT_ENTRY *)e1)->channel > ((const IT_ENTRY *)e2)->channel)
+ return 1;
- return 0;
+ return 0;
}
*/
-static int it_entry_compare(const IT_ENTRY * e1, const IT_ENTRY * e2) {
- if (IT_IS_END_ROW(e1) && IT_IS_END_ROW(e2)) return 1;
- if (e1->channel != e2->channel) return 0;
- if (e1->mask != e2->mask) return 0;
- if ((e1->mask & IT_ENTRY_NOTE) && (e1->note != e2->note)) return 0;
- if ((e1->mask & IT_ENTRY_INSTRUMENT) && (e1->instrument != e2->instrument)) return 0;
- if ((e1->mask & IT_ENTRY_VOLPAN) && (e1->volpan != e2->volpan)) return 0;
- if ((e1->mask & IT_ENTRY_EFFECT) && ((e1->effect != e2->effect) || (e1->effectvalue != e2->effectvalue))) return 0;
- return 1;
+static int it_entry_compare(const IT_ENTRY *e1, const IT_ENTRY *e2) {
+ if (IT_IS_END_ROW(e1) && IT_IS_END_ROW(e2))
+ return 1;
+ if (e1->channel != e2->channel)
+ return 0;
+ if (e1->mask != e2->mask)
+ return 0;
+ if ((e1->mask & IT_ENTRY_NOTE) && (e1->note != e2->note))
+ return 0;
+ if ((e1->mask & IT_ENTRY_INSTRUMENT) && (e1->instrument != e2->instrument))
+ return 0;
+ if ((e1->mask & IT_ENTRY_VOLPAN) && (e1->volpan != e2->volpan))
+ return 0;
+ if ((e1->mask & IT_ENTRY_EFFECT) &&
+ ((e1->effect != e2->effect) || (e1->effectvalue != e2->effectvalue)))
+ return 0;
+ return 1;
}
/*
static void dumb_it_optimize_pattern(IT_PATTERN * pattern) {
- IT_ENTRY * entry, * end;
- IT_ENTRY * rowstart, * rowend;
- IT_ENTRY * current;
+ IT_ENTRY * entry, * end;
+ IT_ENTRY * rowstart, * rowend;
+ IT_ENTRY * current;
- if (!pattern->n_entries || !pattern->entry) return;
+ if (!pattern->n_entries || !pattern->entry) return;
- current = entry = pattern->entry;
- end = entry + pattern->n_entries;
+ current = entry = pattern->entry;
+ end = entry + pattern->n_entries;
- while (entry < end) {
- rowstart = entry;
- while (!IT_IS_END_ROW(entry)) entry++;
- rowend = entry;
- if (rowend > rowstart + 1)
- qsort(rowstart, rowend - rowstart, sizeof(IT_ENTRY), &it_optimize_compare);
- entry = rowstart;
- while (entry < rowend) {
- if (!(entry->mask)) {}
- else if (it_entry_compare(entry, current)) {}
- else if (!(current->mask) ||
- ((entry->channel == current->channel) &&
- ((entry->mask | current->mask) == (entry->mask ^ current->mask)))) {
- current->mask |= entry->mask;
- if (entry->mask & IT_ENTRY_NOTE) current->note = entry->note;
- if (entry->mask & IT_ENTRY_INSTRUMENT) current->instrument = entry->instrument;
- if (entry->mask & IT_ENTRY_VOLPAN) current->volpan = entry->volpan;
- if (entry->mask & IT_ENTRY_EFFECT) {
- current->effect = entry->effect;
- current->effectvalue = entry->effectvalue;
- }
- } else {
- if (++current < entry) *current = *entry;
- }
- entry++;
- }
- if (++current < entry) *current = *entry;
- entry++;
- }
+ while (entry < end) {
+ rowstart = entry;
+ while (!IT_IS_END_ROW(entry)) entry++;
+ rowend = entry;
+ if (rowend > rowstart + 1)
+ qsort(rowstart, rowend - rowstart, sizeof(IT_ENTRY),
+&it_optimize_compare); entry = rowstart; while (entry < rowend) { if
+(!(entry->mask)) {} else if (it_entry_compare(entry, current)) {} else if
+(!(current->mask) ||
+ ((entry->channel == current->channel)
+&&
+ ((entry->mask | current->mask) ==
+(entry->mask ^ current->mask)))) { current->mask |= entry->mask; if (entry->mask
+& IT_ENTRY_NOTE) current->note = entry->note; if (entry->mask &
+IT_ENTRY_INSTRUMENT) current->instrument = entry->instrument; if (entry->mask &
+IT_ENTRY_VOLPAN) current->volpan = entry->volpan; if (entry->mask &
+IT_ENTRY_EFFECT) { current->effect = entry->effect; current->effectvalue =
+entry->effectvalue;
+ }
+ } else {
+ if (++current < entry) *current = *entry;
+ }
+ entry++;
+ }
+ if (++current < entry) *current = *entry;
+ entry++;
+ }
- current++;
+ current++;
- if (current < end) {
- IT_ENTRY * opt;
- pattern->n_entries = current - pattern->entry;
- opt = realloc(pattern->entry, pattern->n_entries * sizeof(*pattern->entry));
- if (opt) pattern->entry = opt;
- }
+ if (current < end) {
+ IT_ENTRY * opt;
+ pattern->n_entries = current - pattern->entry;
+ opt = realloc(pattern->entry, pattern->n_entries *
+sizeof(*pattern->entry)); if (opt) pattern->entry = opt;
+ }
}
*/
-static int it_pattern_compare(const IT_PATTERN * p1, const IT_PATTERN * p2) {
- IT_ENTRY * e1, * end;
- IT_ENTRY * e2;
+static int it_pattern_compare(const IT_PATTERN *p1, const IT_PATTERN *p2) {
+ IT_ENTRY *e1, *end;
+ IT_ENTRY *e2;
- if (p1 == p2) return 1;
- if (p1->n_entries != p2->n_entries) return 0;
+ if (p1 == p2)
+ return 1;
+ if (p1->n_entries != p2->n_entries)
+ return 0;
- e1 = p1->entry; end = e1 + p1->n_entries;
- e2 = p2->entry;
+ e1 = p1->entry;
+ end = e1 + p1->n_entries;
+ e2 = p2->entry;
- while (e1 < end) {
- if (!it_entry_compare(e1, e2)) return 0;
- e1++; e2++;
- }
+ while (e1 < end) {
+ if (!it_entry_compare(e1, e2))
+ return 0;
+ e1++;
+ e2++;
+ }
- return 1;
+ return 1;
}
-static void dumb_it_optimize_orders(DUMB_IT_SIGDATA * sigdata) {
- int n, o, p;
+static void dumb_it_optimize_orders(DUMB_IT_SIGDATA *sigdata) {
+ int n, o, p;
/*int last_invalid = (sigdata->flags & IT_WAS_AN_XM) ? 255 : 253;*/
- unsigned char * order_list;
- int n_patterns;
+ unsigned char *order_list;
+ int n_patterns;
- IT_PATTERN * pattern;
+ IT_PATTERN *pattern;
- if (!sigdata->n_orders || !sigdata->n_patterns) return;
+ if (!sigdata->n_orders || !sigdata->n_patterns)
+ return;
- n_patterns = 0;
- order_list = malloc(sigdata->n_orders);
+ n_patterns = 0;
+ order_list = malloc(sigdata->n_orders);
- if (!order_list) return;
+ if (!order_list)
+ return;
- for (n = 0; n < sigdata->n_orders; n++) {
- if (sigdata->order[n] < sigdata->n_patterns) {
- for (o = 0; o < n_patterns; o++) {
- if (sigdata->order[n] == order_list[o]) break;
- }
- if (o == n_patterns) {
- order_list[n_patterns++] = sigdata->order[n];
- }
- }
- }
+ for (n = 0; n < sigdata->n_orders; n++) {
+ if (sigdata->order[n] < sigdata->n_patterns) {
+ for (o = 0; o < n_patterns; o++) {
+ if (sigdata->order[n] == order_list[o])
+ break;
+ }
+ if (o == n_patterns) {
+ order_list[n_patterns++] = sigdata->order[n];
+ }
+ }
+ }
- if (!n_patterns) {
- free(order_list);
- return;
- }
+ if (!n_patterns) {
+ free(order_list);
+ return;
+ }
- /*for (n = 0; n < n_patterns; n++) {
- dumb_it_optimize_pattern(&sigdata->pattern[order_list[n]]);
- }*/
+ /*for (n = 0; n < n_patterns; n++) {
+ dumb_it_optimize_pattern(&sigdata->pattern[order_list[n]]);
+ }*/
- for (n = 0; n < n_patterns; n++) {
- for (o = n + 1; o < n_patterns; o++) {
- if ((order_list[n] != order_list[o]) &&
- it_pattern_compare(&sigdata->pattern[order_list[n]], &sigdata->pattern[order_list[o]])) {
- for (p = 0; p < sigdata->n_orders; p++) {
- if (sigdata->order[p] == order_list[o]) {
- sigdata->order[p] = order_list[n];
- }
- }
- for (p = o + 1; p < n_patterns; p++) {
- if (order_list[p] == order_list[o]) {
- order_list[p] = order_list[n];
- }
- }
- order_list[o] = order_list[n];
- }
- }
- }
+ for (n = 0; n < n_patterns; n++) {
+ for (o = n + 1; o < n_patterns; o++) {
+ if ((order_list[n] != order_list[o]) &&
+ it_pattern_compare(&sigdata->pattern[order_list[n]],
+ &sigdata->pattern[order_list[o]])) {
+ for (p = 0; p < sigdata->n_orders; p++) {
+ if (sigdata->order[p] == order_list[o]) {
+ sigdata->order[p] = order_list[n];
+ }
+ }
+ for (p = o + 1; p < n_patterns; p++) {
+ if (order_list[p] == order_list[o]) {
+ order_list[p] = order_list[n];
+ }
+ }
+ order_list[o] = order_list[n];
+ }
+ }
+ }
- qsort(order_list, n_patterns, sizeof(*order_list), &it_order_compare);
+ qsort(order_list, n_patterns, sizeof(*order_list), &it_order_compare);
- for (n = 0, o = 0; n < n_patterns; n++) {
- if (order_list[n] != order_list[o]) {
- if (++o < n) order_list[o] = order_list[n];
- }
- }
+ for (n = 0, o = 0; n < n_patterns; n++) {
+ if (order_list[n] != order_list[o]) {
+ if (++o < n)
+ order_list[o] = order_list[n];
+ }
+ }
- n_patterns = o + 1;
+ n_patterns = o + 1;
- pattern = malloc(n_patterns * sizeof(*pattern));
- if (!pattern) {
- free(order_list);
- return;
- }
+ pattern = malloc(n_patterns * sizeof(*pattern));
+ if (!pattern) {
+ free(order_list);
+ return;
+ }
- for (n = 0; n < n_patterns; n++) {
- pattern[n] = sigdata->pattern[order_list[n]];
- }
+ for (n = 0; n < n_patterns; n++) {
+ pattern[n] = sigdata->pattern[order_list[n]];
+ }
- for (n = 0; n < sigdata->n_patterns; n++) {
- for (o = 0; o < n_patterns; o++) {
- if (order_list[o] == n) break;
- }
- if (o == n_patterns) {
- if (sigdata->pattern[n].entry)
- free(sigdata->pattern[n].entry);
- }
- }
+ for (n = 0; n < sigdata->n_patterns; n++) {
+ for (o = 0; o < n_patterns; o++) {
+ if (order_list[o] == n)
+ break;
+ }
+ if (o == n_patterns) {
+ if (sigdata->pattern[n].entry)
+ free(sigdata->pattern[n].entry);
+ }
+ }
- free(sigdata->pattern);
- sigdata->pattern = pattern;
- sigdata->n_patterns = n_patterns;
+ free(sigdata->pattern);
+ sigdata->pattern = pattern;
+ sigdata->n_patterns = n_patterns;
- for (n = 0; n < sigdata->n_orders; n++) {
- for (o = 0; o < n_patterns; o++) {
- if (sigdata->order[n] == order_list[o]) {
- sigdata->order[n] = o;
- break;
- }
- }
- }
+ for (n = 0; n < sigdata->n_orders; n++) {
+ for (o = 0; o < n_patterns; o++) {
+ if (sigdata->order[n] == order_list[o]) {
+ sigdata->order[n] = o;
+ break;
+ }
+ }
+ }
- free(order_list);
+ free(order_list);
}
int dumb_get_psm_subsong_count(DUMBFILE *f) {
- size_t length;
+ size_t length;
int subsongs;
- long l;
+ long l;
- if (dumbfile_mgetl(f) != DUMB_ID('P','S','M',' ')) return 0;
+ if (dumbfile_mgetl(f) != DUMB_ID('P', 'S', 'M', ' '))
+ return 0;
- length = dumbfile_igetl(f);
+ length = dumbfile_igetl(f);
- if (dumbfile_mgetl(f) != DUMB_ID('F','I','L','E')) return 0;
+ if (dumbfile_mgetl(f) != DUMB_ID('F', 'I', 'L', 'E'))
+ return 0;
- subsongs = 0;
+ subsongs = 0;
- while (length >= 8 && !dumbfile_error(f)) {
- if (dumbfile_mgetl(f) == DUMB_ID('S','O','N','G')) subsongs++;
- l = dumbfile_igetl(f);
- dumbfile_skip(f, l);
- length -= l + 8;
- }
+ while (length >= 8 && !dumbfile_error(f)) {
+ if (dumbfile_mgetl(f) == DUMB_ID('S', 'O', 'N', 'G'))
+ subsongs++;
+ l = dumbfile_igetl(f);
+ dumbfile_skip(f, l);
+ length -= l + 8;
+ }
- if (dumbfile_error(f)) return 0;
+ if (dumbfile_error(f))
+ return 0;
- return subsongs;
+ return subsongs;
}
-
-
/* Eww */
-int pattcmp( const unsigned char * a, const unsigned char * b, size_t l )
-{
+int pattcmp(const unsigned char *a, const unsigned char *b, size_t l) {
long i, j;
unsigned long na, nb;
- char * p;
+ char *p;
- na = nb = 0;
+ na = nb = 0;
- i = memcmp( a, b, l );
- if ( !i ) return 0;
+ i = memcmp(a, b, l);
+ if (!i)
+ return 0;
- /* damnit */
+ /* damnit */
- for ( i = 0; i < l; ++i )
- {
- if ( a [i] >= '0' && a [i] <= '9' ) break;
- }
+ for (i = 0; i < l; ++i) {
+ if (a[i] >= '0' && a[i] <= '9')
+ break;
+ }
- if ( i < l )
- {
- na = strtoul( (const char *)a + i, &p, 10 );
- if ( (const unsigned char *)p == a + i ) return 1;
- }
+ if (i < l) {
+ na = strtoul((const char *)a + i, &p, 10);
+ if ((const unsigned char *)p == a + i)
+ return 1;
+ }
- for ( j = 0; j < l; ++j )
- {
- if ( b [j] >= '0' && b [j] <= '9' ) break;
- }
+ for (j = 0; j < l; ++j) {
+ if (b[j] >= '0' && b[j] <= '9')
+ break;
+ }
- if ( j < l )
- {
- nb = strtoul( (const char *)b + j, &p, 10 );
- if ( (const unsigned char *)p == b + j ) return -1;
- }
+ if (j < l) {
+ nb = strtoul((const char *)b + j, &p, 10);
+ if ((const unsigned char *)p == b + j)
+ return -1;
+ }
- if ( i < j ) return -1;
- else if ( i > j ) return 1;
+ if (i < j)
+ return -1;
+ else if (i > j)
+ return 1;
- i = memcmp( a, b, j );
- if ( i ) return (int)i;
+ i = memcmp(a, b, j);
+ if (i)
+ return (int)i;
- return (int)(((long)na) - ((long)nb));
+ return (int)(((long)na) - ((long)nb));
}
+DUH *dumb_read_psm_quick(DUMBFILE *f, int subsong) {
+ sigdata_t *sigdata;
+ int ver;
+ DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
-DUH *dumb_read_psm_quick(DUMBFILE *f, int subsong)
-{
- sigdata_t *sigdata;
- int ver;
+ sigdata = it_psm_load_sigdata(f, &ver, subsong);
- DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
+ if (!sigdata)
+ return NULL;
- sigdata = it_psm_load_sigdata(f, &ver, subsong);
-
- if (!sigdata)
- return NULL;
-
- {
- int n_tags = 2;
- char version[16];
- const char *tag[3][2];
- tag[0][0] = "TITLE";
+ {
+ int n_tags = 2;
+ char version[16];
+ const char *tag[3][2];
+ tag[0][0] = "TITLE";
tag[0][1] = (const char *)(((DUMB_IT_SIGDATA *)sigdata)->name);
- tag[1][0] = "FORMAT";
- tag[1][1] = "PSM";
- if ( ver )
- {
- tag[2][0] = "FORMATVERSION";
- snprintf( version, 15, "%d", ver );
+ tag[1][0] = "FORMAT";
+ tag[1][1] = "PSM";
+ if (ver) {
+ tag[2][0] = "FORMATVERSION";
+ snprintf(version, 15, "%d", ver);
version[15] = 0;
- tag[2][1] = (const char *) &version;
- ++n_tags;
- }
- return make_duh(-1, n_tags, (const char *const (*)[2])tag, 1, &descptr, &sigdata);
- }
+ tag[2][1] = (const char *)&version;
+ ++n_tags;
+ }
+ return make_duh(-1, n_tags, (const char *const(*)[2])tag, 1, &descptr,
+ &sigdata);
+ }
}
--- a/src/it/readptm.c
+++ b/src/it/readptm.c
@@ -24,274 +24,275 @@
#include "dumb.h"
#include "internal/it.h"
+static int it_ptm_read_sample_header(IT_SAMPLE *sample, long *offset,
+ DUMBFILE *f) {
+ int flags;
+ flags = dumbfile_getc(f);
-static int it_ptm_read_sample_header(IT_SAMPLE *sample, long *offset, DUMBFILE *f)
-{
- int flags;
-
- flags = dumbfile_getc(f);
-
dumbfile_getnc((char *)sample->filename, 12, f);
- sample->filename[12] = 0;
+ sample->filename[12] = 0;
- sample->default_volume = dumbfile_getc(f);
+ sample->default_volume = dumbfile_getc(f);
- sample->C5_speed = dumbfile_igetw(f) << 1;
+ sample->C5_speed = dumbfile_igetw(f) << 1;
- dumbfile_skip(f, 2); /* segment */
+ dumbfile_skip(f, 2); /* segment */
- *offset = dumbfile_igetl(f);
+ *offset = dumbfile_igetl(f);
- sample->length = dumbfile_igetl(f);
- sample->loop_start = dumbfile_igetl(f);
- sample->loop_end = dumbfile_igetl(f);
+ sample->length = dumbfile_igetl(f);
+ sample->loop_start = dumbfile_igetl(f);
+ sample->loop_end = dumbfile_igetl(f);
- /* GUSBegin, GUSLStart, GUSLEnd, GUSLoop, reserverd */
- dumbfile_skip(f, 4+4+4+1+1);
+ /* GUSBegin, GUSLStart, GUSLEnd, GUSLoop, reserverd */
+ dumbfile_skip(f, 4 + 4 + 4 + 1 + 1);
dumbfile_getnc((char *)sample->name, 28, f);
- sample->name[28] = 0;
+ sample->name[28] = 0;
- /*
- if (dumbfile_mgetl(f) != DUMB_ID('P','T','M','S'))
- return -1;
- */
+ /*
+ if (dumbfile_mgetl(f) != DUMB_ID('P','T','M','S'))
+ return -1;
+ */
- /* BLAH! Shit likes to have broken or missing sample IDs */
- dumbfile_skip(f, 4);
+ /* BLAH! Shit likes to have broken or missing sample IDs */
+ dumbfile_skip(f, 4);
- if ((flags & 3) == 0) {
- /* Looks like no sample */
- sample->flags &= ~IT_SAMPLE_EXISTS;
- return dumbfile_error(f);
- }
+ if ((flags & 3) == 0) {
+ /* Looks like no sample */
+ sample->flags &= ~IT_SAMPLE_EXISTS;
+ return dumbfile_error(f);
+ }
- sample->global_volume = 64;
+ sample->global_volume = 64;
- sample->flags = IT_SAMPLE_EXISTS;
- if (flags & 4) sample->flags |= IT_SAMPLE_LOOP;
- if (flags & 8) sample->flags |= IT_SAMPLE_PINGPONG_LOOP;
+ sample->flags = IT_SAMPLE_EXISTS;
+ if (flags & 4)
+ sample->flags |= IT_SAMPLE_LOOP;
+ if (flags & 8)
+ sample->flags |= IT_SAMPLE_PINGPONG_LOOP;
- if (flags & 16) {
- sample->flags |= IT_SAMPLE_16BIT;
+ if (flags & 16) {
+ sample->flags |= IT_SAMPLE_16BIT;
- sample->length >>= 1;
- sample->loop_start >>= 1;
- sample->loop_end >>= 1;
- }
+ sample->length >>= 1;
+ sample->loop_start >>= 1;
+ sample->loop_end >>= 1;
+ }
- if (sample->loop_end) sample->loop_end--;
+ if (sample->loop_end)
+ sample->loop_end--;
- sample->default_pan = 0; // 0 = don't use, or 160 = centre?
+ sample->default_pan = 0; // 0 = don't use, or 160 = centre?
- if (sample->length <= 0)
- sample->flags &= ~IT_SAMPLE_EXISTS;
- else if (sample->flags & IT_SAMPLE_LOOP) {
- if ((unsigned int)sample->loop_end > (unsigned int)sample->length)
- sample->flags &= ~IT_SAMPLE_LOOP;
- else if ((unsigned int)sample->loop_start >= (unsigned int)sample->loop_end)
- sample->flags &= ~IT_SAMPLE_LOOP;
- else
- sample->length = sample->loop_end;
- }
+ if (sample->length <= 0)
+ sample->flags &= ~IT_SAMPLE_EXISTS;
+ else if (sample->flags & IT_SAMPLE_LOOP) {
+ if ((unsigned int)sample->loop_end > (unsigned int)sample->length)
+ sample->flags &= ~IT_SAMPLE_LOOP;
+ else if ((unsigned int)sample->loop_start >=
+ (unsigned int)sample->loop_end)
+ sample->flags &= ~IT_SAMPLE_LOOP;
+ else
+ sample->length = sample->loop_end;
+ }
+ // Do we need to set all these?
+ sample->vibrato_speed = 0;
+ sample->vibrato_depth = 0;
+ sample->vibrato_rate = 0;
+ sample->vibrato_waveform = IT_VIBRATO_SINE;
+ sample->finetune = 0;
+ sample->max_resampling_quality = -1;
- //Do we need to set all these?
- sample->vibrato_speed = 0;
- sample->vibrato_depth = 0;
- sample->vibrato_rate = 0;
- sample->vibrato_waveform = IT_VIBRATO_SINE;
- sample->finetune = 0;
- sample->max_resampling_quality = -1;
+ return dumbfile_error(f);
+}
- return dumbfile_error(f);
+static int it_ptm_read_byte(DUMBFILE *f) {
+ int meh = dumbfile_getc(f);
+ if (meh < 0)
+ return 0;
+ return meh;
}
+static int it_ptm_read_sample_data(IT_SAMPLE *sample, int last, DUMBFILE *f) {
+ long n;
+ int s;
-static int it_ptm_read_byte(DUMBFILE *f)
-{
- int meh = dumbfile_getc(f);
- if (meh < 0) return 0;
- return meh;
-}
+ sample->data =
+ malloc(sample->length * (sample->flags & IT_SAMPLE_16BIT ? 2 : 1));
+ if (!sample->data)
+ return -1;
-static int it_ptm_read_sample_data(IT_SAMPLE *sample, int last, DUMBFILE *f)
-{
- long n;
- int s;
+ s = 0;
- sample->data = malloc(sample->length * (sample->flags & IT_SAMPLE_16BIT ? 2 : 1));
- if (!sample->data)
- return -1;
+ if (sample->flags & IT_SAMPLE_16BIT) {
+ unsigned char a, b;
+ for (n = 0; n < sample->length; n++) {
+ a = s += (signed char)it_ptm_read_byte(f);
+ b = s += (signed char)it_ptm_read_byte(f);
+ ((short *)sample->data)[n] = a | (b << 8);
+ }
+ } else {
+ for (n = 0; n < sample->length; n++) {
+ s += (signed char)it_ptm_read_byte(f);
+ ((signed char *)sample->data)[n] = s;
+ }
+ }
- s = 0;
+ if (dumbfile_error(f) && !last)
+ return -1;
- if (sample->flags & IT_SAMPLE_16BIT) {
- unsigned char a, b;
- for (n = 0; n < sample->length; n++) {
- a = s += (signed char) it_ptm_read_byte(f);
- b = s += (signed char) it_ptm_read_byte(f);
- ((short *)sample->data)[n] = a | (b << 8);
- }
- } else {
- for (n = 0; n < sample->length; n++) {
- s += (signed char) it_ptm_read_byte(f);
- ((signed char *)sample->data)[n] = s;
- }
- }
-
- if (dumbfile_error(f) && !last)
- return -1;
-
- return 0;
+ return 0;
}
+static int it_ptm_read_pattern(IT_PATTERN *pattern, DUMBFILE *f,
+ unsigned char *buffer, size_t length) {
+ int buflen = 0;
+ int bufpos = 0;
+ int effect, effectvalue;
+ IT_ENTRY *entry;
-static int it_ptm_read_pattern(IT_PATTERN *pattern, DUMBFILE *f, unsigned char *buffer, size_t length)
-{
- int buflen = 0;
- int bufpos = 0;
- int effect, effectvalue;
+ unsigned char channel;
- IT_ENTRY *entry;
+ if (!length)
+ return -1;
- unsigned char channel;
+ pattern->n_rows = 0;
+ pattern->n_entries = 0;
- if (!length)
- return -1;
+ /* Read in the pattern data, little by little, and work out how many
+ * entries we need room for. Sorry, but this is just so funny...
+ */
+ for (;;) {
+ unsigned char b = buffer[buflen++] = dumbfile_getc(f);
- pattern->n_rows = 0;
- pattern->n_entries = 0;
-
- /* Read in the pattern data, little by little, and work out how many
- * entries we need room for. Sorry, but this is just so funny...
- */
- for (;;) {
- unsigned char b = buffer[buflen++] = dumbfile_getc(f);
-
#if 1
- static const unsigned char used[8] = {0, 2, 2, 4, 1, 3, 3, 5};
- channel = b & 31;
- b >>= 5;
- pattern->n_entries++;
- if (b) {
- if (buflen + used[b] >= 65536) return -1;
+ static const unsigned char used[8] = {0, 2, 2, 4, 1, 3, 3, 5};
+ channel = b & 31;
+ b >>= 5;
+ pattern->n_entries++;
+ if (b) {
+ if (buflen + used[b] >= 65536)
+ return -1;
dumbfile_getnc((char *)buffer + buflen, used[b], f);
- buflen += used[b];
- } else {
- /* End of row */
- if (++pattern->n_rows == 64) break;
- if (buflen >= 65536) return -1;
- }
+ buflen += used[b];
+ } else {
+ /* End of row */
+ if (++pattern->n_rows == 64)
+ break;
+ if (buflen >= 65536)
+ return -1;
+ }
#else
- if (b == 0) {
- /* End of row */
- pattern->n_entries++;
- if (++pattern->n_rows == 64) break;
- if (buflen >= 65536) return -1;
- } else {
- static const unsigned char used[8] = {0, 2, 2, 4, 1, 3, 3, 5};
- channel = b & 31;
- b >>= 5;
- if (b) {
- pattern->n_entries++;
- if (buflen + used[b] >= 65536) return -1;
- dumbfile_getnc(buffer + buflen, used[b], f);
- buflen += used[b];
- }
- }
+ if (b == 0) {
+ /* End of row */
+ pattern->n_entries++;
+ if (++pattern->n_rows == 64)
+ break;
+ if (buflen >= 65536)
+ return -1;
+ } else {
+ static const unsigned char used[8] = {0, 2, 2, 4, 1, 3, 3, 5};
+ channel = b & 31;
+ b >>= 5;
+ if (b) {
+ pattern->n_entries++;
+ if (buflen + used[b] >= 65536)
+ return -1;
+ dumbfile_getnc(buffer + buflen, used[b], f);
+ buflen += used[b];
+ }
+ }
#endif
- /* We have ensured that buflen < 65536 at this point, so it is safe
- * to iterate and read at least one more byte without checking.
- * However, now would be a good time to check for errors reading from
- * the file.
- */
+ /* We have ensured that buflen < 65536 at this point, so it is safe
+ * to iterate and read at least one more byte without checking.
+ * However, now would be a good time to check for errors reading from
+ * the file.
+ */
- if (dumbfile_error(f))
- return -1;
+ if (dumbfile_error(f))
+ return -1;
- /* Great. We ran out of data, but there should be data for more rows.
- * Fill the rest with null data...
- */
- if (buflen >= (dumb_ssize_t) length && pattern->n_rows < 64)
- {
- while (pattern->n_rows < 64)
- {
- if (buflen >= 65536) return -1;
- buffer[buflen++] = 0;
- pattern->n_entries++;
- pattern->n_rows++;
- }
- break;
- }
- }
+ /* Great. We ran out of data, but there should be data for more rows.
+ * Fill the rest with null data...
+ */
+ if (buflen >= (dumb_ssize_t)length && pattern->n_rows < 64) {
+ while (pattern->n_rows < 64) {
+ if (buflen >= 65536)
+ return -1;
+ buffer[buflen++] = 0;
+ pattern->n_entries++;
+ pattern->n_rows++;
+ }
+ break;
+ }
+ }
- pattern->entry = malloc(pattern->n_entries * sizeof(*pattern->entry));
+ pattern->entry = malloc(pattern->n_entries * sizeof(*pattern->entry));
- if (!pattern->entry)
- return -1;
+ if (!pattern->entry)
+ return -1;
- entry = pattern->entry;
+ entry = pattern->entry;
- while (bufpos < buflen) {
- unsigned char b = buffer[bufpos++];
+ while (bufpos < buflen) {
+ unsigned char b = buffer[bufpos++];
- if (b == 0)
- {
- /* End of row */
- IT_SET_END_ROW(entry);
- entry++;
- continue;
- }
+ if (b == 0) {
+ /* End of row */
+ IT_SET_END_ROW(entry);
+ entry++;
+ continue;
+ }
- channel = b & 31;
+ channel = b & 31;
- if (b & 224) {
- entry->mask = 0;
- entry->channel = channel;
+ if (b & 224) {
+ entry->mask = 0;
+ entry->channel = channel;
- if (b & 32) {
- unsigned char n = buffer[bufpos++];
- if (n == 254 || (n >= 1 && n <= 120)) {
- if (n == 254)
- entry->note = IT_NOTE_CUT;
- else
- entry->note = n - 1;
- entry->mask |= IT_ENTRY_NOTE;
- }
+ if (b & 32) {
+ unsigned char n = buffer[bufpos++];
+ if (n == 254 || (n >= 1 && n <= 120)) {
+ if (n == 254)
+ entry->note = IT_NOTE_CUT;
+ else
+ entry->note = n - 1;
+ entry->mask |= IT_ENTRY_NOTE;
+ }
- entry->instrument = buffer[bufpos++];
- if (entry->instrument)
- entry->mask |= IT_ENTRY_INSTRUMENT;
- }
+ entry->instrument = buffer[bufpos++];
+ if (entry->instrument)
+ entry->mask |= IT_ENTRY_INSTRUMENT;
+ }
- if (b & 64) {
- effect = buffer[bufpos++];
- effectvalue = buffer[bufpos++];
- _dumb_it_ptm_convert_effect(effect, effectvalue, entry);
- }
+ if (b & 64) {
+ effect = buffer[bufpos++];
+ effectvalue = buffer[bufpos++];
+ _dumb_it_ptm_convert_effect(effect, effectvalue, entry);
+ }
- if (b & 128) {
- entry->volpan = buffer[bufpos++];
- if (entry->volpan <= 64)
- entry->mask |= IT_ENTRY_VOLPAN;
- }
+ if (b & 128) {
+ entry->volpan = buffer[bufpos++];
+ if (entry->volpan <= 64)
+ entry->mask |= IT_ENTRY_VOLPAN;
+ }
- entry++;
- }
- }
+ entry++;
+ }
+ }
- ASSERT(entry == pattern->entry + pattern->n_entries);
+ ASSERT(entry == pattern->entry + pattern->n_entries);
- return 0;
+ return 0;
}
-
-
-/** WARNING: this is duplicated in itread.c - also bad practice to use the same struct name unless they are unified in a header */
+/** WARNING: this is duplicated in itread.c - also bad practice to use the same
+ * struct name unless they are unified in a header */
/* Currently we assume the sample data are stored after the sample headers in
* module files. This assumption may be unjustified; let me know if you have
* trouble.
@@ -298,257 +299,263 @@
*/
#define PTM_COMPONENT_INSTRUMENT 1
-#define PTM_COMPONENT_PATTERN 2
-#define PTM_COMPONENT_SAMPLE 3
+#define PTM_COMPONENT_PATTERN 2
+#define PTM_COMPONENT_SAMPLE 3
-typedef struct PTM_COMPONENT
-{
- unsigned char type;
- unsigned char n;
- long offset;
-}
-PTM_COMPONENT;
+typedef struct PTM_COMPONENT {
+ unsigned char type;
+ unsigned char n;
+ long offset;
+} PTM_COMPONENT;
-
-
-static int ptm_component_compare(const void *e1, const void *e2)
-{
- return (int)(((const PTM_COMPONENT *)e1)->offset -
- ((const PTM_COMPONENT *)e2)->offset);
+static int ptm_component_compare(const void *e1, const void *e2) {
+ return (int)(((const PTM_COMPONENT *)e1)->offset -
+ ((const PTM_COMPONENT *)e2)->offset);
}
+static DUMB_IT_SIGDATA *it_ptm_load_sigdata(DUMBFILE *f) {
+ DUMB_IT_SIGDATA *sigdata;
+ PTM_COMPONENT *component;
+ int n_components = 0;
-static DUMB_IT_SIGDATA *it_ptm_load_sigdata(DUMBFILE *f)
-{
- DUMB_IT_SIGDATA *sigdata;
+ int n;
- PTM_COMPONENT *component;
- int n_components = 0;
+ unsigned char *buffer;
- int n;
+ sigdata = malloc(sizeof(*sigdata));
+ if (!sigdata)
+ return NULL;
- unsigned char *buffer;
-
- sigdata = malloc(sizeof(*sigdata));
- if (!sigdata) return NULL;
-
- /* Skip song name. */
+ /* Skip song name. */
dumbfile_getnc((char *)sigdata->name, 28, f);
- sigdata->name[28] = 0;
+ sigdata->name[28] = 0;
- if (dumbfile_getc(f) != 0x1A || dumbfile_igetw(f) != 0x203) {
- free(sigdata);
- return NULL;
- }
+ if (dumbfile_getc(f) != 0x1A || dumbfile_igetw(f) != 0x203) {
+ free(sigdata);
+ return NULL;
+ }
- dumbfile_skip(f, 1);
+ dumbfile_skip(f, 1);
- sigdata->song_message = NULL;
- sigdata->order = NULL;
- sigdata->instrument = NULL;
- sigdata->sample = NULL;
- sigdata->pattern = NULL;
- sigdata->midi = NULL;
- sigdata->checkpoint = NULL;
+ sigdata->song_message = NULL;
+ sigdata->order = NULL;
+ sigdata->instrument = NULL;
+ sigdata->sample = NULL;
+ sigdata->pattern = NULL;
+ sigdata->midi = NULL;
+ sigdata->checkpoint = NULL;
- sigdata->n_orders = dumbfile_igetw(f);
- sigdata->n_instruments = 0;
- sigdata->n_samples = dumbfile_igetw(f);
- sigdata->n_patterns = dumbfile_igetw(f);
+ sigdata->n_orders = dumbfile_igetw(f);
+ sigdata->n_instruments = 0;
+ sigdata->n_samples = dumbfile_igetw(f);
+ sigdata->n_patterns = dumbfile_igetw(f);
- if (dumbfile_error(f) || sigdata->n_orders <= 0 || sigdata->n_samples > 255 || sigdata->n_patterns > 128) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ if (dumbfile_error(f) || sigdata->n_orders <= 0 ||
+ sigdata->n_samples > 255 || sigdata->n_patterns > 128) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- sigdata->n_pchannels = dumbfile_igetw(f);
+ sigdata->n_pchannels = dumbfile_igetw(f);
- if (dumbfile_igetw(f) != 0) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ if (dumbfile_igetw(f) != 0) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- dumbfile_skip(f, 2);
+ dumbfile_skip(f, 2);
- if (dumbfile_mgetl(f) != DUMB_ID('P','T','M','F')) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ if (dumbfile_mgetl(f) != DUMB_ID('P', 'T', 'M', 'F')) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- dumbfile_skip(f, 16);
+ dumbfile_skip(f, 16);
- sigdata->order = malloc(sigdata->n_orders);
- if (!sigdata->order) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ sigdata->order = malloc(sigdata->n_orders);
+ if (!sigdata->order) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- if (sigdata->n_samples) {
- sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
- if (!sigdata->sample) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- for (n = 0; n < sigdata->n_samples; n++)
- sigdata->sample[n].data = NULL;
- }
+ if (sigdata->n_samples) {
+ sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
+ if (!sigdata->sample) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (n = 0; n < sigdata->n_samples; n++)
+ sigdata->sample[n].data = NULL;
+ }
- if (sigdata->n_patterns) {
- sigdata->pattern = malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
- if (!sigdata->pattern) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- for (n = 0; n < sigdata->n_patterns; n++)
- sigdata->pattern[n].entry = NULL;
- }
+ if (sigdata->n_patterns) {
+ sigdata->pattern =
+ malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
+ if (!sigdata->pattern) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (n = 0; n < sigdata->n_patterns; n++)
+ sigdata->pattern[n].entry = NULL;
+ }
- /** WARNING: which ones? */
- sigdata->flags = IT_STEREO | IT_OLD_EFFECTS | IT_COMPATIBLE_GXX | IT_WAS_A_PTM;
+ /** WARNING: which ones? */
+ sigdata->flags =
+ IT_STEREO | IT_OLD_EFFECTS | IT_COMPATIBLE_GXX | IT_WAS_A_PTM;
- sigdata->global_volume = 128;
- sigdata->speed = 6;
- sigdata->tempo = 125;
- sigdata->mixing_volume = 48;
+ sigdata->global_volume = 128;
+ sigdata->speed = 6;
+ sigdata->tempo = 125;
+ sigdata->mixing_volume = 48;
- /* Panning positions for 32 channels */
- {
- int i;
- for (i = 0; i < 32; i++) {
- int c = dumbfile_getc(f);
- if (c <= 15) {
- sigdata->channel_volume[i] = 64;
- sigdata->channel_pan[i] = c;
- } else {
- /** WARNING: this could be improved if we support channel muting... */
- sigdata->channel_volume[i] = 0;
- sigdata->channel_pan[i] = 7;
- }
- }
- }
+ /* Panning positions for 32 channels */
+ {
+ int i;
+ for (i = 0; i < 32; i++) {
+ int c = dumbfile_getc(f);
+ if (c <= 15) {
+ sigdata->channel_volume[i] = 64;
+ sigdata->channel_pan[i] = c;
+ } else {
+ /** WARNING: this could be improved if we support channel
+ * muting... */
+ sigdata->channel_volume[i] = 0;
+ sigdata->channel_pan[i] = 7;
+ }
+ }
+ }
- /* Orders, byte each, length = sigdata->n_orders (should be even) */
+ /* Orders, byte each, length = sigdata->n_orders (should be even) */
dumbfile_getnc((char *)sigdata->order, sigdata->n_orders, f);
- sigdata->restart_position = 0;
+ sigdata->restart_position = 0;
- component = malloc(768*sizeof(*component));
- if (!component) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ component = malloc(768 * sizeof(*component));
+ if (!component) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
if (dumbfile_seek(f, 352, DFS_SEEK_SET)) {
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- for (n = 0; n < sigdata->n_patterns; n++) {
- component[n_components].type = PTM_COMPONENT_PATTERN;
- component[n_components].n = n;
- component[n_components].offset = dumbfile_igetw(f) << 4;
- n_components++;
- }
+ for (n = 0; n < sigdata->n_patterns; n++) {
+ component[n_components].type = PTM_COMPONENT_PATTERN;
+ component[n_components].n = n;
+ component[n_components].offset = dumbfile_igetw(f) << 4;
+ n_components++;
+ }
if (dumbfile_seek(f, 608, DFS_SEEK_SET)) {
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- for (n = 0; n < sigdata->n_samples; n++) {
- if (it_ptm_read_sample_header(&sigdata->sample[n], &component[n_components].offset, f)) {
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- if (!(sigdata->sample[n].flags & IT_SAMPLE_EXISTS)) continue;
- component[n_components].type = PTM_COMPONENT_SAMPLE;
- component[n_components].n = n;
- n_components++;
- }
+ for (n = 0; n < sigdata->n_samples; n++) {
+ if (it_ptm_read_sample_header(&sigdata->sample[n],
+ &component[n_components].offset, f)) {
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ if (!(sigdata->sample[n].flags & IT_SAMPLE_EXISTS))
+ continue;
+ component[n_components].type = PTM_COMPONENT_SAMPLE;
+ component[n_components].n = n;
+ n_components++;
+ }
- qsort(component, n_components, sizeof(PTM_COMPONENT), &ptm_component_compare);
+ qsort(component, n_components, sizeof(PTM_COMPONENT),
+ &ptm_component_compare);
- {
- int i;
- for (i = 0; i < 32; i++) {
- sigdata->channel_pan[i] -= (sigdata->channel_pan[i] & 8) >> 3;
- sigdata->channel_pan[i] = ((int)sigdata->channel_pan[i] << 5) / 7;
- if (sigdata->channel_pan[i] > 64) sigdata->channel_pan[i] = 64;
- }
- }
+ {
+ int i;
+ for (i = 0; i < 32; i++) {
+ sigdata->channel_pan[i] -= (sigdata->channel_pan[i] & 8) >> 3;
+ sigdata->channel_pan[i] = ((int)sigdata->channel_pan[i] << 5) / 7;
+ if (sigdata->channel_pan[i] > 64)
+ sigdata->channel_pan[i] = 64;
+ }
+ }
- sigdata->pan_separation = 128;
+ sigdata->pan_separation = 128;
- if (dumbfile_error(f)) {
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ if (dumbfile_error(f)) {
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- buffer = malloc(65536);
- if (!buffer) {
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ buffer = malloc(65536);
+ if (!buffer) {
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- for (n = 0; n < n_components; n++) {
+ for (n = 0; n < n_components; n++) {
if (dumbfile_seek(f, component[n].offset, DFS_SEEK_SET)) {
- free(buffer);
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ free(buffer);
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- switch (component[n].type) {
+ switch (component[n].type) {
- case PTM_COMPONENT_PATTERN:
- if (it_ptm_read_pattern(&sigdata->pattern[component[n].n], f, buffer, (n + 1 < n_components) ? (component[n+1].offset - component[n].offset) : 0)) {
- free(buffer);
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- break;
+ case PTM_COMPONENT_PATTERN:
+ if (it_ptm_read_pattern(
+ &sigdata->pattern[component[n].n], f, buffer,
+ (n + 1 < n_components)
+ ? (component[n + 1].offset - component[n].offset)
+ : 0)) {
+ free(buffer);
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ break;
- case PTM_COMPONENT_SAMPLE:
- if (it_ptm_read_sample_data(&sigdata->sample[component[n].n], (n + 1 == n_components), f)) {
- free(buffer);
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- }
- }
+ case PTM_COMPONENT_SAMPLE:
+ if (it_ptm_read_sample_data(&sigdata->sample[component[n].n],
+ (n + 1 == n_components), f)) {
+ free(buffer);
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ }
+ }
- free(buffer);
- free(component);
+ free(buffer);
+ free(component);
- _dumb_it_fix_invalid_orders(sigdata);
+ _dumb_it_fix_invalid_orders(sigdata);
- return sigdata;
+ return sigdata;
}
-DUH *dumb_read_ptm_quick(DUMBFILE *f)
-{
- sigdata_t *sigdata;
+DUH *dumb_read_ptm_quick(DUMBFILE *f) {
+ sigdata_t *sigdata;
- DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
+ DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
- sigdata = it_ptm_load_sigdata(f);
+ sigdata = it_ptm_load_sigdata(f);
- if (!sigdata)
- return NULL;
+ if (!sigdata)
+ return NULL;
- {
- const char *tag[2][2];
- tag[0][0] = "TITLE";
+ {
+ const char *tag[2][2];
+ tag[0][0] = "TITLE";
tag[0][1] = (const char *)(((DUMB_IT_SIGDATA *)sigdata)->name);
- tag[1][0] = "FORMAT";
- tag[1][1] = "PTM";
- return make_duh(-1, 2, (const char *const (*)[2])tag, 1, &descptr, &sigdata);
- }
+ tag[1][0] = "FORMAT";
+ tag[1][1] = "PTM";
+ return make_duh(-1, 2, (const char *const(*)[2])tag, 1, &descptr,
+ &sigdata);
+ }
}
--- a/src/it/readriff.c
+++ b/src/it/readriff.c
@@ -21,37 +21,38 @@
#include "internal/it.h"
#include "internal/riff.h"
+DUH *dumb_read_riff_amff(DUMBFILE *f, struct riff *stream);
+DUH *dumb_read_riff_am(DUMBFILE *f, struct riff *stream);
+DUH *dumb_read_riff_dsmf(DUMBFILE *f, struct riff *stream);
-DUH *dumb_read_riff_amff( DUMBFILE * f, struct riff * stream );
-DUH *dumb_read_riff_am( DUMBFILE * f, struct riff * stream );
-DUH *dumb_read_riff_dsmf( DUMBFILE * f, struct riff * stream );
-
/* dumb_read_riff_quick(): reads a RIFF file into a DUH struct, returning a
* pointer to the DUH struct. When you have finished with it, you must pass
* the pointer to unload_duh() so that the memory can be freed.
*/
-DUH *dumb_read_riff_quick( DUMBFILE * f )
-{
- DUH * duh;
- struct riff * stream;
+DUH *dumb_read_riff_quick(DUMBFILE *f) {
+ DUH *duh;
+ struct riff *stream;
long size;
size = dumbfile_get_size(f);
- stream = riff_parse( f, 0, size, 1 );
- if ( ! stream ) stream = riff_parse( f, 0, size, 0 );
+ stream = riff_parse(f, 0, size, 1);
+ if (!stream)
+ stream = riff_parse(f, 0, size, 0);
- if ( ! stream ) return 0;
+ if (!stream)
+ return 0;
- if ( stream->type == DUMB_ID( 'A', 'M', ' ', ' ' ) )
- duh = dumb_read_riff_am( f, stream );
- else if ( stream->type == DUMB_ID( 'A', 'M', 'F', 'F' ) )
- duh = dumb_read_riff_amff( f, stream );
- else if ( stream->type == DUMB_ID( 'D', 'S', 'M', 'F' ) )
- duh = dumb_read_riff_dsmf( f, stream );
- else duh = 0;
+ if (stream->type == DUMB_ID('A', 'M', ' ', ' '))
+ duh = dumb_read_riff_am(f, stream);
+ else if (stream->type == DUMB_ID('A', 'M', 'F', 'F'))
+ duh = dumb_read_riff_amff(f, stream);
+ else if (stream->type == DUMB_ID('D', 'S', 'M', 'F'))
+ duh = dumb_read_riff_dsmf(f, stream);
+ else
+ duh = 0;
- riff_free( stream );
+ riff_free(stream);
- return duh;
+ return duh;
}
--- a/src/it/reads3m.c
+++ b/src/it/reads3m.c
@@ -24,385 +24,388 @@
#include "dumb.h"
#include "internal/it.h"
-static int it_s3m_read_sample_header(IT_SAMPLE *sample, long *offset, unsigned char *pack, int cwtv, DUMBFILE *f)
-{
- unsigned char type;
- int flags;
+static int it_s3m_read_sample_header(IT_SAMPLE *sample, long *offset,
+ unsigned char *pack, int cwtv,
+ DUMBFILE *f) {
+ unsigned char type;
+ int flags;
- type = dumbfile_getc(f);
+ type = dumbfile_getc(f);
dumbfile_getnc((char *)sample->filename, 12, f);
- sample->filename[12] = 0;
+ sample->filename[12] = 0;
- if (type > 1) {
- /** WARNING: no adlib support */
- dumbfile_skip(f, 3 + 12 + 1 + 1 + 2 + 2 + 2 + 12);
+ if (type > 1) {
+ /** WARNING: no adlib support */
+ dumbfile_skip(f, 3 + 12 + 1 + 1 + 2 + 2 + 2 + 12);
dumbfile_getnc((char *)sample->name, 28, f);
- sample->name[28] = 0;
- dumbfile_skip(f, 4);
- sample->flags &= ~IT_SAMPLE_EXISTS;
- return dumbfile_error(f);
- }
+ sample->name[28] = 0;
+ dumbfile_skip(f, 4);
+ sample->flags &= ~IT_SAMPLE_EXISTS;
+ return dumbfile_error(f);
+ }
- *offset = dumbfile_getc(f) << 20;
- *offset += dumbfile_igetw(f) << 4;
+ *offset = dumbfile_getc(f) << 20;
+ *offset += dumbfile_igetw(f) << 4;
- sample->length = dumbfile_igetl(f);
- sample->loop_start = dumbfile_igetl(f);
- sample->loop_end = dumbfile_igetl(f);
+ sample->length = dumbfile_igetl(f);
+ sample->loop_start = dumbfile_igetl(f);
+ sample->loop_end = dumbfile_igetl(f);
- sample->default_volume = dumbfile_getc(f);
+ sample->default_volume = dumbfile_getc(f);
- dumbfile_skip(f, 1);
+ dumbfile_skip(f, 1);
- flags = dumbfile_getc(f);
+ flags = dumbfile_getc(f);
- if (flags < 0 || (flags != 0 && flags != 4))
- /* Sample is packed apparently (or error reading from file). We don't
- * know how to read packed samples.
- */
- return -1;
+ if (flags < 0 || (flags != 0 && flags != 4))
+ /* Sample is packed apparently (or error reading from file). We don't
+ * know how to read packed samples.
+ */
+ return -1;
- *pack = flags;
+ *pack = flags;
- flags = dumbfile_getc(f);
+ flags = dumbfile_getc(f);
- sample->C5_speed = dumbfile_igetl(f) << 1;
+ sample->C5_speed = dumbfile_igetl(f) << 1;
- /* Skip four unused bytes and three internal variables. */
- dumbfile_skip(f, 4+2+2+4);
+ /* Skip four unused bytes and three internal variables. */
+ dumbfile_skip(f, 4 + 2 + 2 + 4);
dumbfile_getnc((char *)sample->name, 28, f);
- sample->name[28] = 0;
+ sample->name[28] = 0;
- if (type == 0 || sample->length <= 0) {
- /* Looks like no-existy. Anyway, there's for sure no 'SCRS' ... */
- sample->flags &= ~IT_SAMPLE_EXISTS;
- return dumbfile_error(f);
- }
+ if (type == 0 || sample->length <= 0) {
+ /* Looks like no-existy. Anyway, there's for sure no 'SCRS' ... */
+ sample->flags &= ~IT_SAMPLE_EXISTS;
+ return dumbfile_error(f);
+ }
- if (dumbfile_mgetl(f) != DUMB_ID('S','C','R','S'))
- return -1;
+ if (dumbfile_mgetl(f) != DUMB_ID('S', 'C', 'R', 'S'))
+ return -1;
- sample->global_volume = 64;
+ sample->global_volume = 64;
- sample->flags = IT_SAMPLE_EXISTS;
- if (flags & 1) sample->flags |= IT_SAMPLE_LOOP;
+ sample->flags = IT_SAMPLE_EXISTS;
+ if (flags & 1)
+ sample->flags |= IT_SAMPLE_LOOP;
- /* The ST3 TECH.DOC is unclear on this, but IMAGO Orpheus is not. Piece of crap. */
+ /* The ST3 TECH.DOC is unclear on this, but IMAGO Orpheus is not. Piece of
+ * crap. */
- if (flags & 2) {
- sample->flags |= IT_SAMPLE_STEREO;
+ if (flags & 2) {
+ sample->flags |= IT_SAMPLE_STEREO;
- if ((cwtv & 0xF000) == 0x2000) {
- sample->length >>= 1;
- sample->loop_start >>= 1;
- sample->loop_end >>= 1;
- }
- }
+ if ((cwtv & 0xF000) == 0x2000) {
+ sample->length >>= 1;
+ sample->loop_start >>= 1;
+ sample->loop_end >>= 1;
+ }
+ }
- if (flags & 4) {
- sample->flags |= IT_SAMPLE_16BIT;
+ if (flags & 4) {
+ sample->flags |= IT_SAMPLE_16BIT;
- if ((cwtv & 0xF000) == 0x2000) {
- sample->length >>= 1;
- sample->loop_start >>= 1;
- sample->loop_end >>= 1;
- }
- }
+ if ((cwtv & 0xF000) == 0x2000) {
+ sample->length >>= 1;
+ sample->loop_start >>= 1;
+ sample->loop_end >>= 1;
+ }
+ }
- sample->default_pan = 0; // 0 = don't use, or 160 = centre?
+ sample->default_pan = 0; // 0 = don't use, or 160 = centre?
- if (sample->flags & IT_SAMPLE_LOOP) {
- if ((unsigned int)sample->loop_end > (unsigned int)sample->length)
- /*sample->flags &= ~IT_SAMPLE_LOOP;*/
- sample->loop_end = sample->length;
- else if ((unsigned int)sample->loop_start >= (unsigned int)sample->loop_end)
- sample->flags &= ~IT_SAMPLE_LOOP;
- else
- /* ScreamTracker seems not to save what comes after the loop end
- * point, but rather to assume it is a duplicate of what comes at
- * the loop start point. I am not completely sure of this though.
- * It is easy to evade; simply truncate the sample.
- */
- sample->length = sample->loop_end;
- }
+ if (sample->flags & IT_SAMPLE_LOOP) {
+ if ((unsigned int)sample->loop_end > (unsigned int)sample->length)
+ /*sample->flags &= ~IT_SAMPLE_LOOP;*/
+ sample->loop_end = sample->length;
+ else if ((unsigned int)sample->loop_start >=
+ (unsigned int)sample->loop_end)
+ sample->flags &= ~IT_SAMPLE_LOOP;
+ else
+ /* ScreamTracker seems not to save what comes after the loop end
+ * point, but rather to assume it is a duplicate of what comes at
+ * the loop start point. I am not completely sure of this though.
+ * It is easy to evade; simply truncate the sample.
+ */
+ sample->length = sample->loop_end;
+ }
+ // Do we need to set all these?
+ sample->vibrato_speed = 0;
+ sample->vibrato_depth = 0;
+ sample->vibrato_rate = 0;
+ sample->vibrato_waveform = IT_VIBRATO_SINE;
+ sample->finetune = 0;
+ sample->max_resampling_quality = -1;
- //Do we need to set all these?
- sample->vibrato_speed = 0;
- sample->vibrato_depth = 0;
- sample->vibrato_rate = 0;
- sample->vibrato_waveform = IT_VIBRATO_SINE;
- sample->finetune = 0;
- sample->max_resampling_quality = -1;
-
- return dumbfile_error(f);
+ return dumbfile_error(f);
}
+static int it_s3m_read_sample_data(IT_SAMPLE *sample, int ffi,
+ unsigned char pack, DUMBFILE *f) {
+ long n;
+ long datasize = sample->length;
+ if (sample->flags & IT_SAMPLE_STEREO)
+ datasize <<= 1;
-static int it_s3m_read_sample_data(IT_SAMPLE *sample, int ffi, unsigned char pack, DUMBFILE *f)
-{
- long n;
+ sample->data = malloc(datasize * (sample->flags & IT_SAMPLE_16BIT ? 2 : 1));
+ if (!sample->data)
+ return -1;
- long datasize = sample->length;
- if (sample->flags & IT_SAMPLE_STEREO) datasize <<= 1;
+ if (pack == 4) {
+ if (_dumb_it_read_sample_data_adpcm4(sample, f) < 0)
+ return -1;
+ } else if (sample->flags & IT_SAMPLE_STEREO) {
+ if (sample->flags & IT_SAMPLE_16BIT) {
+ for (n = 0; n < datasize; n += 2)
+ ((short *)sample->data)[n] = dumbfile_igetw(f);
+ for (n = 1; n < datasize; n += 2)
+ ((short *)sample->data)[n] = dumbfile_igetw(f);
+ } else {
+ for (n = 0; n < datasize; n += 2)
+ ((signed char *)sample->data)[n] = dumbfile_getc(f);
+ for (n = 1; n < datasize; n += 2)
+ ((signed char *)sample->data)[n] = dumbfile_getc(f);
+ }
+ } else if (sample->flags & IT_SAMPLE_16BIT)
+ for (n = 0; n < sample->length; n++)
+ ((short *)sample->data)[n] = dumbfile_igetw(f);
+ else
+ for (n = 0; n < sample->length; n++)
+ ((signed char *)sample->data)[n] = dumbfile_getc(f);
- sample->data = malloc(datasize * (sample->flags & IT_SAMPLE_16BIT ? 2 : 1));
- if (!sample->data)
- return -1;
+ if (dumbfile_error(f))
+ return -1;
- if (pack == 4) {
- if (_dumb_it_read_sample_data_adpcm4(sample, f) < 0)
- return -1;
- }
- else if (sample->flags & IT_SAMPLE_STEREO) {
- if (sample->flags & IT_SAMPLE_16BIT) {
- for (n = 0; n < datasize; n += 2)
- ((short *)sample->data)[n] = dumbfile_igetw(f);
- for (n = 1; n < datasize; n += 2)
- ((short *)sample->data)[n] = dumbfile_igetw(f);
- } else {
- for (n = 0; n < datasize; n += 2)
- ((signed char *)sample->data)[n] = dumbfile_getc(f);
- for (n = 1; n < datasize; n += 2)
- ((signed char *)sample->data)[n] = dumbfile_getc(f);
- }
- } else if (sample->flags & IT_SAMPLE_16BIT)
- for (n = 0; n < sample->length; n++)
- ((short *)sample->data)[n] = dumbfile_igetw(f);
- else
- for (n = 0; n < sample->length; n++)
- ((signed char *)sample->data)[n] = dumbfile_getc(f);
+ if (ffi != 1) {
+ /* Convert to signed. */
+ if (sample->flags & IT_SAMPLE_16BIT)
+ for (n = 0; n < datasize; n++)
+ ((short *)sample->data)[n] ^= 0x8000;
+ else
+ for (n = 0; n < datasize; n++)
+ ((signed char *)sample->data)[n] ^= 0x80;
+ }
- if (dumbfile_error(f))
- return -1;
-
- if (ffi != 1) {
- /* Convert to signed. */
- if (sample->flags & IT_SAMPLE_16BIT)
- for (n = 0; n < datasize; n++)
- ((short *)sample->data)[n] ^= 0x8000;
- else
- for (n = 0; n < datasize; n++)
- ((signed char *)sample->data)[n] ^= 0x80;
- }
-
- return 0;
+ return 0;
}
+static int it_s3m_read_pattern(IT_PATTERN *pattern, DUMBFILE *f,
+ unsigned char *buffer) {
+ int length;
+ int buflen = 0;
+ int bufpos = 0;
+ IT_ENTRY *entry;
-static int it_s3m_read_pattern(IT_PATTERN *pattern, DUMBFILE *f, unsigned char *buffer)
-{
- int length;
- int buflen = 0;
- int bufpos = 0;
+ unsigned char channel;
- IT_ENTRY *entry;
-
- unsigned char channel;
-
- /* Haha, this is hilarious!
- *
- * Well, after some experimentation, it seems that different S3M writers
- * define the format in different ways. The S3M docs say that the first
- * two bytes hold the "length of [the] packed pattern", and the packed
- * pattern data follow. Judging by the contents of ARMANI.S3M, packaged
- * with ScreamTracker itself, the measure of length _includes_ the two
- * bytes used to store the length; in other words, we should read
- * (length - 2) more bytes. However, aryx.s3m, packaged with ModPlug
- * Tracker, excludes these two bytes, so (length) more bytes must be
- * read.
- *
- * Call me crazy, but I just find it insanely funny that the format was
- * misunderstood in this way :D
- *
- * Now we can't just risk reading two extra bytes, because then we
- * overshoot, and DUMBFILEs don't support backward seeking (for a good
- * reason). Luckily, there is a way. We can read the data little by
- * little, and stop when we have 64 rows in memory. Provided we protect
- * against buffer overflow, this method should work with all sensibly
- * written S3M files. If you find one for which it does not work, please
- * let me know at entheh@users.sf.net so I can look at it.
+ /* Haha, this is hilarious!
*
+ * Well, after some experimentation, it seems that different S3M writers
+ * define the format in different ways. The S3M docs say that the first
+ * two bytes hold the "length of [the] packed pattern", and the packed
+ * pattern data follow. Judging by the contents of ARMANI.S3M, packaged
+ * with ScreamTracker itself, the measure of length _includes_ the two
+ * bytes used to store the length; in other words, we should read
+ * (length - 2) more bytes. However, aryx.s3m, packaged with ModPlug
+ * Tracker, excludes these two bytes, so (length) more bytes must be
+ * read.
+ *
+ * Call me crazy, but I just find it insanely funny that the format was
+ * misunderstood in this way :D
+ *
+ * Now we can't just risk reading two extra bytes, because then we
+ * overshoot, and DUMBFILEs don't support backward seeking (for a good
+ * reason). Luckily, there is a way. We can read the data little by
+ * little, and stop when we have 64 rows in memory. Provided we protect
+ * against buffer overflow, this method should work with all sensibly
+ * written S3M files. If you find one for which it does not work, please
+ * let me know at entheh@users.sf.net so I can look at it.
+ *
* "for a good reason" ? What's this nonsense? -kode54
*
- */
+ */
- length = dumbfile_igetw(f);
-
- if (dumbfile_error(f) || !length)
- return -1;
+ length = dumbfile_igetw(f);
- pattern->n_rows = 0;
- pattern->n_entries = 0;
+ if (dumbfile_error(f) || !length)
+ return -1;
- /* Read in the pattern data, little by little, and work out how many
- * entries we need room for. Sorry, but this is just so funny...
- */
- for (;;) {
- unsigned char b = buffer[buflen++] = dumbfile_getc(f);
+ pattern->n_rows = 0;
+ pattern->n_entries = 0;
+ /* Read in the pattern data, little by little, and work out how many
+ * entries we need room for. Sorry, but this is just so funny...
+ */
+ for (;;) {
+ unsigned char b = buffer[buflen++] = dumbfile_getc(f);
+
#if 1
- static const unsigned char used[8] = {0, 2, 1, 3, 2, 4, 3, 5};
- channel = b & 31;
- b >>= 5;
- pattern->n_entries++;
- if (b) {
- if (buflen + used[b] >= 65536) return -1;
- if (buflen + used[b] <= length)
+ static const unsigned char used[8] = {0, 2, 1, 3, 2, 4, 3, 5};
+ channel = b & 31;
+ b >>= 5;
+ pattern->n_entries++;
+ if (b) {
+ if (buflen + used[b] >= 65536)
+ return -1;
+ if (buflen + used[b] <= length)
dumbfile_getnc((char *)buffer + buflen, used[b], f);
- else
- memset(buffer + buflen, 0, used[b]);
- buflen += used[b];
- } else {
- /* End of row */
- if (++pattern->n_rows == 64) break;
- if (buflen >= 65536) return -1;
- }
+ else
+ memset(buffer + buflen, 0, used[b]);
+ buflen += used[b];
+ } else {
+ /* End of row */
+ if (++pattern->n_rows == 64)
+ break;
+ if (buflen >= 65536)
+ return -1;
+ }
#else
- if (b == 0) {
- /* End of row */
- pattern->n_entries++;
- if (++pattern->n_rows == 64) break;
- if (buflen >= 65536) return -1;
- } else {
- static const unsigned char used[8] = {0, 2, 1, 3, 2, 4, 3, 5};
- channel = b & 31;
- b >>= 5;
- if (b) {
- pattern->n_entries++;
- if (buflen + used[b] >= 65536) return -1;
- dumbfile_getnc(buffer + buflen, used[b], f);
- buflen += used[b];
- }
- }
+ if (b == 0) {
+ /* End of row */
+ pattern->n_entries++;
+ if (++pattern->n_rows == 64)
+ break;
+ if (buflen >= 65536)
+ return -1;
+ } else {
+ static const unsigned char used[8] = {0, 2, 1, 3, 2, 4, 3, 5};
+ channel = b & 31;
+ b >>= 5;
+ if (b) {
+ pattern->n_entries++;
+ if (buflen + used[b] >= 65536)
+ return -1;
+ dumbfile_getnc(buffer + buflen, used[b], f);
+ buflen += used[b];
+ }
+ }
#endif
- /* We have ensured that buflen < 65536 at this point, so it is safe
- * to iterate and read at least one more byte without checking.
- * However, now would be a good time to check for errors reading from
- * the file.
- */
+ /* We have ensured that buflen < 65536 at this point, so it is safe
+ * to iterate and read at least one more byte without checking.
+ * However, now would be a good time to check for errors reading from
+ * the file.
+ */
- if (dumbfile_error(f))
- return -1;
+ if (dumbfile_error(f))
+ return -1;
- /* Great. We ran out of data, but there should be data for more rows.
- * Fill the rest with null data...
- */
- if (buflen >= length && pattern->n_rows < 64)
- {
- while (pattern->n_rows < 64)
- {
- if (buflen >= 65536) return -1;
- buffer[buflen++] = 0;
- pattern->n_entries++;
- pattern->n_rows++;
- }
- break;
- }
- }
+ /* Great. We ran out of data, but there should be data for more rows.
+ * Fill the rest with null data...
+ */
+ if (buflen >= length && pattern->n_rows < 64) {
+ while (pattern->n_rows < 64) {
+ if (buflen >= 65536)
+ return -1;
+ buffer[buflen++] = 0;
+ pattern->n_entries++;
+ pattern->n_rows++;
+ }
+ break;
+ }
+ }
- pattern->entry = malloc(pattern->n_entries * sizeof(*pattern->entry));
+ pattern->entry = malloc(pattern->n_entries * sizeof(*pattern->entry));
- if (!pattern->entry)
- return -1;
+ if (!pattern->entry)
+ return -1;
- entry = pattern->entry;
+ entry = pattern->entry;
- while (bufpos < buflen) {
- unsigned char b = buffer[bufpos++];
+ while (bufpos < buflen) {
+ unsigned char b = buffer[bufpos++];
#if 1
- if (!(b & ~31))
+ if (!(b & ~31))
#else
- if (b == 0)
+ if (b == 0)
#endif
- {
- /* End of row */
- IT_SET_END_ROW(entry);
- entry++;
- continue;
- }
+ {
+ /* End of row */
+ IT_SET_END_ROW(entry);
+ entry++;
+ continue;
+ }
- channel = b & 31;
+ channel = b & 31;
- if (b & 224) {
- entry->mask = 0;
- entry->channel = channel;
+ if (b & 224) {
+ entry->mask = 0;
+ entry->channel = channel;
- if (b & 32) {
- unsigned char n = buffer[bufpos++];
- if (n != 255) {
- if (n == 254)
- entry->note = IT_NOTE_CUT;
- else
- entry->note = (n >> 4) * 12 + (n & 15);
- entry->mask |= IT_ENTRY_NOTE;
- }
+ if (b & 32) {
+ unsigned char n = buffer[bufpos++];
+ if (n != 255) {
+ if (n == 254)
+ entry->note = IT_NOTE_CUT;
+ else
+ entry->note = (n >> 4) * 12 + (n & 15);
+ entry->mask |= IT_ENTRY_NOTE;
+ }
- entry->instrument = buffer[bufpos++];
- if (entry->instrument)
- entry->mask |= IT_ENTRY_INSTRUMENT;
- }
+ entry->instrument = buffer[bufpos++];
+ if (entry->instrument)
+ entry->mask |= IT_ENTRY_INSTRUMENT;
+ }
- if (b & 64) {
- entry->volpan = buffer[bufpos++];
- if (entry->volpan != 255)
- entry->mask |= IT_ENTRY_VOLPAN;
- }
+ if (b & 64) {
+ entry->volpan = buffer[bufpos++];
+ if (entry->volpan != 255)
+ entry->mask |= IT_ENTRY_VOLPAN;
+ }
- if (b & 128) {
- entry->effect = buffer[bufpos++];
- entry->effectvalue = buffer[bufpos++];
- // XXX woot
- if (entry->effect && entry->effect < IT_MIDI_MACRO /*!= 255*/) {
- entry->mask |= IT_ENTRY_EFFECT;
- switch (entry->effect) {
- case IT_BREAK_TO_ROW:
- entry->effectvalue -= (entry->effectvalue >> 4) * 6;
- break;
+ if (b & 128) {
+ entry->effect = buffer[bufpos++];
+ entry->effectvalue = buffer[bufpos++];
+ // XXX woot
+ if (entry->effect && entry->effect < IT_MIDI_MACRO /*!= 255*/) {
+ entry->mask |= IT_ENTRY_EFFECT;
+ switch (entry->effect) {
+ case IT_BREAK_TO_ROW:
+ entry->effectvalue -= (entry->effectvalue >> 4) * 6;
+ break;
- case IT_SET_CHANNEL_VOLUME:
- case IT_CHANNEL_VOLUME_SLIDE:
- case IT_PANNING_SLIDE:
- case IT_GLOBAL_VOLUME_SLIDE:
- case IT_PANBRELLO:
- case IT_MIDI_MACRO:
- entry->mask &= ~IT_ENTRY_EFFECT;
- break;
+ case IT_SET_CHANNEL_VOLUME:
+ case IT_CHANNEL_VOLUME_SLIDE:
+ case IT_PANNING_SLIDE:
+ case IT_GLOBAL_VOLUME_SLIDE:
+ case IT_PANBRELLO:
+ case IT_MIDI_MACRO:
+ entry->mask &= ~IT_ENTRY_EFFECT;
+ break;
- case IT_S:
- switch (entry->effectvalue >> 4) {
- case IT_S_SET_PANBRELLO_WAVEFORM:
- case IT_S_FINE_PATTERN_DELAY:
- case IT_S7:
- case IT_S_SET_SURROUND_SOUND:
- case IT_S_SET_MIDI_MACRO:
- entry->mask &= ~IT_ENTRY_EFFECT;
- break;
- }
- break;
- }
- }
- /** WARNING: ARGH! CONVERT TEH EFFECTS!@~ */
- }
+ case IT_S:
+ switch (entry->effectvalue >> 4) {
+ case IT_S_SET_PANBRELLO_WAVEFORM:
+ case IT_S_FINE_PATTERN_DELAY:
+ case IT_S7:
+ case IT_S_SET_SURROUND_SOUND:
+ case IT_S_SET_MIDI_MACRO:
+ entry->mask &= ~IT_ENTRY_EFFECT;
+ break;
+ }
+ break;
+ }
+ }
+ /** WARNING: ARGH! CONVERT TEH EFFECTS!@~ */
+ }
- entry++;
- }
- }
+ entry++;
+ }
+ }
- ASSERT(entry == pattern->entry + pattern->n_entries);
+ ASSERT(entry == pattern->entry + pattern->n_entries);
- return 0;
+ return 0;
}
-
-
-/** WARNING: this is duplicated in itread.c - also bad practice to use the same struct name unless they are unified in a header */
+/** WARNING: this is duplicated in itread.c - also bad practice to use the same
+ * struct name unless they are unified in a header */
/* Currently we assume the sample data are stored after the sample headers in
* module files. This assumption may be unjustified; let me know if you have
* trouble.
@@ -409,358 +412,365 @@
*/
#define S3M_COMPONENT_INSTRUMENT 1
-#define S3M_COMPONENT_PATTERN 2
-#define S3M_COMPONENT_SAMPLE 3
+#define S3M_COMPONENT_PATTERN 2
+#define S3M_COMPONENT_SAMPLE 3
-typedef struct S3M_COMPONENT
-{
- unsigned char type;
- unsigned char n;
- long offset;
- short sampfirst; /* component[sampfirst] = first sample data after this */
- short sampnext; /* sampnext is used to create linked lists of sample data */
-}
-S3M_COMPONENT;
+typedef struct S3M_COMPONENT {
+ unsigned char type;
+ unsigned char n;
+ long offset;
+ short sampfirst; /* component[sampfirst] = first sample data after this */
+ short sampnext; /* sampnext is used to create linked lists of sample data */
+} S3M_COMPONENT;
-
-
-static int s3m_component_compare(const void *e1, const void *e2)
-{
- return (int)(((const S3M_COMPONENT *)e1)->offset -
- ((const S3M_COMPONENT *)e2)->offset);
+static int s3m_component_compare(const void *e1, const void *e2) {
+ return (int)(((const S3M_COMPONENT *)e1)->offset -
+ ((const S3M_COMPONENT *)e2)->offset);
}
+static DUMB_IT_SIGDATA *it_s3m_load_sigdata(DUMBFILE *f, int *cwtv) {
+ DUMB_IT_SIGDATA *sigdata;
+ int flags, ffi;
+ int default_pan_present;
-static DUMB_IT_SIGDATA *it_s3m_load_sigdata(DUMBFILE *f, int * cwtv)
-{
- DUMB_IT_SIGDATA *sigdata;
+ int master_volume;
- int flags, ffi;
- int default_pan_present;
+ unsigned char sample_pack[256];
- int master_volume;
+ S3M_COMPONENT *component;
+ int n_components = 0;
- unsigned char sample_pack[256];
+ int n;
- S3M_COMPONENT *component;
- int n_components = 0;
+ unsigned char *buffer;
- int n;
+ sigdata = malloc(sizeof(*sigdata));
+ if (!sigdata)
+ return NULL;
- unsigned char *buffer;
-
- sigdata = malloc(sizeof(*sigdata));
- if (!sigdata) return NULL;
-
dumbfile_getnc((char *)sigdata->name, 28, f);
- sigdata->name[28] = 0;
+ sigdata->name[28] = 0;
- n = dumbfile_getc(f);
+ n = dumbfile_getc(f);
- if (n != 0x1A && n != 0) {
- free(sigdata);
- return NULL;
- }
+ if (n != 0x1A && n != 0) {
+ free(sigdata);
+ return NULL;
+ }
- if (dumbfile_getc(f) != 16) {
- free(sigdata);
- return NULL;
- }
+ if (dumbfile_getc(f) != 16) {
+ free(sigdata);
+ return NULL;
+ }
- dumbfile_skip(f, 2);
+ dumbfile_skip(f, 2);
- sigdata->song_message = NULL;
- sigdata->order = NULL;
- sigdata->instrument = NULL;
- sigdata->sample = NULL;
- sigdata->pattern = NULL;
- sigdata->midi = NULL;
- sigdata->checkpoint = NULL;
+ sigdata->song_message = NULL;
+ sigdata->order = NULL;
+ sigdata->instrument = NULL;
+ sigdata->sample = NULL;
+ sigdata->pattern = NULL;
+ sigdata->midi = NULL;
+ sigdata->checkpoint = NULL;
- sigdata->n_orders = dumbfile_igetw(f);
- sigdata->n_instruments = 0;
- sigdata->n_samples = dumbfile_igetw(f);
- sigdata->n_patterns = dumbfile_igetw(f);
+ sigdata->n_orders = dumbfile_igetw(f);
+ sigdata->n_instruments = 0;
+ sigdata->n_samples = dumbfile_igetw(f);
+ sigdata->n_patterns = dumbfile_igetw(f);
- if (dumbfile_error(f) || sigdata->n_orders <= 0 || sigdata->n_samples > 256 || sigdata->n_patterns > 256) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ if (dumbfile_error(f) || sigdata->n_orders <= 0 ||
+ sigdata->n_samples > 256 || sigdata->n_patterns > 256) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- sigdata->order = malloc(sigdata->n_orders);
- if (!sigdata->order) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ sigdata->order = malloc(sigdata->n_orders);
+ if (!sigdata->order) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- if (sigdata->n_samples) {
- sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
- if (!sigdata->sample) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- for (n = 0; n < sigdata->n_samples; n++)
- sigdata->sample[n].data = NULL;
- }
+ if (sigdata->n_samples) {
+ sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
+ if (!sigdata->sample) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (n = 0; n < sigdata->n_samples; n++)
+ sigdata->sample[n].data = NULL;
+ }
- if (sigdata->n_patterns) {
- sigdata->pattern = malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
- if (!sigdata->pattern) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- for (n = 0; n < sigdata->n_patterns; n++)
- sigdata->pattern[n].entry = NULL;
- }
+ if (sigdata->n_patterns) {
+ sigdata->pattern =
+ malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
+ if (!sigdata->pattern) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (n = 0; n < sigdata->n_patterns; n++)
+ sigdata->pattern[n].entry = NULL;
+ }
- flags = dumbfile_igetw(f);
+ flags = dumbfile_igetw(f);
- *cwtv = dumbfile_igetw(f);
+ *cwtv = dumbfile_igetw(f);
- if (*cwtv == 0x1300) {
- /** WARNING: volume slides on every frame */
- }
+ if (*cwtv == 0x1300) {
+ /** WARNING: volume slides on every frame */
+ }
- ffi = dumbfile_igetw(f);
+ ffi = dumbfile_igetw(f);
- /** WARNING: which ones? */
- sigdata->flags = IT_OLD_EFFECTS | IT_COMPATIBLE_GXX | IT_WAS_AN_S3M;
+ /** WARNING: which ones? */
+ sigdata->flags = IT_OLD_EFFECTS | IT_COMPATIBLE_GXX | IT_WAS_AN_S3M;
- if (dumbfile_mgetl(f) != DUMB_ID('S','C','R','M')) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ if (dumbfile_mgetl(f) != DUMB_ID('S', 'C', 'R', 'M')) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- sigdata->global_volume = dumbfile_getc(f);
- if ( !sigdata->global_volume || sigdata->global_volume > 64 ) sigdata->global_volume = 64;
- sigdata->speed = dumbfile_getc(f);
- if (sigdata->speed == 0) sigdata->speed = 6; // Should we? What about tempo?
- sigdata->tempo = dumbfile_getc(f);
- master_volume = dumbfile_getc(f); // 7 bits; +128 for stereo
- sigdata->mixing_volume = master_volume & 127;
+ sigdata->global_volume = dumbfile_getc(f);
+ if (!sigdata->global_volume || sigdata->global_volume > 64)
+ sigdata->global_volume = 64;
+ sigdata->speed = dumbfile_getc(f);
+ if (sigdata->speed == 0)
+ sigdata->speed = 6; // Should we? What about tempo?
+ sigdata->tempo = dumbfile_getc(f);
+ master_volume = dumbfile_getc(f); // 7 bits; +128 for stereo
+ sigdata->mixing_volume = master_volume & 127;
- if (master_volume & 128) sigdata->flags |= IT_STEREO;
+ if (master_volume & 128)
+ sigdata->flags |= IT_STEREO;
- /* Skip GUS Ultra Click Removal byte. */
- dumbfile_getc(f);
+ /* Skip GUS Ultra Click Removal byte. */
+ dumbfile_getc(f);
- default_pan_present = dumbfile_getc(f);
+ default_pan_present = dumbfile_getc(f);
- dumbfile_skip(f, 8);
+ dumbfile_skip(f, 8);
- /* Skip Special Custom Data Pointer. */
- /** WARNING: investigate this? */
- dumbfile_igetw(f);
+ /* Skip Special Custom Data Pointer. */
+ /** WARNING: investigate this? */
+ dumbfile_igetw(f);
- sigdata->n_pchannels = 0;
- /* Channel settings for 32 channels, 255=unused, +128=disabled */
- {
- int i;
- int sep = (7 * dumb_it_default_panning_separation + 50) / 100;
- for (i = 0; i < 32; i++) {
- int c = dumbfile_getc(f);
- if (!(c & (128 | 16))) { /* +128=disabled, +16=Adlib */
- if (sigdata->n_pchannels < i + 1) sigdata->n_pchannels = i + 1;
- sigdata->channel_volume[i] = 64;
- sigdata->channel_pan[i] = c & 8 ? 7 + sep : 7 - sep;
- /** WARNING: ah, but it should be 7 for mono... */
- } else {
- /** WARNING: this could be improved if we support channel muting... */
- sigdata->channel_volume[i] = 0;
- sigdata->channel_pan[i] = 7;
- }
- }
- }
+ sigdata->n_pchannels = 0;
+ /* Channel settings for 32 channels, 255=unused, +128=disabled */
+ {
+ int i;
+ int sep = (7 * dumb_it_default_panning_separation + 50) / 100;
+ for (i = 0; i < 32; i++) {
+ int c = dumbfile_getc(f);
+ if (!(c & (128 | 16))) { /* +128=disabled, +16=Adlib */
+ if (sigdata->n_pchannels < i + 1)
+ sigdata->n_pchannels = i + 1;
+ sigdata->channel_volume[i] = 64;
+ sigdata->channel_pan[i] = c & 8 ? 7 + sep : 7 - sep;
+ /** WARNING: ah, but it should be 7 for mono... */
+ } else {
+ /** WARNING: this could be improved if we support channel
+ * muting... */
+ sigdata->channel_volume[i] = 0;
+ sigdata->channel_pan[i] = 7;
+ }
+ }
+ }
- /* Orders, byte each, length = sigdata->n_orders (should be even) */
+ /* Orders, byte each, length = sigdata->n_orders (should be even) */
dumbfile_getnc((char *)sigdata->order, sigdata->n_orders, f);
- sigdata->restart_position = 0;
+ sigdata->restart_position = 0;
- component = malloc(768*sizeof(*component));
- if (!component) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ component = malloc(768 * sizeof(*component));
+ if (!component) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- for (n = 0; n < sigdata->n_samples; n++) {
- component[n_components].type = S3M_COMPONENT_SAMPLE;
- component[n_components].n = n;
- component[n_components].offset = dumbfile_igetw(f) << 4;
- component[n_components].sampfirst = -1;
- n_components++;
- }
+ for (n = 0; n < sigdata->n_samples; n++) {
+ component[n_components].type = S3M_COMPONENT_SAMPLE;
+ component[n_components].n = n;
+ component[n_components].offset = dumbfile_igetw(f) << 4;
+ component[n_components].sampfirst = -1;
+ n_components++;
+ }
- for (n = 0; n < sigdata->n_patterns; n++) {
- long offset = dumbfile_igetw(f) << 4;
- if (offset) {
- component[n_components].type = S3M_COMPONENT_PATTERN;
- component[n_components].n = n;
- component[n_components].offset = offset;
- component[n_components].sampfirst = -1;
- n_components++;
- } else {
- /** WARNING: Empty 64-row pattern ... ? (this does happen!) */
- sigdata->pattern[n].n_rows = 64;
- sigdata->pattern[n].n_entries = 0;
- }
- }
+ for (n = 0; n < sigdata->n_patterns; n++) {
+ long offset = dumbfile_igetw(f) << 4;
+ if (offset) {
+ component[n_components].type = S3M_COMPONENT_PATTERN;
+ component[n_components].n = n;
+ component[n_components].offset = offset;
+ component[n_components].sampfirst = -1;
+ n_components++;
+ } else {
+ /** WARNING: Empty 64-row pattern ... ? (this does happen!) */
+ sigdata->pattern[n].n_rows = 64;
+ sigdata->pattern[n].n_entries = 0;
+ }
+ }
- qsort(component, n_components, sizeof(S3M_COMPONENT), &s3m_component_compare);
+ qsort(component, n_components, sizeof(S3M_COMPONENT),
+ &s3m_component_compare);
- /* I found a really dumb S3M file that claimed to contain default pan
- * data but didn't contain any. Programs would load it by reading part of
- * the first instrument header, assuming the data to be default pan
- * positions, and then rereading the instrument module. We cannot do this
- * without obfuscating the file input model, so we insert an extra check
- * here that we won't overrun the start of the first component.
- */
- if (default_pan_present == 252 && component[0].offset >= dumbfile_pos(f) + 32) {
- /* Channel default pan positions */
- int i;
- for (i = 0; i < 32; i++) {
- int c = dumbfile_getc(f);
- if (c & 32)
- sigdata->channel_pan[i] = c & 15;
- }
- }
+ /* I found a really dumb S3M file that claimed to contain default pan
+ * data but didn't contain any. Programs would load it by reading part of
+ * the first instrument header, assuming the data to be default pan
+ * positions, and then rereading the instrument module. We cannot do this
+ * without obfuscating the file input model, so we insert an extra check
+ * here that we won't overrun the start of the first component.
+ */
+ if (default_pan_present == 252 &&
+ component[0].offset >= dumbfile_pos(f) + 32) {
+ /* Channel default pan positions */
+ int i;
+ for (i = 0; i < 32; i++) {
+ int c = dumbfile_getc(f);
+ if (c & 32)
+ sigdata->channel_pan[i] = c & 15;
+ }
+ }
- {
- int i;
- for (i = 0; i < 32; i++) {
- sigdata->channel_pan[i] -= (sigdata->channel_pan[i] & 8) >> 3;
- sigdata->channel_pan[i] = ((int)sigdata->channel_pan[i] << 5) / 7;
- }
- }
+ {
+ int i;
+ for (i = 0; i < 32; i++) {
+ sigdata->channel_pan[i] -= (sigdata->channel_pan[i] & 8) >> 3;
+ sigdata->channel_pan[i] = ((int)sigdata->channel_pan[i] << 5) / 7;
+ }
+ }
- sigdata->pan_separation = 128;
+ sigdata->pan_separation = 128;
- if (dumbfile_error(f)) {
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ if (dumbfile_error(f)) {
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- buffer = malloc(65536);
- if (!buffer) {
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ buffer = malloc(65536);
+ if (!buffer) {
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- for (n = 0; n < n_components; n++) {
- long offset;
- int m;
+ for (n = 0; n < n_components; n++) {
+ long offset;
+ int m;
- offset = 0;
+ offset = 0;
if (dumbfile_seek(f, component[n].offset, DFS_SEEK_SET)) {
- free(buffer);
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ free(buffer);
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- switch (component[n].type) {
+ switch (component[n].type) {
- case S3M_COMPONENT_PATTERN:
- if (it_s3m_read_pattern(&sigdata->pattern[component[n].n], f, buffer)) {
- free(buffer);
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- break;
+ case S3M_COMPONENT_PATTERN:
+ if (it_s3m_read_pattern(&sigdata->pattern[component[n].n], f,
+ buffer)) {
+ free(buffer);
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ break;
- case S3M_COMPONENT_SAMPLE:
- if (it_s3m_read_sample_header(&sigdata->sample[component[n].n], &offset, &sample_pack[component[n].n], *cwtv, f)) {
- free(buffer);
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ case S3M_COMPONENT_SAMPLE:
+ if (it_s3m_read_sample_header(&sigdata->sample[component[n].n],
+ &offset, &sample_pack[component[n].n],
+ *cwtv, f)) {
+ free(buffer);
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- if (sigdata->sample[component[n].n].flags & IT_SAMPLE_EXISTS) {
- short *sample;
+ if (sigdata->sample[component[n].n].flags & IT_SAMPLE_EXISTS) {
+ short *sample;
- for (m = n + 1; m < n_components; m++)
- if (component[m].offset > offset)
- break;
- m--;
+ for (m = n + 1; m < n_components; m++)
+ if (component[m].offset > offset)
+ break;
+ m--;
- sample = &component[m].sampfirst;
+ sample = &component[m].sampfirst;
- while (*sample >= 0 && component[*sample].offset <= offset)
- sample = &component[*sample].sampnext;
+ while (*sample >= 0 && component[*sample].offset <= offset)
+ sample = &component[*sample].sampnext;
- component[n].sampnext = *sample;
- *sample = n;
+ component[n].sampnext = *sample;
+ *sample = n;
- component[n].offset = offset;
- }
- }
+ component[n].offset = offset;
+ }
+ }
- m = component[n].sampfirst;
+ m = component[n].sampfirst;
- while (m >= 0) {
- // XXX
- if (dumbfile_seek(f, component[m].offset, DFS_SEEK_SET)) {
- free(buffer);
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ while (m >= 0) {
+ // XXX
+ if (dumbfile_seek(f, component[m].offset, DFS_SEEK_SET)) {
+ free(buffer);
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- if (it_s3m_read_sample_data(&sigdata->sample[component[m].n], ffi, sample_pack[component[m].n], f)) {
- free(buffer);
- free(component);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ if (it_s3m_read_sample_data(&sigdata->sample[component[m].n], ffi,
+ sample_pack[component[m].n], f)) {
+ free(buffer);
+ free(component);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- m = component[m].sampnext;
- }
- }
+ m = component[m].sampnext;
+ }
+ }
- free(buffer);
- free(component);
+ free(buffer);
+ free(component);
- _dumb_it_fix_invalid_orders(sigdata);
+ _dumb_it_fix_invalid_orders(sigdata);
- return sigdata;
+ return sigdata;
}
-static char hexdigit(int in)
-{
- if (in < 10) return in + '0';
- else return in + 'A' - 10;
+static char hexdigit(int in) {
+ if (in < 10)
+ return in + '0';
+ else
+ return in + 'A' - 10;
}
-DUH *dumb_read_s3m_quick(DUMBFILE *f)
-{
- sigdata_t *sigdata;
- int cwtv;
+DUH *dumb_read_s3m_quick(DUMBFILE *f) {
+ sigdata_t *sigdata;
+ int cwtv;
- DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
+ DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
- sigdata = it_s3m_load_sigdata(f, &cwtv);
+ sigdata = it_s3m_load_sigdata(f, &cwtv);
- if (!sigdata)
- return NULL;
+ if (!sigdata)
+ return NULL;
- {
- char version[8];
- const char *tag[3][2];
- tag[0][0] = "TITLE";
+ {
+ char version[8];
+ const char *tag[3][2];
+ tag[0][0] = "TITLE";
tag[0][1] = (const char *)(((DUMB_IT_SIGDATA *)sigdata)->name);
- tag[1][0] = "FORMAT";
- tag[1][1] = "S3M";
- tag[2][0] = "TRACKERVERSION";
- version[0] = hexdigit((cwtv >> 8) & 15);
- version[1] = '.';
- version[2] = hexdigit((cwtv >> 4) & 15);
- version[3] = hexdigit(cwtv & 15);
- version[4] = 0;
- tag[2][1] = (const char *) &version;
- return make_duh(-1, 3, (const char *const (*)[2])tag, 1, &descptr, &sigdata);
- }
+ tag[1][0] = "FORMAT";
+ tag[1][1] = "S3M";
+ tag[2][0] = "TRACKERVERSION";
+ version[0] = hexdigit((cwtv >> 8) & 15);
+ version[1] = '.';
+ version[2] = hexdigit((cwtv >> 4) & 15);
+ version[3] = hexdigit(cwtv & 15);
+ version[4] = 0;
+ tag[2][1] = (const char *)&version;
+ return make_duh(-1, 3, (const char *const(*)[2])tag, 1, &descptr,
+ &sigdata);
+ }
}
--- a/src/it/reads3m2.c
+++ b/src/it/reads3m2.c
@@ -19,11 +19,8 @@
#include "dumb.h"
-
-
-DUH *dumb_read_s3m(DUMBFILE *f)
-{
- DUH *duh = dumb_read_s3m_quick(f);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+DUH *dumb_read_s3m(DUMBFILE *f) {
+ DUH *duh = dumb_read_s3m_quick(f);
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/readstm.c
+++ b/src/it/readstm.c
@@ -26,372 +26,376 @@
#include "internal/it.h"
#ifdef _MSC_VER
- #define strnicmp _strnicmp
+#define strnicmp _strnicmp
#else
- #if defined(unix) || defined(__unix__) || defined(__unix)
- #include <strings.h>
- #endif
- #define strnicmp strncasecmp
+#if defined(unix) || defined(__unix__) || defined(__unix)
+#include <strings.h>
#endif
+#define strnicmp strncasecmp
+#endif
-static int it_stm_read_sample_header( IT_SAMPLE *sample, DUMBFILE *f, unsigned short *offset )
-{
- dumbfile_getnc( (char *) sample->filename, 12, f );
- sample->filename[12] = 0;
+static int it_stm_read_sample_header(IT_SAMPLE *sample, DUMBFILE *f,
+ unsigned short *offset) {
+ dumbfile_getnc((char *)sample->filename, 12, f);
+ sample->filename[12] = 0;
- memcpy( sample->name, sample->filename, 13 );
+ memcpy(sample->name, sample->filename, 13);
- dumbfile_skip( f, 2 );
+ dumbfile_skip(f, 2);
- *offset = dumbfile_igetw( f );
+ *offset = dumbfile_igetw(f);
- sample->length = dumbfile_igetw( f );
- sample->loop_start = dumbfile_igetw( f );
- sample->loop_end = dumbfile_igetw( f );
+ sample->length = dumbfile_igetw(f);
+ sample->loop_start = dumbfile_igetw(f);
+ sample->loop_end = dumbfile_igetw(f);
- sample->default_volume = dumbfile_getc( f );
+ sample->default_volume = dumbfile_getc(f);
- dumbfile_skip( f, 1 );
+ dumbfile_skip(f, 1);
- sample->C5_speed = dumbfile_igetw( f ) << 3;
+ sample->C5_speed = dumbfile_igetw(f) << 3;
- dumbfile_skip( f, 6 );
+ dumbfile_skip(f, 6);
- if ( sample->length < 4 || !sample->default_volume ) {
- /* Looks like no-existy. */
- sample->flags &= ~IT_SAMPLE_EXISTS;
- sample->length = 0;
- *offset = 0;
- return dumbfile_error( f );
- }
+ if (sample->length < 4 || !sample->default_volume) {
+ /* Looks like no-existy. */
+ sample->flags &= ~IT_SAMPLE_EXISTS;
+ sample->length = 0;
+ *offset = 0;
+ return dumbfile_error(f);
+ }
- sample->flags = IT_SAMPLE_EXISTS;
- sample->global_volume = 64;
- sample->default_pan = 0; // 0 = don't use, or 160 = centre?
+ sample->flags = IT_SAMPLE_EXISTS;
+ sample->global_volume = 64;
+ sample->default_pan = 0; // 0 = don't use, or 160 = centre?
- if ( ( sample->loop_start < sample->length ) &&
- ( sample->loop_end > sample->loop_start ) &&
- ( sample->loop_end != 0xFFFF ) ) {
- sample->flags |= IT_SAMPLE_LOOP;
- if ( sample->loop_end > sample->length ) sample->loop_end = sample->length;
- }
+ if ((sample->loop_start < sample->length) &&
+ (sample->loop_end > sample->loop_start) &&
+ (sample->loop_end != 0xFFFF)) {
+ sample->flags |= IT_SAMPLE_LOOP;
+ if (sample->loop_end > sample->length)
+ sample->loop_end = sample->length;
+ }
- //Do we need to set all these?
- sample->vibrato_speed = 0;
- sample->vibrato_depth = 0;
- sample->vibrato_rate = 0;
- sample->vibrato_waveform = IT_VIBRATO_SINE;
- sample->finetune = 0;
- sample->max_resampling_quality = -1;
+ // Do we need to set all these?
+ sample->vibrato_speed = 0;
+ sample->vibrato_depth = 0;
+ sample->vibrato_rate = 0;
+ sample->vibrato_waveform = IT_VIBRATO_SINE;
+ sample->finetune = 0;
+ sample->max_resampling_quality = -1;
- return dumbfile_error(f);
+ return dumbfile_error(f);
}
-static int it_stm_read_sample_data( IT_SAMPLE *sample, DUMBFILE * f )
-{
- if ( ! sample->length ) return 0;
+static int it_stm_read_sample_data(IT_SAMPLE *sample, DUMBFILE *f) {
+ if (!sample->length)
+ return 0;
- sample->data = malloc( sample->length );
- if (!sample->data)
- return -1;
+ sample->data = malloc(sample->length);
+ if (!sample->data)
+ return -1;
- dumbfile_getnc( sample->data, sample->length, f );
+ dumbfile_getnc(sample->data, sample->length, f);
- return dumbfile_error( f );
+ return dumbfile_error(f);
}
-static int it_stm_read_pattern( IT_PATTERN *pattern, DUMBFILE *f, unsigned char *buffer )
-{
- int pos;
- int channel;
- int row;
- IT_ENTRY *entry;
+static int it_stm_read_pattern(IT_PATTERN *pattern, DUMBFILE *f,
+ unsigned char *buffer) {
+ int pos;
+ int channel;
+ int row;
+ IT_ENTRY *entry;
- pattern->n_rows = 64;
+ pattern->n_rows = 64;
- if ( dumbfile_getnc( (char *) buffer, 64 * 4 * 4, f ) != 64 * 4 * 4 )
- return -1;
+ if (dumbfile_getnc((char *)buffer, 64 * 4 * 4, f) != 64 * 4 * 4)
+ return -1;
- pattern->n_entries = 64;
- pos = 0;
- for ( row = 0; row < 64; ++row ) {
- for ( channel = 0; channel < 4; ++channel ) {
- if ( buffer[ pos + 0 ] | buffer[ pos + 1 ] | buffer[ pos + 2 ] | buffer[ pos + 3 ] )
- ++pattern->n_entries;
- pos += 4;
- }
- }
+ pattern->n_entries = 64;
+ pos = 0;
+ for (row = 0; row < 64; ++row) {
+ for (channel = 0; channel < 4; ++channel) {
+ if (buffer[pos + 0] | buffer[pos + 1] | buffer[pos + 2] |
+ buffer[pos + 3])
+ ++pattern->n_entries;
+ pos += 4;
+ }
+ }
- pattern->entry = malloc( pattern->n_entries * sizeof( *pattern->entry ) );
- if ( !pattern->entry )
- return -1;
+ pattern->entry = malloc(pattern->n_entries * sizeof(*pattern->entry));
+ if (!pattern->entry)
+ return -1;
- entry = pattern->entry;
- pos = 0;
- for ( row = 0; row < 64; ++row ) {
- for ( channel = 0; channel < 4; ++channel ) {
- if ( buffer[ pos + 0 ] | buffer[ pos + 1 ] | buffer[ pos + 2 ] | buffer[ pos + 3 ] ) {
- unsigned note;
- note = buffer[ pos + 0 ];
- entry->channel = channel;
- entry->mask = 0;
- entry->instrument = buffer[ pos + 1 ] >> 3;
- entry->volpan = ( buffer[ pos + 1 ] & 0x07 ) + ( buffer[ pos + 2 ] >> 1 );
- entry->effect = buffer[ pos + 2 ] & 0x0F;
- entry->effectvalue = buffer[ pos + 3 ];
- if ( entry->instrument && entry->instrument < 32 )
- entry->mask |= IT_ENTRY_INSTRUMENT;
- if ( note < 251 ) {
- entry->mask |= IT_ENTRY_NOTE;
- entry->note = ( note >> 4 ) * 12 + ( note & 0x0F );
- }
- if ( entry->volpan <= 64 )
- entry->mask |= IT_ENTRY_VOLPAN;
- entry->mask |= IT_ENTRY_EFFECT;
- switch ( entry->effect ) {
- case IT_SET_SPEED:
+ entry = pattern->entry;
+ pos = 0;
+ for (row = 0; row < 64; ++row) {
+ for (channel = 0; channel < 4; ++channel) {
+ if (buffer[pos + 0] | buffer[pos + 1] | buffer[pos + 2] |
+ buffer[pos + 3]) {
+ unsigned note;
+ note = buffer[pos + 0];
+ entry->channel = channel;
+ entry->mask = 0;
+ entry->instrument = buffer[pos + 1] >> 3;
+ entry->volpan =
+ (buffer[pos + 1] & 0x07) + (buffer[pos + 2] >> 1);
+ entry->effect = buffer[pos + 2] & 0x0F;
+ entry->effectvalue = buffer[pos + 3];
+ if (entry->instrument && entry->instrument < 32)
+ entry->mask |= IT_ENTRY_INSTRUMENT;
+ if (note < 251) {
+ entry->mask |= IT_ENTRY_NOTE;
+ entry->note = (note >> 4) * 12 + (note & 0x0F);
+ }
+ if (entry->volpan <= 64)
+ entry->mask |= IT_ENTRY_VOLPAN;
+ entry->mask |= IT_ENTRY_EFFECT;
+ switch (entry->effect) {
+ case IT_SET_SPEED:
/* taken care of in the renderer */
- break;
+ break;
- case IT_BREAK_TO_ROW:
- entry->effectvalue -= (entry->effectvalue >> 4) * 6;
- break;
+ case IT_BREAK_TO_ROW:
+ entry->effectvalue -= (entry->effectvalue >> 4) * 6;
+ break;
- case IT_JUMP_TO_ORDER:
- case IT_VOLUME_SLIDE:
- case IT_PORTAMENTO_DOWN:
- case IT_PORTAMENTO_UP:
- case IT_TONE_PORTAMENTO:
- case IT_VIBRATO:
- case IT_TREMOR:
- case IT_ARPEGGIO:
- case IT_VOLSLIDE_VIBRATO:
- case IT_VOLSLIDE_TONEPORTA:
- break;
+ case IT_JUMP_TO_ORDER:
+ case IT_VOLUME_SLIDE:
+ case IT_PORTAMENTO_DOWN:
+ case IT_PORTAMENTO_UP:
+ case IT_TONE_PORTAMENTO:
+ case IT_VIBRATO:
+ case IT_TREMOR:
+ case IT_ARPEGGIO:
+ case IT_VOLSLIDE_VIBRATO:
+ case IT_VOLSLIDE_TONEPORTA:
+ break;
- default:
- entry->mask &= ~IT_ENTRY_EFFECT;
- break;
- }
- if ( entry->mask ) ++entry;
- }
- pos += 4;
- }
- IT_SET_END_ROW(entry);
- ++entry;
- }
+ default:
+ entry->mask &= ~IT_ENTRY_EFFECT;
+ break;
+ }
+ if (entry->mask)
+ ++entry;
+ }
+ pos += 4;
+ }
+ IT_SET_END_ROW(entry);
+ ++entry;
+ }
- pattern->n_entries = (int)(entry - pattern->entry);
+ pattern->n_entries = (int)(entry - pattern->entry);
- return 0;
+ return 0;
}
+static DUMB_IT_SIGDATA *it_stm_load_sigdata(DUMBFILE *f, int *version) {
+ DUMB_IT_SIGDATA *sigdata;
+ char tracker_name[8];
-static DUMB_IT_SIGDATA *it_stm_load_sigdata(DUMBFILE *f, int * version)
-{
- DUMB_IT_SIGDATA *sigdata;
+ unsigned short sample_offset[31];
- char tracker_name[ 8 ];
-
- unsigned short sample_offset[ 31 ];
-
int n;
- sigdata = malloc(sizeof(*sigdata));
- if (!sigdata) return NULL;
+ sigdata = malloc(sizeof(*sigdata));
+ if (!sigdata)
+ return NULL;
- /* Skip song name. */
+ /* Skip song name. */
dumbfile_getnc((char *)sigdata->name, 20, f);
- sigdata->name[20] = 0;
+ sigdata->name[20] = 0;
- dumbfile_getnc(tracker_name, 8, f);
- n = dumbfile_getc(f);
- if ( n != 0x02 && n != 0x1A && n != 0x1B )
- {
- free( sigdata );
- return NULL;
- }
- if ( dumbfile_getc(f) != 2 ) /* only support modules */
- {
- free( sigdata );
- return NULL;
- }
- if ( strnicmp( tracker_name, "!Scream!", 8 ) &&
- strnicmp( tracker_name, "BMOD2STM", 8 ) &&
- strnicmp( tracker_name, "WUZAMOD!", 8 ) )
- {
- free( sigdata );
- return NULL;
- }
+ dumbfile_getnc(tracker_name, 8, f);
+ n = dumbfile_getc(f);
+ if (n != 0x02 && n != 0x1A && n != 0x1B) {
+ free(sigdata);
+ return NULL;
+ }
+ if (dumbfile_getc(f) != 2) /* only support modules */
+ {
+ free(sigdata);
+ return NULL;
+ }
+ if (strnicmp(tracker_name, "!Scream!", 8) &&
+ strnicmp(tracker_name, "BMOD2STM", 8) &&
+ strnicmp(tracker_name, "WUZAMOD!", 8)) {
+ free(sigdata);
+ return NULL;
+ }
- *version = dumbfile_mgetw(f);
+ *version = dumbfile_mgetw(f);
- sigdata->song_message = NULL;
- sigdata->order = NULL;
- sigdata->instrument = NULL;
- sigdata->sample = NULL;
- sigdata->pattern = NULL;
- sigdata->midi = NULL;
- sigdata->checkpoint = NULL;
+ sigdata->song_message = NULL;
+ sigdata->order = NULL;
+ sigdata->instrument = NULL;
+ sigdata->sample = NULL;
+ sigdata->pattern = NULL;
+ sigdata->midi = NULL;
+ sigdata->checkpoint = NULL;
- sigdata->n_instruments = 0;
- sigdata->n_samples = 31;
- sigdata->n_pchannels = 4;
+ sigdata->n_instruments = 0;
+ sigdata->n_samples = 31;
+ sigdata->n_pchannels = 4;
sigdata->tempo = 125;
sigdata->mixing_volume = 48;
- sigdata->pan_separation = 128;
+ sigdata->pan_separation = 128;
- /** WARNING: which ones? */
- sigdata->flags = IT_OLD_EFFECTS | IT_COMPATIBLE_GXX | IT_WAS_AN_S3M | IT_WAS_AN_STM | IT_STEREO;
+ /** WARNING: which ones? */
+ sigdata->flags = IT_OLD_EFFECTS | IT_COMPATIBLE_GXX | IT_WAS_AN_S3M |
+ IT_WAS_AN_STM | IT_STEREO;
n = dumbfile_getc(f);
- if ( n < 32 ) n = 32;
+ if (n < 32)
+ n = 32;
sigdata->speed = n;
sigdata->n_patterns = dumbfile_getc(f);
- sigdata->global_volume = dumbfile_getc(f) << 1;
- if ( sigdata->global_volume > 128 ) sigdata->global_volume = 128;
-
- dumbfile_skip(f, 13);
+ sigdata->global_volume = dumbfile_getc(f) << 1;
+ if (sigdata->global_volume > 128)
+ sigdata->global_volume = 128;
- if ( dumbfile_error(f) || sigdata->n_patterns < 1 || sigdata->n_patterns > 99 ) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ dumbfile_skip(f, 13);
- sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
- if (!sigdata->sample) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- for (n = 0; n < sigdata->n_samples; n++)
- sigdata->sample[n].data = NULL;
+ if (dumbfile_error(f) || sigdata->n_patterns < 1 ||
+ sigdata->n_patterns > 99) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- if (sigdata->n_patterns) {
- sigdata->pattern = malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
- if (!sigdata->pattern) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- for (n = 0; n < sigdata->n_patterns; n++)
- sigdata->pattern[n].entry = NULL;
- }
+ sigdata->sample = malloc(sigdata->n_samples * sizeof(*sigdata->sample));
+ if (!sigdata->sample) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (n = 0; n < sigdata->n_samples; n++)
+ sigdata->sample[n].data = NULL;
- memset( sigdata->channel_volume, 64, 4 );
- n = 32 * dumb_it_default_panning_separation / 100;
- sigdata->channel_pan[ 0 ] = 32 + n;
- sigdata->channel_pan[ 1 ] = 32 - n;
- sigdata->channel_pan[ 2 ] = 32 + n;
- sigdata->channel_pan[ 3 ] = 32 - n;
+ if (sigdata->n_patterns) {
+ sigdata->pattern =
+ malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
+ if (!sigdata->pattern) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (n = 0; n < sigdata->n_patterns; n++)
+ sigdata->pattern[n].entry = NULL;
+ }
- for ( n = 0; n < sigdata->n_samples; ++n ) {
- if ( it_stm_read_sample_header( &sigdata->sample[ n ], f, &sample_offset[ n ] ) ) {
- _dumb_it_unload_sigdata( sigdata );
- return NULL;
- }
- }
+ memset(sigdata->channel_volume, 64, 4);
+ n = 32 * dumb_it_default_panning_separation / 100;
+ sigdata->channel_pan[0] = 32 + n;
+ sigdata->channel_pan[1] = 32 - n;
+ sigdata->channel_pan[2] = 32 + n;
+ sigdata->channel_pan[3] = 32 - n;
- sigdata->order = malloc( 128 );
- if ( !sigdata->order ) {
- _dumb_it_unload_sigdata( sigdata );
- return NULL;
- }
+ for (n = 0; n < sigdata->n_samples; ++n) {
+ if (it_stm_read_sample_header(&sigdata->sample[n], f,
+ &sample_offset[n])) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ }
- /* Orders, byte each, length = sigdata->n_orders (should be even) */
- dumbfile_getnc( (char *) sigdata->order, *version >= 0x200 ? 128 : 64, f );
- if (*version < 0x200) memset( sigdata->order + 64, 0xFF, 64 );
- sigdata->restart_position = 0;
+ sigdata->order = malloc(128);
+ if (!sigdata->order) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- for ( n = 127; n >= 0; --n ) {
- if ( sigdata->order[ n ] < sigdata->n_patterns ) break;
- }
- if ( n < 0 ) {
- _dumb_it_unload_sigdata( sigdata );
- return NULL;
- }
- sigdata->n_orders = n + 1;
+ /* Orders, byte each, length = sigdata->n_orders (should be even) */
+ dumbfile_getnc((char *)sigdata->order, *version >= 0x200 ? 128 : 64, f);
+ if (*version < 0x200)
+ memset(sigdata->order + 64, 0xFF, 64);
+ sigdata->restart_position = 0;
- for ( n = 0; n < 128; ++n ) {
- if ( sigdata->order[ n ] >= 99 ) sigdata->order[ n ] = 0xFF;
- }
+ for (n = 127; n >= 0; --n) {
+ if (sigdata->order[n] < sigdata->n_patterns)
+ break;
+ }
+ if (n < 0) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ sigdata->n_orders = n + 1;
- if ( sigdata->n_patterns ) {
- unsigned char * buffer = malloc( 64 * 4 * 4 );
- if ( ! buffer ) {
- _dumb_it_unload_sigdata( sigdata );
- return NULL;
- }
- for ( n = 0; n < sigdata->n_patterns; ++n ) {
- if ( it_stm_read_pattern( &sigdata->pattern[ n ], f, buffer ) ) {
- free( buffer );
- _dumb_it_unload_sigdata( sigdata );
- return NULL;
- }
- }
- free( buffer );
- }
+ for (n = 0; n < 128; ++n) {
+ if (sigdata->order[n] >= 99)
+ sigdata->order[n] = 0xFF;
+ }
- for ( n = 0; n < sigdata->n_samples; ++n ) {
- if ( sample_offset[ n ] )
- {
- if ( dumbfile_seek( f, sample_offset[ n ] * 16, DFS_SEEK_SET ) ||
- it_stm_read_sample_data( &sigdata->sample[ n ], f ) ) {
- _dumb_it_unload_sigdata( sigdata );
+ if (sigdata->n_patterns) {
+ unsigned char *buffer = malloc(64 * 4 * 4);
+ if (!buffer) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (n = 0; n < sigdata->n_patterns; ++n) {
+ if (it_stm_read_pattern(&sigdata->pattern[n], f, buffer)) {
+ free(buffer);
+ _dumb_it_unload_sigdata(sigdata);
return NULL;
}
}
- else
- {
- sigdata->sample[ n ].flags = 0;
- sigdata->sample[ n ].length = 0;
+ free(buffer);
+ }
+
+ for (n = 0; n < sigdata->n_samples; ++n) {
+ if (sample_offset[n]) {
+ if (dumbfile_seek(f, sample_offset[n] * 16, DFS_SEEK_SET) ||
+ it_stm_read_sample_data(&sigdata->sample[n], f)) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ } else {
+ sigdata->sample[n].flags = 0;
+ sigdata->sample[n].length = 0;
}
}
- _dumb_it_fix_invalid_orders(sigdata);
+ _dumb_it_fix_invalid_orders(sigdata);
- return sigdata;
+ return sigdata;
}
-DUH *dumb_read_stm_quick(DUMBFILE *f)
-{
- sigdata_t *sigdata;
- int ver;
+DUH *dumb_read_stm_quick(DUMBFILE *f) {
+ sigdata_t *sigdata;
+ int ver;
- DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
+ DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
- sigdata = it_stm_load_sigdata(f , &ver);
+ sigdata = it_stm_load_sigdata(f, &ver);
- if (!sigdata)
- return NULL;
+ if (!sigdata)
+ return NULL;
- {
- char version[16];
- const char *tag[2][2];
- tag[0][0] = "TITLE";
+ {
+ char version[16];
+ const char *tag[2][2];
+ tag[0][0] = "TITLE";
tag[0][1] = (const char *)(((DUMB_IT_SIGDATA *)sigdata)->name);
- tag[1][0] = "FORMAT";
- version[0] = 'S';
- version[1] = 'T';
- version[2] = 'M';
- version[3] = ' ';
- version[4] = 'v';
- version[5] = '0' + ((ver >> 8) & 15);
- version[6] = '.';
- if ((ver & 255) > 99)
- {
- version[7] = '0' + ((ver & 255) / 100 );
- version[8] = '0' + (((ver & 255) / 10) % 10);
- version[9] = '0' + ((ver & 255) % 10);
- version[10] = 0;
- }
- else
- {
- version[7] = '0' + ((ver & 255) / 10);
- version[8] = '0' + ((ver & 255) % 10);
- version[9] = 0;
- }
- tag[1][1] = (const char *) &version;
- return make_duh(-1, 2, (const char *const (*)[2])tag, 1, &descptr, &sigdata);
- }
+ tag[1][0] = "FORMAT";
+ version[0] = 'S';
+ version[1] = 'T';
+ version[2] = 'M';
+ version[3] = ' ';
+ version[4] = 'v';
+ version[5] = '0' + ((ver >> 8) & 15);
+ version[6] = '.';
+ if ((ver & 255) > 99) {
+ version[7] = '0' + ((ver & 255) / 100);
+ version[8] = '0' + (((ver & 255) / 10) % 10);
+ version[9] = '0' + ((ver & 255) % 10);
+ version[10] = 0;
+ } else {
+ version[7] = '0' + ((ver & 255) / 10);
+ version[8] = '0' + ((ver & 255) % 10);
+ version[9] = 0;
+ }
+ tag[1][1] = (const char *)&version;
+ return make_duh(-1, 2, (const char *const(*)[2])tag, 1, &descptr,
+ &sigdata);
+ }
}
--- a/src/it/readstm2.c
+++ b/src/it/readstm2.c
@@ -19,11 +19,8 @@
#include "dumb.h"
-
-
-DUH *dumb_read_stm(DUMBFILE *f)
-{
- DUH *duh = dumb_read_stm_quick(f);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+DUH *dumb_read_stm(DUMBFILE *f) {
+ DUH *duh = dumb_read_stm_quick(f);
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/readxm.c
+++ b/src/it/readxm.c
@@ -25,8 +25,6 @@
#include "internal/it.h"
#include "internal/dumbfile.h"
-
-
/** TODO:
* XM_TREMOLO doesn't sound quite right...
@@ -56,592 +54,566 @@
*/
+#define XM_LINEAR_FREQUENCY 1 /* otherwise, use amiga slides */
+#define XM_ENTRY_PACKED 128
+#define XM_ENTRY_NOTE 1
+#define XM_ENTRY_INSTRUMENT 2
+#define XM_ENTRY_VOLUME 4
+#define XM_ENTRY_EFFECT 8
+#define XM_ENTRY_EFFECTVALUE 16
-#define XM_LINEAR_FREQUENCY 1 /* otherwise, use amiga slides */
+#define XM_NOTE_OFF 97
-#define XM_ENTRY_PACKED 128
-#define XM_ENTRY_NOTE 1
-#define XM_ENTRY_INSTRUMENT 2
-#define XM_ENTRY_VOLUME 4
-#define XM_ENTRY_EFFECT 8
-#define XM_ENTRY_EFFECTVALUE 16
+#define XM_ENVELOPE_ON 1
+#define XM_ENVELOPE_SUSTAIN 2
+#define XM_ENVELOPE_LOOP 4
-#define XM_NOTE_OFF 97
+#define XM_SAMPLE_NO_LOOP 0
+#define XM_SAMPLE_FORWARD_LOOP 1
+#define XM_SAMPLE_PINGPONG_LOOP 2
+#define XM_SAMPLE_16BIT 16
+#define XM_SAMPLE_STEREO 32
-#define XM_ENVELOPE_ON 1
-#define XM_ENVELOPE_SUSTAIN 2
-#define XM_ENVELOPE_LOOP 4
+#define XM_VIBRATO_SINE 0
+#define XM_VIBRATO_SQUARE 1
+#define XM_VIBRATO_RAMP_DOWN 2
+#define XM_VIBRATO_RAMP_UP 3
-#define XM_SAMPLE_NO_LOOP 0
-#define XM_SAMPLE_FORWARD_LOOP 1
-#define XM_SAMPLE_PINGPONG_LOOP 2
-#define XM_SAMPLE_16BIT 16
-#define XM_SAMPLE_STEREO 32
-
-#define XM_VIBRATO_SINE 0
-#define XM_VIBRATO_SQUARE 1
-#define XM_VIBRATO_RAMP_DOWN 2
-#define XM_VIBRATO_RAMP_UP 3
-
-
-
/* Probably useless :) */
-const char xm_convert_vibrato[] = {
- IT_VIBRATO_SINE,
- IT_VIBRATO_XM_SQUARE,
- IT_VIBRATO_RAMP_DOWN,
- IT_VIBRATO_RAMP_UP,
- IT_VIBRATO_RANDOM
-};
+const char xm_convert_vibrato[] = {IT_VIBRATO_SINE, IT_VIBRATO_XM_SQUARE,
+ IT_VIBRATO_RAMP_DOWN, IT_VIBRATO_RAMP_UP,
+ IT_VIBRATO_RANDOM};
-
-
#define XM_MAX_SAMPLES_PER_INSTRUMENT 16
-
-
/* Extra data that doesn't fit inside IT_INSTRUMENT */
-typedef struct XM_INSTRUMENT_EXTRA
-{
- int n_samples;
- int vibrato_type;
- int vibrato_sweep; /* 0-0xFF */
- int vibrato_depth; /* 0-0x0F */
- int vibrato_speed; /* 0-0x3F */
- int sample_header_size;
-}
-XM_INSTRUMENT_EXTRA;
+typedef struct XM_INSTRUMENT_EXTRA {
+ int n_samples;
+ int vibrato_type;
+ int vibrato_sweep; /* 0-0xFF */
+ int vibrato_depth; /* 0-0x0F */
+ int vibrato_speed; /* 0-0x3F */
+ int sample_header_size;
+} XM_INSTRUMENT_EXTRA;
-
-
/* Trims off trailing white space, usually added by the tracker on file creation
*/
-static void trim_whitespace(char *ptr, size_t size)
-{
- char *p = ptr + size - 1;
- while (p >= ptr && *p <= 0x20) *p-- = '\0';
+static void trim_whitespace(char *ptr, size_t size) {
+ char *p = ptr + size - 1;
+ while (p >= ptr && *p <= 0x20)
+ *p-- = '\0';
}
/* Frees the original block if it can't resize it or if size is 0, and acts
* as malloc if ptr is NULL.
*/
-static void *safe_realloc(void *ptr, size_t size)
-{
- if (ptr == NULL)
- return malloc(size);
+static void *safe_realloc(void *ptr, size_t size) {
+ if (ptr == NULL)
+ return malloc(size);
- if (size == 0) {
- free(ptr);
- return NULL;
- } else {
- void *new_block = realloc(ptr, size);
- if (!new_block)
- free(ptr);
- return new_block;
- }
+ if (size == 0) {
+ free(ptr);
+ return NULL;
+ } else {
+ void *new_block = realloc(ptr, size);
+ if (!new_block)
+ free(ptr);
+ return new_block;
+ }
}
-
-
/* The interpretation of the XM volume column is left to the player. Here, we
* just filter bad values.
*/
// This function is so tiny now, should we inline it?
-static void it_xm_convert_volume(int volume, IT_ENTRY *entry)
-{
- entry->mask |= IT_ENTRY_VOLPAN;
- entry->volpan = volume;
+static void it_xm_convert_volume(int volume, IT_ENTRY *entry) {
+ entry->mask |= IT_ENTRY_VOLPAN;
+ entry->volpan = volume;
- switch (volume >> 4) {
- case 0xA: /* set vibrato speed */
- case 0xB: /* vibrato */
- case 0xF: /* tone porta */
- case 0x6: /* vol slide up */
- case 0x7: /* vol slide down */
- case 0x8: /* fine vol slide up */
- case 0x9: /* fine vol slide down */
- case 0xC: /* set panning */
- case 0xD: /* pan slide left */
- case 0xE: /* pan slide right */
- case 0x1: /* set volume */
- case 0x2: /* set volume */
- case 0x3: /* set volume */
- case 0x4: /* set volume */
- break;
+ switch (volume >> 4) {
+ case 0xA: /* set vibrato speed */
+ case 0xB: /* vibrato */
+ case 0xF: /* tone porta */
+ case 0x6: /* vol slide up */
+ case 0x7: /* vol slide down */
+ case 0x8: /* fine vol slide up */
+ case 0x9: /* fine vol slide down */
+ case 0xC: /* set panning */
+ case 0xD: /* pan slide left */
+ case 0xE: /* pan slide right */
+ case 0x1: /* set volume */
+ case 0x2: /* set volume */
+ case 0x3: /* set volume */
+ case 0x4: /* set volume */
+ break;
- case 0x5:
- if (volume == 0x50)
- break; /* set volume */
- /* else fall through */
+ case 0x5:
+ if (volume == 0x50)
+ break; /* set volume */
+ /* else fall through */
- default:
- entry->mask &= ~IT_ENTRY_VOLPAN;
- break;
- }
+ default:
+ entry->mask &= ~IT_ENTRY_VOLPAN;
+ break;
+ }
}
+static int it_xm_read_pattern(IT_PATTERN *pattern, DUMBFILE *f, int n_channels,
+ unsigned char *buffer, int version) {
+ int size;
+ int pos;
+ int channel;
+ int row;
+ int effect, effectvalue;
+ IT_ENTRY *entry;
+ /* pattern header size */
+ if (dumbfile_igetl(f) != (version == 0x0102 ? 0x08 : 0x09)) {
+ TRACE("XM error: unexpected pattern header size\n");
+ return -1;
+ }
-static int it_xm_read_pattern(IT_PATTERN *pattern, DUMBFILE *f, int n_channels, unsigned char *buffer, int version)
-{
- int size;
- int pos;
- int channel;
- int row;
- int effect, effectvalue;
- IT_ENTRY *entry;
+ /* pattern data packing type */
+ if (dumbfile_getc(f) != 0) {
+ TRACE("XM error: unexpected pattern packing type\n");
+ return -1;
+ }
- /* pattern header size */
- if (dumbfile_igetl(f) != ( version == 0x0102 ? 0x08 : 0x09 ) ) {
- TRACE("XM error: unexpected pattern header size\n");
- return -1;
- }
+ if (version == 0x0102)
+ pattern->n_rows = dumbfile_getc(f) + 1;
+ else
+ pattern->n_rows = dumbfile_igetw(f); /* 1..256 */
+ size = dumbfile_igetw(f);
+ pattern->n_entries = 0;
- /* pattern data packing type */
- if (dumbfile_getc(f) != 0) {
- TRACE("XM error: unexpected pattern packing type\n");
- return -1;
- }
+ if (dumbfile_error(f))
+ return -1;
- if ( version == 0x0102 )
- pattern->n_rows = dumbfile_getc(f) + 1;
- else
- pattern->n_rows = dumbfile_igetw(f); /* 1..256 */
- size = dumbfile_igetw(f);
- pattern->n_entries = 0;
+ if (size == 0)
+ return 0;
- if (dumbfile_error(f))
- return -1;
+ if (size > 1280 * n_channels) {
+ TRACE("XM error: pattern data size > %d bytes\n", 1280 * n_channels);
+ return -1;
+ }
- if (size == 0)
- return 0;
-
- if (size > 1280 * n_channels) {
- TRACE("XM error: pattern data size > %d bytes\n", 1280 * n_channels);
- return -1;
- }
-
if (dumbfile_getnc((char *)buffer, size, f) < size)
- return -1;
+ return -1;
- /* compute number of entries */
- pattern->n_entries = 0;
- pos = channel = row = 0;
- while (pos < size) {
- if (!(buffer[pos] & XM_ENTRY_PACKED) || (buffer[pos] & 31))
- pattern->n_entries++;
+ /* compute number of entries */
+ pattern->n_entries = 0;
+ pos = channel = row = 0;
+ while (pos < size) {
+ if (!(buffer[pos] & XM_ENTRY_PACKED) || (buffer[pos] & 31))
+ pattern->n_entries++;
- channel++;
- if (channel >= n_channels) {
- channel = 0;
- row++;
- pattern->n_entries++;
- }
+ channel++;
+ if (channel >= n_channels) {
+ channel = 0;
+ row++;
+ pattern->n_entries++;
+ }
- if (buffer[pos] & XM_ENTRY_PACKED) {
- static const char offset[] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5 };
- pos += 1 + offset[buffer[pos] & 31];
- } else {
- pos += 5;
- }
- }
+ if (buffer[pos] & XM_ENTRY_PACKED) {
+ static const char offset[] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2,
+ 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3,
+ 3, 4, 2, 3, 3, 4, 3, 4, 4, 5};
+ pos += 1 + offset[buffer[pos] & 31];
+ } else {
+ pos += 5;
+ }
+ }
- if (row > pattern->n_rows) {
- TRACE("XM error: wrong number of rows in pattern data\n");
- return -1;
- }
+ if (row > pattern->n_rows) {
+ TRACE("XM error: wrong number of rows in pattern data\n");
+ return -1;
+ }
- /* Whoops, looks like some modules may be short, a few channels, maybe even rows... */
+ /* Whoops, looks like some modules may be short, a few channels, maybe even
+ * rows... */
- while (row < pattern->n_rows)
- {
- pattern->n_entries++;
- row++;
- }
+ while (row < pattern->n_rows) {
+ pattern->n_entries++;
+ row++;
+ }
- pattern->entry = malloc(pattern->n_entries * sizeof(*pattern->entry));
- if (!pattern->entry)
- return -1;
+ pattern->entry = malloc(pattern->n_entries * sizeof(*pattern->entry));
+ if (!pattern->entry)
+ return -1;
- /* read the entries */
- entry = pattern->entry;
- pos = channel = row = 0;
- while (pos < size) {
- unsigned char mask;
+ /* read the entries */
+ entry = pattern->entry;
+ pos = channel = row = 0;
+ while (pos < size) {
+ unsigned char mask;
- if (buffer[pos] & XM_ENTRY_PACKED)
- mask = buffer[pos++] & 31;
- else
- mask = 31;
+ if (buffer[pos] & XM_ENTRY_PACKED)
+ mask = buffer[pos++] & 31;
+ else
+ mask = 31;
- if (mask) {
- ASSERT(entry < pattern->entry + pattern->n_entries);
+ if (mask) {
+ ASSERT(entry < pattern->entry + pattern->n_entries);
- entry->channel = channel;
- entry->mask = 0;
+ entry->channel = channel;
+ entry->mask = 0;
- if (mask & XM_ENTRY_NOTE) {
- int note = buffer[pos++]; /* 1-96 <=> C0-B7 */
- entry->note = (note == XM_NOTE_OFF) ? (IT_NOTE_OFF) : (note-1);
- entry->mask |= IT_ENTRY_NOTE;
- }
+ if (mask & XM_ENTRY_NOTE) {
+ int note = buffer[pos++]; /* 1-96 <=> C0-B7 */
+ entry->note =
+ (note == XM_NOTE_OFF) ? (IT_NOTE_OFF) : (note - 1);
+ entry->mask |= IT_ENTRY_NOTE;
+ }
- if (mask & XM_ENTRY_INSTRUMENT) {
- entry->instrument = buffer[pos++]; /* 1-128 */
- entry->mask |= IT_ENTRY_INSTRUMENT;
- }
+ if (mask & XM_ENTRY_INSTRUMENT) {
+ entry->instrument = buffer[pos++]; /* 1-128 */
+ entry->mask |= IT_ENTRY_INSTRUMENT;
+ }
- if (mask & XM_ENTRY_VOLUME)
- it_xm_convert_volume(buffer[pos++], entry);
+ if (mask & XM_ENTRY_VOLUME)
+ it_xm_convert_volume(buffer[pos++], entry);
- effect = effectvalue = 0;
- if (mask & XM_ENTRY_EFFECT) effect = buffer[pos++];
- if (mask & XM_ENTRY_EFFECTVALUE) effectvalue = buffer[pos++];
- _dumb_it_xm_convert_effect(effect, effectvalue, entry, 0);
+ effect = effectvalue = 0;
+ if (mask & XM_ENTRY_EFFECT)
+ effect = buffer[pos++];
+ if (mask & XM_ENTRY_EFFECTVALUE)
+ effectvalue = buffer[pos++];
+ _dumb_it_xm_convert_effect(effect, effectvalue, entry, 0);
- entry++;
- }
+ entry++;
+ }
- channel++;
- if (channel >= n_channels) {
- channel = 0;
- row++;
- IT_SET_END_ROW(entry);
- entry++;
- }
- }
+ channel++;
+ if (channel >= n_channels) {
+ channel = 0;
+ row++;
+ IT_SET_END_ROW(entry);
+ entry++;
+ }
+ }
- while (row < pattern->n_rows)
- {
- row++;
- IT_SET_END_ROW(entry);
- entry++;
- }
+ while (row < pattern->n_rows) {
+ row++;
+ IT_SET_END_ROW(entry);
+ entry++;
+ }
- return 0;
+ return 0;
}
-
-
-static int it_xm_make_envelope(IT_ENVELOPE *envelope, const unsigned short *data, int y_offset)
-{
+static int it_xm_make_envelope(IT_ENVELOPE *envelope,
+ const unsigned short *data, int y_offset) {
int i, pos, val;
- if (envelope->n_nodes > 12) {
- /* XXX
- TRACE("XM error: wrong number of envelope nodes (%d)\n", envelope->n_nodes);
- envelope->n_nodes = 0;
- return -1; */
- envelope->n_nodes = 12;
- }
+ if (envelope->n_nodes > 12) {
+ /* XXX
+ TRACE("XM error: wrong number of envelope nodes (%d)\n",
+ envelope->n_nodes); envelope->n_nodes = 0; return -1; */
+ envelope->n_nodes = 12;
+ }
- if (envelope->sus_loop_start >= 12) envelope->flags &= ~IT_ENVELOPE_SUSTAIN_LOOP;
- if (envelope->loop_end >= 12) envelope->loop_end = 0;
- if (envelope->loop_start >= envelope->loop_end) envelope->flags &= ~IT_ENVELOPE_LOOP_ON;
+ if (envelope->sus_loop_start >= 12)
+ envelope->flags &= ~IT_ENVELOPE_SUSTAIN_LOOP;
+ if (envelope->loop_end >= 12)
+ envelope->loop_end = 0;
+ if (envelope->loop_start >= envelope->loop_end)
+ envelope->flags &= ~IT_ENVELOPE_LOOP_ON;
- pos = 0;
- for (i = 0; i < envelope->n_nodes; i++) {
- envelope->node_t[i] = data[pos++];
+ pos = 0;
+ for (i = 0; i < envelope->n_nodes; i++) {
+ envelope->node_t[i] = data[pos++];
val = data[pos++];
if (val > 64) {
- TRACE("XM error: out-of-range envelope node (node_y[%d]=%d)\n", i, val);
+ TRACE("XM error: out-of-range envelope node (node_y[%d]=%d)\n", i,
+ val);
/* FT2 seems to simply clip the value */
val = 64;
- }
+ }
envelope->node_y[i] = (signed char)(val + y_offset);
- }
+ }
- return 0;
+ return 0;
}
-
-
typedef struct LIMITED_XM LIMITED_XM;
-struct LIMITED_XM
-{
- unsigned char *buffered;
- long ptr, limit, allocated;
- DUMBFILE *remaining;
+struct LIMITED_XM {
+ unsigned char *buffered;
+ long ptr, limit, allocated;
+ DUMBFILE *remaining;
};
-static int limit_xm_resize(void *f, long n)
-{
- DUMBFILE *df = f;
- LIMITED_XM *lx = df->file;
- if (n < 0)
- return -1;
- if (lx->buffered || n) {
- if (n > lx->allocated) {
- unsigned char *buffered = realloc( lx->buffered, n );
- if ( !buffered ) return -1;
- lx->buffered = buffered;
- memset( buffered + lx->allocated, 0, n - lx->allocated );
- lx->allocated = n;
- }
- if ( dumbfile_getnc( (char *)lx->buffered, n, lx->remaining ) < n ) return -1;
- } else if (!n) {
- if ( lx->buffered ) free( lx->buffered );
- lx->buffered = NULL;
- lx->allocated = 0;
- }
- lx->limit = n;
- lx->ptr = 0;
- return 0;
+static int limit_xm_resize(void *f, long n) {
+ DUMBFILE *df = f;
+ LIMITED_XM *lx = df->file;
+ if (n < 0)
+ return -1;
+ if (lx->buffered || n) {
+ if (n > lx->allocated) {
+ unsigned char *buffered = realloc(lx->buffered, n);
+ if (!buffered)
+ return -1;
+ lx->buffered = buffered;
+ memset(buffered + lx->allocated, 0, n - lx->allocated);
+ lx->allocated = n;
+ }
+ if (dumbfile_getnc((char *)lx->buffered, n, lx->remaining) < n)
+ return -1;
+ } else if (!n) {
+ if (lx->buffered)
+ free(lx->buffered);
+ lx->buffered = NULL;
+ lx->allocated = 0;
+ }
+ lx->limit = n;
+ lx->ptr = 0;
+ return 0;
}
-static int limit_xm_skip_end(void *f, long n)
-{
- DUMBFILE *df = f;
- LIMITED_XM *lx = df->file;
- return dumbfile_skip( lx->remaining, n );
+static int limit_xm_skip_end(void *f, long n) {
+ DUMBFILE *df = f;
+ LIMITED_XM *lx = df->file;
+ return dumbfile_skip(lx->remaining, n);
}
-static int limit_xm_skip(void *f, dumb_off_t n)
-{
- LIMITED_XM *lx = f;
- lx->ptr += n;
- return 0;
+static int limit_xm_skip(void *f, dumb_off_t n) {
+ LIMITED_XM *lx = f;
+ lx->ptr += n;
+ return 0;
}
-
-
-static int limit_xm_getc(void *f)
-{
- LIMITED_XM *lx = f;
- if (lx->ptr >= lx->allocated) {
- return 0;
- }
- return lx->buffered[lx->ptr++];
+static int limit_xm_getc(void *f) {
+ LIMITED_XM *lx = f;
+ if (lx->ptr >= lx->allocated) {
+ return 0;
+ }
+ return lx->buffered[lx->ptr++];
}
-
-
-static dumb_ssize_t limit_xm_getnc(char *ptr, size_t n, void *f)
-{
- LIMITED_XM *lx = f;
- dumb_ssize_t left;
- left = lx->allocated - lx->ptr;
- if ((dumb_ssize_t) n > left) {
- if (left > 0) {
- memcpy( ptr, lx->buffered + lx->ptr, left );
- memset( ptr + left, 0, n - left );
- } else {
- memset( ptr, 0, n );
- }
- } else {
- memcpy( ptr, lx->buffered + lx->ptr, n );
- }
- lx->ptr += n;
- return n;
+static dumb_ssize_t limit_xm_getnc(char *ptr, size_t n, void *f) {
+ LIMITED_XM *lx = f;
+ dumb_ssize_t left;
+ left = lx->allocated - lx->ptr;
+ if ((dumb_ssize_t)n > left) {
+ if (left > 0) {
+ memcpy(ptr, lx->buffered + lx->ptr, left);
+ memset(ptr + left, 0, n - left);
+ } else {
+ memset(ptr, 0, n);
+ }
+ } else {
+ memcpy(ptr, lx->buffered + lx->ptr, n);
+ }
+ lx->ptr += n;
+ return n;
}
-
-
-static void limit_xm_close(void *f)
-{
- LIMITED_XM *lx = f;
- if (lx->buffered) free(lx->buffered);
- /* Do NOT close lx->remaining */
- free(f);
+static void limit_xm_close(void *f) {
+ LIMITED_XM *lx = f;
+ if (lx->buffered)
+ free(lx->buffered);
+ /* Do NOT close lx->remaining */
+ free(f);
}
-
/* These two can be stubs since this implementation doesn't use seeking */
-static int limit_xm_seek(void *f, dumb_off_t n)
-{
+static int limit_xm_seek(void *f, dumb_off_t n) {
(void)f;
(void)n;
return 1;
}
-
-
-static dumb_off_t limit_xm_get_size(void *f)
-{
+static dumb_off_t limit_xm_get_size(void *f) {
(void)f;
return 0;
}
+DUMBFILE_SYSTEM limit_xm_dfs = {NULL,
+ &limit_xm_skip,
+ &limit_xm_getc,
+ &limit_xm_getnc,
+ &limit_xm_close,
+ &limit_xm_seek,
+ &limit_xm_get_size};
-
-DUMBFILE_SYSTEM limit_xm_dfs = {
- NULL,
- &limit_xm_skip,
- &limit_xm_getc,
- &limit_xm_getnc,
- &limit_xm_close,
- &limit_xm_seek,
- &limit_xm_get_size
-};
-
-static DUMBFILE *dumbfile_limit_xm(DUMBFILE *f)
-{
- LIMITED_XM * lx = malloc(sizeof(*lx));
- lx->remaining = f;
- lx->buffered = NULL;
- lx->ptr = 0;
- lx->limit = 0;
- lx->allocated = 0;
- return dumbfile_open_ex( lx, &limit_xm_dfs );
+static DUMBFILE *dumbfile_limit_xm(DUMBFILE *f) {
+ LIMITED_XM *lx = malloc(sizeof(*lx));
+ lx->remaining = f;
+ lx->buffered = NULL;
+ lx->ptr = 0;
+ lx->limit = 0;
+ lx->allocated = 0;
+ return dumbfile_open_ex(lx, &limit_xm_dfs);
}
-static int it_xm_read_instrument(IT_INSTRUMENT *instrument, XM_INSTRUMENT_EXTRA *extra, DUMBFILE *f)
-{
- unsigned long size, bytes_read;
- unsigned short vol_points[24];
- unsigned short pan_points[24];
- int i, type;
- const unsigned long max_size = 4 + 22 + 1 + 2 + 4 + 96 + 48 + 48 + 1 * 14 + 2 + 2;
- unsigned long skip_end = 0;
+static int it_xm_read_instrument(IT_INSTRUMENT *instrument,
+ XM_INSTRUMENT_EXTRA *extra, DUMBFILE *f) {
+ unsigned long size, bytes_read;
+ unsigned short vol_points[24];
+ unsigned short pan_points[24];
+ int i, type;
+ const unsigned long max_size =
+ 4 + 22 + 1 + 2 + 4 + 96 + 48 + 48 + 1 * 14 + 2 + 2;
+ unsigned long skip_end = 0;
- /* Header size. Tends to be more than the actual size of the structure.
- * So unread bytes must be skipped before reading the first sample
- * header.
- */
+ /* Header size. Tends to be more than the actual size of the structure.
+ * So unread bytes must be skipped before reading the first sample
+ * header.
+ */
- if ( limit_xm_resize( f, 4 ) < 0 ) return -1;
+ if (limit_xm_resize(f, 4) < 0)
+ return -1;
- size = dumbfile_igetl(f);
+ size = dumbfile_igetl(f);
- if ( size == 0 ) size = max_size;
- else if ( size > max_size )
- {
- skip_end = size - max_size;
- size = max_size;
- }
+ if (size == 0)
+ size = max_size;
+ else if (size > max_size) {
+ skip_end = size - max_size;
+ size = max_size;
+ }
- if ( limit_xm_resize( f, size - 4 ) < 0 ) return -1;
+ if (limit_xm_resize(f, size - 4) < 0)
+ return -1;
dumbfile_getnc((char *)instrument->name, 22, f);
- instrument->name[22] = 0;
+ instrument->name[22] = 0;
trim_whitespace((char *)instrument->name, 22);
- instrument->filename[0] = 0;
- dumbfile_skip(f, 1); /* Instrument type. Should be 0, but seems random. */
- extra->n_samples = dumbfile_igetw(f);
+ instrument->filename[0] = 0;
+ dumbfile_skip(f, 1); /* Instrument type. Should be 0, but seems random. */
+ extra->n_samples = dumbfile_igetw(f);
- if (dumbfile_error(f) || (unsigned int)extra->n_samples > XM_MAX_SAMPLES_PER_INSTRUMENT)
- return -1;
+ if (dumbfile_error(f) ||
+ (unsigned int)extra->n_samples > XM_MAX_SAMPLES_PER_INSTRUMENT)
+ return -1;
- bytes_read = 4 + 22 + 1 + 2;
+ bytes_read = 4 + 22 + 1 + 2;
- if (extra->n_samples) {
- /* sample header size */
- /*i = dumbfile_igetl(f);
- if (!i || i > 0x28) i = 0x28;*/
- dumbfile_skip(f, 4);
- i = 0x28;
- extra->sample_header_size = i;
+ if (extra->n_samples) {
+ /* sample header size */
+ /*i = dumbfile_igetl(f);
+ if (!i || i > 0x28) i = 0x28;*/
+ dumbfile_skip(f, 4);
+ i = 0x28;
+ extra->sample_header_size = i;
- /* sample map */
- for (i = 0; i < 96; i++) {
- instrument->map_sample[i] = dumbfile_getc(f) + 1;
- instrument->map_note[i] = i;
- }
+ /* sample map */
+ for (i = 0; i < 96; i++) {
+ instrument->map_sample[i] = dumbfile_getc(f) + 1;
+ instrument->map_note[i] = i;
+ }
- if (dumbfile_error(f))
- return 1;
+ if (dumbfile_error(f))
+ return 1;
- /* volume/panning envelopes */
- for (i = 0; i < 24; i++)
- vol_points[i] = dumbfile_igetw(f);
- for (i = 0; i < 24; i++)
- pan_points[i] = dumbfile_igetw(f);
+ /* volume/panning envelopes */
+ for (i = 0; i < 24; i++)
+ vol_points[i] = dumbfile_igetw(f);
+ for (i = 0; i < 24; i++)
+ pan_points[i] = dumbfile_igetw(f);
- instrument->volume_envelope.n_nodes = dumbfile_getc(f);
- instrument->pan_envelope.n_nodes = dumbfile_getc(f);
+ instrument->volume_envelope.n_nodes = dumbfile_getc(f);
+ instrument->pan_envelope.n_nodes = dumbfile_getc(f);
- if (dumbfile_error(f))
- return -1;
+ if (dumbfile_error(f))
+ return -1;
- instrument->volume_envelope.sus_loop_start = dumbfile_getc(f);
- instrument->volume_envelope.loop_start = dumbfile_getc(f);
- instrument->volume_envelope.loop_end = dumbfile_getc(f);
+ instrument->volume_envelope.sus_loop_start = dumbfile_getc(f);
+ instrument->volume_envelope.loop_start = dumbfile_getc(f);
+ instrument->volume_envelope.loop_end = dumbfile_getc(f);
- instrument->pan_envelope.sus_loop_start = dumbfile_getc(f);
- instrument->pan_envelope.loop_start = dumbfile_getc(f);
- instrument->pan_envelope.loop_end = dumbfile_getc(f);
+ instrument->pan_envelope.sus_loop_start = dumbfile_getc(f);
+ instrument->pan_envelope.loop_start = dumbfile_getc(f);
+ instrument->pan_envelope.loop_end = dumbfile_getc(f);
- /* The envelope handler for XM files won't use sus_loop_end. */
+ /* The envelope handler for XM files won't use sus_loop_end. */
- type = dumbfile_getc(f);
- instrument->volume_envelope.flags = 0;
- if ((type & XM_ENVELOPE_ON) && instrument->volume_envelope.n_nodes)
- instrument->volume_envelope.flags |= IT_ENVELOPE_ON;
- if (type & XM_ENVELOPE_LOOP) instrument->volume_envelope.flags |= IT_ENVELOPE_LOOP_ON;
+ type = dumbfile_getc(f);
+ instrument->volume_envelope.flags = 0;
+ if ((type & XM_ENVELOPE_ON) && instrument->volume_envelope.n_nodes)
+ instrument->volume_envelope.flags |= IT_ENVELOPE_ON;
+ if (type & XM_ENVELOPE_LOOP)
+ instrument->volume_envelope.flags |= IT_ENVELOPE_LOOP_ON;
#if 1
- if (type & XM_ENVELOPE_SUSTAIN) instrument->volume_envelope.flags |= IT_ENVELOPE_SUSTAIN_LOOP;
+ if (type & XM_ENVELOPE_SUSTAIN)
+ instrument->volume_envelope.flags |= IT_ENVELOPE_SUSTAIN_LOOP;
#else // This is now handled in itrender.c
- /* let's avoid fading out when reaching the last envelope node */
- if (!(type & XM_ENVELOPE_LOOP)) {
- instrument->volume_envelope.loop_start = instrument->volume_envelope.n_nodes-1;
- instrument->volume_envelope.loop_end = instrument->volume_envelope.n_nodes-1;
- }
- instrument->volume_envelope.flags |= IT_ENVELOPE_LOOP_ON;
+ /* let's avoid fading out when reaching the last envelope node */
+ if (!(type & XM_ENVELOPE_LOOP)) {
+ instrument->volume_envelope.loop_start =
+ instrument->volume_envelope.n_nodes - 1;
+ instrument->volume_envelope.loop_end =
+ instrument->volume_envelope.n_nodes - 1;
+ }
+ instrument->volume_envelope.flags |= IT_ENVELOPE_LOOP_ON;
#endif
- type = dumbfile_getc(f);
- instrument->pan_envelope.flags = 0;
- if ((type & XM_ENVELOPE_ON) && instrument->pan_envelope.n_nodes)
- instrument->pan_envelope.flags |= IT_ENVELOPE_ON;
- if (type & XM_ENVELOPE_LOOP) instrument->pan_envelope.flags |= IT_ENVELOPE_LOOP_ON; // should this be here?
- if (type & XM_ENVELOPE_SUSTAIN) instrument->pan_envelope.flags |= IT_ENVELOPE_SUSTAIN_LOOP;
+ type = dumbfile_getc(f);
+ instrument->pan_envelope.flags = 0;
+ if ((type & XM_ENVELOPE_ON) && instrument->pan_envelope.n_nodes)
+ instrument->pan_envelope.flags |= IT_ENVELOPE_ON;
+ if (type & XM_ENVELOPE_LOOP)
+ instrument->pan_envelope.flags |=
+ IT_ENVELOPE_LOOP_ON; // should this be here?
+ if (type & XM_ENVELOPE_SUSTAIN)
+ instrument->pan_envelope.flags |= IT_ENVELOPE_SUSTAIN_LOOP;
- if (it_xm_make_envelope(&instrument->volume_envelope, vol_points, 0) != 0) {
- TRACE("XM error: volume envelope\n");
- if (instrument->volume_envelope.flags & IT_ENVELOPE_ON) return -1;
- }
+ if (it_xm_make_envelope(&instrument->volume_envelope, vol_points, 0) !=
+ 0) {
+ TRACE("XM error: volume envelope\n");
+ if (instrument->volume_envelope.flags & IT_ENVELOPE_ON)
+ return -1;
+ }
- if (it_xm_make_envelope(&instrument->pan_envelope, pan_points, -32) != 0) {
- TRACE("XM error: pan envelope\n");
- if (instrument->pan_envelope.flags & IT_ENVELOPE_ON) return -1;
- }
+ if (it_xm_make_envelope(&instrument->pan_envelope, pan_points, -32) !=
+ 0) {
+ TRACE("XM error: pan envelope\n");
+ if (instrument->pan_envelope.flags & IT_ENVELOPE_ON)
+ return -1;
+ }
- instrument->pitch_envelope.flags = 0;
+ instrument->pitch_envelope.flags = 0;
- extra->vibrato_type = dumbfile_getc(f);
- extra->vibrato_sweep = dumbfile_getc(f);
- extra->vibrato_depth = dumbfile_getc(f);
- extra->vibrato_speed = dumbfile_getc(f);
+ extra->vibrato_type = dumbfile_getc(f);
+ extra->vibrato_sweep = dumbfile_getc(f);
+ extra->vibrato_depth = dumbfile_getc(f);
+ extra->vibrato_speed = dumbfile_getc(f);
- if (dumbfile_error(f) || extra->vibrato_type > 4) // XXX
- return -1;
+ if (dumbfile_error(f) || extra->vibrato_type > 4) // XXX
+ return -1;
- /** WARNING: lossy approximation */
- instrument->fadeout = (dumbfile_igetw(f)*128 + 64)/0xFFF;
+ /** WARNING: lossy approximation */
+ instrument->fadeout = (dumbfile_igetw(f) * 128 + 64) / 0xFFF;
- dumbfile_skip(f, 2); /* reserved */
+ dumbfile_skip(f, 2); /* reserved */
- bytes_read += 4 + 96 + 48 + 48 + 14*1 + 2 + 2;
- } else
- for (i = 0; i < 96; i++)
- instrument->map_sample[i] = 0;
+ bytes_read += 4 + 96 + 48 + 48 + 14 * 1 + 2 + 2;
+ } else
+ for (i = 0; i < 96; i++)
+ instrument->map_sample[i] = 0;
- if (size > bytes_read && dumbfile_skip(f, size - bytes_read))
- return -1;
+ if (size > bytes_read && dumbfile_skip(f, size - bytes_read))
+ return -1;
- if (skip_end && limit_xm_skip_end(f, skip_end))
- return -1;
+ if (skip_end && limit_xm_skip_end(f, skip_end))
+ return -1;
- instrument->new_note_action = NNA_NOTE_CUT;
- instrument->dup_check_type = DCT_OFF;
- instrument->dup_check_action = DCA_NOTE_CUT;
- instrument->pp_separation = 0;
- instrument->pp_centre = 60; /* C-5 */
- instrument->global_volume = 128;
- instrument->default_pan = 32;
- instrument->random_volume = 0;
- instrument->random_pan = 0;
- instrument->filter_cutoff = 0;
- instrument->filter_resonance = 0;
+ instrument->new_note_action = NNA_NOTE_CUT;
+ instrument->dup_check_type = DCT_OFF;
+ instrument->dup_check_action = DCA_NOTE_CUT;
+ instrument->pp_separation = 0;
+ instrument->pp_centre = 60; /* C-5 */
+ instrument->global_volume = 128;
+ instrument->default_pan = 32;
+ instrument->random_volume = 0;
+ instrument->random_pan = 0;
+ instrument->filter_cutoff = 0;
+ instrument->filter_resonance = 0;
- return 0;
+ return 0;
}
-
-
/* I (entheh) have two XM files saved by a very naughty program. After a
* 16-bit sample, it saved a rogue byte. The length of the sample was indeed
* an odd number, incremented to include the rogue byte.
@@ -654,159 +626,158 @@
* won't be accounted for by reading sample->length samples. It returns a
* negative number on failure.
*/
-static int it_xm_read_sample_header(IT_SAMPLE *sample, DUMBFILE *f)
-{
- int type;
- int relative_note_number; /* relative to C4 */
- int finetune;
- int roguebytes;
- int roguebytesmask;
- int reserved;
+static int it_xm_read_sample_header(IT_SAMPLE *sample, DUMBFILE *f) {
+ int type;
+ int relative_note_number; /* relative to C4 */
+ int finetune;
+ int roguebytes;
+ int roguebytesmask;
+ int reserved;
- sample->length = dumbfile_igetl(f);
- sample->loop_start = dumbfile_igetl(f);
- sample->loop_end = sample->loop_start + dumbfile_igetl(f);
- sample->global_volume = 64;
- sample->default_volume = dumbfile_getc(f);
- finetune = (signed char)dumbfile_getc(f); /* -128..127 <=> -1 semitone .. +127/128 of a semitone */
- type = dumbfile_getc(f);
- sample->default_pan = dumbfile_getc(f); /* 0-255 */
- relative_note_number = (signed char)dumbfile_getc(f);
+ sample->length = dumbfile_igetl(f);
+ sample->loop_start = dumbfile_igetl(f);
+ sample->loop_end = sample->loop_start + dumbfile_igetl(f);
+ sample->global_volume = 64;
+ sample->default_volume = dumbfile_getc(f);
+ finetune = (signed char)dumbfile_getc(
+ f); /* -128..127 <=> -1 semitone .. +127/128 of a semitone */
+ type = dumbfile_getc(f);
+ sample->default_pan = dumbfile_getc(f); /* 0-255 */
+ relative_note_number = (signed char)dumbfile_getc(f);
- reserved = dumbfile_getc(f);
+ reserved = dumbfile_getc(f);
dumbfile_getnc((char *)sample->name, 22, f);
- sample->name[22] = 0;
+ sample->name[22] = 0;
trim_whitespace((char *)sample->name, 22);
- sample->filename[0] = 0;
+ sample->filename[0] = 0;
- if (dumbfile_error(f))
- return -1;
+ if (dumbfile_error(f))
+ return -1;
- sample->C5_speed = (long)(16726.0*pow(DUMB_SEMITONE_BASE, relative_note_number) /**pow(DUMB_PITCH_BASE, )*/ );
- sample->finetune = finetune*2;
+ sample->C5_speed =
+ (long)(16726.0 * pow(DUMB_SEMITONE_BASE,
+ relative_note_number) /**pow(DUMB_PITCH_BASE, )*/);
+ sample->finetune = finetune * 2;
- sample->flags = IT_SAMPLE_EXISTS;
+ sample->flags = IT_SAMPLE_EXISTS;
- if (reserved == 0xAD &&
- (!(type & (XM_SAMPLE_16BIT | XM_SAMPLE_STEREO))))
- {
- /* F U Olivier Lapicque */
- roguebytes = 4;
- roguebytesmask = 4 << 2;
- }
- else
- {
- roguebytes = (int)sample->length;
- roguebytesmask = 3;
- }
+ if (reserved == 0xAD && (!(type & (XM_SAMPLE_16BIT | XM_SAMPLE_STEREO)))) {
+ /* F U Olivier Lapicque */
+ roguebytes = 4;
+ roguebytesmask = 4 << 2;
+ } else {
+ roguebytes = (int)sample->length;
+ roguebytesmask = 3;
+ }
- if (type & XM_SAMPLE_16BIT) {
- sample->flags |= IT_SAMPLE_16BIT;
- sample->length >>= 1;
- sample->loop_start >>= 1;
- sample->loop_end >>= 1;
- } else
- roguebytesmask >>= 1;
+ if (type & XM_SAMPLE_16BIT) {
+ sample->flags |= IT_SAMPLE_16BIT;
+ sample->length >>= 1;
+ sample->loop_start >>= 1;
+ sample->loop_end >>= 1;
+ } else
+ roguebytesmask >>= 1;
- if (type & XM_SAMPLE_STEREO) {
- sample->flags |= IT_SAMPLE_STEREO;
- sample->length >>= 1;
- sample->loop_start >>= 1;
- sample->loop_end >>= 1;
- } else
- roguebytesmask >>= 1;
+ if (type & XM_SAMPLE_STEREO) {
+ sample->flags |= IT_SAMPLE_STEREO;
+ sample->length >>= 1;
+ sample->loop_start >>= 1;
+ sample->loop_end >>= 1;
+ } else
+ roguebytesmask >>= 1;
- roguebytes &= roguebytesmask;
+ roguebytes &= roguebytesmask;
- if ((unsigned int)sample->loop_start < (unsigned int)sample->loop_end) {
- if (type & XM_SAMPLE_FORWARD_LOOP) sample->flags |= IT_SAMPLE_LOOP;
- if (type & XM_SAMPLE_PINGPONG_LOOP) sample->flags |= IT_SAMPLE_LOOP | IT_SAMPLE_PINGPONG_LOOP;
- }
+ if ((unsigned int)sample->loop_start < (unsigned int)sample->loop_end) {
+ if (type & XM_SAMPLE_FORWARD_LOOP)
+ sample->flags |= IT_SAMPLE_LOOP;
+ if (type & XM_SAMPLE_PINGPONG_LOOP)
+ sample->flags |= IT_SAMPLE_LOOP | IT_SAMPLE_PINGPONG_LOOP;
+ }
- if (sample->length <= 0)
- sample->flags &= ~IT_SAMPLE_EXISTS;
- else if ((unsigned int)sample->loop_end > (unsigned int)sample->length)
- sample->flags &= ~IT_SAMPLE_LOOP;
- else if ((unsigned int)sample->loop_start >= (unsigned int)sample->loop_end)
- sample->flags &= ~IT_SAMPLE_LOOP;
+ if (sample->length <= 0)
+ sample->flags &= ~IT_SAMPLE_EXISTS;
+ else if ((unsigned int)sample->loop_end > (unsigned int)sample->length)
+ sample->flags &= ~IT_SAMPLE_LOOP;
+ else if ((unsigned int)sample->loop_start >= (unsigned int)sample->loop_end)
+ sample->flags &= ~IT_SAMPLE_LOOP;
- return roguebytes;
+ return roguebytes;
}
+static int it_xm_read_sample_data(IT_SAMPLE *sample, unsigned char roguebytes,
+ DUMBFILE *f) {
+ int old;
+ long i;
+ long truncated_size;
+ int n_channels;
+ long datasize;
+ if (!(sample->flags & IT_SAMPLE_EXISTS))
+ return dumbfile_skip(f, roguebytes);
-static int it_xm_read_sample_data(IT_SAMPLE *sample, unsigned char roguebytes, DUMBFILE *f)
-{
- int old;
- long i;
- long truncated_size;
- int n_channels;
- long datasize;
+ /* let's get rid of the sample data coming after the end of the loop */
+ if ((sample->flags & IT_SAMPLE_LOOP) && sample->loop_end < sample->length &&
+ roguebytes != 4) {
+ truncated_size = sample->length - sample->loop_end;
+ sample->length = sample->loop_end;
+ } else {
+ truncated_size = 0;
+ }
- if (!(sample->flags & IT_SAMPLE_EXISTS))
- return dumbfile_skip(f, roguebytes);
+ n_channels = sample->flags & IT_SAMPLE_STEREO ? 2 : 1;
+ datasize = sample->length * n_channels;
- /* let's get rid of the sample data coming after the end of the loop */
- if ((sample->flags & IT_SAMPLE_LOOP) && sample->loop_end < sample->length && roguebytes != 4) {
- truncated_size = sample->length - sample->loop_end;
- sample->length = sample->loop_end;
- } else {
- truncated_size = 0;
- }
+ sample->data = malloc(datasize * (sample->flags & IT_SAMPLE_16BIT ? 2 : 1));
+ if (!sample->data)
+ return -1;
- n_channels = sample->flags & IT_SAMPLE_STEREO ? 2 : 1;
- datasize = sample->length * n_channels;
+ if (roguebytes == 4) {
+ if (_dumb_it_read_sample_data_adpcm4(sample, f) < 0)
+ return -1;
+ roguebytes = 0;
+ } else {
+ /* sample data is stored as signed delta values */
+ old = 0;
+ if (sample->flags & IT_SAMPLE_16BIT)
+ for (i = 0; i < sample->length; i++)
+ ((short *)sample->data)[i * n_channels] = old +=
+ dumbfile_igetw(f);
+ else
+ for (i = 0; i < sample->length; i++)
+ ((signed char *)sample->data)[i * n_channels] = old +=
+ dumbfile_getc(f);
+ }
- sample->data = malloc(datasize * (sample->flags & IT_SAMPLE_16BIT ? 2 : 1));
- if (!sample->data)
- return -1;
+ /* skip truncated data */
+ dumbfile_skip(f, (sample->flags & IT_SAMPLE_16BIT) ? (2 * truncated_size)
+ : (truncated_size));
- if (roguebytes == 4)
- {
- if (_dumb_it_read_sample_data_adpcm4(sample, f) < 0)
- return -1;
- roguebytes = 0;
- }
- else
- {
- /* sample data is stored as signed delta values */
- old = 0;
- if (sample->flags & IT_SAMPLE_16BIT)
- for (i = 0; i < sample->length; i++)
- ((short *)sample->data)[i*n_channels] = old += dumbfile_igetw(f);
- else
- for (i = 0; i < sample->length; i++)
- ((signed char *)sample->data)[i*n_channels] = old += dumbfile_getc(f);
- }
+ if (sample->flags & IT_SAMPLE_STEREO) {
+ old = 0;
+ if (sample->flags & IT_SAMPLE_16BIT)
+ for (i = 1; i < datasize; i += 2)
+ ((short *)sample->data)[i] = old += dumbfile_igetw(f);
+ else
+ for (i = 1; i < datasize; i += 2)
+ ((signed char *)sample->data)[i] = old += dumbfile_getc(f);
- /* skip truncated data */
- dumbfile_skip(f, (sample->flags & IT_SAMPLE_16BIT) ? (2*truncated_size) : (truncated_size));
+ /* skip truncated data */
+ dumbfile_skip(f, (sample->flags & IT_SAMPLE_16BIT)
+ ? (2 * truncated_size)
+ : (truncated_size));
+ }
- if (sample->flags & IT_SAMPLE_STEREO) {
- old = 0;
- if (sample->flags & IT_SAMPLE_16BIT)
- for (i = 1; i < datasize; i += 2)
- ((short *)sample->data)[i] = old += dumbfile_igetw(f);
- else
- for (i = 1; i < datasize; i += 2)
- ((signed char *)sample->data)[i] = old += dumbfile_getc(f);
+ dumbfile_skip(f, roguebytes);
- /* skip truncated data */
- dumbfile_skip(f, (sample->flags & IT_SAMPLE_16BIT) ? (2*truncated_size) : (truncated_size));
- }
+ if (dumbfile_error(f))
+ return -1;
- dumbfile_skip(f, roguebytes);
-
- if (dumbfile_error(f))
- return -1;
-
- return 0;
+ return 0;
}
-
-
/* "Real programmers don't document. If it was hard to write,
* it should be hard to understand."
*
@@ -813,452 +784,479 @@
* (Never trust the documentation provided with a tracker.
* Real files are the only truth...)
*/
-static DUMB_IT_SIGDATA *it_xm_load_sigdata(DUMBFILE *f, int * version)
-{
- DUMB_IT_SIGDATA *sigdata;
- char id_text[18];
+static DUMB_IT_SIGDATA *it_xm_load_sigdata(DUMBFILE *f, int *version) {
+ DUMB_IT_SIGDATA *sigdata;
+ char id_text[18];
- size_t header_size;
- int flags;
- int n_channels;
- int total_samples;
- int i, j;
+ size_t header_size;
+ int flags;
+ int n_channels;
+ int total_samples;
+ int i, j;
- /* check ID text */
- if (dumbfile_getnc(id_text, 17, f) < 17)
- return NULL;
- id_text[17] = 0;
- if (strcmp(id_text, "Extended Module: ") != 0) {
- TRACE("XM error: Not an Extended Module\n");
- return NULL;
- }
+ /* check ID text */
+ if (dumbfile_getnc(id_text, 17, f) < 17)
+ return NULL;
+ id_text[17] = 0;
+ if (strcmp(id_text, "Extended Module: ") != 0) {
+ TRACE("XM error: Not an Extended Module\n");
+ return NULL;
+ }
- sigdata = malloc(sizeof(*sigdata));
- if (!sigdata)
- return NULL;
+ sigdata = malloc(sizeof(*sigdata));
+ if (!sigdata)
+ return NULL;
- /* song name */
+ /* song name */
if (dumbfile_getnc((char *)sigdata->name, 20, f) < 20) {
- free(sigdata);
- return NULL;
- }
- sigdata->name[20] = 0;
+ free(sigdata);
+ return NULL;
+ }
+ sigdata->name[20] = 0;
trim_whitespace((char *)sigdata->name, 20);
- if (dumbfile_getc(f) != 0x1A) {
- TRACE("XM error: 0x1A not found\n");
- free(sigdata);
- return NULL;
- }
+ if (dumbfile_getc(f) != 0x1A) {
+ TRACE("XM error: 0x1A not found\n");
+ free(sigdata);
+ return NULL;
+ }
- /* tracker name */
- if (dumbfile_skip(f, 20)) {
- free(sigdata);
- return NULL;
- }
+ /* tracker name */
+ if (dumbfile_skip(f, 20)) {
+ free(sigdata);
+ return NULL;
+ }
- /* version number */
- * version = dumbfile_igetw(f);
- if (* version > 0x0104 || * version < 0x0102) {
- TRACE("XM error: wrong format version\n");
- free(sigdata);
- return NULL;
- }
+ /* version number */
+ *version = dumbfile_igetw(f);
+ if (*version > 0x0104 || *version < 0x0102) {
+ TRACE("XM error: wrong format version\n");
+ free(sigdata);
+ return NULL;
+ }
- /*
- ------------------
- --- Header ---
- ------------------
- */
+ /*
+ ------------------
+ --- Header ---
+ ------------------
+ */
- /* header size */
- header_size = dumbfile_igetl(f);
- if (header_size < (4 + 2*8 + 1) || header_size > 0x114) {
- TRACE("XM error: unexpected header size\n");
- free(sigdata);
- return NULL;
- }
+ /* header size */
+ header_size = dumbfile_igetl(f);
+ if (header_size < (4 + 2 * 8 + 1) || header_size > 0x114) {
+ TRACE("XM error: unexpected header size\n");
+ free(sigdata);
+ return NULL;
+ }
- sigdata->song_message = NULL;
- sigdata->order = NULL;
- sigdata->instrument = NULL;
- sigdata->sample = NULL;
- sigdata->pattern = NULL;
- sigdata->midi = NULL;
- sigdata->checkpoint = NULL;
+ sigdata->song_message = NULL;
+ sigdata->order = NULL;
+ sigdata->instrument = NULL;
+ sigdata->sample = NULL;
+ sigdata->pattern = NULL;
+ sigdata->midi = NULL;
+ sigdata->checkpoint = NULL;
- sigdata->n_samples = 0;
- sigdata->n_orders = dumbfile_igetw(f);
- sigdata->restart_position = dumbfile_igetw(f);
- n_channels = dumbfile_igetw(f); /* max 32 but we'll be lenient */
- sigdata->n_pchannels = n_channels;
- sigdata->n_patterns = dumbfile_igetw(f);
- sigdata->n_instruments = dumbfile_igetw(f); /* max 128 */ /* XXX upped to 256 */
- flags = dumbfile_igetw(f);
- sigdata->speed = dumbfile_igetw(f);
- if (sigdata->speed == 0) sigdata->speed = 6; // Should we? What about tempo?
- sigdata->tempo = dumbfile_igetw(f);
+ sigdata->n_samples = 0;
+ sigdata->n_orders = dumbfile_igetw(f);
+ sigdata->restart_position = dumbfile_igetw(f);
+ n_channels = dumbfile_igetw(f); /* max 32 but we'll be lenient */
+ sigdata->n_pchannels = n_channels;
+ sigdata->n_patterns = dumbfile_igetw(f);
+ sigdata->n_instruments = dumbfile_igetw(f);
+ /* max 128 */ /* XXX upped to 256 */
+ flags = dumbfile_igetw(f);
+ sigdata->speed = dumbfile_igetw(f);
+ if (sigdata->speed == 0)
+ sigdata->speed = 6; // Should we? What about tempo?
+ sigdata->tempo = dumbfile_igetw(f);
- // FT2 always clips restart position against the song length
- if (sigdata->restart_position > sigdata->n_orders)
- sigdata->restart_position = sigdata->n_orders;
- // And FT2 starts playback on order 0, regardless of length,
- // and only checks if the next order is greater than or equal
- // to this, not the current pattern. Work around this with
- // DUMB's playback core by overriding a zero length with one.
- if (sigdata->n_orders == 0)
- sigdata->n_orders = 1;
+ // FT2 always clips restart position against the song length
+ if (sigdata->restart_position > sigdata->n_orders)
+ sigdata->restart_position = sigdata->n_orders;
+ // And FT2 starts playback on order 0, regardless of length,
+ // and only checks if the next order is greater than or equal
+ // to this, not the current pattern. Work around this with
+ // DUMB's playback core by overriding a zero length with one.
+ if (sigdata->n_orders == 0)
+ sigdata->n_orders = 1;
- /* sanity checks */
- // XXX
- i = (int)(header_size - 4 - 2 * 8); /* Maximum number of orders expected */
- if (dumbfile_error(f) || sigdata->n_orders <= 0 || sigdata->n_orders > i || !sigdata->n_patterns || sigdata->n_patterns > 256 || !sigdata->n_instruments || sigdata->n_instruments > 256 || n_channels > DUMB_IT_N_CHANNELS) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ /* sanity checks */
+ // XXX
+ i = (int)(header_size - 4 - 2 * 8); /* Maximum number of orders expected */
+ if (dumbfile_error(f) || sigdata->n_orders <= 0 || sigdata->n_orders > i ||
+ !sigdata->n_patterns || sigdata->n_patterns > 256 ||
+ !sigdata->n_instruments || sigdata->n_instruments > 256 ||
+ n_channels > DUMB_IT_N_CHANNELS) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- //if (sigdata->restart_position >= sigdata->n_orders)
- //sigdata->restart_position = 0;
+ // if (sigdata->restart_position >= sigdata->n_orders)
+ // sigdata->restart_position = 0;
- /* order table */
- sigdata->order = malloc(sigdata->n_orders*sizeof(*sigdata->order));
- if (!sigdata->order) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ /* order table */
+ sigdata->order = malloc(sigdata->n_orders * sizeof(*sigdata->order));
+ if (!sigdata->order) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
dumbfile_getnc((char *)sigdata->order, sigdata->n_orders, f);
- dumbfile_skip(f, i - sigdata->n_orders);
+ dumbfile_skip(f, i - sigdata->n_orders);
- if (dumbfile_error(f)) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ if (dumbfile_error(f)) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- if ( * version > 0x103 ) {
- /*
- --------------------
- --- Patterns ---
- --------------------
- */
+ if (*version > 0x103) {
+ /*
+ --------------------
+ --- Patterns ---
+ --------------------
+ */
- sigdata->pattern = malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
- if (!sigdata->pattern) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- for (i = 0; i < sigdata->n_patterns; i++)
- sigdata->pattern[i].entry = NULL;
+ sigdata->pattern =
+ malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
+ if (!sigdata->pattern) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (i = 0; i < sigdata->n_patterns; i++)
+ sigdata->pattern[i].entry = NULL;
- {
- unsigned char *buffer = malloc(1280 * n_channels); /* 256 rows * 5 bytes */
- if (!buffer) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- for (i = 0; i < sigdata->n_patterns; i++) {
- if (it_xm_read_pattern(&sigdata->pattern[i], f, n_channels, buffer, * version) != 0) {
- free(buffer);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- }
- free(buffer);
- }
+ {
+ unsigned char *buffer =
+ malloc(1280 * n_channels); /* 256 rows * 5 bytes */
+ if (!buffer) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (i = 0; i < sigdata->n_patterns; i++) {
+ if (it_xm_read_pattern(&sigdata->pattern[i], f, n_channels,
+ buffer, *version) != 0) {
+ free(buffer);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ }
+ free(buffer);
+ }
- /*
- -----------------------------------
- --- Instruments and Samples ---
- -----------------------------------
- */
+ /*
+ -----------------------------------
+ --- Instruments and Samples ---
+ -----------------------------------
+ */
- sigdata->instrument = malloc(sigdata->n_instruments * sizeof(*sigdata->instrument));
- if (!sigdata->instrument) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ sigdata->instrument =
+ malloc(sigdata->n_instruments * sizeof(*sigdata->instrument));
+ if (!sigdata->instrument) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- /* With XM, samples are not global, they're part of an instrument. In a
- * file, each instrument is stored with its samples. Because of this, I
- * don't know how to find how many samples are present in the file. Thus
- * I have to do n_instruments reallocation on sigdata->sample.
- * Looking at FT2, it doesn't seem possible to have more than 16 samples
- * per instrument (even though n_samples is stored as 2 bytes). So maybe
- * we could allocate a 128*16 array of samples, and shrink it back to the
- * correct size when we know it?
- * Alternatively, I could allocate samples by blocks of N (still O(n)),
- * or double the number of allocated samples when I need more (O(log n)).
- */
- total_samples = 0;
- sigdata->sample = NULL;
+ /* With XM, samples are not global, they're part of an instrument. In a
+ * file, each instrument is stored with its samples. Because of this, I
+ * don't know how to find how many samples are present in the file. Thus
+ * I have to do n_instruments reallocation on sigdata->sample.
+ * Looking at FT2, it doesn't seem possible to have more than 16 samples
+ * per instrument (even though n_samples is stored as 2 bytes). So maybe
+ * we could allocate a 128*16 array of samples, and shrink it back to
+ * the correct size when we know it? Alternatively, I could allocate
+ * samples by blocks of N (still O(n)), or double the number of
+ * allocated samples when I need more (O(log n)).
+ */
+ total_samples = 0;
+ sigdata->sample = NULL;
- for (i = 0; i < sigdata->n_instruments; i++) {
- XM_INSTRUMENT_EXTRA extra;
+ for (i = 0; i < sigdata->n_instruments; i++) {
+ XM_INSTRUMENT_EXTRA extra;
- DUMBFILE * lf = dumbfile_limit_xm( f );
- if ( !lf ) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ DUMBFILE *lf = dumbfile_limit_xm(f);
+ if (!lf) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- if (it_xm_read_instrument(&sigdata->instrument[i], &extra, lf) < 0) {
- // XXX
- if ( ! i )
- {
- TRACE("XM error: instrument %d\n", i+1);
- dumbfile_close( lf );
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- else
- {
- dumbfile_close( lf );
- sigdata->n_instruments = i;
- break;
- }
- }
+ if (it_xm_read_instrument(&sigdata->instrument[i], &extra, lf) <
+ 0) {
+ // XXX
+ if (!i) {
+ TRACE("XM error: instrument %d\n", i + 1);
+ dumbfile_close(lf);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ } else {
+ dumbfile_close(lf);
+ sigdata->n_instruments = i;
+ break;
+ }
+ }
- if (extra.n_samples) {
- unsigned char roguebytes[XM_MAX_SAMPLES_PER_INSTRUMENT];
+ if (extra.n_samples) {
+ unsigned char roguebytes[XM_MAX_SAMPLES_PER_INSTRUMENT];
- /* adjust instrument sample map (make indices absolute) */
- for (j = 0; j < 96; j++)
- sigdata->instrument[i].map_sample[j] += total_samples;
+ /* adjust instrument sample map (make indices absolute) */
+ for (j = 0; j < 96; j++)
+ sigdata->instrument[i].map_sample[j] += total_samples;
- sigdata->sample = safe_realloc(sigdata->sample, sizeof(*sigdata->sample)*(total_samples+extra.n_samples));
- if (!sigdata->sample) {
- dumbfile_close( lf );
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- for (j = total_samples; j < total_samples+extra.n_samples; j++)
- sigdata->sample[j].data = NULL;
+ sigdata->sample = safe_realloc(
+ sigdata->sample, sizeof(*sigdata->sample) *
+ (total_samples + extra.n_samples));
+ if (!sigdata->sample) {
+ dumbfile_close(lf);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (j = total_samples; j < total_samples + extra.n_samples;
+ j++)
+ sigdata->sample[j].data = NULL;
- if ( limit_xm_resize( lf, 0 ) < 0 ) {
- dumbfile_close( lf );
- _dumb_it_unload_sigdata( sigdata );
- return NULL;
- }
+ if (limit_xm_resize(lf, 0) < 0) {
+ dumbfile_close(lf);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- /* read instrument's samples */
- for (j = 0; j < extra.n_samples; j++) {
- IT_SAMPLE *sample = &sigdata->sample[total_samples+j];
- int b;
- if ( limit_xm_resize( lf, extra.sample_header_size ) < 0 ) {
- dumbfile_close( lf );
- _dumb_it_unload_sigdata( sigdata );
- return NULL;
- }
- b = it_xm_read_sample_header(sample, lf);
- if (b < 0) {
- dumbfile_close( lf );
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- roguebytes[j] = b;
- // Any reason why these can't be set inside it_xm_read_sample_header()?
- sample->vibrato_speed = extra.vibrato_speed;
- sample->vibrato_depth = extra.vibrato_depth;
- sample->vibrato_rate = extra.vibrato_sweep;
- /* Rate and sweep don't match, but the difference is
- * accounted for in itrender.c.
- */
- sample->vibrato_waveform = xm_convert_vibrato[extra.vibrato_type];
- sample->max_resampling_quality = -1;
- }
- for (j = 0; j < extra.n_samples; j++) {
- if (it_xm_read_sample_data(&sigdata->sample[total_samples+j], roguebytes[j], f) != 0) {
- dumbfile_close( lf );
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- }
- total_samples += extra.n_samples;
- }
+ /* read instrument's samples */
+ for (j = 0; j < extra.n_samples; j++) {
+ IT_SAMPLE *sample = &sigdata->sample[total_samples + j];
+ int b;
+ if (limit_xm_resize(lf, extra.sample_header_size) < 0) {
+ dumbfile_close(lf);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ b = it_xm_read_sample_header(sample, lf);
+ if (b < 0) {
+ dumbfile_close(lf);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ roguebytes[j] = b;
+ // Any reason why these can't be set inside
+ // it_xm_read_sample_header()?
+ sample->vibrato_speed = extra.vibrato_speed;
+ sample->vibrato_depth = extra.vibrato_depth;
+ sample->vibrato_rate = extra.vibrato_sweep;
+ /* Rate and sweep don't match, but the difference is
+ * accounted for in itrender.c.
+ */
+ sample->vibrato_waveform =
+ xm_convert_vibrato[extra.vibrato_type];
+ sample->max_resampling_quality = -1;
+ }
+ for (j = 0; j < extra.n_samples; j++) {
+ if (it_xm_read_sample_data(
+ &sigdata->sample[total_samples + j], roguebytes[j],
+ f) != 0) {
+ dumbfile_close(lf);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ }
+ total_samples += extra.n_samples;
+ }
- dumbfile_close( lf );
- }
+ dumbfile_close(lf);
+ }
- sigdata->n_samples = total_samples;
- } else {
- // ahboy! old layout!
- // first instruments and sample headers, then patterns, then sample data!
+ sigdata->n_samples = total_samples;
+ } else {
+ // ahboy! old layout!
+ // first instruments and sample headers, then patterns, then sample
+ // data!
- /*
- -----------------------------------
- --- Instruments and Samples ---
- -----------------------------------
- */
+ /*
+ -----------------------------------
+ --- Instruments and Samples ---
+ -----------------------------------
+ */
- unsigned char * roguebytes = malloc( sigdata->n_instruments * XM_MAX_SAMPLES_PER_INSTRUMENT );
- if (!roguebytes) {
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ unsigned char *roguebytes =
+ malloc(sigdata->n_instruments * XM_MAX_SAMPLES_PER_INSTRUMENT);
+ if (!roguebytes) {
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- sigdata->instrument = malloc(sigdata->n_instruments * sizeof(*sigdata->instrument));
- if (!sigdata->instrument) {
- free(roguebytes);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ sigdata->instrument =
+ malloc(sigdata->n_instruments * sizeof(*sigdata->instrument));
+ if (!sigdata->instrument) {
+ free(roguebytes);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- total_samples = 0;
- sigdata->sample = NULL;
+ total_samples = 0;
+ sigdata->sample = NULL;
- for (i = 0; i < sigdata->n_instruments; i++) {
- XM_INSTRUMENT_EXTRA extra;
+ for (i = 0; i < sigdata->n_instruments; i++) {
+ XM_INSTRUMENT_EXTRA extra;
- DUMBFILE * lf = dumbfile_limit_xm( f );
- if ( !lf ) {
- free(roguebytes);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ DUMBFILE *lf = dumbfile_limit_xm(f);
+ if (!lf) {
+ free(roguebytes);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- if (it_xm_read_instrument(&sigdata->instrument[i], &extra, lf) < 0) {
- TRACE("XM error: instrument %d\n", i+1);
- dumbfile_close(lf);
- free(roguebytes);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
+ if (it_xm_read_instrument(&sigdata->instrument[i], &extra, lf) <
+ 0) {
+ TRACE("XM error: instrument %d\n", i + 1);
+ dumbfile_close(lf);
+ free(roguebytes);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- if (extra.n_samples) {
- /* adjust instrument sample map (make indices absolute) */
- for (j = 0; j < 96; j++)
- sigdata->instrument[i].map_sample[j] += total_samples;
+ if (extra.n_samples) {
+ /* adjust instrument sample map (make indices absolute) */
+ for (j = 0; j < 96; j++)
+ sigdata->instrument[i].map_sample[j] += total_samples;
- sigdata->sample = safe_realloc(sigdata->sample, sizeof(*sigdata->sample)*(total_samples+extra.n_samples));
- if (!sigdata->sample) {
- dumbfile_close( lf );
- free(roguebytes);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- for (j = total_samples; j < total_samples+extra.n_samples; j++)
- sigdata->sample[j].data = NULL;
+ sigdata->sample = safe_realloc(
+ sigdata->sample, sizeof(*sigdata->sample) *
+ (total_samples + extra.n_samples));
+ if (!sigdata->sample) {
+ dumbfile_close(lf);
+ free(roguebytes);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (j = total_samples; j < total_samples + extra.n_samples;
+ j++)
+ sigdata->sample[j].data = NULL;
- if ( limit_xm_resize( lf, 0 ) < 0 ) {
- dumbfile_close( lf );
- free( roguebytes );
- _dumb_it_unload_sigdata( sigdata );
- return NULL;
- }
+ if (limit_xm_resize(lf, 0) < 0) {
+ dumbfile_close(lf);
+ free(roguebytes);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
- /* read instrument's samples */
- for (j = 0; j < extra.n_samples; j++) {
- IT_SAMPLE *sample = &sigdata->sample[total_samples+j];
- int b;
- if ( limit_xm_resize( lf, extra.sample_header_size ) < 0 ) {
- dumbfile_close( lf );
- free( roguebytes );
- _dumb_it_unload_sigdata( sigdata );
- return NULL;
- }
- b = it_xm_read_sample_header(sample, lf);
- if (b < 0) {
- free(roguebytes);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- roguebytes[total_samples+j] = b;
- // Any reason why these can't be set inside it_xm_read_sample_header()?
- sample->vibrato_speed = extra.vibrato_speed;
- sample->vibrato_depth = extra.vibrato_depth;
- sample->vibrato_rate = extra.vibrato_sweep;
- /* Rate and sweep don't match, but the difference is
- * accounted for in itrender.c.
- */
- sample->vibrato_waveform = xm_convert_vibrato[extra.vibrato_type];
- sample->max_resampling_quality = -1;
- }
- total_samples += extra.n_samples;
- }
+ /* read instrument's samples */
+ for (j = 0; j < extra.n_samples; j++) {
+ IT_SAMPLE *sample = &sigdata->sample[total_samples + j];
+ int b;
+ if (limit_xm_resize(lf, extra.sample_header_size) < 0) {
+ dumbfile_close(lf);
+ free(roguebytes);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ b = it_xm_read_sample_header(sample, lf);
+ if (b < 0) {
+ free(roguebytes);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ roguebytes[total_samples + j] = b;
+ // Any reason why these can't be set inside
+ // it_xm_read_sample_header()?
+ sample->vibrato_speed = extra.vibrato_speed;
+ sample->vibrato_depth = extra.vibrato_depth;
+ sample->vibrato_rate = extra.vibrato_sweep;
+ /* Rate and sweep don't match, but the difference is
+ * accounted for in itrender.c.
+ */
+ sample->vibrato_waveform =
+ xm_convert_vibrato[extra.vibrato_type];
+ sample->max_resampling_quality = -1;
+ }
+ total_samples += extra.n_samples;
+ }
- dumbfile_close( lf );
- }
+ dumbfile_close(lf);
+ }
- sigdata->n_samples = total_samples;
+ sigdata->n_samples = total_samples;
- /*
- --------------------
- --- Patterns ---
- --------------------
- */
+ /*
+ --------------------
+ --- Patterns ---
+ --------------------
+ */
- sigdata->pattern = malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
- if (!sigdata->pattern) {
- free(roguebytes);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- for (i = 0; i < sigdata->n_patterns; i++)
- sigdata->pattern[i].entry = NULL;
+ sigdata->pattern =
+ malloc(sigdata->n_patterns * sizeof(*sigdata->pattern));
+ if (!sigdata->pattern) {
+ free(roguebytes);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (i = 0; i < sigdata->n_patterns; i++)
+ sigdata->pattern[i].entry = NULL;
- {
- unsigned char *buffer = malloc(1280 * n_channels); /* 256 rows * 5 bytes */
- if (!buffer) {
- free(roguebytes);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- for (i = 0; i < sigdata->n_patterns; i++) {
- if (it_xm_read_pattern(&sigdata->pattern[i], f, n_channels, buffer, * version) != 0) {
- free(buffer);
- free(roguebytes);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- }
- free(buffer);
- }
+ {
+ unsigned char *buffer =
+ malloc(1280 * n_channels); /* 256 rows * 5 bytes */
+ if (!buffer) {
+ free(roguebytes);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ for (i = 0; i < sigdata->n_patterns; i++) {
+ if (it_xm_read_pattern(&sigdata->pattern[i], f, n_channels,
+ buffer, *version) != 0) {
+ free(buffer);
+ free(roguebytes);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ }
+ free(buffer);
+ }
- // and now we load the sample data
- for (j = 0; j < total_samples; j++) {
- if (it_xm_read_sample_data(&sigdata->sample[j], roguebytes[j], f) != 0) {
- free(roguebytes);
- _dumb_it_unload_sigdata(sigdata);
- return NULL;
- }
- }
+ // and now we load the sample data
+ for (j = 0; j < total_samples; j++) {
+ if (it_xm_read_sample_data(&sigdata->sample[j], roguebytes[j], f) !=
+ 0) {
+ free(roguebytes);
+ _dumb_it_unload_sigdata(sigdata);
+ return NULL;
+ }
+ }
- free(roguebytes);
- }
+ free(roguebytes);
+ }
+ sigdata->flags = IT_WAS_AN_XM | IT_OLD_EFFECTS | IT_COMPATIBLE_GXX |
+ IT_STEREO | IT_USE_INSTRUMENTS;
+ // Are we OK with IT_COMPATIBLE_GXX off?
+ //
+ // When specifying note + instr + tone portamento, and an old note is still
+ // playing (even after note off):
+ // - If Compatible Gxx is on, the new note will be triggered only if the
+ // instrument _changes_.
+ // - If Compatible Gxx is off, the new note will always be triggered,
+ // provided the instrument is specified.
+ // - FT2 seems to do the latter (unconfirmed).
- sigdata->flags = IT_WAS_AN_XM | IT_OLD_EFFECTS | IT_COMPATIBLE_GXX | IT_STEREO | IT_USE_INSTRUMENTS;
- // Are we OK with IT_COMPATIBLE_GXX off?
- //
- // When specifying note + instr + tone portamento, and an old note is still playing (even after note off):
- // - If Compatible Gxx is on, the new note will be triggered only if the instrument _changes_.
- // - If Compatible Gxx is off, the new note will always be triggered, provided the instrument is specified.
- // - FT2 seems to do the latter (unconfirmed).
+ // Err, wait. XM playback has its own code. The change made to the IT
+ // playbackc code didn't affect XM playback. Forget this then. There's
+ // still a bug in XM playback though, and it'll need some investigation...
+ // tomorrow...
- // Err, wait. XM playback has its own code. The change made to the IT
- // playbackc code didn't affect XM playback. Forget this then. There's
- // still a bug in XM playback though, and it'll need some investigation...
- // tomorrow...
+ // UPDATE: IT_COMPATIBLE_GXX is required to be on, so that tone porta has
+ // separate memory from portamento.
- // UPDATE: IT_COMPATIBLE_GXX is required to be on, so that tone porta has
- // separate memory from portamento.
+ if (flags & XM_LINEAR_FREQUENCY)
+ sigdata->flags |= IT_LINEAR_SLIDES;
- if (flags & XM_LINEAR_FREQUENCY)
- sigdata->flags |= IT_LINEAR_SLIDES;
+ sigdata->global_volume = 128;
+ sigdata->mixing_volume = 48;
+ sigdata->pan_separation = 128;
- sigdata->global_volume = 128;
- sigdata->mixing_volume = 48;
- sigdata->pan_separation = 128;
+ memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
+ memset(sigdata->channel_pan, 32, DUMB_IT_N_CHANNELS);
- memset(sigdata->channel_volume, 64, DUMB_IT_N_CHANNELS);
- memset(sigdata->channel_pan, 32, DUMB_IT_N_CHANNELS);
+ _dumb_it_fix_invalid_orders(sigdata);
- _dumb_it_fix_invalid_orders(sigdata);
-
- return sigdata;
+ return sigdata;
}
-
-
#if 0 // no fucking way, dude!
/* The length returned is the time required to play from the beginning of the
@@ -1390,41 +1388,41 @@
#endif /* 0 */
-
-static char hexdigit(int in)
-{
- if (in < 10) return in + '0';
- else return in + 'A' - 10;
+static char hexdigit(int in) {
+ if (in < 10)
+ return in + '0';
+ else
+ return in + 'A' - 10;
}
-DUH *dumb_read_xm_quick(DUMBFILE *f)
-{
- sigdata_t *sigdata;
- int ver;
+DUH *dumb_read_xm_quick(DUMBFILE *f) {
+ sigdata_t *sigdata;
+ int ver;
- DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
+ DUH_SIGTYPE_DESC *descptr = &_dumb_sigtype_it;
- sigdata = it_xm_load_sigdata(f, &ver);
+ sigdata = it_xm_load_sigdata(f, &ver);
- if (!sigdata)
- return NULL;
+ if (!sigdata)
+ return NULL;
- {
- char version[16];
- const char *tag[2][2];
- tag[0][0] = "TITLE";
+ {
+ char version[16];
+ const char *tag[2][2];
+ tag[0][0] = "TITLE";
tag[0][1] = (const char *)(((DUMB_IT_SIGDATA *)sigdata)->name);
- tag[1][0] = "FORMAT";
- version[0] = 'X';
- version[1] = 'M';
- version[2] = ' ';
- version[3] = 'v';
- version[4] = hexdigit( ( ver >> 8 ) & 15 );
- version[5] = '.';
- version[6] = hexdigit( ( ver >> 4 ) & 15 );
- version[7] = hexdigit( ver & 15 );
- version[8] = 0;
- tag[1][1] = ( const char * ) & version;
- return make_duh(-1, 2, (const char *const (*)[2])tag, 1, &descptr, &sigdata);
- }
+ tag[1][0] = "FORMAT";
+ version[0] = 'X';
+ version[1] = 'M';
+ version[2] = ' ';
+ version[3] = 'v';
+ version[4] = hexdigit((ver >> 8) & 15);
+ version[5] = '.';
+ version[6] = hexdigit((ver >> 4) & 15);
+ version[7] = hexdigit(ver & 15);
+ version[8] = 0;
+ tag[1][1] = (const char *)&version;
+ return make_duh(-1, 2, (const char *const(*)[2])tag, 1, &descptr,
+ &sigdata);
+ }
}
--- a/src/it/readxm2.c
+++ b/src/it/readxm2.c
@@ -19,11 +19,8 @@
#include "dumb.h"
-
-
-DUH *dumb_read_xm(DUMBFILE *f)
-{
- DUH *duh = dumb_read_xm_quick(f);
- dumb_it_do_initial_runthrough(duh);
- return duh;
+DUH *dumb_read_xm(DUMBFILE *f) {
+ DUH *duh = dumb_read_xm_quick(f);
+ dumb_it_do_initial_runthrough(duh);
+ return duh;
}
--- a/src/it/xmeffect.c
+++ b/src/it/xmeffect.c
@@ -17,8 +17,6 @@
* \__/
*/
-
-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -72,28 +70,29 @@
};
#endif
-
-
/* Effects marked with 'special' are handled specifically in itrender.c */
-void _dumb_it_xm_convert_effect(int effect, int value, IT_ENTRY *entry, int mod)
-{
-const int log = 0;
+void _dumb_it_xm_convert_effect(int effect, int value, IT_ENTRY *entry,
+ int mod) {
+ const int log = 0;
- if ((!effect && !value) || (effect >= XM_N_EFFECTS))
- return;
+ if ((!effect && !value) || (effect >= XM_N_EFFECTS))
+ return;
-if (log) printf("%c%02X", (effect<10)?('0'+effect):('A'+effect-10), value);
+ if (log)
+ printf("%c%02X", (effect < 10) ? ('0' + effect) : ('A' + effect - 10),
+ value);
- /* Linearisation of the effect number... */
- if (effect == XM_E) {
- effect = EBASE + HIGH(value);
- value = LOW(value);
- } else if (effect == XM_X) {
- effect = XBASE + HIGH(value);
- value = LOW(value);
- }
+ /* Linearisation of the effect number... */
+ if (effect == XM_E) {
+ effect = EBASE + HIGH(value);
+ value = LOW(value);
+ } else if (effect == XM_X) {
+ effect = XBASE + HIGH(value);
+ value = LOW(value);
+ }
-if (log) printf(" - %2d %02X", effect, value);
+ if (log)
+ printf(" - %2d %02X", effect, value);
#if 0 // This should be handled in itrender.c!
/* update effect memory */
@@ -119,128 +118,188 @@
}
#endif
- /* convert effect */
- entry->mask |= IT_ENTRY_EFFECT;
- switch (effect) {
+ /* convert effect */
+ entry->mask |= IT_ENTRY_EFFECT;
+ switch (effect) {
- case XM_APPREGIO: effect = IT_ARPEGGIO; break;
- case XM_VIBRATO: effect = IT_VIBRATO; break;
- case XM_TONE_PORTAMENTO: effect = IT_TONE_PORTAMENTO; break;
- case XM_TREMOLO: effect = IT_TREMOLO; break;
- case XM_SET_PANNING: effect = IT_SET_PANNING; break;
- case XM_SAMPLE_OFFSET: effect = IT_SET_SAMPLE_OFFSET; break;
- case XM_POSITION_JUMP: effect = IT_JUMP_TO_ORDER; break;
- case XM_MULTI_RETRIG: effect = IT_RETRIGGER_NOTE; break;
- case XM_TREMOR: effect = IT_TREMOR; break;
- case XM_PORTAMENTO_UP: effect = IT_XM_PORTAMENTO_UP; break;
- case XM_PORTAMENTO_DOWN: effect = IT_XM_PORTAMENTO_DOWN; break;
- case XM_SET_CHANNEL_VOLUME: effect = IT_SET_CHANNEL_VOLUME; break; /* special */
- case XM_VOLSLIDE_TONEPORTA: effect = IT_VOLSLIDE_TONEPORTA; break; /* special */
- case XM_VOLSLIDE_VIBRATO: effect = IT_VOLSLIDE_VIBRATO; break; /* special */
+ case XM_APPREGIO:
+ effect = IT_ARPEGGIO;
+ break;
+ case XM_VIBRATO:
+ effect = IT_VIBRATO;
+ break;
+ case XM_TONE_PORTAMENTO:
+ effect = IT_TONE_PORTAMENTO;
+ break;
+ case XM_TREMOLO:
+ effect = IT_TREMOLO;
+ break;
+ case XM_SET_PANNING:
+ effect = IT_SET_PANNING;
+ break;
+ case XM_SAMPLE_OFFSET:
+ effect = IT_SET_SAMPLE_OFFSET;
+ break;
+ case XM_POSITION_JUMP:
+ effect = IT_JUMP_TO_ORDER;
+ break;
+ case XM_MULTI_RETRIG:
+ effect = IT_RETRIGGER_NOTE;
+ break;
+ case XM_TREMOR:
+ effect = IT_TREMOR;
+ break;
+ case XM_PORTAMENTO_UP:
+ effect = IT_XM_PORTAMENTO_UP;
+ break;
+ case XM_PORTAMENTO_DOWN:
+ effect = IT_XM_PORTAMENTO_DOWN;
+ break;
+ case XM_SET_CHANNEL_VOLUME:
+ effect = IT_SET_CHANNEL_VOLUME;
+ break; /* special */
+ case XM_VOLSLIDE_TONEPORTA:
+ effect = IT_VOLSLIDE_TONEPORTA;
+ break; /* special */
+ case XM_VOLSLIDE_VIBRATO:
+ effect = IT_VOLSLIDE_VIBRATO;
+ break; /* special */
- case XM_PATTERN_BREAK:
- effect = IT_BREAK_TO_ROW;
- value = BCD_TO_NORMAL(value);
- if (value > 63) value = 0; /* FT2, maybe ProTracker? */
- break;
+ case XM_PATTERN_BREAK:
+ effect = IT_BREAK_TO_ROW;
+ value = BCD_TO_NORMAL(value);
+ if (value > 63)
+ value = 0; /* FT2, maybe ProTracker? */
+ break;
- case XM_VOLUME_SLIDE: /* special */
- effect = IT_VOLUME_SLIDE;
- value = HIGH(value) ? EFFECT_VALUE(HIGH(value), 0) : EFFECT_VALUE(0, LOW(value));
- break;
+ case XM_VOLUME_SLIDE: /* special */
+ effect = IT_VOLUME_SLIDE;
+ value = HIGH(value) ? EFFECT_VALUE(HIGH(value), 0)
+ : EFFECT_VALUE(0, LOW(value));
+ break;
- case XM_PANNING_SLIDE:
- effect = IT_PANNING_SLIDE;
- //value = HIGH(value) ? EFFECT_VALUE(HIGH(value), 0) : EFFECT_VALUE(0, LOW(value));
- value = HIGH(value) ? EFFECT_VALUE(0, HIGH(value)) : EFFECT_VALUE(LOW(value), 0);
- break;
+ case XM_PANNING_SLIDE:
+ effect = IT_PANNING_SLIDE;
+ // value = HIGH(value) ? EFFECT_VALUE(HIGH(value), 0) : EFFECT_VALUE(0,
+ // LOW(value));
+ value = HIGH(value) ? EFFECT_VALUE(0, HIGH(value))
+ : EFFECT_VALUE(LOW(value), 0);
+ break;
- case XM_GLOBAL_VOLUME_SLIDE: /* special */
- effect = IT_GLOBAL_VOLUME_SLIDE;
- value = HIGH(value) ? EFFECT_VALUE(HIGH(value), 0) : EFFECT_VALUE(0, LOW(value));
- break;
+ case XM_GLOBAL_VOLUME_SLIDE: /* special */
+ effect = IT_GLOBAL_VOLUME_SLIDE;
+ value = HIGH(value) ? EFFECT_VALUE(HIGH(value), 0)
+ : EFFECT_VALUE(0, LOW(value));
+ break;
- case XM_SET_TEMPO_BPM:
- if (mod) effect = (value <= 0x20) ? (IT_SET_SPEED) : (IT_SET_SONG_TEMPO);
- else effect = (value < 0x20) ? (IT_SET_SPEED) : (IT_SET_SONG_TEMPO);
- break;
+ case XM_SET_TEMPO_BPM:
+ if (mod)
+ effect = (value <= 0x20) ? (IT_SET_SPEED) : (IT_SET_SONG_TEMPO);
+ else
+ effect = (value < 0x20) ? (IT_SET_SPEED) : (IT_SET_SONG_TEMPO);
+ break;
- case XM_SET_GLOBAL_VOLUME:
- effect = IT_SET_GLOBAL_VOLUME;
- value *= 2;
- if (value > 128) value = 128;
- break;
+ case XM_SET_GLOBAL_VOLUME:
+ effect = IT_SET_GLOBAL_VOLUME;
+ value *= 2;
+ if (value > 128)
+ value = 128;
+ break;
- case XM_KEY_OFF:
- effect = IT_XM_KEY_OFF;
- break;
+ case XM_KEY_OFF:
+ effect = IT_XM_KEY_OFF;
+ break;
- case XM_SET_ENVELOPE_POSITION:
- effect = IT_XM_SET_ENVELOPE_POSITION;
- break;
+ case XM_SET_ENVELOPE_POSITION:
+ effect = IT_XM_SET_ENVELOPE_POSITION;
+ break;
- case EBASE+XM_E_SET_FILTER: effect = SBASE+IT_S_SET_FILTER; break;
- case EBASE+XM_E_SET_GLISSANDO_CONTROL: effect = SBASE+IT_S_SET_GLISSANDO_CONTROL; break; /** TODO */
- case EBASE+XM_E_SET_FINETUNE: effect = SBASE+IT_S_FINETUNE; break;
- case EBASE+XM_E_SET_LOOP: effect = SBASE+IT_S_PATTERN_LOOP; break;
- case EBASE+XM_E_NOTE_CUT: effect = SBASE+IT_S_DELAYED_NOTE_CUT; break;
- case EBASE+XM_E_NOTE_DELAY: effect = SBASE+IT_S_NOTE_DELAY; break;
- case EBASE+XM_E_PATTERN_DELAY: effect = SBASE+IT_S_PATTERN_DELAY; break;
- case EBASE+XM_E_SET_PANNING: effect = SBASE+IT_S_SET_PAN; break;
- case EBASE+XM_E_FINE_VOLSLIDE_UP: effect = IT_XM_FINE_VOLSLIDE_UP; break;
- case EBASE+XM_E_FINE_VOLSLIDE_DOWN: effect = IT_XM_FINE_VOLSLIDE_DOWN; break;
- case EBASE+XM_E_SET_MIDI_MACRO: effect = SBASE+IT_S_SET_MIDI_MACRO; break;
+ case EBASE + XM_E_SET_FILTER:
+ effect = SBASE + IT_S_SET_FILTER;
+ break;
+ case EBASE + XM_E_SET_GLISSANDO_CONTROL:
+ effect = SBASE + IT_S_SET_GLISSANDO_CONTROL;
+ break; /** TODO */
+ case EBASE + XM_E_SET_FINETUNE:
+ effect = SBASE + IT_S_FINETUNE;
+ break;
+ case EBASE + XM_E_SET_LOOP:
+ effect = SBASE + IT_S_PATTERN_LOOP;
+ break;
+ case EBASE + XM_E_NOTE_CUT:
+ effect = SBASE + IT_S_DELAYED_NOTE_CUT;
+ break;
+ case EBASE + XM_E_NOTE_DELAY:
+ effect = SBASE + IT_S_NOTE_DELAY;
+ break;
+ case EBASE + XM_E_PATTERN_DELAY:
+ effect = SBASE + IT_S_PATTERN_DELAY;
+ break;
+ case EBASE + XM_E_SET_PANNING:
+ effect = SBASE + IT_S_SET_PAN;
+ break;
+ case EBASE + XM_E_FINE_VOLSLIDE_UP:
+ effect = IT_XM_FINE_VOLSLIDE_UP;
+ break;
+ case EBASE + XM_E_FINE_VOLSLIDE_DOWN:
+ effect = IT_XM_FINE_VOLSLIDE_DOWN;
+ break;
+ case EBASE + XM_E_SET_MIDI_MACRO:
+ effect = SBASE + IT_S_SET_MIDI_MACRO;
+ break;
- case EBASE + XM_E_FINE_PORTA_UP:
- effect = IT_PORTAMENTO_UP;
- value = EFFECT_VALUE(0xF, value);
- break;
+ case EBASE + XM_E_FINE_PORTA_UP:
+ effect = IT_PORTAMENTO_UP;
+ value = EFFECT_VALUE(0xF, value);
+ break;
- case EBASE + XM_E_FINE_PORTA_DOWN:
- effect = IT_PORTAMENTO_DOWN;
- value = EFFECT_VALUE(0xF, value);
- break;
+ case EBASE + XM_E_FINE_PORTA_DOWN:
+ effect = IT_PORTAMENTO_DOWN;
+ value = EFFECT_VALUE(0xF, value);
+ break;
- case EBASE + XM_E_RETRIG_NOTE:
- effect = IT_XM_RETRIGGER_NOTE;
- value = EFFECT_VALUE(0, value);
- break;
+ case EBASE + XM_E_RETRIG_NOTE:
+ effect = IT_XM_RETRIGGER_NOTE;
+ value = EFFECT_VALUE(0, value);
+ break;
- case EBASE + XM_E_SET_VIBRATO_CONTROL:
- effect = SBASE+IT_S_SET_VIBRATO_WAVEFORM;
- value &= ~4;
- break;
+ case EBASE + XM_E_SET_VIBRATO_CONTROL:
+ effect = SBASE + IT_S_SET_VIBRATO_WAVEFORM;
+ value &= ~4;
+ break;
- case EBASE + XM_E_SET_TREMOLO_CONTROL:
- effect = SBASE+IT_S_SET_TREMOLO_WAVEFORM;
- value &= ~4;
- break;
+ case EBASE + XM_E_SET_TREMOLO_CONTROL:
+ effect = SBASE + IT_S_SET_TREMOLO_WAVEFORM;
+ value &= ~4;
+ break;
- case XBASE + XM_X_EXTRAFINE_PORTA_UP:
- effect = IT_PORTAMENTO_UP;
- value = EFFECT_VALUE(0xE, value);
- break;
+ case XBASE + XM_X_EXTRAFINE_PORTA_UP:
+ effect = IT_PORTAMENTO_UP;
+ value = EFFECT_VALUE(0xE, value);
+ break;
- case XBASE + XM_X_EXTRAFINE_PORTA_DOWN:
- effect = IT_PORTAMENTO_DOWN;
- value = EFFECT_VALUE(0xE, value);
- break;
+ case XBASE + XM_X_EXTRAFINE_PORTA_DOWN:
+ effect = IT_PORTAMENTO_DOWN;
+ value = EFFECT_VALUE(0xE, value);
+ break;
- default:
- /* user effect (often used in demos for synchronisation) */
- entry->mask &= ~IT_ENTRY_EFFECT;
- }
+ default:
+ /* user effect (often used in demos for synchronisation) */
+ entry->mask &= ~IT_ENTRY_EFFECT;
+ }
-if (log) printf(" - %2d %02X", effect, value);
+ if (log)
+ printf(" - %2d %02X", effect, value);
- /* Inverse linearisation... */
- if (effect >= SBASE && effect < SBASE+16) {
- value = EFFECT_VALUE(effect-SBASE, value);
- effect = IT_S;
- }
+ /* Inverse linearisation... */
+ if (effect >= SBASE && effect < SBASE + 16) {
+ value = EFFECT_VALUE(effect - SBASE, value);
+ effect = IT_S;
+ }
-if (log) printf(" - %c%02X\n", 'A'+effect-1, value);
+ if (log)
+ printf(" - %c%02X\n", 'A' + effect - 1, value);
- entry->effect = effect;
- entry->effectvalue = value;
+ entry->effect = effect;
+ entry->effectvalue = value;
}