|
|
1.1 root 1: #define SND_CALLER
2: #define GAME
3: #include <malloc.h>
4: #include "sos.h"
5: #include "sosm.h"
6: #include "icorp.h"
7: #include <memcheck.h>
8:
9: int readfile(int, char *, long);
10: #pragma aux readfile =\
11: "mov ah,0x3f",\
12: "int 0x21",\
13: parm [ebx] [edx] [ecx]\
14: modify [eax];
15:
16:
17: int flag = 0;
18:
19: extern int displaytime;
20:
21: //JSA SPOOGE
22: extern int musiclevel;
23: extern int digilevel;
24: extern int loopinstuff;
25: extern int enchantedsoundhandle;
26:
27: // local data for hmi INI
28: static PSTR szHexNumbers = "0123456789ABCDEF";
29: static WORD wMultiplier[] = {1, 16, 256, 4096, 65536, 1048576, 16777216, 268435456};
30: // local function prototypes
31: WORD hmiINIHex2Decimal(PSTR szHexValue);
32: WORD hmiINIGetHexIndex(BYTE bValue);
33:
34: //TEMP!!
35: volatile unsigned joetime;
36:
37: //krapo
38:
39: #define NUMLEVELS 17
40: #define SONGSPERLEVEL 4
41:
42: typedef struct {
43: HANDLE hMIDISong; // if != -1 then the file is playing
44: long offset;
45: long cache_ptr;
46: long cache_length;
47: char cache_lock;
48: } songbuffertype;
49: songbuffertype sngbuf[NUMLEVELS][SONGSPERLEVEL];
50: songbuffertype *sngbufptr[NUMLEVELS][SONGSPERLEVEL];
51:
52: _SOS_MIDI_INIT_SONG hmiSongStructs[SONGSPERLEVEL];
53:
54: extern int mapon;
55:
56: int oldsong = 0;
57:
58: //****************
59: // CODE STARTS *
60: //****************
61:
62:
63: //
64: // Temporary method for storing a song in memory.
65:
66: //mark
67:
68: BOOL
69: loadlevelsongs(int which)
70: {
71: int i,
72: bytesread = 0;
73:
74: if (!MusicMode)
75: return (0);
76:
77: for (i = 0; i < SONGSPERLEVEL; i++) {
78: // set lock and try to allocate cache
79: sngbufptr[which][i]->cache_lock = 200;
80: allocache(&(sngbufptr[which][i]->cache_ptr), sngbufptr[which][i]->cache_length, &(sngbufptr[which][i]->cache_lock));
81:
82: #if USINGALLOCATEPERMANENTTILE
83: sngbufptr[which][i]->cache_ptr = (void *) malloc(sngbufptr[which][i]->cache_length);
84: if (sngbufptr[which][i]->cache_ptr == _NULL)
85: #endif
86: if (sngbufptr[which][i]->cache_ptr == 0L) {
87: sngbufptr[which][i]->cache_lock = 0x00;
88: return (0);
89: }
90:
91: // read data from file
92: lseek(hSongFile, sngbufptr[which][i]->offset, SEEK_SET);
93: bytesread = read(hSongFile, (void *) sngbufptr[which][i]->cache_ptr, sngbufptr[which][i]->cache_length);
94: if (bytesread != sngbufptr[which][i]->cache_length) {
95: sngbufptr[which][i]->cache_ptr = 0L;
96: sngbufptr[which][i]->cache_lock = 0x00;
97: return (0);
98: }
99:
100: // reset song structure
101: // memset( hmiSongStructs[i], 0, sizeof( _SOS_MIDI_INIT_SONG ) );
102:
103: // set up song structure
104: hmiSongStructs[i].lpSongData = (LPSTR) sngbufptr[which][i]->cache_ptr;
105: if (sosMIDIInitSong(&(hmiSongStructs[i]), &sSOSTrackMap[i], &(sngbufptr[which][i]->hMIDISong))) {
106: // return error "startsong() : sosMIDIInitSong failed!"
107: return (0);
108: }
109: hmiSongStructs[i].lpSongCallback = sosMIDISongCallback;
110: }
111:
112: oldsong = which;
113:
114: return (1);
115: }
116:
117:
118: VOID
119: _far sosMIDISongCallback(WORD hSong)
120: {
121: int i;
122:
123: if (attacktheme) {
124: for (i = 0; i < SONGSPERLEVEL; i++) {
125: if (hSong == sngbufptr[oldsong][i]->hMIDISong) {
126: sosMIDIResetSong(sngbufptr[oldsong][i]->hMIDISong, &hmiSongStructs[i]);
127: }
128: }
129: startsong(rand() % 2);
130: attacktheme = 0;
131: }
132:
133: }
134:
135:
136: BOOL
137: startsong(WORD which)
138: {
139: int i;
140:
141: if (!MusicMode)
142: return (0);
143:
144: // check to see if songs are playing and stop/fade if necessary
145: for (i = 0; i < SONGSPERLEVEL; i++) {
146: if (!sosMIDISongDone(sngbufptr[oldsong][i]->hMIDISong)) {
147: sosMIDIStopSong(sngbufptr[oldsong][i]->hMIDISong);
148: // sosMIDIUnInitSong(sngbufptr[oldsong][i]->hMIDISong);
149: // sngbufptr[oldsong][i]->hMIDISong=-1;
150: }
151: }
152:
153:
154: if ((wError = sosMIDIStartSong(sngbufptr[oldsong][which]->hMIDISong))) {
155: // return error "startsong() : sosMIDIStartSong failed!"
156: return (0);
157: }
158: // sprintf(displaybuf,"playing song %d", which);
159: // displaytime=250;
160:
161: if (which < 2)
162: attacktheme = 0;
163:
164: return (1);
165: }
166: //krapo
167:
168: void
169: dolevelmusic(int which)
170: {
171: int i,
172: temp;
173:
174: if (!MusicMode)
175: return;
176:
177: if (which < 0 || which > NUMLEVELS-1) {
178: which=0;
179: }
180:
181: // check to see if songs are playing and stop/fade if necessary
182: for (i = 0; i < SONGSPERLEVEL; i++) {
183: if (!sosMIDISongDone(sngbufptr[oldsong][i]->hMIDISong)) {
184: sosMIDIStopSong(sngbufptr[oldsong][i]->hMIDISong);
185: // sosMIDIUnInitSong(sngbufptr[oldsong][i]->hMIDISong);
186: // sngbufptr[oldsong][i]->hMIDISong=-1;
187: }
188: if (which != 16)
189: sosMIDIUnInitSong(sngbufptr[oldsong][i]->hMIDISong);
190: sngbufptr[oldsong][i]->hMIDISong = -1;
191: sngbufptr[oldsong][i]->cache_lock = 0;
192: }
193:
194: loadlevelsongs(which);
195: startsong(0);
196: }
197:
198:
199: VOID
200: SND_MenuMusic(void)
201: {
202: // 15 levels the sixteenth set is the menu song!
203: dolevelmusic(NUMLEVELS - 1);
204: }
205:
206:
207: //
208: // INTERNAL ROUTINES
209: //
210:
211: //////////////////////////////////////////////////////////////////////////////
212: // //
213: // SND_InitSOSTimer() : Registers the timerevent() function to be //
214: // called by SOS. //
215: // //
216: //////////////////////////////////////////////////////////////////////////////
217: VOID
218: SND_InitSOSTimer(VOID)
219: {
220: if ((wError = sosTIMERRegisterEvent(120, (VOID(far *)) timerevent, &hTimerT_ClockHandle))) {
221: sosTIMERUnInitSystem(0);
222: sosDIGIUnInitSystem();
223: crash("TIMER FAILURE!");
224: }
225: }
226:
227: //////////////////////////////////////////////////////////////////////////////
228: // //
229: // timerevent() : Handles timer functions originally in game.c //
230: // //
231: //////////////////////////////////////////////////////////////////////////////
232: VOID
233: _far _loadds timerevent(VOID)
234: {
235: joetime++;
236: totalclock++;
237: keytimerstuff();
238:
239:
240: }
241:
242:
243: //////////////////////////////////////////////////////////////////////////////
244: // //
245: // sosDIGISampleCallback(WORD,WORD,WORD) : Call back routine from SOS //
246: // Digi functions. wCallSource indicates which process is complete //
247: // hSample is the particular sample handle. //
248: // //
249: //////////////////////////////////////////////////////////////////////////////
250: VOID
251: _far cdecl sosDIGISampleCallback(WORD wDriverHandle, WORD wCallSource, WORD hSample)
252: {
253: //
254: // recording driver will also use this callback for future!
255: // will have to switch wDriverHandle as well...
256: //
257:
258: switch (wCallSource) {
259: case _SAMPLE_DONE:
260: for (wIndex = 0; wIndex < MAX_ACTIVE_SAMPLES; wIndex++)
261: if (hSample == SampleRay[wIndex].SOSHandle)
262: break;
263: sSOSSampleData[wIndex].wLoopCount = 0;
264: sSOSSampleData[wIndex].dwSampleSize = 0;
265: SampleRay[wIndex].SOSHandle = -1;
266: SampleRay[wIndex].playing = 0;
267: SampleRay[wIndex].priority = 0;
268: SampleRay[wIndex].number = -1;
269: break;
270:
271: }
272:
273: }
274:
275:
276:
277:
278: VOID
279: SND_SetupTables(VOID)
280: {
281: int i,
282: j,
283: listindex = 0;
284:
285:
286: if (SoundMode) {
287: hSoundFile = open("JOESND", O_RDONLY | O_BINARY);
288: if (hSoundFile == -1) {
289: crash("COULDN'T OPEN JOESND!");
290: }
291: DigiList = malloc(0x1000);
292: if (DigiList == NULL) {
293: crash("malloc failed for DigiList");
294: }
295: lseek(hSoundFile, -4096L, SEEK_END);
296: readfile(hSoundFile, (void *) FP_OFF(DigiList), 4096);
297: }
298:
299: if (MusicMode) {
300: if (sMIDIHardware.wPort == 0x388) {
301: hSongFile = open("F_SONGS", O_RDONLY | O_BINARY);
302: }
303: else {
304: hSongFile = open("W_SONGS", O_RDONLY | O_BINARY);
305: }
306:
307: if (hSongFile == -1) {
308: crash("COULDN'T OPEN SONGS!");
309: }
310: SongList = malloc(0x1000);
311: if (SongList == NULL) {
312: crash("malloc failed for SongList");
313: }
314: lseek(hSongFile, -4096L, SEEK_END);
315: readfile(hSongFile, (void *) FP_OFF(SongList), 4096);
316: }
317:
318: // setup offset and length of all songs
319: for (i = 0; i < NUMLEVELS; i++) {
320: for (j = 0; j < SONGSPERLEVEL; j++) {
321: sngbufptr[i][j] = &sngbuf[i][j];
322: sngbufptr[i][j]->hMIDISong = -1;
323: sngbufptr[i][j]->offset = (SongList[listindex * 3] * 4096L);
324: sngbufptr[i][j]->cache_ptr = 0L;
325: sngbufptr[i][j]->cache_length = (WORD) (SongList[listindex * 3 + 1]);
326: sngbufptr[i][j]->cache_lock = 0x00;
327: listindex++;
328: }
329: }
330:
331:
332: return;
333: }
334:
335:
336:
337: //////////////////////////////////////////////////////////////////////////////
338: // //
339: // SND_LoadMidiIns(void) : Read melodic and percussive banks into mem. //
340: // Conditional : GENERAL MIDI and WAVE synths don't need patches //
341: // //
342: //////////////////////////////////////////////////////////////////////////////
343: void
344: SND_LoadMidiIns(void)
345: {
346: static WORD wLength;
347:
348: //JSA_DEMO check port address to verify FM device
349:
350: if ((MusicMode == _STANDARD_MUSIC || MusicMode == _DIG_MIDI_MUSIC) &&
351: sMIDIHardware.wPort == 0x388) {
352: // (wMIDIDeviceID != _MIDI_MPU_401 && wMIDIDeviceID != _MIDI_MT_32
353: // && wMIDIDeviceID!=_MIDI_AWE32) ) {
354: hMiscHandle = open("melodic.bnk", O_RDONLY);
355: if (hMiscHandle == -1)
356: crash("MELODIC BANK FILE FAILED!");
357: m_bnkptr = malloc(0x152c);
358: if (m_bnkptr == NULL) {
359: crash("malloc failed for m_bnkptr");
360: }
361: read(hMiscHandle, (void *) FP_OFF(m_bnkptr), 0x152c);
362: close(hMiscHandle);
363: if ((wError = sosMIDISetInsData(hSOSDriverHandles[MIDI], m_bnkptr, 0x00)))
364: crash("BAD SetInsData MEL!");
365:
366: hMiscHandle = open("drum.bnk", O_RDONLY);
367: if (hMiscHandle == -1)
368: crash("PERCUSSIVE BANK FILE FAILED!");
369: d_bnkptr = malloc(0x152c);
370: if (d_bnkptr == NULL) {
371: crash("malloc failed for d_bnkptr");
372: }
373: read(hMiscHandle, (void *) FP_OFF(d_bnkptr), 0x152c);
374: close(hMiscHandle);
375: if ((wError = sosMIDISetInsData(hSOSDriverHandles[MIDI], d_bnkptr, 0x00)))
376: printf("BAD SetInsData DRUM!");
377: }
378:
379: if (MusicMode == _DIG_MIDI_MUSIC) {
380: hMiscHandle = open("test.dig", O_RDONLY);
381: if (hMiscHandle == -1)
382: crash("DIGI_MIDI FILE FAILED!");
383: wLength = lseek(hMiscHandle, 0L, SEEK_END);
384: lseek(hMiscHandle, 0L, SEEK_SET);
385: digi_bnkptr = malloc(wLength);
386: if (digi_bnkptr == NULL) {
387: crash("malloc failed for digi_bnkptr");
388: }
389: read(hMiscHandle, (void *) FP_OFF(digi_bnkptr), wLength);
390: close(hMiscHandle);
391: if ((wError = sosMIDISetInsData(hSOSDriverHandles[DIG_MIDI], digi_bnkptr, 0x00)))
392: crash("BAD SetInsData digmidi!");
393: }
394: }
395:
396: //
397: // PUBLIC ROUTINES
398: //
399:
400:
401:
402: VOID
403: SND_DoBuffers(void)
404: {
405:
406:
407: for (wIndex = 0; wIndex < MAX_ACTIVE_SAMPLES; wIndex++) {
408: sSOSSampleData[wIndex].lpSamplePtr = (LPSTR) malloc((long) 55000);
409: if (sSOSSampleData[wIndex].lpSamplePtr == _NULL)
410: crash("Could Not get a Sound Buffer!!");
411: }
412:
413: }
414:
415: VOID
416: SND_UnDoBuffers(void)
417: {
418:
419: for (wIndex = 0; wIndex < MAX_ACTIVE_SAMPLES; wIndex++) {
420: if (sSOSSampleData[wIndex].lpSamplePtr != NULL)
421: free((void *) FP_OFF(sSOSSampleData[wIndex].lpSamplePtr));
422: }
423:
424: }
425:
426:
427: //////////////////////////////////////////////////////////////////////////////
428: // //
429: // SND_Startup() : Initialize all SOS Drivers and start timer //
430: // service. //
431: // //
432: //////////////////////////////////////////////////////////////////////////////
433:
434: extern
435: _SOS_HARDWARE sDIGISettings;
436: extern
437: _SOS_MIDI_HARDWARE sMIDISettings;
438: extern
439: WORD wDIGIDevice,
440: wMIDIDevice;
441:
442: VOID
443: SND_Startup(VOID)
444: {
445:
446: if (SD_Started)
447: return;
448:
449: wDIGIDeviceID = wDIGIDevice;
450: wMIDIDeviceID = wMIDIDevice;
451: memmove(&sDIGIHardware, &sDIGISettings, sizeof(sDIGIHardware));
452: memmove(&sMIDIHardware, &sMIDISettings, sizeof(sMIDIHardware));
453:
454: //GET Volume values
455: wMIDIVol = (musiclevel << 3);
456: wDIGIVol = (digilevel << 11);
457:
458:
459: //TIMERSYSTEM
460:
461: wError = sosTIMERInitSystem(_TIMER_DOS_RATE, _SOS_DEBUG_NORMAL);
462: if (wError != _ERR_NO_ERROR)
463: crash("Problem with Timer SysInit!");
464:
465: SND_InitSOSTimer();
466:
467: hSOSDriverHandles[DIGI] = -1;
468: hSOSDriverHandles[MIDI] = -1;
469:
470: if (wDIGIDeviceID == 0xffffffff)
471: SoundMode = _OFF;
472: if (wMIDIDeviceID == 0xffffffff)
473: MusicMode = _OFF;
474:
475: //DIGISYSTEM
476:
477: if (SoundMode == _ON) { // && wDIGIDeviceID!=0xffffffff) {
478: wError = sosDIGIInitSystem(_NULL, _SOS_DEBUG_NORMAL);
479: if (wError != _ERR_NO_ERROR)
480: crash("Error on Digi SysInit!");
481: }
482:
483: //MIDISYSTEM
484: if (MusicMode == _STANDARD_MUSIC) {
485: if (wError = sosMIDIInitSystem(_NULL, _SOS_DEBUG_NORMAL)) {
486: sosTIMERUnInitSystem(0);
487: sosDIGIUnInitSystem();
488: crash("Could not Init Midi System!");
489: }
490: }
491:
492: //MIDIDRIVER
493: if (MusicMode == _STANDARD_MUSIC) {
494: sSOSMIDIInitDriver.lpDriverMemory = _NULL;
495:
496: if ((wError = sosMIDIInitDriver(wMIDIDeviceID, &sMIDIHardware,
497: &sSOSMIDIInitDriver, &hSOSDriverHandles[MIDI]))) {
498: sosMIDIUnInitSystem();
499: sosDIGIUnInitSystem();
500: sosTIMERUnInitSystem(0);
501: crash("Could not Init Midi Driver!\n");
502: }
503:
504: SND_LoadMidiIns();
505: sosMIDIEnableChannelStealing(_FALSE);
506: for (wIndex = 0; wIndex < MAX_ACTIVE_SONGS; wIndex++)
507: hSOSSongHandles[wIndex] = 0x7fff;
508:
509: Midi_Loaded = _TRUE;
510: sosMIDISetMasterVolume(wMIDIVol);
511: }
512:
513:
514: //DIGIDRIVER
515: if (SoundMode == _ON) { // && wDIGIDeviceID!=0xffffffff) {
516:
517: if ((wError = sosDIGIInitDriver(wDIGIDeviceID, &sDIGIHardware,
518: &sSOSInitDriver, &hSOSDriverHandles[DIGI]))) {
519: sosTIMERUnInitSystem(0);
520: sosDIGIUnInitSystem();
521: crash("Could not initialize Digi Driver!");
522: }
523: if ((wError = sosTIMERRegisterEvent(_SOS_FILL_TIMER_RATE, sSOSInitDriver.lpFillHandler,
524: &hTimerDig_FillHandle))) {
525: sosDIGIUnInitDriver(hSOSDriverHandles[DIGI], _TRUE, _TRUE);
526: sosTIMERUnInitSystem(0);
527: sosDIGIUnInitSystem();
528: crash("Could not register lpFillHandler!");
529: }
530: Digi_Loaded = _TRUE;
531:
532: sosDIGISetMasterVolume(hSOSDriverHandles[DIGI], wDIGIVol);
533:
534: for (wIndex = 0; wIndex < MAX_ACTIVE_SAMPLES; wIndex++)
535: SampleRay[wIndex].number = -1;
536:
537: // RAF NOV 17
538: // ADDED SMK STUFF
539: // smkinit(hSOSDriverHandles[DIGI]);
540: }
541:
542: // read in offset page list's
543: SND_SetupTables();
544: SD_Started = _TRUE;
545: }
546:
547:
548: //////////////////////////////////////////////////////////////////////////////
549: // //
550: // SND_Shutdown() : Un-Initialize all SOS Drivers and releases //
551: // timer service(s). //
552: // //
553: //////////////////////////////////////////////////////////////////////////////
554: VOID
555: SND_Shutdown(VOID)
556: {
557: int i;
558:
559: if (!SD_Started)
560: return;
561:
562: if (SoundMode && Digi_Loaded) {
563: SND_DIGIFlush();
564:
565: sosTIMERRemoveEvent(hTimerDig_FillHandle);
566: flag = sosDIGIUnInitDriver(hSOSDriverHandles[DIGI], _TRUE, _TRUE);
567: if (hSoundFile != -1)
568: close(hSoundFile);
569: if (hLoopFile != -1)
570: close(hLoopFile);
571: if (hSongFile != -1)
572: close(hSongFile);
573: if (DigiList != NULL)
574: free(DigiList);
575: if (LoopList != NULL)
576: free(LoopList);
577: Digi_Loaded = _FALSE;
578: }
579:
580: if (MusicMode && Midi_Loaded) {
581: for (i = 0; i < SONGSPERLEVEL; i++) {
582: if (!sosMIDISongDone(sngbufptr[oldsong][i]->hMIDISong)) {
583: sosMIDIStopSong(sngbufptr[oldsong][i]->hMIDISong);
584: // sosMIDIUnInitSong(sngbufptr[oldsong][i]->hMIDISong);
585: // sngbufptr[oldsong][i]->hMIDISong=-1;
586: }
587: sngbufptr[oldsong][i]->cache_lock = 0;
588: sosMIDIUnInitSong(sngbufptr[oldsong][i]->hMIDISong);
589: sngbufptr[oldsong][i]->hMIDISong = -1;
590: }
591:
592:
593: sosMIDIUnInitDriver(hSOSDriverHandles[MIDI], _TRUE);
594: if (m_bnkptr != NULL)
595: free(m_bnkptr);
596: if (d_bnkptr != NULL)
597: free(d_bnkptr);
598: if (digi_bnkptr != NULL)
599: free(digi_bnkptr);
600: if (lpMIDISong != NULL)
601: free((PSTR) FP_OFF(lpMIDISong));
602: Midi_Loaded = _FALSE;
603: }
604:
605: sosMIDIUnInitSystem();
606:
607: sosDIGIUnInitSystem();
608:
609: sosTIMERRemoveEvent(hTimerT_ClockHandle);
610:
611: sosTIMERUnInitSystem(0);
612:
613: SD_Started = _FALSE;
614:
615: }
616:
617: void
618: SND_StopMusic(void)
619: {
620: int i;
621:
622: if (MusicMode && Midi_Loaded) {
623: for (i = 0; i < SONGSPERLEVEL; i++) {
624: if (!sosMIDISongDone(sngbufptr[oldsong][i]->hMIDISong)) {
625: sosMIDIStopSong(sngbufptr[oldsong][i]->hMIDISong);
626: // sosMIDIUnInitSong(sngbufptr[oldsong][i]->hMIDISong);
627: // sngbufptr[oldsong][i]->hMIDISong=-1;
628: }
629: sngbufptr[oldsong][i]->cache_lock = 0;
630: sosMIDIUnInitSong(sngbufptr[oldsong][i]->hMIDISong);
631: sngbufptr[oldsong][i]->hMIDISong = -1;
632: }
633: }
634: }
635:
636: //////////////////////////////////////////////////////////////////////////////
637: // //
638: // SND_Mixer(WORD wSource,WORD wVolume) : Change Music or SFX Volume //
639: // //
640: //////////////////////////////////////////////////////////////////////////////
641: VOID
642: SND_Mixer(WORD wSource, WORD wVolume)
643: {
644: if (wSource == MIDI) {
645: if (MusicMode) {
646: wMIDIVol = (wVolume << 3);
647: sosMIDISetMasterVolume((BYTE) wMIDIVol);
648: }
649: }
650: else {
651: if (SoundMode) {
652: wDIGIVol = (wVolume << 11);
653: sosDIGISetMasterVolume(hSOSDriverHandles[DIGI], wDIGIVol);
654: }
655: }
656: }
657:
658:
659: //WORD
660: int
661: SND_PlaySound(WORD sound, long x, long y, WORD Pan, WORD loopcount)
662: {
663: WORD wVol,
664: flag = 0;
665: long sqrdist;
666: long prioritize;
667:
668: if (!SoundMode)
669: return (0);
670: // return((WORD)0);
671:
672:
673: prioritize = DigiList[(sound * 3) + 2];
674:
675: if (((x == 0) && (y == 0)) || ((player[pyrn].x == x) && (player[pyrn].y == y))) {
676: wVol = 0x7fff;
677: Pan = 0;
678: }
679: else {
680: sqrdist = labs(player[pyrn].x - x) + labs(player[pyrn].y - y);
681: if (sqrdist < 1500)
682: wVol = 0x7fff;
683: else if (sqrdist > 8500)
684: wVol = 0x1f00;
685: else
686: wVol = 39000 - (sqrdist << 2);
687: }
688:
689:
690: if (sound == S_STONELOOP1) {
691: for (wIndex = 0, flag = 0; wIndex < MAX_ACTIVE_SAMPLES; wIndex++)
692: if (sound == SampleRay[wIndex].number)
693: return (0);
694: }
695:
696: for (wIndex = 0, flag = 0; wIndex < MAX_ACTIVE_SAMPLES; wIndex++)
697: if (!SampleRay[wIndex].playing) {
698: flag = 1;
699: break;
700: }
701:
702: // if(!flag && prioritize<9) //none available low prio
703: if (!flag)
704: return (0);
705:
706: else if (!flag) { // none avail but high prio
707: for (wIndex = 0; wIndex < MAX_ACTIVE_SAMPLES; wIndex++) {
708: if (SampleRay[wIndex].priority < 9 && sSOSSampleData[wIndex].wLoopCount != -1) {
709: if (!sosDIGISampleDone(hSOSDriverHandles[DIGI], SampleRay[wIndex].SOSHandle) &&
710: (sSOSSampleData[wIndex].dwSampleSize != 0)) {
711: sosDIGIStopSample(hSOSDriverHandles[DIGI], SampleRay[wIndex].SOSHandle);
712: sSOSSampleData[wIndex].wLoopCount = 0;
713: sSOSSampleData[wIndex].dwSampleSize = 0;
714: SampleRay[wIndex].SOSHandle = -1;
715: SampleRay[wIndex].playing = 0;
716: SampleRay[wIndex].priority = 0;
717: SampleRay[wIndex].number = -1;
718: break;
719: }
720: }
721: }
722: }
723:
724:
725: sSOSSampleData[wIndex].dwSampleSize = (WORD) DigiList[(sound * 3) + 1];
726:
727: SeekIndex = (DigiList[(sound * 3) + 0] * 4096);
728:
729: lseek(hSoundFile, SeekIndex, 0x00);
730: memset((void *) FP_OFF(sSOSSampleData[wIndex].lpSamplePtr), '0', 55000);
731: read(hSoundFile, (void *) FP_OFF(sSOSSampleData[wIndex].lpSamplePtr), sSOSSampleData[wIndex].dwSampleSize);
732:
733: if (loopcount)
734: sSOSSampleData[wIndex].wLoopCount = loopcount;
735:
736: if (Pan)
737: Pan = ((getangle(player[pyrn].x - x, player[pyrn].y - y) + (2047 - player[pyrn].ang)) % 2047) >> 6;
738:
739: //HILES this will put the enchanted weapons inthe right speaker
740: // if( sound == S_ENCHANTLOOP1 || sound == S_ENCHANTLOOP2 )
741: // sSOSSampleData[wIndex].wSamplePanLocation = 0xe000;
742: // else
743: sSOSSampleData[wIndex].wSamplePanLocation = PanArray[Pan];
744: sSOSSampleData[wIndex].wVolume = wVol;
745: SampleRay[wIndex].SOSHandle = sosDIGIStartSample(hSOSDriverHandles[DIGI], &sSOSSampleData[wIndex]);
746: SampleRay[wIndex].x = x;
747: SampleRay[wIndex].y = y;
748: SampleRay[wIndex].playing = 1;
749: SampleRay[wIndex].number = sound;
750: SampleRay[wIndex].priority = prioritize;
751: ActiveSampleBits |= (0x01 << wIndex);
752:
753: return (SampleRay[wIndex].SOSHandle);
754:
755: }
756:
757:
758: WORD
759: SND_Sound(WORD sound)
760: {
761: static WORD handle;
762:
763: if (!SoundMode)
764: return (-1);
765: return (SND_PlaySound(sound, 0, 0, 0, 0));
766:
767: }
768:
769: VOID
770: SND_CheckLoops(void)
771: {
772:
773: // special case loops
774: if (cartsnd != -1) {
775: SND_StopLoop(cartsnd);
776: cartsnd = -1;
777: }
778: if (lavasnd != -1) {
779: SND_StopLoop(lavasnd);
780: lavasnd = -1;
781: }
782: if (batsnd != -1) {
783: SND_StopLoop(batsnd);
784: batsnd = -1;
785: }
786:
787: if (enchantedsoundhandle != -1) {
788: SND_StopLoop(enchantedsoundhandle);
789: }
790:
791:
792:
793: // ambient sound array
794: for (wIndex = 0; wIndex < MAX_AMB_SOUNDS; wIndex++) {
795: if (ambsoundarray[wIndex].hsound != -1) {
796: SND_StopLoop(ambsoundarray[wIndex].hsound);
797: ambsoundarray[wIndex].hsound = -1;
798: }
799: }
800:
801: SND_DIGIFlush();
802:
803: }
804:
805: VOID
806: SND_StopLoop(WORD which)
807: {
808:
809: if (!SoundMode)
810: return;
811:
812: for (wIndex = 0; wIndex < MAX_ACTIVE_SAMPLES; wIndex++)
813: if (which == SampleRay[wIndex].SOSHandle)
814: break;
815:
816: sosDIGIStopSample(hSOSDriverHandles[DIGI], SampleRay[wIndex].SOSHandle);
817: sSOSSampleData[wIndex].wLoopCount = 0;
818: SampleRay[wIndex].SOSHandle = -1;
819: SampleRay[wIndex].playing = 0;
820: SampleRay[wIndex].number = -1;
821:
822: }
823:
824:
825: VOID
826: SND_DIGIFLush(void)
827: {
828: if (!SoundMode)
829: return;
830:
831: for (wIndex = 0; wIndex < MAX_ACTIVE_SAMPLES; wIndex++) {
832: if (SampleRay[wIndex].playing)
833: sosDIGIStopSample(hSOSDriverHandles[DIGI], SampleRay[wIndex].SOSHandle);
834: // if( sSOSSampleData[wIndex].lpSamplePtr != NULL )
835: // free((void *)FP_OFF(sSOSSampleData[wIndex].lpSamplePtr));
836: SampleRay[wIndex].SOSHandle = -1;
837: SampleRay[wIndex].playing = 0;
838: SampleRay[wIndex].number = -1;
839: ActiveSampleBits |= (0x01 << wIndex);
840: }
841: }
842:
843:
844:
845: //
846: // Sound Location Stuff
847: //
848:
849:
850: VOID
851: SND_UpdateSoundLoc(WORD which, WORD Volume, WORD Pan)
852: {
853:
854: gVol = Volume;
855: gPan = sosDIGISetPanLocation(hSOSDriverHandles[DIGI], SampleRay[which].SOSHandle, PanArray[Pan]);
856: sosDIGISetSampleVolume(hSOSDriverHandles[DIGI], SampleRay[which].SOSHandle, Volume);
857:
858: }
859:
860:
861:
862: // JOE START functions called often from external modules
863:
864: //JSA 3/20/95
865: //
866: // note: soundnum=sound to play; xplc is x location of source; yplc is y loc
867: //
868:
869: void
870: playsound_loc(int soundnum, long xplc, long yplc)
871: {
872: long sqrdist;
873: unsigned wVol,
874: wPan;
875:
876: SND_PlaySound(soundnum, xplc, yplc, 1, 0);
877: }
878:
879: void
880: updatesound_loc(void)
881: {
882: int wIndex;
883: unsigned wVol,
884: wPan;
885: long sqrdist;
886:
887: if (!SoundMode)
888: return;
889:
890: for (wIndex = 0; wIndex < MAX_ACTIVE_SAMPLES; wIndex++)
891: if (SampleRay[wIndex].playing && SampleRay[wIndex].x && SampleRay[wIndex].y) {
892: if (sSOSSampleData[wIndex].dwSampleSize != 0) {
893: sqrdist = labs(player[pyrn].x - SampleRay[wIndex].x) +
894: labs(player[pyrn].y - SampleRay[wIndex].y);
895:
896: if (sqrdist < 1500)
897: wVol = 0x7fff;
898: else if (sqrdist > 8500)
899: wVol = 0x1f00;
900: else
901: wVol = 39000 - (sqrdist << 2);
902:
903: wPan = ((getangle(player[pyrn].x - SampleRay[wIndex].x, player[pyrn].y - SampleRay[wIndex].y) + (2047 - player[pyrn].ang)) % 2047) >> 6;
904: SND_UpdateSoundLoc(wIndex, wVol, wPan);
905: // sprintf(displaybuf,"%dVol %x Pan %x Dist
906: // %ld",SampleRay[wIndex].number,wVol,wPan,sqrdist);
907: // displaytime=100;
908: }
909:
910: }
911:
912: }
913:
914: // Location Stuff End
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.