All keys that have a function should be hilighted:
gmrst%<>
[T]ime (toggle between elapsed/remaining/total) [%] In %
Next [s]ong
Next [g]roup
[M]ixer (toggle between mixer devices) [<],[>] Volume down/up
[R]epeat (toggle between None/Song/Group/All)
1..7: CD-style controls
cursorkeys/enter/pgup/pgdn: group/song window

Classes
=======
=>Eentje die interface TEKENT (set van basisfuncties, allemaal virtual), zodat
  je meerdere layouts kun hebben :) (Interface hoeft niet alles weer te geven)
=>Eentje die keyboard input verwerkt en playlist bijhoudt. Enige wat hier
  flexibel moet zijn is de schermaansturing. Die moet volledig transparant
  zijn! (zodat 'ie ook voor de X versie gebruikt kan worden. Alle input
  moet een apart functie aanroepen (voor toetsenbord vanaf 1 funktie) zodat
  aanroep van die functies ook vanuit een mouseclick kan gebeuren. (in de
  tekstversie doorloopt 'ie dus continu een input-loop, in de X versie hoeft
  dat niet)
  
Playlist=>Linked List

// 'all songs random' is an exception: When this global playback method is
// used, the playlist will *NOT* contain groups. Play-order is now detemined
// DURING playback, instead of preordering the lot.
// HOW: All groups in normal order => A linked list of all items (groups,
//      songs) with playmode NORMAL. If during playback one messes with the
//      order, it will be reflected in playback order. One cannot delete the
//      current group during playback..everything else is possible tho.
//      All groups in random order => A linked list of all items (groups,
//      songs) with playmode RANDOM. An array of ints keeps track of
//      which items have been played, which is dynamically adjusted if one
//      messes with the grouporder.
enum playmode_enum { NORMAL, RANDOM, CURRENT };
struct playlist
{
	char *filename; (either filename or group is NULL (or both))
	struct playlist *group; //recursive!
	playmode_enum playmode;
	struct playlist *prev;
	struct playlist *next;
} ;

struct playlist *current;
struct playlist *first;
struct playlist *last;

Class _PlayList() //this class plays the actual list. It should be standalone
{
	_PlayList(struct playlist *songlist, PlayWindow *iface);

	void Init()
	{
		interface->DrawFixedStuff();

		//pak 1e te spelen SONG en vul interface hiermee
	//begin afspelen
	//[tijdens afspelen: lees input en verwerk]
};

Class _PlayWindow()
{
	PlayWindow(); //store screensize
	virtual DrawFixedStuff(); //all text/colours that will never change
	virtual DrawID3Info(struct id3header id3);
	virtual DrawFileName(char *filename);
	virtual DrawMpegInfo(int layer, int Khz, int bitrate, int stereo);
	virtual DrawTime(time_t current, time_t total);
	virtual DrawNextSong(struct id3header id3);
	virtual DrawNextSong(char *filename);
	virtual DrawGroupName(char *name);
	virtual DrawNextGroupname(char *name);
	virtual DrawRepeatMode();
	virtual DrawMixerDevName(char *name);
	virtual SetMixerPercentage(short vol);
}

//determine next (random) song
//2 groups, first group=5 songs, 2nd group=10 songs. Order is all songs
//random.
//weight of 1st group: 5  - (#played songs for this group)
//weight of 2nd group: 10 - (#played songs for this group)
//random (sum of weights) => song to play.
