diff --git a/src/addresses.h b/src/addresses.h index feca8397a2..e371cafe26 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -108,6 +108,8 @@ #define RCT2_ADDRESS_CURRENT_SOUND_DEVICE 0x009AF280 +#define RCT2_ADDRESS_VEHICLE_SOUND_LIST 0x009AF288 + #define RCT2_ADDRESS_CURENT_CURSOR 0x009DE51C #define RCT2_ADDRESS_INPUT_STATE 0x009DE51D #define RCT2_ADDRESS_CURSOR_DOWN_WINDOWCLASS 0x009DE51F @@ -310,7 +312,7 @@ #define RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER 0x0141ED68 - +#define RCT2_ADDRESS_SOUND_CHANNEL_LIST 0x014262E0 #define RCT2_ADDRESS_WATER_RAISE_COST 0x0141F738 #define RCT2_ADDRESS_WATER_LOWER_COST 0x0141F73C diff --git a/src/audio.c b/src/audio.c index 14778f7926..be4683a9c0 100644 --- a/src/audio.c +++ b/src/audio.c @@ -90,14 +90,15 @@ void sound_play_panned(int sound_id, int x) */ int sound_channel_play(int channel, int a2, int volume, int pan, int frequency) { - RCT2_GLOBAL(0x1426444 + (91 * channel * 4), uint32) = a2; + rct_sound_channel* sound_channel = &RCT2_ADDRESS(RCT2_ADDRESS_SOUND_CHANNEL_LIST, rct_sound_channel)[channel]; + sound_channel->var_164 = a2; sound_channel_set_frequency(channel, frequency); sound_channel_set_pan(channel, pan); sound_channel_set_volume(channel, volume); LPDIRECTSOUNDBUFFER dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel]; dsbuffer->lpVtbl->SetCurrentPosition(dsbuffer, 0); dsbuffer->lpVtbl->Play(dsbuffer, 0, 0, DSBPLAY_LOOPING); - RCT2_GLOBAL(0x14262E0 + (91 * channel * 4), uint32) = 1; + sound_channel->var_0 = 1; return 1; } @@ -279,10 +280,10 @@ rct_sound* sound_remove(rct_sound* sound) void pause_sounds() { if (++RCT2_GLOBAL(0x009AF59C, uint8) == 1) { - pause_other_sounds(); //RCT2_CALLPROC_EBPSAFE(0x006BCAE5); // ? sounds - pause_vehicle_sounds(); //RCT2_CALLPROC_EBPSAFE(0x006BABDF); // vehicle sounds - pause_ride_music(); //RCT2_CALLPROC_EBPSAFE(0x006BCA9F); // ride music - pause_peep_sounds(); //RCT2_CALLPROC_EBPSAFE(0x006BD07F); // peep sounds + stop_other_sounds(); + stop_vehicle_sounds(); + stop_ride_music(); + stop_peep_sounds(); } g_sounds_disabled = 1; } @@ -291,7 +292,7 @@ void pause_sounds() * * rct2: 0x006BCAE5 */ -void pause_other_sounds() +void stop_other_sounds() { if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) != 0xFFFFFFFF) { if (RCT2_GLOBAL(0x009AF5A8, uint32) != 1) { @@ -319,24 +320,24 @@ void pause_other_sounds() * * rct2: 0x006BABDF */ -void pause_vehicle_sounds() +void stop_vehicle_sounds() { - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) != 0xFFFFFFFF) { + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, sint32) != -1) { for (int i = 0; i < 7; i++) { - uint8 * data = RCT2_ADDRESS(0x009AF288 + (i * 60), uint8); - if (*(uint16 *)&data[0] != 0xFFFF) { - if (*(uint16 *)&data[0x18] != 0xFFFF) { + rct_vehicle_sound* vehicle_sound = &RCT2_ADDRESS(RCT2_ADDRESS_VEHICLE_SOUND_LIST, rct_vehicle_sound)[i]; + if (vehicle_sound->var_0 != 0xFFFF) { + if (vehicle_sound->var_18 != 0xFFFF) { RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_stop((rct_sound*)&data[0x04]); + sound_stop(&vehicle_sound->sound1); RCT2_GLOBAL(0x014241BC, uint32) = 0; } - if (*(uint16 *)&data[0x34] != 0xFFFF) { + if (vehicle_sound->var_34 != 0xFFFF) { RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_stop((rct_sound*)&data[0x20]); + sound_stop(&vehicle_sound->sound2); RCT2_GLOBAL(0x014241BC, uint32) = 0; } } - *(uint16 *)&data[0] = 0xFFFF; + vehicle_sound->var_0 = 0xFFFF; } } } @@ -345,14 +346,14 @@ void pause_vehicle_sounds() * * rct2: 0x006BCA9F */ -void pause_ride_music() +void stop_ride_music() { if ((RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0))) { for (int i = 0; i < 2; i++) { uint8 * data = RCT2_ADDRESS(0x009AF46C + (i * 8), uint8); if (data[0] != 0xFF) { RCT2_GLOBAL(0x014241BC, uint32) = 1; - RCT2_CALLPROC_1(0x00401A05, int, i); + sound_channel_stop(i); RCT2_GLOBAL(0x014241BC, uint32) = 0; data[0] = 0xFF; } @@ -364,18 +365,42 @@ void pause_ride_music() * * rct2: 0x006BD07F */ -void pause_peep_sounds() +void stop_peep_sounds() { if ((RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0))) { if (RCT2_GLOBAL(0x009AF5FC, uint32) != 1) { RCT2_GLOBAL(0x014241BC, uint32) = 1; - RCT2_CALLPROC_1(0x00401A05, int, 2); + sound_channel_stop(2); RCT2_GLOBAL(0x014241BC, uint32) = 0; RCT2_GLOBAL(0x009AF5FC, uint32) = 1; } } } +/** +* +* rct2: 0x00401A05 +*/ +int sound_channel_stop(int channel) +{ + rct_sound_channel* sound_channel = &RCT2_ADDRESS(RCT2_ADDRESS_SOUND_CHANNEL_LIST, rct_sound_channel)[channel]; + sound_channel->var_0 = 0; + sound_channel->var_160 = 1; + while (InterlockedExchange(&RCT2_GLOBAL(0x009E1AAC, int), 1) != 1) { + Sleep(10); + } + if (sound_channel->var_120) + RCT2_CALLPROC_2(0x00405436, uint32, uint32, sound_channel->var_11C, sound_channel->var_120); // free_sound? + + LPDIRECTSOUNDBUFFER dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel]; + if (dsbuffer) { + dsbuffer->lpVtbl->Stop(dsbuffer); + dsbuffer->lpVtbl->Release(dsbuffer); + } + InterlockedExchange(&RCT2_GLOBAL(0x009E1AAC, int), 0); + return 1; +} + /** * * rct2: 0x006BABD8 diff --git a/src/audio.h b/src/audio.h index af98b232a4..ddc9f46d72 100644 --- a/src/audio.h +++ b/src/audio.h @@ -21,6 +21,8 @@ #ifndef _AUDIO_H_ #define _AUDIO_H_ +#include "rct2.h" + typedef struct { char name[256]; } audio_device; @@ -55,6 +57,28 @@ typedef struct rct_sound { struct rct_sound* next; } rct_sound; +typedef struct { + uint32 var_0; + uint8 pad_4[0x118]; + uint32 var_11C; + uint32 var_120; + uint8 pad_124[0x3C]; + uint32 var_160; + uint32 var_164; + uint32 var_168; +} rct_sound_channel; + +typedef struct { + uint16 var_0; + uint16 var_2; + rct_sound sound1; // 0x04 + uint16 var_18; + uint8 pad_1A[0x06]; + rct_sound sound2; // 0x20 + uint16 var_34; + uint8 pad_36[0x06]; +} rct_vehicle_sound; + void get_dsound_devices(); int sound_prepare(int sound_id, rct_sound *sound, int var_8, int var_c); void sound_play_panned(int sound_id, int x); @@ -68,12 +92,13 @@ int sound_channel_set_frequency(int channel, int frequency); int sound_channel_set_pan(int channel, int pan); int sound_channel_set_volume(int channel, int volume); void sound_stop(rct_sound *sound); +int sound_channel_stop(int channel); rct_sound* sound_remove(rct_sound* sound); void pause_sounds(); -void pause_other_sounds(); -void pause_vehicle_sounds(); -void pause_ride_music(); -void pause_peep_sounds(); +void stop_other_sounds(); +void stop_vehicle_sounds(); +void stop_ride_music(); +void stop_peep_sounds(); void unpause_sounds(); // 0x009AF59C probably does the same job