TODO for the next engine framework: * emit stateChanged() with no parameter and force controller to read the state from EngineBase::state() instead, as this makes things more likely to be consistent * combine load() and play() as it just complicates things for engine development (eg crossfade is a bitch for me due to the separation * setVolumeSW( double ), to give more resolution for setting volume * Make EngineObserver system use engineStateChanged( oldState, newState ) * Don't do above function for Play on every track? Is this ever useful? * Would be useful if engineNewMetaData and stateChanged for Play weren't separate? * setVolumeSW uses a log function, volume() doesn't so you get different values back to what you expect. Really we should provide a volumeToLog( int ) function for engines to use internally as some engines may already apply a log function anyway.