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.
This commit is contained in:
Clownacy 2019-09-10 17:57:44 +00:00
parent aede7b6069
commit 88f22510ee
3 changed files with 89 additions and 1 deletions

View file

@ -141,6 +141,9 @@ BOOL MakeSoundObject8(signed char *wavep, signed char track, signed char pipi)
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 @@ static const short freq_tbl[12] = {262, 277, 294, 311, 330, 349, 370, 392, 415,
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,12 +206,18 @@ unsigned char key_twin[MAXTRACK]; // 今使っているキー(連続時のノイ
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);
}
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 @@ void ChangeOrganVolume(int no, long volume, signed char track) // 300がMAXで30
// サウンドの再生 (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 @@ void PlayOrganObject(unsigned char key, int mode, signed char track, long freq)
// オルガーニャオブジェクトを開放 (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 @@ BOOL InitWaveData100(void)
{
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 @@ BOOL InitWaveData100(void)
// 波形を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,22 +347,34 @@ BOOL MakeOrganyaWave(signed char track, signed char wave_no, signed char pipi)
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);
}
// サウンドの再生 (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 @@ void OrgData::SetPlayPointer(long x)
// 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 @@ BOOL StartOrganya(const char *path_wave) // The argument is ignored for some rea
// 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 @@ BOOL LoadOrganya(const char *name)
void SetOrganyaPosition(unsigned int x)
{
if (!audio_backend_initialised)
return;
org_data.SetPlayPointer(x);
gOrgVolume = 100;
bFadeout = FALSE;
@ -775,16 +820,25 @@ void SetOrganyaPosition(unsigned int x)
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 @@ BOOL ChangeOrganyaVolume(signed int volume)
void StopOrganyaMusic()
{
if (!audio_backend_initialised)
return;
organya_timer = 0;
// Stop notes
@ -814,6 +871,9 @@ void SetOrganyaFadeout()
void EndOrganya()
{
if (!audio_backend_initialised)
return;
organya_timer = 0;
// Release everything related to org

View file

@ -24,6 +24,7 @@ equivalents.
#include "PixTone.h"
#include "Tags.h"
BOOL audio_backend_initialised;
AudioBackend_Sound *lpSECONDARYBUFFER[SE_MAX];
// DirectSoundの開始 (Starting DirectSound)
@ -31,8 +32,16 @@ BOOL InitDirectSound(void)
{
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 @@ void EndDirectSound(void)
{
int i;
if (!audio_backend_initialised)
return;
EndOrganya();
for (i = 0; i < SE_MAX; i++)
@ -190,6 +202,9 @@ BOOL LoadSoundObject(LPCSTR file_name, int no)
*/
void PlaySoundObject(int no, int mode)
{
if (!audio_backend_initialised)
return;
if (lpSECONDARYBUFFER[no] != NULL)
{
switch (mode)
@ -213,16 +228,25 @@ void PlaySoundObject(int no, int mode)
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);
}
@ -236,6 +260,9 @@ int MakePixToneObject(const PIXTONEPARAMETER *ptp, int ptp_num, int no)
unsigned char *pcm_buffer;
unsigned char *mixed_pcm_buffer;
if (!audio_backend_initialised)
return 0;
ptp_pointer = ptp;
sample_count = 0;

View file

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