1
0
mirror of https://github.com/pumpitupdev/pumptools.git synced 2024-12-25 04:34:52 +01:00
pumptools/doc/development/notes/exc-sound-manager-notes.md

3.1 KiB

Notes about Exceed's implementation of a sound manager

Pre-face

To understand what the developers of AM did here, you should have some knowledge about how they had to handle sound on the MK3 hardware which is the predecessor of the MK5 hardware that was used with Exceed. Exceed builds on the codebase of the previous game(s), Prex 3 and Premiere 3, that ran on MK3/MK5. However, moving from Dos (MK3)/Windows XP Embedded (MK5) to Linux (MK5), the code had to be adjusted to work on the different kind of hardware and operating system. Their engine was targeted and optimized for the MK3 hardware platform and had to use various pieces of custom hardware to implement stuff like: security using the lock chip, MP3 decoding and effect playback and IO.

Sound playback, higher level view

For sound playback, the game had the following requirements:

  1. For playing a song, menu background music, title screen intro music or any other music tracks, sound data encoded as MP3 files are used. These needed to be loaded, decoded and played back whenever the game reaches certain points in the game scene.
  2. Various short sound effects, e.g. to give the user confirmation about hitting a button, have to be played back when a certain event is triggered, e.g. user input or a scripted event in a scene. On exceed, these are stored as WAV files.
  3. Audio played back by the above two items needs to be mixed because playback of both can happen simultaneously.

MK3 hardware for decoding and audio playback

The MK3 hardware came with a dedicated piece of hardware, a MP3 decoder and playback chip. Therefore, audio data from disc was streamed encoded to the hardware for decoding and playback, and effects were triggered by commands to the appropriate chips as their audio data is stored in a ROM chip on the board.

Exceed's sound manager

With the move to Linux and less specialized hardware closer to a normal PC, the audio pipeline changed a lot. On Linux, alsa/libasound is used for sending data to the underlying audio driver. Decoding of the MP3 song data is done by the CPU. Effects are stored as WAV files and also played back using libasound.

The sound manager relies on hardware mixing using the same sound device, e.g. hw:0. This device is opened once on game init for playing back sound effects and another time for every song/background music to be played back for the current scene.

Hardware sound tracks specs

Effect track

  • Channels: 2
  • Buffer size in frames: 4096
  • Periods: 2
  • Sample format: 16-bit signed LE
  • Sample rate: 44100
  • Sample order: FL, FR

Song track

  • Channels: 2
  • Buffer size in frames: 16384
  • Periods: 8
  • Sample format: 16-bit signed LE
  • Sample rate: 44100
  • Sample order: FL, FR

Issues on todays distros

However, this way of mixing is not supported anymore by alsa. Instead, you have to use software mixing using dmix which is supported by alsa's built in plugin system today. But, that doesn't seem to work properly with different configurations from different versions of alsa on today's available distros.

Fortunately, this got fixed already on Exceed 2 which implements its own software mixer in the pump engine.