X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fsound.cpp;fp=src%2Fsound.cpp;h=3be768305629b37a3d8e8d7d8ff38e67ede1297d;hb=009359ef732411d9d978d137f1371647abc97261;hp=744eafaca7df547f422fbb06b38e8dace7763b5a;hpb=be67039a7ed493081dd1503f94cdfae4dd4d965e;p=thunder diff --git a/src/sound.cpp b/src/sound.cpp index 744eafa..3be7683 100644 --- a/src/sound.cpp +++ b/src/sound.cpp @@ -13,9 +13,13 @@ #include "sound.h" #include +#include "psg.h" #include "resource.h" #include "ym2151.h" + +#define SAMPLE_RATE 48000 + // Function prototypes void SoundFunc(void *, Uint8 *, int); @@ -23,24 +27,24 @@ void SoundFunc(void *, Uint8 *, int); extern uint8_t voice_rom[]; // PCM data pointer static bool soundInitialized = false; -const float sampleBase = 44010.0/6000.0; // Btwn 5512.5 and 6000 +const float sampleBase = (float)SAMPLE_RATE/6000.0; // Voice is between 5512.5 and 6000 Hz bool snd_go = false; -bool chan1_go = false, chan2_go = false, chan3_go = false; -bool chan4_go = false, chan5_go = false, chan6_go = false; -uint8_t * sndp1, * sndp2, * sndp3, * sndp4, * sndp5, * sndp6; +bool chan1_go = false, chan2_go = false;//, chan3_go = false; +bool /*chan4_go = false, chan5_go = false,*/ chan6_go = false; +uint8_t * sndp1, * sndp2, /* sndp3, * sndp4, * sndp5,*/ * sndp6; uint32_t rom_pos, end_pos; uint32_t spos1, end_pos1; uint32_t spos2, end_pos2; -uint32_t spos3, end_pos3; -uint32_t spos4, end_pos4; -uint32_t spos5, end_pos5; +//uint32_t spos3, end_pos3; +//uint32_t spos4, end_pos4; +//uint32_t spos5, end_pos5; uint32_t spos6, end_pos6; float sample1; -uint8_t prevSamp1; -int8_t delta_x1; +int16_t prevSamp1; +//int8_t delta_x1; float sample2; -uint8_t prevSamp2; -int8_t delta_x2; +int16_t prevSamp2; +//int8_t delta_x2; uint16_t snd_num; uint8_t * snd_array[3] = { sunknown, scya, scamera }; // From RESOURCE.H uint32_t snd_lens[3] = { sunknownlen, scyalen, scameralen }; @@ -50,14 +54,16 @@ void InitSound(void) { // params 1, 4 & 5 are useless // if (YMInit(1, 3579580, 22050, 16, 512))//, (SAMPLE **)sbp)) - if (YMInit(1, 3579580, 44100, 16, 512)) + if (YMInit(1, 3579580, SAMPLE_RATE, 16, 512)) { printf("SOUND: Could not init YM2151 emulator!\n"); return;// -1; } + InitPSG(SAMPLE_RATE); + SDL_AudioSpec desired, obtained; - desired.freq = 44100; + desired.freq = SAMPLE_RATE; desired.format = AUDIO_S16; desired.channels = 1; desired.samples = 1024; @@ -81,10 +87,10 @@ void SpawnSound(int type, int snd, int channel/* = 0*/) { extern uint32_t psg_lens[16]; extern uint8_t * psg_adrs[16]; - extern uint32_t voc_lens[32]; - extern uint8_t * voc_adrs[32]; - extern uint32_t fm_lens[14]; - extern uint8_t * fm_adrs[14]; +// extern uint32_t voc_lens[32]; +// extern uint8_t * voc_adrs[32]; +// extern uint32_t fm_lens[14]; +// extern uint8_t * fm_adrs[14]; if (!soundInitialized) return; @@ -92,6 +98,7 @@ void SpawnSound(int type, int snd, int channel/* = 0*/) snd_num = snd; // SpawnMsg(MSHOWNUMS); + // Voice type sounds... if (type == GAMESOUND) { // Will that do it??? Yes!!! @@ -131,6 +138,7 @@ void SpawnSound(int type, int snd, int channel/* = 0*/) chan2_go = true; } } +#if 0 else if (type == PSGSOUND) { if (snd_num & 0x10) // Second channel? @@ -154,6 +162,7 @@ void SpawnSound(int type, int snd, int channel/* = 0*/) chan4_go = false; // No sound loaded, so don't do it! } } +#endif #if 0 else if (type == FMSOUND) { @@ -176,25 +185,22 @@ void SpawnSound(int type, int snd, int channel/* = 0*/) } -void SoundFunc(void * userdata, Uint8 * buff, int num) +void SoundFunc(void * userdata, Uint8 * buffer, int num) { static bool psg1go = false, psg2go = false; // Length / 2 is because it's set up for 16-bit samples // YM2151UpdateOne(buffer, length / 2); // Have to go into ym2151.cpp and change this manually back to 8 bit - YM2151UpdateOne(buff, num / 2); + YM2151UpdateOne(buffer, num / 2); // return; + UpdatePSG(buffer, num / 2); // 0-22 different sounds... - uint16_t cnt = 0, sample; + uint16_t cnt = 0;//, sample; uint8_t start_samp1, end_samp1, start_samp2, end_samp2; - uint8_t samp1 = 128, samp2 = 128, samp3 = 128, - samp4 = 128, samp5 = 128, samp6 = 128; // Zero samples... + int16_t samp1 = 0, samp2 = 0, samp6 = 0; // Zero samples... - // Kill sound... -// memset(buff, 128, num); - - if (!(chan1_go || chan2_go || chan3_go || chan4_go /*|| chan5_go*/ || chan6_go)) + if (!(chan1_go || chan2_go /*|| chan3_go || chan4_go || chan5_go*/ || chan6_go)) return; while (cnt != (num / 2)) @@ -203,16 +209,17 @@ void SoundFunc(void * userdata, Uint8 * buff, int num) { if (sample1 < 1) { - samp1 = voice_rom[spos1++]; + uint8_t voiceSample = voice_rom[spos1++]; + samp1 = ((int16_t)voiceSample - 128) * 160; // Kill channel 1 if done... - if (samp1 == 0xFF) + if (voiceSample == 0xFF) { chan1_go = false; - samp1 = 128; + samp1 = 0; } // RLE compression... - else if (samp1 == 0x00) + else if (voiceSample == 0x00) { // # of repeats sample1 += (float)voice_rom[spos1++] * sampleBase; @@ -235,14 +242,16 @@ void SoundFunc(void * userdata, Uint8 * buff, int num) { if (sample2 < 1) { - samp2 = voice_rom[spos2++]; + uint8_t voiceSample = voice_rom[spos2++]; + samp2 = ((int16_t)voiceSample - 128) * 160; +// samp2 = voice_rom[spos2++]; - if (samp2 == 0xFF) + if (voiceSample == 0xFF) { chan2_go = false; samp2 = 128; // Kill channel 2 if done... } - else if (samp2 == 0x00) // RLE compression... + else if (voiceSample == 0x00) // RLE compression... { sample2 += (float)voice_rom[spos2++] * sampleBase; // # of repeats samp2 = prevSamp2; @@ -257,30 +266,31 @@ void SoundFunc(void * userdata, Uint8 * buff, int num) sample2 -= 1.0; } +#if 0 if (chan3_go) { - samp3 = (psg1go ? sndp3[spos3++] : sndp3[spos3]); + samp3 = ((psg1go ? sndp3[spos3++] : sndp3[spos3]) - 128) * 160; psg1go = !psg1go; if (spos3 == end_pos3) { chan3_go = false; - samp3 = 128; // Kill channel 3 if done... + samp3 = 0; // Kill channel 3 if done... } } if (chan4_go) { - samp4 = (psg2go ? sndp4[spos4++] : sndp4[spos4]); + samp4 = ((psg2go ? sndp4[spos4++] : sndp4[spos4]) - 128) * 160; psg2go = !psg2go; if (spos4 == end_pos4) { chan4_go = false; - samp4 = 128; // Kill channel 4 if done... + samp4 = 0; // Kill channel 4 if done... } } -#if 0 + if (chan5_go) { samp5 = sndp5[spos5++]; @@ -299,20 +309,25 @@ void SoundFunc(void * userdata, Uint8 * buff, int num) if (spos6 == end_pos6) { chan6_go = false; - samp6 = 128; // Kill channel 6... + samp6 = 0; // Kill channel 6... } } // Mix 'em... // sample = samp1 + samp2 + samp3 + samp4 + samp5 + samp6 - 640; - sample = samp1 + samp2 + samp3 + samp4 + samp6 - (5 * 128); + int32_t sample = samp1 + samp2 + samp6; + sample += ((int16_t *)buffer)[cnt]; // If it overflowed, clip it - if (sample & 0xFF00) +// if (sample & 0xFFFF0000) // sample = (sample & 0x8000 ? 0x00 : 0xFF); - sample = (sample & 0x8000 ? 0x0000 : 0xFFFF); +// sample = (sample & 0x80000000 ? 0x0000 : 0xFFFF); + if (sample > 32767) + sample = 32767; + else if (sample < -32767) + sample = -32767; - ((uint16_t *)buff)[cnt++] += sample << 7; + ((int16_t *)buffer)[cnt++] = (int16_t)sample; } }