| version 1.1 | | version 1.2 |
|---|
| | |
| #include "mm_drv.h" | | #include "mm_drv.h" |
| #include "timer.h" | | #include "timer.h" |
| | | |
| //#include "SDL.h" | | |
| //#include "SDL_audio.h" | | |
| | | |
| #include "error.h" | | #include "error.h" |
| #include "mono.h" | | #include "mono.h" |
| #include "fix.h" | | #include "fix.h" |
| | |
| #include "kconfig.h" | | #include "kconfig.h" |
| #include "midiallg.h" | | #include "midiallg.h" |
| | | |
| | | #include "altsound.h" |
| | | |
| int digi_driver_board = 0; | | int digi_driver_board = 0; |
| int digi_driver_port = 0; | | int digi_driver_port = 0; |
| int digi_driver_irq = 0; | | int digi_driver_irq = 0; |
| int digi_driver_dma = 0; | | int digi_driver_dma = 0; |
| //int digi_midi_type = 0; // Midi driver type | | |
| //int digi_midi_port = 0; // Midi driver port | | |
| int digi_timer_rate = 9943; // rate for the timer to go off to handle the driver system (120 Hz) | | int digi_timer_rate = 9943; // rate for the timer to go off to handle the driver system (120 Hz) |
| | | |
| #ifndef ALLG_MIDI | | #ifndef ALLG_MIDI |
| | |
| unsigned int position; // Position we are at at the moment. | | unsigned int position; // Position we are at at the moment. |
| } SoundSlots[MAX_SOUND_SLOTS]; | | } SoundSlots[MAX_SOUND_SLOTS]; |
| | | |
| //static SDL_AudioSpec WaveSpec; | | |
| static int digi_sounds_initialized = 0; | | static int digi_sounds_initialized = 0; |
| | | |
| //added on 980905 by adb to add rotating/volume based sound kill system | | //added on 980905 by adb to add rotating/volume based sound kill system |
| | |
| unsigned char *streamend; | | unsigned char *streamend; |
| struct sound_slot *sl; | | struct sound_slot *sl; |
| | | |
| // if (grd_curscreen) | | |
| // grd_curscreen->sc_canvas.cv_bitmap.bm_data[8]++; | | |
| len &= ~1; /* stereo -> always write 2 byte pairs */ | | len &= ~1; /* stereo -> always write 2 byte pairs */ |
| streamend = stream + len; | | streamend = stream + len; |
| | | |
| #if 0 | | |
| { | | |
| static int n = 0; | | |
| while(stream < streamend) { | | |
| *(stream++) = (n & 256) ? 256 - (n & 255) : (n & 255); | | |
| n++; | | |
| } | | |
| return len; | | |
| } | | |
| #endif | | |
| | | |
| memset(stream, 0x80, len); | | memset(stream, 0x80, len); |
| | | |
| for (sl = SoundSlots; sl < SoundSlots + MAX_SOUND_SLOTS; sl++) | | for (sl = SoundSlots; sl < SoundSlots + MAX_SOUND_SLOTS; sl++) |
| | |
| | | |
| void mm_timer() { | | void mm_timer() { |
| drv->Update(); | | drv->Update(); |
| // if (grd_curscreen) | | |
| // (*grd_curscreen->sc_canvas.cv_bitmap.bm_data)++; | | |
| } | | } |
| | | |
| /* Initialise audio devices. */ | | /* Initialise audio devices. */ |
| | |
| memset(SampleHandles, 255, sizeof(SampleHandles)); | | memset(SampleHandles, 255, sizeof(SampleHandles)); |
| //end edit by adb | | //end edit by adb |
| | | |
| #if 0 | | |
| WaveSpec.freq = 11025; | | |
| WaveSpec.format = AUDIO_U8 | AUDIO_STEREO; | | |
| WaveSpec.samples = SOUND_BUFFER_SIZE; | | |
| WaveSpec.callback = audio_mixcallback; | | |
| | | |
| if ( SDL_OpenAudio(&WaveSpec, NULL) < 0 ) { | | |
| printf("Couldn't open audio: %s\n", SDL_GetError()); | | |
| exit(2); | | |
| } | | |
| SDL_PauseAudio(0); | | |
| #endif | | |
| if (!drv->Init()) { | | if (!drv->Init()) { |
| printf("Couldn't open audio: %s", myerr); | | printf("Couldn't open audio: %s", myerr); |
| return -1; | | return -1; |
| | |
| #endif | | #endif |
| } | | } |
| | | |
| /* 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]; | | |
| } | | |
| | | |
| static int get_free_slot() | | static int get_free_slot() |
| { | | { |
| int i; | | int i; |
| | |
| int ntries; | | int ntries; |
| int slot; | | int slot; |
| | | |
| 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 |
| | |
| { | | { |
| if ( (SoundSlots[SampleHandles[next_handle]].volume > digi_volume) && (ntries<digi_max_channels) ) | | if ( (SoundSlots[SampleHandles[next_handle]].volume > digi_volume) && (ntries<digi_max_channels) ) |
| { | | { |
| //mprintf(( 0, "Not stopping loud sound %d.\n", next_handle )); | | |
| next_handle++; | | next_handle++; |
| if ( next_handle >= digi_max_channels ) | | if ( next_handle >= digi_max_channels ) |
| next_handle = 0; | | next_handle = 0; |
| ntries++; | | ntries++; |
| goto TryNextChannel; | | goto TryNextChannel; |
| } | | } |
| //mprintf(( 0, "[SS:%d]", next_handle )); | | |
| SoundSlots[SampleHandles[next_handle]].playing = 0; | | SoundSlots[SampleHandles[next_handle]].playing = 0; |
| SampleHandles[next_handle] = -1; | | SampleHandles[next_handle] = -1; |
| } | | } |
| //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; |
| | | |
| if (volume > F2_0) | | if (volume > F2_0) |
| volume = F2_0; | | volume = F2_0; |
| | | |
| 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; |
| | |
| { | | { |
| int slot; | | int slot; |
| | | |
| 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; |
| | |
| 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 (soundno < 0 ) return; | | if (digi_xlat_sound(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; |
| 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_initialised) |
| if (soundno < 0 ) return; | | return; |
| | | if (digi_xlat_sound(soundno) < 0 ) |
| | | return; |
| | | |
| | | if (volume < MIN_VOLUME ) |
| | | 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; | | |
| | | |
| soundnum = digi_xlat_sound(org_soundnum); | | |
| | | |
| if ( max_volume < 0 ) return -1; | | if ( max_volume < 0 ) |
| // if ( max_volume > F1_0 ) max_volume = F1_0; | | return -1; |
| | | if (!digi_initialised) |
| | | return -1; |
| | | if (digi_xlat_sound(soundnum) < 0 ) |
| | | return -1; |
| | | |
| if (!digi_initialised) return -1; | | if (Sounddat(soundnum)->data==NULL) |
| if (soundnum < 0 ) return -1; | | { |
| 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].signature=next_signature++; | | SoundObjects[i].signature=next_signature++; |
| SoundObjects[i].flags = SOF_USED | SOF_LINK_TO_OBJ; | | SoundObjects[i].flags = SOF_USED | SOF_LINK_TO_OBJ; |
| | | |
| if ( forever ) | | if ( forever ) |
| SoundObjects[i].flags |= SOF_PLAY_FOREVER; | | SoundObjects[i].flags |= SOF_PLAY_FOREVER; |
| SoundObjects[i].lo_objnum = objnum; | | SoundObjects[i].lo_objnum = objnum; |
| | |
| } | | } |
| | | |
| 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 < 0 ) |
| // if ( max_volume > F1_0 ) max_volume = F1_0; | | return -1; |
| | | if (!digi_initialised) |
| if (!digi_initialised) return -1; | | return -1; |
| if (soundnum < 0 ) return -1; | | if (digi_xlat_sound(soundnum) < 0 ) |
| if (GameSounds[soundnum].data==NULL) { | | 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; |
| } | | } |
| | | |
| | | |
| SoundObjects[i].signature=next_signature++; | | |
| SoundObjects[i].flags = SOF_USED | SOF_LINK_TO_POS; | | |
| if ( forever ) | | if ( forever ) |
| SoundObjects[i].flags |= SOF_PLAY_FOREVER; | | SoundObjects[i].flags |= SOF_PLAY_FOREVER; |
| | | SoundObjects[i].signature=next_signature++; |
| | | SoundObjects[i].flags = SOF_USED | SOF_LINK_TO_POS; |
| SoundObjects[i].lp_segnum = segnum; | | SoundObjects[i].lp_segnum = segnum; |
| SoundObjects[i].lp_sidenum = sidenum; | | SoundObjects[i].lp_sidenum = sidenum; |
| SoundObjects[i].lp_position = *pos; | | SoundObjects[i].lp_position = *pos; |
| | |
| { | | { |
| 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; |
| } | | |
| 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 )); |
| } | | } |
| } | | |
| | | |
| void digi_kill_sound_linked_to_object( int objnum ) | | void digi_kill_sound_linked_to_object( int objnum ) |
| { | | { |
| | |
| | | |
| void digi_init_sounds() | | void digi_init_sounds() |
| { | | { |
| // int i; | | if (!digi_initialised) |
| | | return; |
| if (!digi_initialised) return; | | |
| | | |
| digi_reset_digi_sounds(); | | digi_reset_digi_sounds(); |
| | | |
| // for (i=0; i<MAX_SOUND_OBJECTS; i++ ) { | | |
| // if (digi_sounds_initialized) { | | |
| // if ( SoundObjects[i].flags & SOF_PLAYING ) { | | |
| // SoundSlots[SoundObjects[i].handle].playing=0; | | |
| // } | | |
| // } | | |
| // SoundObjects[i].flags = 0; // Mark as dead, so some other sound can use this sound | | |
| // } | | |
| digi_stop_soundobjects(); | | digi_stop_soundobjects(); |
| | | |
| digi_sounds_initialized = 1; | | digi_sounds_initialized = 1; |
| } | | } |
| | | |
| | |
| { | | { |
| int i; | | int i; |
| | | |
| soundno = digi_xlat_sound(soundno); | | |
| | | |
| for (i = 0; i < MAX_SOUND_SLOTS; i++) | | for (i = 0; i < MAX_SOUND_SLOTS; i++) |
| //changed on 980905 by adb: added SoundSlots[i].playing && | | //changed on 980905 by adb: added SoundSlots[i].playing && |
| if (SoundSlots[i].playing && SoundSlots[i].soundno == soundno) | | if (SoundSlots[i].playing && SoundSlots[i].soundno == soundno) |
| | |
| return 0; | | return 0; |
| } | | } |
| | | |
| | | |
| //void digi_pause_all() { } | | |
| //void digi_resume_all() { } | | |
| //void digi_stop_all() { } | | |
| | | |
| //added on 980905 by adb to make sound channel setting work | | //added on 980905 by adb to make sound channel setting work |
| void digi_set_max_channels(int n) { | | void digi_set_max_channels(int n) { |
| digi_max_channels = n; | | digi_max_channels = n; |