// Volume 0-F1_0 int digi_audio_start_sound(short soundnum, fix volume, int pan, int looping, int, int, sound_object *const soundobj) { int i, starting_channel; if (!digi_initialised) return -1; if (soundnum < 0) return -1; SDL_LockAudio(); Assert(GameSounds[soundnum].data != reinterpret_cast<void *>(-1)); starting_channel = next_channel; while(1) { if (!SoundSlots[next_channel].playing) break; if (!SoundSlots[next_channel].persistent) break; // use this channel! next_channel++; if (next_channel >= digi_max_channels) next_channel = 0; if (next_channel == starting_channel) { SDL_UnlockAudio(); return -1; } } if (SoundSlots[next_channel].playing) { SoundSlots[next_channel].playing = 0; if (SoundSlots[next_channel].soundobj != sound_object_none) { digi_end_soundobj(*SoundSlots[next_channel].soundobj); } if (SoundQ_channel == next_channel) SoundQ_end(); } #ifndef NDEBUG verify_sound_channel_free(next_channel); #endif SoundSlots[next_channel].soundno = soundnum; SoundSlots[next_channel].samples = GameSounds[soundnum].data; SoundSlots[next_channel].length = GameSounds[soundnum].length; SoundSlots[next_channel].volume = fixmul(digi_volume, volume); SoundSlots[next_channel].pan = pan; SoundSlots[next_channel].position = 0; SoundSlots[next_channel].looped = looping; SoundSlots[next_channel].playing = 1; SoundSlots[next_channel].soundobj = soundobj; SoundSlots[next_channel].persistent = 0; if (soundobj || looping || volume > F1_0) SoundSlots[next_channel].persistent = 1; i = next_channel; next_channel++; if (next_channel >= digi_max_channels) next_channel = 0; SDL_UnlockAudio(); return i; }
// Volume 0-F1_0 int digi_start_sound(short soundnum, fix volume, int pan, int looping, int loop_start, int loop_end, int soundobj) { int i, starting_channel; if (!digi_initialised) return -1; if (soundnum < 0) return -1; LOCK(); Assert(GameSounds[soundnum].data != (void *)-1); starting_channel = next_channel; while(1) { if (!SoundSlots[next_channel].playing) break; if (!SoundSlots[next_channel].persistent) break; // use this channel! next_channel++; if (next_channel >= digi_max_channels) next_channel = 0; if (next_channel == starting_channel) { UNLOCK(); return -1; } } if (SoundSlots[next_channel].playing) { SoundSlots[next_channel].playing = 0; if (SoundSlots[next_channel].soundobj > -1) { digi_end_soundobj(SoundSlots[next_channel].soundobj); } if (SoundQ_channel == next_channel) SoundQ_end(); } #ifndef NDEBUG verify_sound_channel_free(next_channel); #endif SoundSlots[next_channel].soundno = soundnum; SoundSlots[next_channel].samples = GameSounds[soundnum].data; SoundSlots[next_channel].length = GameSounds[soundnum].length; SoundSlots[next_channel].volume = fixmul(digi_volume, volume); SoundSlots[next_channel].pan = pan; SoundSlots[next_channel].position = 0; SoundSlots[next_channel].looped = looping; SoundSlots[next_channel].playing = 1; SoundSlots[next_channel].soundobj = soundobj; SoundSlots[next_channel].persistent = 0; if ((soundobj > -1) || (looping) || (volume > F1_0)) SoundSlots[next_channel].persistent = 1; i = next_channel; next_channel++; if (next_channel >= digi_max_channels) next_channel = 0; UNLOCK(); return i; }