Bits of possibly less-than-obvious advice:

archutils/ contains arch-specific code.  This should contain code
shared by more than one arch/ driver.

arch/ contains drivers for specific features that can be better
implemented nonportably.  Most drivers (all except sound) contain
default, portable implementations, so StepMania should work mostly
out-of-the-box on platforms that are supported by the supporting
libraries (particularly SDL); only a sound driver needs to be
written.


Avoid accessing other singleton classes from singleton destructors.  That
introduces dependencies on the order of destruction, and can cause problems
if one of the singletons throws an exception.


This kills VC:

template<class T> static void YY( T opt ) { }
enum { A } a;
enum { A1 } b;
void XX() { YY(a); YY(b); }

foo.obj : fatal error LNK1179: invalid or corrupt file: duplicate COMDAT '?YY@@YAXW4__unnamed@@@Z'

It mangles the template incorrectly.  Solution: don't use anonymous
enums as template parameters; give them a name.

