ref: 88f22510ee63b87882941b4006300fdb861d22a0
parent: aede7b6069cc6b7502d2f73f8969034df40206bc
author: Clownacy <Clownacy@users.noreply.github.com>
date: Tue Sep 10 13:57:44 EDT 2019
Fix crash when AudioBackend_Init fails Similar checks existed in the original code (see the accurate branch), but they were removed in the Organya source code release, so I figured they were useless. Turns out they're not. Fixes #48.
--- a/src/Organya.cpp
+++ b/src/Organya.cpp
@@ -141,6 +141,9 @@
unsigned char *wp_sub;
int work;
+ if (!audio_backend_initialised)
+ return FALSE;
+
for (j = 0; j < 8; j++)
{
for (k = 0; k < 2; k++)
@@ -188,6 +191,9 @@
void ChangeOrganFrequency(unsigned char key, signed char track, long a)
{
+ if (!audio_backend_initialised)
+ return;
+
for (int j = 0; j < 8; j++)
for (int i = 0; i < 2; i++)
AudioBackend_SetSoundFrequency(lpORGANBUFFER[track][j][i], ((oct_wave[j].wave_size * freq_tbl[key]) * oct_wave[j].oct_par) / 8 + (a - 1000)); // 1000を+αのデフォルト値とする (1000 is the default value for + α)
@@ -200,6 +206,9 @@
void ChangeOrganPan(unsigned char key, unsigned char pan, signed char track) // 512がMAXで256がノーマル (512 is MAX and 256 is normal)
{
+ if (!audio_backend_initialised)
+ return;
+
if (old_key[track] != PANDUMMY)
AudioBackend_SetSoundPan(lpORGANBUFFER[track][old_key[track] / 12][key_twin[track]], (pan_tbl[pan] - 0x100) * 10);
}
@@ -206,6 +215,9 @@
void ChangeOrganVolume(int no, long volume, signed char track) // 300がMAXで300がノーマル (300 is MAX and 300 is normal)
{
+ if (!audio_backend_initialised)
+ return;
+
if (old_key[track] != VOLDUMMY)
AudioBackend_SetSoundVolume(lpORGANBUFFER[track][old_key[track] / 12][key_twin[track]], (volume - 0xFF) * 8);
}
@@ -213,6 +225,9 @@
// サウンドの再生 (Play sound)
void PlayOrganObject(unsigned char key, int mode, signed char track, long freq)
{
+ if (!audio_backend_initialised)
+ return;
+
if (lpORGANBUFFER[track][key / 12][key_twin[track]] != NULL)
{
switch (mode)
@@ -272,6 +287,9 @@
// オルガーニャオブジェクトを開放 (Open Organya object)
void ReleaseOrganyaObject(signed char track)
{
+ if (!audio_backend_initialised)
+ return;
+
for (int i = 0; i < 8; i++)
{
if (lpORGANBUFFER[track][i][0] != NULL)
@@ -294,6 +312,9 @@
{
const unsigned long *lpdword; // リソースのアドレス (Resource address)
+ if (!audio_backend_initialised)
+ return FALSE;
+
// リソースの検索 (Search for resources)
lpdword = (unsigned long*)FindResource("WAVE100", "WAVE", NULL);
@@ -308,6 +329,9 @@
// 波形を100個の中から選択して作成 (Select from 100 waveforms to create)
BOOL MakeOrganyaWave(signed char track, signed char wave_no, signed char pipi)
{
+ if (!audio_backend_initialised)
+ return FALSE;
+
if (wave_no > 99)
return FALSE;
@@ -323,16 +347,25 @@
void ChangeDramFrequency(unsigned char key, signed char track)
{
+ if (!audio_backend_initialised)
+ return;
+
AudioBackend_SetSoundFrequency(lpSECONDARYBUFFER[150 + track], key * 800 + 100);
}
void ChangeDramPan(unsigned char pan, signed char track)
{
+ if (!audio_backend_initialised)
+ return;
+
AudioBackend_SetSoundPan(lpSECONDARYBUFFER[150 + track], (pan_tbl[pan] - 0x100) * 10);
}
void ChangeDramVolume(long volume, signed char track)
{
+ if (!audio_backend_initialised)
+ return;
+
AudioBackend_SetSoundVolume(lpSECONDARYBUFFER[150 + track], (volume - 0xFF) * 8);
}
@@ -339,6 +372,9 @@
// サウンドの再生 (Play sound)
void PlayDramObject(unsigned char key, int mode, signed char track)
{
+ if (!audio_backend_initialised)
+ return;
+
if (lpSECONDARYBUFFER[150 + track] != NULL)
{
switch (mode)
@@ -742,6 +778,9 @@
// Start and end organya
BOOL StartOrganya(const char *path_wave) // The argument is ignored for some reason
{
+ if (!audio_backend_initialised)
+ return FALSE;
+
if (!InitWaveData100())
return FALSE;
@@ -753,6 +792,9 @@
// Load organya file
BOOL LoadOrganya(const char *name)
{
+ if (!audio_backend_initialised)
+ return FALSE;
+
if (!org_data.InitMusicData(name))
return FALSE;
@@ -768,6 +810,9 @@
void SetOrganyaPosition(unsigned int x)
{
+ if (!audio_backend_initialised)
+ return;
+
org_data.SetPlayPointer(x);
gOrgVolume = 100;
bFadeout = FALSE;
@@ -775,16 +820,25 @@
unsigned int GetOrganyaPosition(void)
{
+ if (!audio_backend_initialised)
+ return 0 ;
+
return play_p;
}
void PlayOrganyaMusic(void)
{
+ if (!audio_backend_initialised)
+ return;
+
organya_timer = org_data.info.wait;
}
BOOL ChangeOrganyaVolume(signed int volume)
{
+ if (!audio_backend_initialised)
+ return FALSE;
+
if (volume < 0 || volume > 100)
return FALSE;
@@ -794,6 +848,9 @@
void StopOrganyaMusic()
{
+ if (!audio_backend_initialised)
+ return;
+
organya_timer = 0;
// Stop notes
@@ -814,6 +871,9 @@
void EndOrganya()
{
+ if (!audio_backend_initialised)
+ return;
+
organya_timer = 0;
// Release everything related to org
--- a/src/Sound.cpp
+++ b/src/Sound.cpp
@@ -24,6 +24,7 @@
#include "PixTone.h"
#include "Tags.h"
+BOOL audio_backend_initialised;
AudioBackend_Sound *lpSECONDARYBUFFER[SE_MAX];
// DirectSoundの開始 (Starting DirectSound)
@@ -31,8 +32,16 @@
{
int i;
- if (!AudioBackend_Init())
+ audio_backend_initialised = AudioBackend_Init();
+
+ if (!audio_backend_initialised)
+ {
+#ifndef FIX_BUGS
+ // This makes absolutely no sense here
+ StartOrganya("Org/Wave.dat");
+#endif
return FALSE;
+ }
for (i = 0; i < SE_MAX; i++)
lpSECONDARYBUFFER[i] = NULL;
@@ -47,6 +56,9 @@
{
int i;
+ if (!audio_backend_initialised)
+ return;
+
EndOrganya();
for (i = 0; i < SE_MAX; i++)
@@ -190,6 +202,9 @@
*/
void PlaySoundObject(int no, int mode)
{
+ if (!audio_backend_initialised)
+ return;
+
if (lpSECONDARYBUFFER[no] != NULL)
{
switch (mode)
@@ -213,16 +228,25 @@
void ChangeSoundFrequency(int no, unsigned long rate) // 100がMIN9999がMAXで2195?がノーマル (100 is MIN, 9999 is MAX, and 2195 is normal)
{
+ if (!audio_backend_initialised)
+ return;
+
AudioBackend_SetSoundFrequency(lpSECONDARYBUFFER[no], (rate * 10) + 100);
}
void ChangeSoundVolume(int no, long volume) // 300がMAXで300がノーマル (300 is MAX and 300 is normal)
{
+ if (!audio_backend_initialised)
+ return;
+
AudioBackend_SetSoundVolume(lpSECONDARYBUFFER[no], (volume - 300) * 8);
}
void ChangeSoundPan(int no, long pan) // 512がMAXで256がノーマル (512 is MAX and 256 is normal)
{
+ if (!audio_backend_initialised)
+ return;
+
AudioBackend_SetSoundPan(lpSECONDARYBUFFER[no], (pan - 256) * 10);
}
@@ -235,6 +259,9 @@
int sample_count;
unsigned char *pcm_buffer;
unsigned char *mixed_pcm_buffer;
+
+ if (!audio_backend_initialised)
+ return 0;
ptp_pointer = ptp;
sample_count = 0;
--- a/src/Sound.h
+++ b/src/Sound.h
@@ -9,6 +9,7 @@
#define SE_MAX 160 // According to the Organya source code release, this is the real name for this constant
+extern BOOL audio_backend_initialised;
extern AudioBackend_Sound *lpSECONDARYBUFFER[SE_MAX];
BOOL InitDirectSound(void);
--
⑨