version 1.5 | | version 1.6 |
---|
| | |
#include "newdemo.h" | | #include "newdemo.h" |
#include "kconfig.h" | | #include "kconfig.h" |
#include "hmpfile.h" | | #include "hmpfile.h" |
| | |
| | #include "altsound.h" |
| | |
hmp_file *hmp = NULL; | | hmp_file *hmp = NULL; |
| | |
#ifdef DIGI_SOUND | | #ifdef DIGI_SOUND |
| | |
return 0; | | return 0; |
} | | } |
| | |
/* Find the sound which actually equates to a sound number */ | | |
int digi_xlat_sound(int soundno) | | |
{ | | |
if ( soundno < 0 ) return -1; | | |
| | |
if ( digi_lomem ) { | | |
soundno = AltSounds[soundno]; | | |
if ( soundno == 255 ) return -1; | | |
} | | |
return Sounds[soundno]; | | |
} | | |
| | |
//added 2000/01/15 Matt Mueller -- remove some duplication (and fix a big memory leak, in the kill=0 one case) | | //added 2000/01/15 Matt Mueller -- remove some duplication (and fix a big memory leak, in the kill=0 one case) |
static int DS_release_slot(int slot,int kill){ | | static int DS_release_slot(int slot,int kill){ |
if (SoundSlots[slot].lpsb) { | | if (SoundSlots[slot].lpsb) { |
| | |
int slot; | | int slot; |
HRESULT hr; | | HRESULT hr; |
| | |
if (!digi_initialised) return -1; | | if (!digi_initialised) |
| | return -1; |
| | |
//added on 980905 by adb from original source to add sound kill system | | //added on 980905 by adb from original source to add sound kill system |
// play at most digi_max_channel samples, if possible kill sample with low volume | | // play at most digi_max_channel samples, if possible kill sample with low volume |
| | |
//end edit by adb | | //end edit by adb |
| | |
slot = get_free_slot(); | | slot = get_free_slot(); |
if (slot<0) return -1; | | if (slot<0) |
| | return -1; |
| | |
SoundSlots[slot].soundno = soundnum; | | SoundSlots[slot].soundno = soundnum; |
SoundSlots[slot].samples = GameSounds[soundnum].data; | | SoundSlots[slot].samples = Sounddat(soundnum)->data; |
SoundSlots[slot].length = GameSounds[soundnum].length; | | SoundSlots[slot].length = Sounddat[soundnum].length; |
SoundSlots[slot].volume = fixmul(digi_volume, volume); | | SoundSlots[slot].volume = fixmul(digi_volume, volume); |
SoundSlots[slot].pan = pan; | | SoundSlots[slot].pan = pan; |
SoundSlots[slot].position = 0; | | SoundSlots[slot].position = 0; |
| | |
| | |
memset(&waveformat, 0, sizeof(waveformat)); | | memset(&waveformat, 0, sizeof(waveformat)); |
waveformat.wFormatTag=WAVE_FORMAT_PCM; | | waveformat.wFormatTag=WAVE_FORMAT_PCM; |
waveformat.wBitsPerSample=8; | | waveformat.wBitsPerSample = Sounddat(soundnum)->bits; |
waveformat.nChannels = 1; | | waveformat.nChannels = 1; |
waveformat.nSamplesPerSec = 11025; | | waveformat.nSamplesPerSec = Sounddat(soundnum)->freq; |
waveformat.nBlockAlign = | | waveformat.nBlockAlign = |
waveformat.nChannels * (waveformat.wBitsPerSample/8); | | waveformat.nChannels * (waveformat.wBitsPerSample/8); |
waveformat.nAvgBytesPerSec = | | waveformat.nAvgBytesPerSec = |
| | |
dsbd.lpwfxFormat = &waveformat; | | dsbd.lpwfxFormat = &waveformat; |
| | |
hr = IDirectSound_CreateSoundBuffer(lpds, &dsbd, &SoundSlots[slot].lpsb, NULL); | | hr = IDirectSound_CreateSoundBuffer(lpds, &dsbd, &SoundSlots[slot].lpsb, NULL); |
if ( hr != DS_OK ) { | | if ( hr != DS_OK ) |
| | { |
printf("Createsoundbuffer failed! hr=0x%X\n", (int)hr); | | printf("Createsoundbuffer failed! hr=0x%X\n", (int)hr); |
abort(); | | abort(); |
} | | } |
| | |
{ | | { |
char *ptr1, *ptr2; | | char *ptr1, *ptr2; |
int len1, len2; | | int len1, len2; |
IDirectSoundBuffer_Lock(SoundSlots[slot].lpsb, 0, GameSounds[soundnum].length, | | |
| | IDirectSoundBuffer_Lock(SoundSlots[slot].lpsb, 0, Sounddat(soundnum)->length, |
(void **)&ptr1, &len1, (void **)&ptr2, &len2, 0); | | (void **)&ptr1, &len1, (void **)&ptr2, &len2, 0); |
memcpy(ptr1,GameSounds[soundnum].data, MIN(len1, GameSounds[soundnum].length)); | | memcpy(ptr1,Sounddat(soundnum)->data, MIN(len1, Sounddat(soundnum)->length)); |
IDirectSoundBuffer_Unlock(SoundSlots[slot].lpsb, ptr1, len1, ptr2, len2); | | IDirectSoundBuffer_Unlock(SoundSlots[slot].lpsb, ptr1, len1, ptr2, len2); |
} | | } |
| | |
IDirectSoundBuffer_SetPan(SoundSlots[slot].lpsb, ((int)(f2fl(pan) * 20000.0))-10000); | | IDirectSoundBuffer_SetPan(SoundSlots[slot].lpsb, ((int)(f2fl(pan) * 20000.0))-10000); |
// IDirectSoundBuffer_SetVolume(SoundSlots[slot].lpsb, MIN(((int)(f2fl(SoundSlots[slot].volume) * 15000.0)) - 10000, 0));//nope | | |
IDirectSoundBuffer_SetVolume(SoundSlots[slot].lpsb, D1vol2DSvol(SoundSlots[slot].volume)); | | IDirectSoundBuffer_SetVolume(SoundSlots[slot].lpsb, D1vol2DSvol(SoundSlots[slot].volume)); |
| | |
IDirectSoundBuffer_Play(SoundSlots[slot].lpsb, 0, 0, 0); | | IDirectSoundBuffer_Play(SoundSlots[slot].lpsb, 0, 0, 0); |
| | |
//added on 980905 by adb to add sound kill system from original sos digi.c | | //added on 980905 by adb to add sound kill system from original sos digi.c |
| | |
int slot; | | int slot; |
HRESULT hr; | | HRESULT hr; |
| | |
if (!digi_initialised) return -1; | | if (!digi_initialised) |
| | return -1; |
slot = get_free_slot(); | | slot = get_free_slot(); |
| | |
if (slot<0) return -1; | | if (slot<0) |
| | return -1; |
| | |
SoundSlots[slot].soundno = SoundObjects[obj].soundnum; | | SoundSlots[slot].soundno = SoundObjects[obj].soundnum; |
SoundSlots[slot].samples = GameSounds[SoundObjects[obj].soundnum].data; | | SoundSlots[slot].samples = Sounddat(SoundObjects[obj].soundnum)->data; |
SoundSlots[slot].length = GameSounds[SoundObjects[obj].soundnum].length; | | SoundSlots[slot].length = Sounddat(SoundObjects[obj].soundnum)->length; |
SoundSlots[slot].volume = fixmul(digi_volume, SoundObjects[obj].volume); | | SoundSlots[slot].volume = fixmul(digi_volume, SoundObjects[obj].volume); |
SoundSlots[slot].pan = SoundObjects[obj].pan; | | SoundSlots[slot].pan = SoundObjects[obj].pan; |
SoundSlots[slot].position = 0; | | SoundSlots[slot].position = 0; |
| | |
| | |
memset(&waveformat, 0, sizeof(waveformat)); | | memset(&waveformat, 0, sizeof(waveformat)); |
waveformat.wFormatTag=WAVE_FORMAT_PCM; | | waveformat.wFormatTag=WAVE_FORMAT_PCM; |
waveformat.wBitsPerSample=8; | | waveformat.wBitsPerSample = Sounddat(SoundObjects[obj].soundnum)->bits; |
waveformat.nChannels = 1; | | waveformat.nChannels = 1; |
waveformat.nSamplesPerSec = 11025; | | waveformat.nSamplesPerSec = Sounddat(SoundObjects[obj].soundnum)->freq; |
waveformat.nBlockAlign = | | waveformat.nBlockAlign = |
waveformat.nChannels * (waveformat.wBitsPerSample/8); | | waveformat.nChannels * (waveformat.wBitsPerSample/8); |
waveformat.nAvgBytesPerSec = | | waveformat.nAvgBytesPerSec = |
| | |
dsbd.lpwfxFormat = &waveformat; | | dsbd.lpwfxFormat = &waveformat; |
| | |
hr = IDirectSound_CreateSoundBuffer(lpds, &dsbd, &SoundSlots[slot].lpsb, NULL); | | hr = IDirectSound_CreateSoundBuffer(lpds, &dsbd, &SoundSlots[slot].lpsb, NULL); |
if ( hr != DS_OK ) { | | if ( hr != DS_OK ) |
| | { |
abort(); | | abort(); |
} | | } |
{ | | { |
| | |
IDirectSoundBuffer_Unlock(SoundSlots[slot].lpsb, (void *)ptr1, len1, (void *)ptr2, len2); | | IDirectSoundBuffer_Unlock(SoundSlots[slot].lpsb, (void *)ptr1, len1, (void *)ptr2, len2); |
} | | } |
IDirectSoundBuffer_SetPan(SoundSlots[slot].lpsb, ((int)(f2fl(SoundSlots[slot].pan) * 20000))-10000); | | IDirectSoundBuffer_SetPan(SoundSlots[slot].lpsb, ((int)(f2fl(SoundSlots[slot].pan) * 20000))-10000); |
// IDirectSoundBuffer_SetVolume(SoundSlots[slot].lpsb, MIN(((int)(f2fl(SoundSlots[slot].volume) * 15000.0)) - 10000, 0));//nope | | |
IDirectSoundBuffer_SetVolume(SoundSlots[slot].lpsb,D1vol2DSvol(SoundSlots[slot].volume)); | | IDirectSoundBuffer_SetVolume(SoundSlots[slot].lpsb,D1vol2DSvol(SoundSlots[slot].volume)); |
IDirectSoundBuffer_Play(SoundSlots[slot].lpsb, 0, 0, SoundSlots[slot].looped?DSBPLAY_LOOPING:0); | | IDirectSoundBuffer_Play(SoundSlots[slot].lpsb, 0, 0, SoundSlots[slot].looped?DSBPLAY_LOOPING:0); |
| | |
| | |
if ( Newdemo_state == ND_STATE_RECORDING ) | | if ( Newdemo_state == ND_STATE_RECORDING ) |
newdemo_record_sound( soundno ); | | newdemo_record_sound( soundno ); |
#endif | | #endif |
soundno = digi_xlat_sound(soundno); | | if (!digi_initialised) |
| | return; |
if (!digi_initialised) return; | | if (digi_xlat_sound(soundno) < 0 ) return; |
| | |
if (soundno < 0 ) return; | | |
| | |
digi_start_sound(soundno, max_volume, F0_5); | | digi_start_sound(soundno, max_volume, F0_5); |
} | | } |
| | |
if ( Newdemo_state == ND_STATE_RECORDING ) | | if ( Newdemo_state == ND_STATE_RECORDING ) |
newdemo_record_sound( soundno ); | | newdemo_record_sound( soundno ); |
#endif | | #endif |
soundno = digi_xlat_sound(soundno); | | if (!digi_initialised) |
| | return; |
if (!digi_initialised) return; | | if (digi_xlat_sound(soundno) < 0 ) |
| | return; |
if (soundno < 0 ) return; | | |
| | |
for (i=0; i < MAX_SOUND_SLOTS; i++) | | for (i=0; i < MAX_SOUND_SLOTS; i++) |
if (SoundSlots[i].soundno == soundno) { | | if (SoundSlots[i].soundno == soundno) |
| | { |
SoundSlots[i].playing = 0; | | SoundSlots[i].playing = 0; |
DS_release_slot(i,1); | | DS_release_slot(i,1); |
} | | } |
digi_start_sound(soundno, max_volume, F0_5); | | |
| | |
| | digi_start_sound(soundno, max_volume, F0_5); |
} | | } |
| | |
void digi_play_sample_3d( int soundno, int angle, int volume, int no_dups ) // Volume from 0-0x7fff | | void digi_play_sample_3d( int soundno, int angle, int volume, int no_dups ) // Volume from 0-0x7fff |
| | |
no_dups = 1; | | no_dups = 1; |
| | |
#ifdef NEWDEMO | | #ifdef NEWDEMO |
if ( Newdemo_state == ND_STATE_RECORDING ) { | | if ( Newdemo_state == ND_STATE_RECORDING ) |
| | { |
if ( no_dups ) | | if ( no_dups ) |
newdemo_record_sound_3d_once( soundno, angle, volume ); | | newdemo_record_sound_3d_once( soundno, angle, volume ); |
else | | else |
newdemo_record_sound_3d( soundno, angle, volume ); | | newdemo_record_sound_3d( soundno, angle, volume ); |
} | | } |
#endif | | #endif |
soundno = digi_xlat_sound(soundno); | | if (!digi_initialised) |
| | return; |
| | if (digi_xlat_sound(soundno) < 0 ) |
| | return; |
| | if (volume < MIN_VOLUME ) |
| | return; |
| | |
if (!digi_initialised) return; | | |
if (soundno < 0 ) return; | | |
| | |
if (volume < MIN_VOLUME ) return; | | |
digi_start_sound(soundno, volume, angle); | | digi_start_sound(soundno, volume, angle); |
} | | } |
| | |
| | |
} | | } |
} | | } |
| | |
int digi_link_sound_to_object2( int org_soundnum, short objnum, int forever, fix max_volume, fix max_distance ) | | int digi_link_sound_to_object2( int soundnum, short objnum, int forever, fix max_volume, fix max_distance ) |
{ | | { |
int i,volume,pan; | | int i,volume,pan; |
object * objp; | | object * objp; |
int soundnum; | | int soundnum; |
| | |
soundnum = digi_xlat_sound(org_soundnum); | | if ( max_volume < 0 ) |
| | return -1; |
if ( max_volume < 0 ) return -1; | | if (!digi_initialised) |
// if ( max_volume > F1_0 ) max_volume = F1_0; | | return -1; |
| | if (digi_xlat_sound(soundnum) < 0 ) |
if (!digi_initialised) return -1; | | return -1; |
if (soundnum < 0 ) return -1; | | if (Sounddat(soundnum)->data==NULL) |
if (GameSounds[soundnum].data==NULL) { | | { |
Int3(); | | Int3(); |
return -1; | | return -1; |
} | | } |
if ((objnum<0)||(objnum>Highest_object_index)) | | if ((objnum<0)||(objnum>Highest_object_index)) |
return -1; | | return -1; |
| | |
if ( !forever ) { | | if ( !forever ) |
| | { |
// Hack to keep sounds from building up... | | // Hack to keep sounds from building up... |
digi_get_sound_loc( &Viewer->orient, &Viewer->pos, Viewer->segnum, &Objects[objnum].pos, Objects[objnum].segnum, max_volume,&volume, &pan, max_distance ); | | digi_get_sound_loc( &Viewer->orient, &Viewer->pos, Viewer->segnum, &Objects[objnum].pos, Objects[objnum].segnum, max_volume,&volume, &pan, max_distance ); |
digi_play_sample_3d( org_soundnum, pan, volume, 0 ); | | digi_play_sample_3d( soundnum, pan, volume, 0 ); |
return -1; | | return -1; |
} | | } |
| | |
| | |
if (SoundObjects[i].flags==0) | | if (SoundObjects[i].flags==0) |
break; | | break; |
| | |
if (i==MAX_SOUND_OBJECTS) { | | if (i==MAX_SOUND_OBJECTS) |
| | { |
mprintf((1, "Too many sound objects!\n" )); | | mprintf((1, "Too many sound objects!\n" )); |
return -1; | | return -1; |
} | | } |
| | |
SoundObjects[i].volume = 0; | | SoundObjects[i].volume = 0; |
SoundObjects[i].pan = 0; | | SoundObjects[i].pan = 0; |
SoundObjects[i].soundnum = soundnum; | | SoundObjects[i].soundnum = soundnum; |
| | |
objp = &Objects[SoundObjects[i].lo_objnum]; | | objp = &Objects[SoundObjects[i].lo_objnum]; |
digi_get_sound_loc( &Viewer->orient, &Viewer->pos, Viewer->segnum, | | digi_get_sound_loc( &Viewer->orient, &Viewer->pos, Viewer->segnum, |
&objp->pos, objp->segnum, SoundObjects[i].max_volume, | | &objp->pos, objp->segnum, SoundObjects[i].max_volume, |
| | |
} | | } |
| | |
int digi_link_sound_to_object( int soundnum, short objnum, int forever, fix max_volume ) | | int digi_link_sound_to_object( int soundnum, short objnum, int forever, fix max_volume ) |
{ return digi_link_sound_to_object2( soundnum, objnum, forever, max_volume, 256*F1_0); } | | { |
| | return digi_link_sound_to_object2( soundnum, objnum, forever, max_volume, 256*F1_0); |
| | } |
| | |
int digi_link_sound_to_pos2( int org_soundnum, short segnum, short sidenum, vms_vector * pos, int forever, fix max_volume, fix max_distance ) | | int digi_link_sound_to_pos2( int soundnum, short segnum, short sidenum, vms_vector * pos, int forever, fix max_volume, fix max_distance ) |
{ | | { |
int i, volume, pan; | | int i, volume, pan; |
int soundnum; | | |
| | |
soundnum = digi_xlat_sound(org_soundnum); | | |
| | |
if ( max_volume < 0 ) return -1; | | |
// if ( max_volume > F1_0 ) max_volume = F1_0; | | |
| | |
if (!digi_initialised) return -1; | | if ( max_volume < 0 ) |
if (soundnum < 0 ) return -1; | | return -1; |
if (GameSounds[soundnum].data==NULL) { | | if (!digi_initialised) |
| | return -1; |
| | if (digi_sound_xlat(soundnum) < 0) |
| | return -1; |
| | if (Sounddat(soundnum)->data==NULL) |
| | { |
Int3(); | | Int3(); |
return -1; | | return -1; |
} | | } |
| | |
if ((segnum<0)||(segnum>Highest_segment_index)) | | if ((segnum<0)||(segnum>Highest_segment_index)) |
return -1; | | return -1; |
| | |
if ( !forever ) { | | if ( !forever ) |
| | { |
// Hack to keep sounds from building up... | | // Hack to keep sounds from building up... |
digi_get_sound_loc( &Viewer->orient, &Viewer->pos, Viewer->segnum, pos, segnum, max_volume, &volume, &pan, max_distance ); | | digi_get_sound_loc( &Viewer->orient, &Viewer->pos, Viewer->segnum, pos, segnum, max_volume, &volume, &pan, max_distance ); |
digi_play_sample_3d( org_soundnum, pan, volume, 0 ); | | digi_play_sample_3d( soundnum, pan, volume, 0 ); |
return -1; | | return -1; |
} | | } |
| | |
| | |
if (SoundObjects[i].flags==0) | | if (SoundObjects[i].flags==0) |
break; | | break; |
| | |
if (i==MAX_SOUND_OBJECTS) { | | if (i==MAX_SOUND_OBJECTS) |
| | { |
mprintf((1, "Too many sound objects!\n" )); | | mprintf((1, "Too many sound objects!\n" )); |
return -1; | | return -1; |
} | | } |
| | |
{ | | { |
int i,killed; | | int i,killed; |
| | |
soundnum = digi_xlat_sound(soundnum); | | if (!digi_initialised) |
| | return; |
if (!digi_initialised) return; | | |
| | |
killed = 0; | | killed = 0; |
| | |
for (i=0; i<MAX_SOUND_OBJECTS; i++ ) { | | for (i=0; i<MAX_SOUND_OBJECTS; i++ ) |
if ( (SoundObjects[i].flags & SOF_USED) && (SoundObjects[i].flags & SOF_LINK_TO_POS) ) { | | if ( (SoundObjects[i].flags & SOF_USED) && |
if ((SoundObjects[i].lp_segnum == segnum) && (SoundObjects[i].soundnum==soundnum ) && (SoundObjects[i].lp_sidenum==sidenum) ) { | | (SoundObjects[i].flags & SOF_LINK_TO_POS) && |
if ( SoundObjects[i].flags & SOF_PLAYING ) { | | (SoundObjects[i].lp_segnum == segnum) && |
| | (SoundObjects[i].soundnum==soundnum ) && |
| | (SoundObjects[i].lp_sidenum==sidenum) ) |
| | { |
| | if ( SoundObjects[i].flags & SOF_PLAYING ) |
| | { |
SoundSlots[SoundObjects[i].handle].playing = 0; | | SoundSlots[SoundObjects[i].handle].playing = 0; |
DS_release_slot(SoundObjects[i].handle,1); | | DS_release_slot(SoundObjects[i].handle,1); |
} | | } |
SoundObjects[i].flags = 0; // Mark as dead, so some other sound can use this sound | | SoundObjects[i].flags = 0; // Mark as dead, so some other sound can use this sound |
killed++; | | killed++; |
} | | } |
} | | |
} | | |
// If this assert happens, it means that there were 2 sounds | | // If this assert happens, it means that there were 2 sounds |
// that got deleted. Weird, get John. | | // that got deleted. Weird, get John. |
if ( killed > 1 ) { | | if ( killed > 1 ) |
| | { |
mprintf( (1, "ERROR: More than 1 sounds were deleted from seg %d\n", segnum )); | | mprintf( (1, "ERROR: More than 1 sounds were deleted from seg %d\n", segnum )); |
} | | } |
} | | } |