- Diggers
- No Excuses
- Rockfall
The next obvious option is use SharedSound to register a 16bit sound handler, which is how ArcEm works. This however has drawbacks, as far as I can tell SharedSound isn't freely distributable prior to RO5/6 and there are no distribution points for it left on the 'net. It also means coding 8bit to 16bit conversion as it doesn't look like that part was coded in the module - it's hard to tell as it wasn't formally document when added to RO5.
Having read through the layer 0 (SoundDMA) and layer 1 (SoundChannels) source code on ROOL, I've realised that rather counter intuitively, if I sit further up the sound stack at layer 1 there's less to code. Layer 1 is totally 8 bit, even in the RO5 world, so we can happily inject sound into the sound buffer at this level in the knowledge that RISCOS will take care of any log to linear conversion and oversampling. The only issue it doesn't solve is differing sample rates between what the game requires and what the system supports, I'll come back to this later. Firstly, what are the advantages:
- I can legally get the RISCOS ChannelHandler entry point
- I can point the game's ChannelHander to a seperate circular audio buffer
- The game can use a different sound buffer size to the system (resolves 2067BC audio)
- I can emulate MEMC sound registers by filling SoundDMA's buffer with audio and simply not pass the call onto the registered ChannelHandler (resolves No Excuses and Rockfall)
- SoundDMA can be left to the 16bit conversion and oversampling
- We can ensure our circular buffer is at least one buffer ahead by either calling the previous ChannelHandler or game device 9 code more than once. This may also do away with the need to use timers for device 9
- The game won't need to run under the JIT on IOMD 26bit