From e6f966f395868ab6fbbd2474be5493f5c03267ef Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 18 Jan 2015 19:13:21 +0000 Subject: [PATCH] Fix intro crash. Caused by incorrect pointer address. Fixed crash on freeing unallocated memory. Fixed audio issue when channels set to zero. --- src/audio/audio.c | 46 +++++++++++++++++++++--------------------- src/drawing/drawing.c | 2 +- src/platform/windows.c | 2 +- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index 42e436e3c4..b66978f9cb 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -693,32 +693,32 @@ int sound_prepare(int sound_id, rct_sound *sound, int channels, int software) rct_sound_effect* sound_effect = sound_get_effect(sound_id); if (sound_effect) { if (sound_effect_loadvars(sound_effect, &bufferdesc.lpwfxFormat, &buffer, &bufferdesc.dwBufferBytes)) { - bufferdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STATIC; - if (channels) { - if (channels == 2) { + if (channels == 0){ + bufferdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STATIC; + } + else if (channels == 2) { bufferdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRL3D | DSBCAPS_STATIC; - } else { + } else { bufferdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLPAN | DSBCAPS_CTRLFREQUENCY | DSBCAPS_STATIC; + } + if (RCT2_GLOBAL(0x009E2B90, uint32)) { + bufferdesc.dwFlags |= DSBCAPS_CTRLPAN; + } + if (software) { + bufferdesc.dwFlags |= DSBCAPS_LOCSOFTWARE; + } + if (SUCCEEDED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->CreateSoundBuffer(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), &bufferdesc, &sound->dsbuffer, 0))) { + if (sound_fill_buffer(sound->dsbuffer, buffer, bufferdesc.dwBufferBytes)) { + sound->id = sound_id; + DSBCAPS caps; + caps.dwSize = sizeof(caps); + sound->dsbuffer->lpVtbl->GetCaps(sound->dsbuffer, &caps); + sound->has_caps = caps.dwFlags; + sound_add(sound); + return 1; } - if (RCT2_GLOBAL(0x009E2B90, uint32)) { - bufferdesc.dwFlags |= DSBCAPS_CTRLPAN; - } - if (software) { - bufferdesc.dwFlags |= DSBCAPS_LOCSOFTWARE; - } - if (SUCCEEDED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->CreateSoundBuffer(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), &bufferdesc, &sound->dsbuffer, 0))) { - if (sound_fill_buffer(sound->dsbuffer, buffer, bufferdesc.dwBufferBytes)) { - sound->id = sound_id; - DSBCAPS caps; - caps.dwSize = sizeof(caps); - sound->dsbuffer->lpVtbl->GetCaps(sound->dsbuffer, &caps); - sound->has_caps = caps.dwFlags; - sound_add(sound); - return 1; - } - sound->dsbuffer->lpVtbl->Release(sound->dsbuffer); - sound->dsbuffer = 0; - } + sound->dsbuffer->lpVtbl->Release(sound->dsbuffer); + sound->dsbuffer = 0; } sound->dsbuffer = 0; } diff --git a/src/drawing/drawing.c b/src/drawing/drawing.c index 26a57dc3ec..fdd0be4148 100644 --- a/src/drawing/drawing.c +++ b/src/drawing/drawing.c @@ -136,7 +136,7 @@ void gfx_transpose_palette(int pal, unsigned char product) rct_g1_element g1 = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[pal]; int width = g1.width; int x = g1.x_offset; - uint8* dest_pointer = (uint8*)&(RCT2_ADDRESS(0x014124680,uint8)[x]); + uint8* dest_pointer = (uint8*)&(RCT2_ADDRESS(0x01424680, uint8)[x * 4]); uint8* source_pointer = g1.offset; for (; width > 0; width--) { diff --git a/src/platform/windows.c b/src/platform/windows.c index c258dbcc77..dc6763e776 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -70,7 +70,7 @@ __declspec(dllexport) int StartOpenRCT(HINSTANCE hInstance, HINSTANCE hPrevInsta // Get command line arguments in standard form argv = CommandLineToArgvA(lpCmdLine, &argc); runGame = cmdline_run(argv, argc); - LocalFree(argv); + //LocalFree(argv); if (runGame) openrct2_launch();