Skip to content

Commit

Permalink
Multiple Sound Support (sm64pc#377)
Browse files Browse the repository at this point in the history
* Initial support for the game playing multiple sounds at once.

* Make better use of our channels and use the remaining channels.
  • Loading branch information
theclashingfritz authored May 3, 2023
1 parent 5e9eafd commit c5c1f28
Show file tree
Hide file tree
Showing 6 changed files with 190 additions and 79 deletions.
10 changes: 8 additions & 2 deletions include/seq_macros.inc
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@
.byte (\b - sequence_start) >> 8, (\b - sequence_start) & 0xff
.endm

.macro seq_startchannel_extended a, b
.byte 0xb0
.byte \a
.byte (\b - sequence_start) >> 8, (\b - sequence_start) & 0xff
.endm

.macro seq_subtract a
.byte 0xc8
.byte \a
Expand Down Expand Up @@ -80,12 +86,12 @@

.macro seq_disablechannels_extended a
.byte 0xc0
.byte \a >> 24, \a >> 16, \a >> 8, \a & 0xff
.byte (\a >> 56) & 0xff, (\a >> 48) & 0xff, (\a >> 40) & 0xff, (\a >> 32) & 0xff, (\a >> 24) & 0xff, (\a >> 16) & 0xff, (\a >> 8) & 0xff, \a & 0xff
.endm

.macro seq_initchannels_extended a
.byte 0xc1
.byte \a >> 24, \a >> 16, \a >> 8, \a & 0xff
.byte (\a >> 56) & 0xff, (\a >> 48) & 0xff, (\a >> 40) & 0xff, (\a >> 32) & 0xff, (\a >> 24) & 0xff, (\a >> 16) & 0xff, (\a >> 8) & 0xff, \a & 0xff
.endm

.macro seq_changevol a
Expand Down
104 changes: 90 additions & 14 deletions sound/sequences/00_sound_player.s
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,96 @@ seq_setmutescale 0
seq_setvol 127
.endif
seq_settempo 120
#seq_initchannels 0xfff
seq_initchannels_extended 0xfff
seq_startchannel 0, .channel0
seq_startchannel 1, .channel1
seq_startchannel 2, .channel2
seq_startchannel 3, .channel38
seq_startchannel 4, .channel4
seq_startchannel 5, .channel59
seq_startchannel 6, .channel6
seq_startchannel 7, .channel7
seq_startchannel 8, .channel38
seq_startchannel 9, .channel59
seq_startchannel 10, .channel10
seq_startchannel 11, .channel11
seq_initchannels_extended 0xffffffffffffffff

# SOUND_BANK_ACTION
seq_startchannel_extended 0, .channel0
seq_startchannel_extended 1, .channel0
seq_startchannel_extended 2, .channel0
seq_startchannel_extended 3, .channel0
seq_startchannel_extended 4, .channel0
seq_startchannel_extended 5, .channel0
seq_startchannel_extended 6, .channel0
seq_startchannel_extended 7, .channel0

# SOUND_BANK_MOVING
seq_startchannel_extended 8, .channel1
seq_startchannel_extended 9, .channel1
seq_startchannel_extended 10, .channel1
seq_startchannel_extended 11, .channel1
seq_startchannel_extended 12, .channel1
seq_startchannel_extended 13, .channel1
seq_startchannel_extended 14, .channel1
seq_startchannel_extended 15, .channel1

# SOUND_BANK_MARIO_VOICE
seq_startchannel_extended 16, .channel2
seq_startchannel_extended 17, .channel2
seq_startchannel_extended 18, .channel2
seq_startchannel_extended 19, .channel2
seq_startchannel_extended 20, .channel2
seq_startchannel_extended 21, .channel2
seq_startchannel_extended 22, .channel2
seq_startchannel_extended 23, .channel2

# SOUND_BANK_GENERAL
seq_startchannel_extended 24, .channel38
seq_startchannel_extended 25, .channel38
seq_startchannel_extended 26, .channel38
seq_startchannel_extended 27, .channel38

# SOUND_BANK_ENV
seq_startchannel_extended 28, .channel4
seq_startchannel_extended 29, .channel4
seq_startchannel_extended 30, .channel4
seq_startchannel_extended 31, .channel4

# SOUND_BANK_OBJ
seq_startchannel_extended 32, .channel59
seq_startchannel_extended 33, .channel59
seq_startchannel_extended 34, .channel59
seq_startchannel_extended 35, .channel59

# SOUND_BANK_AIR
seq_startchannel_extended 36, .channel6
seq_startchannel_extended 37, .channel6
seq_startchannel_extended 38, .channel6
seq_startchannel_extended 39, .channel6

# SOUND_BANK_MENU
seq_startchannel_extended 40, .channel7

# SOUND_BANK_GENERAL2
seq_startchannel_extended 41, .channel38
seq_startchannel_extended 42, .channel38
seq_startchannel_extended 43, .channel38
seq_startchannel_extended 44, .channel38

# SOUND_BANK_OBJ2
seq_startchannel_extended 45, .channel59
seq_startchannel_extended 46, .channel59
seq_startchannel_extended 47, .channel59

# SOUND_BANK_LUIGI_VOICE
seq_startchannel_extended 48, .channel10
seq_startchannel_extended 49, .channel10
seq_startchannel_extended 50, .channel10
seq_startchannel_extended 51, .channel10
seq_startchannel_extended 52, .channel10
seq_startchannel_extended 53, .channel10
seq_startchannel_extended 54, .channel10
seq_startchannel_extended 55, .channel10

# SOUND_BANK_WARIO_VOICE
seq_startchannel_extended 56, .channel11
seq_startchannel_extended 57, .channel11
seq_startchannel_extended 58, .channel11
seq_startchannel_extended 59, .channel11
seq_startchannel_extended 60, .channel11
seq_startchannel_extended 61, .channel11
seq_startchannel_extended 62, .channel11
seq_startchannel_extended 63, .channel11

.seq_loop:
seq_delay 20000
seq_jump .seq_loop
Expand Down
18 changes: 9 additions & 9 deletions src/audio/external.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
// N.B. sound banks are different from the audio banks referred to in other
// files. We should really fix our naming to be less ambiguous...
#define MAX_BACKGROUND_MUSIC_QUEUE_SIZE 6
#define MAX_CHANNELS_PER_SOUND_BANK 1
#define MAX_CHANNELS_PER_SOUND_BANK 8
#define SOUND_INDEX_COUNT 40

#define SEQUENCE_NONE 0xFF
Expand Down Expand Up @@ -393,9 +393,9 @@ STATIC_ASSERT(ARRAY_COUNT(sBackgroundMusicDefaultVolume) == 64,
u8 sCurrentBackgroundMusicSeqId = SEQUENCE_NONE;
u8 sMusicDynamicDelay = 0;
u8 sSoundBankUsedListBack[SOUND_BANK_COUNT] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
u8 sSoundBankFreeListFront[SOUND_BANK_COUNT] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
u8 sSoundBankFreeListFront[SOUND_BANK_COUNT] = { 8, 8, 8, 4, 4, 4, 4, 1, 4, 3, 8, 8 };
u8 sNumSoundsInBank[SOUND_BANK_COUNT] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // only used for debugging
u8 sMaxChannelsForSoundBank[SOUND_BANK_COUNT] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
u8 sMaxChannelsForSoundBank[SOUND_BANK_COUNT] = { 8, 8, 8, 4, 4, 4, 4, 1, 4, 3, 8, 8 };

// Banks 2 and 7 both grew from 0x30 sounds to 0x40 in size in US.
#ifdef VERSION_JP
Expand Down Expand Up @@ -452,10 +452,9 @@ s8 D_SH_80343E48_pad[0x8];
#endif

struct Sound sSoundRequests[0x100];
// Curiously, this has size 3, despite SEQUENCE_PLAYERS == 4 on EU
struct ChannelVolumeScaleFade D_80360928[3][CHANNELS_MAX];
u8 sUsedChannelsForSoundBank[SOUND_BANK_COUNT];
u8 sCurrentSound[SOUND_BANK_COUNT][MAX_CHANNELS_PER_SOUND_BANK]; // index into sSoundBanks
struct ChannelVolumeScaleFade D_80360928[SEQUENCE_PLAYERS][CHANNELS_MAX] = { 0 };
u8 sUsedChannelsForSoundBank[SOUND_BANK_COUNT] = { 0 };
u8 sCurrentSound[SOUND_BANK_COUNT][MAX_CHANNELS_PER_SOUND_BANK] = { 0 }; // index into sSoundBanks

/**
* For each sound bank, a pool containing the currently active sounds for that bank.
Expand Down Expand Up @@ -1401,7 +1400,7 @@ static void update_game_sound(void) {
for (bank = 0; bank < SOUND_BANK_COUNT; bank++) {
select_current_sounds(bank);

for (i = 0; i < MAX_CHANNELS_PER_SOUND_BANK; i++) {
for (i = 0; i < sUsedChannelsForSoundBank[bank]; i++) {
soundIndex = sCurrentSound[bank][i];

if (soundIndex < SOUND_INDEX_COUNT && sSoundBanks[bank][soundIndex].soundStatus != SOUND_STATUS_STOPPED) {
Expand Down Expand Up @@ -1750,11 +1749,12 @@ static void update_game_sound(void) {
// Increment to the next channel that this bank owns
channelIndex++;
}

// Increment to the first channel index of the next bank
// (In practice sUsedChannelsForSoundBank[i] = sMaxChannelsForSoundBank[i] = 1, so this
// doesn't do anything)
channelIndex += sMaxChannelsForSoundBank[bank] - sUsedChannelsForSoundBank[bank];

}
}

Expand Down
6 changes: 3 additions & 3 deletions src/audio/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@

#if defined(VERSION_EU) || defined(VERSION_SH)
#define SEQUENCE_PLAYERS 4
#define SEQUENCE_CHANNELS 48
#define SEQUENCE_CHANNELS 128
#define SEQUENCE_LAYERS 64
#else
#define SEQUENCE_PLAYERS 3
#define SEQUENCE_CHANNELS 32
#define SEQUENCE_CHANNELS 129
#ifdef VERSION_JP
#define SEQUENCE_LAYERS 48
#else
Expand All @@ -20,7 +20,7 @@
#endif

#define LAYERS_MAX 8
#define CHANNELS_MAX 32
#define CHANNELS_MAX 64

#define NO_LAYER ((struct SequenceChannelLayer *)(-1))

Expand Down
6 changes: 3 additions & 3 deletions src/audio/load.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@ struct Note *gNotes;
static u8 pad[4];
#endif

struct SequencePlayer gSequencePlayers[SEQUENCE_PLAYERS];
struct SequenceChannel gSequenceChannels[SEQUENCE_CHANNELS];
struct SequenceChannelLayer gSequenceLayers[SEQUENCE_LAYERS];
struct SequencePlayer gSequencePlayers[SEQUENCE_PLAYERS] = { 0 };
struct SequenceChannel gSequenceChannels[SEQUENCE_CHANNELS] = { 0 };
struct SequenceChannelLayer gSequenceLayers[SEQUENCE_LAYERS] = { 0 };

struct SequenceChannel gSequenceChannelNone;
struct AudioListItem gLayerFreeList;
Expand Down
Loading

0 comments on commit c5c1f28

Please sign in to comment.