12  i_sound: Sound and Music Abstraction

This tour covers DOOM’s sound and music system through the i_sound module.
We’ll examine the interface (i_sound.h) and Unix/Linux implementation (i_sound.c) for:


12.1 🧩 Sound Interface (i_sound.h)

12.1.1 📄 File: i_sound.h (lines 40–48)

Functions managing the sound system lifecycle: initialization, mixing, playback, and cleanup.


12.1.2 📄 File: i_sound.h (lines 54–60)

Channel and lump utilities: - I_SetChannels builds pitch/volume tables
- I_GetSfxLumpNum maps SFX name to WAD lump


12.1.3 📄 File: i_sound.h (lines 62–79)

Sound FX control interface for: - Starting/stopping sounds
- Checking status
- Updating parameters


12.1.4 📄 File: i_sound.h (lines 93–113)

Music interface: - I_InitMusic, I_ShutdownMusic
- I_RegisterSong, I_UnRegisterSong
- I_PlaySong, I_StopSong, I_PauseSong, I_ResumeSong
- I_SetMusicVolume


12.2 ⚙️ Sound Implementation (i_sound.c)

12.2.1 📄 File: i_sound.c (lines 768–776)

I_InitSound: Opens/configures the sound device (e.g., /dev/dsp).


12.2.2 📄 File: i_sound.c (lines 414–423)

I_SetChannels: Builds pitch and volume lookup tables.


12.2.3 📄 File: i_sound.c (lines 451–456)

I_GetSfxLumpNum: Resolves raw sound sample location in the WAD.


12.3 🔊 Runtime Sound FX Control

12.3.1 📄 File: i_sound.c (lines 491–497)

I_StartSound: Starts playback via addsfx, returns handle.


12.3.2 📄 File: i_sound.c (lines 505–514)

I_StopSound: Stub — channel system not implemented.


12.3.3 📄 File: i_sound.c (lines 517–521)

Handles are treated as expiry tics, not channel IDs.


12.4 🎚️ Mixing and Output

12.4.1 📄 File: i_sound.c (lines 585–593)

I_UpdateSound: Mixes active SFX into a stereo buffer.


12.4.2 📄 File: i_sound.c (lines 617–622)

Clamps output to 16-bit signed range.


12.4.3 📄 File: i_sound.c (lines 666–670)

I_SubmitSound: Sends mixed audio to the sound device.


12.4.4 📄 File: i_sound.c (lines 674–680)

I_UpdateSoundParams: Stub for changing sound parameters mid-playback.


12.4.5 📄 File: i_sound.c (lines 703–710)

I_ShutdownSound: Sound cleanup is unimplemented (FIXME).


12.5 🎵 Music Control

12.5.1 📄 File: i_sound.c (lines 875–879)

I_RegisterSong: Stub — discards song data.


12.5.2 📄 File: i_sound.c (lines 841–846)

I_PlaySong: Schedules music to stop after 30 seconds.


12.5.3 📄 File: i_sound.c (lines 860–867)

I_StopSong: Stops music by clearing relevant flags.


12.5.4 📄 File: i_sound.c (lines 884–889)

I_QrySongPlaying: Checks if music is still playing or looping.


The i_sound module provides DOOM’s audio abstraction layer, handling sound effects and mixing.
Music functionality is largely stubbed out for future platform-specific expansion.