shithub: cstory

Download patch

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);
--