al_duh_get_volume() * [23:25:12] I prefer an API datagram :) * Create a glossary of terms like 'render', 'sigrenderer', etc.? * Consider the order in which stuff appears in dumb.h, and dumb.txt? PROPOSED CHANGE OF TERMINOLOGY: Current situation: A DUH comprises a number of "signals". A signal is an entity capable of producing a stream of audio. When a signal is called upon to generate sound, it may in turn call upon any other signals in the DUH and use the sound from those in generating its own. There are a number of "sigtypes", including 'SAMP' (a sample) and 'SEQU' (a sequence). Every signal in a DUH must be of one of these known types. Every sigtype is characterised by a four-byte identifier and the following function prototypes: typedef void signal_t; typedef void sampinfo_t; signal_t *load_signal(DUH *duh, DUMBFILE *file); sampinfo_t *start_samples(DUH *duh, signal_t *signal, int n_channels, long pos); void set_parameter(sampinfo_t *sampinfo, unsigned char id, long value); long render_samples(sampinfo_t *sampinfo, float volume, float delta, long size, sample_t **samples); void end_samples(sampinfo_t *sampinfo); void unload_signal(signal_t *signal); When a signal in a DUH needs to be loaded, DUMB's core first checks the identifier. If it is unknown, load_duh() fails. Each known sigtype will have pointers to the above functions, so DUMB's core will then call the load_signal() function. This loads the "signal", which could consist of sample data, or sequence data (like the patterns in a music module). (There's ambiguity here; we use the word "signal" for the whole entity and also for the specific data that distinguish it from other signals of the same sigtype.) Once a signal is in memory, it can be used to generate sound. Its start_samples() function is called for that, and a "sampinfo" block is returned; this will contain the current position and any necessary state information. render_samples() generates sound, and end_samples() destroys the sampinfo block. DUMB's support for existing file formats is implemented as follows. First a signal_t is constructed manually by reading the file. Then the special make_duh() function is called. This creates a DUH struct with just one signal in it, the one we just created. We provide all the above functions, except load_signal(), since that has been bypassed. DUMB's core now has our start_samples() etc. function for generating the sound, and it has our unload_signal() function for getting the file out of memory when we're done. It is possible with some sigtypes to adjust their sound using "parameters". set_parameter() is called for this. An example would be changing the cut-off frequency for a signal that acts as a filter. I plan to add a second version of this function that takes a pointer. This would be used when manipulating DUHs in code; an example is when installing a callback function for a music module file. It couldn't be used by a file on disk. This terminology is far from intuitive. Here are some proposals: - The things DUHs are made of can still be called "signals". - The types of signal can still be called "sigtypes" ("signal types"). - The signal-specific data can be called the "sigdata" ("signal data"). - The sampinfo block can be renamed to a "sigrenderer" ("signal renderer"). - The parameters can be called "sigparams" ("signal parameters"). This way we have some consistency between different parts of the library; the API for rendering a DUH as a whole uses the term "renderer". We also have a full name and an abbreviation for each term. Any advances on this? --- Todo/Wishlist: * MOD/XM loading - change the effect memory system; it isn't robust when it comes to remembering stuff from one pattern to the next. * --- IMPORTANT --- Put link to IT in docs: http://www.noisemusic.org/it/ * --- IMPORTANT --- Twist the sample decompression algorithm around, since it was derived from a GPL'd algorithm. We don't want to have to put it under GPL! :) ... or, find out that it wasn't originally written under the GPL and then credit the bloke who wrote it :) * MMX resamplers and downsamplers * Ability to load *.it, *.xm directly into DUH structs (IT done) * Ability to embed IT compressed samples... no, it's copyrighted. Let's do our own :) * Ability to embed ITs themselves (? not sure how useful that is) * Remove cit.c * Check all return values. I think the Winamp plug-in needs looking at... * resample.c - it seems x*y is safe if 0<=x<=65535 and -32768<=y<=32768 or vice versa. Check this is true on all compilers. If so, make use of it to gain more accuracy. * DUMB_IDs should always be long or always be int... * Decide whether the load_signal function really needs the DUH parameter... * Allow for DUH modularity; different pieces share samples etc. * Fix makefile so it can manage without alld - or put note in the FAQ that ppl must build alld * Arrange to detect file types by extension (probably not by content though) * Change aldmbd to aldmd in makefiles to maintain 8.3 compatibility * Put dumb_resampling_quality and dumb_it_max_to_mix in howto.txt * More info in howto.txt, in particular that install_sound() is needed... * Add a sanity check for restart_position? * Note in docs to let entheh know if you release a game using DUMB STUFF TO FIX FOR THE FIRST RELEASE ================================== General ------- * Naming is a bit confusing sometimes... * What to do about ASSERT() and TRACE() - they were hacked in when the lib was split from Allegro, and they need replacing. * Add some constants to dumb.h (DUMB_VERSION_STR etc.) entheh ------ * Update docs, write more docs (a lot to do here!) * Go through, eliminate warnings, resolve some "/** WARNING" comments (they used to be #warning but Bob complained :) * Program it to calculate the length of IT and S3M files (currently always set to 10 minutes IIRC) Bob --- * dumb_resample() now has a volume parameter, so there are some extra floating-point multiply ops that could possibly be optimised. tjaden ------ * Test on Linux when it's all ready plz :)