diff --git a/src/audio.h b/src/audio.h index 9e12285098..4a9e30a221 100644 --- a/src/audio.h +++ b/src/audio.h @@ -31,7 +31,7 @@ typedef struct { extern int gAudioDeviceCount; extern audio_device *gAudioDevices; -#define AUDIO_MAX_VEHICLE_SOUNDS 50 +#define AUDIO_MAX_VEHICLE_SOUNDS 14 void audio_init(); void audio_quit(); diff --git a/src/mixer.cpp b/src/mixer.cpp index f23093d804..ccf0d8fa44 100644 --- a/src/mixer.cpp +++ b/src/mixer.cpp @@ -272,6 +272,11 @@ void Mixer::Init(const char* device) void Mixer::Close() { + Lock(); + while (channels.begin() != channels.end()) { + Stop(*(*channels.begin())); + } + Unlock(); SDL_CloseAudioDevice(deviceid); delete[] effectbuffer; } @@ -329,7 +334,11 @@ void Mixer::MixChannel(Channel& channel, uint8* data, int length) int samplesize = format.channels * format.BytesPerSample(); int samples = length / samplesize; int samplesloaded = loaded / samplesize; - int samplestoread = (int)ceil((samples - samplesloaded) * channel.rate); + double rate = 1; + if (format.format == AUDIO_S16SYS) { + rate = channel.rate; + } + int samplestoread = (int)ceil((samples - samplesloaded) * rate); int lengthloaded = 0; if (channel.offset < channel.stream->Length()) { bool mustconvert = false; @@ -363,11 +372,10 @@ void Mixer::MixChannel(Channel& channel, uint8* data, int length) } bool effectbufferloaded = false; - - if (channel.rate != 1 && format.format == AUDIO_S16SYS) { + if (rate != 1 && format.format == AUDIO_S16SYS) { int in_len = (int)(ceil((double)lengthloaded / samplesize)); int out_len = samples + 20; // needs some extra, otherwise resampler sometimes doesn't process all the input samples - speex_resampler_set_rate(channel.resampler, format.freq, (int)(format.freq * (1 / channel.rate))); + speex_resampler_set_rate(channel.resampler, format.freq, (int)(format.freq * (1 / rate))); speex_resampler_process_interleaved_int(channel.resampler, (const spx_int16_t*)tomix, (spx_uint32_t*)&in_len, (spx_int16_t*)effectbuffer, (spx_uint32_t*)&out_len); effectbufferloaded = true; tomix = effectbuffer; @@ -386,7 +394,7 @@ void Mixer::MixChannel(Channel& channel, uint8* data, int length) break; case AUDIO_U8: EffectPanU8(channel, (uint8*)effectbuffer, lengthloaded / samplesize); - break; + break; } } @@ -493,15 +501,21 @@ void Mixer_Stop_Channel(void* channel) void Mixer_Channel_Volume(void* channel, int volume) { + gMixer.Lock(); ((Channel*)channel)->SetVolume(volume); + gMixer.Unlock(); } void Mixer_Channel_Pan(void* channel, float pan) { + gMixer.Lock(); ((Channel*)channel)->SetPan(pan); + gMixer.Unlock(); } void Mixer_Channel_Rate(void* channel, double rate) { + gMixer.Lock(); ((Channel*)channel)->SetRate(rate); + gMixer.Unlock(); } \ No newline at end of file diff --git a/src/vehicle.c b/src/vehicle.c index 770e074986..1b45f7154b 100644 --- a/src/vehicle.c +++ b/src/vehicle.c @@ -364,7 +364,7 @@ void vehicle_sounds_update() vehicle_sound->sound1_id = sprite->vehicle.sound1_id; #ifndef USE_MIXER RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_prepare(sprite->vehicle.var_BB, &vehicle_sound->sound1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER, uint32)); + sound_prepare(sprite->vehicle.sound1_id, &vehicle_sound->sound1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER, uint32)); RCT2_GLOBAL(0x014241BC, uint32) = 0; #endif vehicle_sound->sound1_pan = vehicle_sound_params->pan; @@ -461,7 +461,7 @@ void vehicle_sounds_update() vehicle_sound->sound2_id = sprite->vehicle.sound2_id; #ifndef USE_MIXER RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_prepare(sprite->vehicle.var_BD, &vehicle_sound->sound2, 1, RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER, uint32)); + sound_prepare(sprite->vehicle.sound2_id, &vehicle_sound->sound2, 1, RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER, uint32)); RCT2_GLOBAL(0x014241BC, uint32) = 0; #endif vehicle_sound->sound2_pan = vehicle_sound_params->pan; diff --git a/src/window_options.c b/src/window_options.c index 4df489aa0f..20de231050 100644 --- a/src/window_options.c +++ b/src/window_options.c @@ -505,7 +505,11 @@ static void window_options_dropdown() case WIDX_SOUND_DROPDOWN: audio_init2(dropdownIndex); if (dropdownIndex < gAudioDeviceCount) { - Mixer_Init(gAudioDevices[dropdownIndex].name); + int devicenum = dropdownIndex; + if (devicenum == 0) { + devicenum = 1; + } + Mixer_Init(gAudioDevices[devicenum].name); } /*#ifdef _MSC_VER __asm movzx ax, dropdownIndex