From acbe1209e87943435ea279051552944a2da250d0 Mon Sep 17 00:00:00 2001 From: Kp Date: Sun, 3 Mar 2013 01:03:33 +0000 Subject: [PATCH] Move */arch/sdl/digi_mixer.c -> similar/arch/sdl/digi_mixer.c --- SConstruct | 14 +- d1x-rebirth/arch/sdl/digi_mixer.c | 219 ------------------ .../arch/sdl/digi_mixer.c | 19 +- 3 files changed, 17 insertions(+), 235 deletions(-) delete mode 100644 d1x-rebirth/arch/sdl/digi_mixer.c rename {d2x-rebirth => similar}/arch/sdl/digi_mixer.c (91%) diff --git a/SConstruct b/SConstruct index 5a1e32742..b11a99d85 100644 --- a/SConstruct +++ b/SConstruct @@ -366,6 +366,7 @@ class DXXProgram(DXXCommon): ] ]) objects_similar_arch_sdlmixer = DXXCommon.create_lazy_object_property([os.path.join('similar', f) for f in [ +'arch/sdl/digi_mixer.c', 'arch/sdl/jukebox.c' ] ], _apply_target_name) @@ -543,7 +544,6 @@ class DXXProgram(DXXCommon): objects = static_archive_construction.objects_common[:] objects.extend(program_specific_objects) if (self.user_settings.sdlmixer == 1): - objects.extend(self.objects_arch_sdlmixer) objects.extend(static_archive_construction.objects_arch_sdlmixer) objects.extend(self.objects_similar_arch_sdlmixer) if (self.user_settings.opengl == 1) or (self.user_settings.opengles == 1): @@ -656,12 +656,6 @@ class D1XProgram(DXXProgram): objects_use_udp = DXXCommon.create_lazy_object_property([os.path.join(srcdir, 'main/net_udp.c')]) - # SDL_mixer sound implementation - objects_arch_sdlmixer = DXXCommon.create_lazy_object_property([os.path.join(srcdir, f) for f in [ -'arch/sdl/digi_mixer.c', -] -]) - # assembler related objects_asm = DXXCommon.create_lazy_object_property([os.path.join(srcdir, f) for f in [ 'texmap/tmap_ll.asm', @@ -767,12 +761,6 @@ class D2XProgram(DXXProgram): objects_use_udp = DXXCommon.create_lazy_object_property([os.path.join(srcdir, 'main/net_udp.c')]) - # SDL_mixer sound implementation - objects_arch_sdlmixer = DXXCommon.create_lazy_object_property([os.path.join(srcdir, f) for f in [ -'arch/sdl/digi_mixer.c', -] -]) - # assembler related objects_asm = DXXCommon.create_lazy_object_property([os.path.join(srcdir, f) for f in [ 'texmap/tmap_ll.asm', diff --git a/d1x-rebirth/arch/sdl/digi_mixer.c b/d1x-rebirth/arch/sdl/digi_mixer.c deleted file mode 100644 index d1637bc1d..000000000 --- a/d1x-rebirth/arch/sdl/digi_mixer.c +++ /dev/null @@ -1,219 +0,0 @@ -/* - * This is an alternate backend for the sound effect system. - * It uses SDL_mixer to provide a more reliable playback, - * and allow processing of multiple audio formats. - * - * This file is based on the original D1X arch/sdl/digi.c - * - * -- MD2211 (2006-10-12) - */ - -#include -#include -#include - -#include -#include -#if !(defined(__APPLE__) && defined(__MACH__)) -#include -#else -#include -#endif - -#include "pstypes.h" -#include "dxxerror.h" -#include "sounds.h" -#include "digi.h" -#include "digi_mixer.h" -#include "digi_mixer_music.h" -#include "console.h" -#include "config.h" -#include "args.h" - -#include "fix.h" -#include "gr.h" // needed for piggy.h -#include "piggy.h" - -#define MIX_DIGI_DEBUG 0 -#define MIX_OUTPUT_FORMAT AUDIO_S16 -#define MIX_OUTPUT_CHANNELS 2 - -#define MAX_SOUND_SLOTS 64 -#if !((defined(__APPLE__) && defined(__MACH__)) || defined(macintosh)) -#define SOUND_BUFFER_SIZE 2048 -#else -#define SOUND_BUFFER_SIZE 1024 -#endif -#define MIN_VOLUME 10 - -static int digi_initialised = 0; -static int digi_max_channels = MAX_SOUND_SLOTS; -static inline int fix2byte(fix f) { return (f / 256) % 256; } -Mix_Chunk SoundChunks[MAX_SOUNDS]; -ubyte channels[MAX_SOUND_SLOTS]; - -/* Initialise audio */ -int digi_mixer_init() -{ - digi_sample_rate = SAMPLE_RATE_44K; - - if (MIX_DIGI_DEBUG) con_printf(CON_DEBUG,"digi_init %d (SDL_Mixer)\n", MAX_SOUNDS); - if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) Error("SDL audio initialisation failed: %s.", SDL_GetError()); - - if (Mix_OpenAudio(digi_sample_rate, MIX_OUTPUT_FORMAT, MIX_OUTPUT_CHANNELS, SOUND_BUFFER_SIZE)) - { - //edited on 10/05/98 by Matt Mueller - should keep running, just with no sound. - con_printf(CON_URGENT,"\nError: Couldn't open audio: %s\n", SDL_GetError()); - GameArg.SndNoSound = 1; - return 1; - } - - digi_max_channels = Mix_AllocateChannels(digi_max_channels); - memset(channels, 0, MAX_SOUND_SLOTS); - Mix_Pause(0); - - digi_initialised = 1; - - digi_mixer_set_digi_volume( (GameCfg.DigiVolume*32768)/8 ); - - return 0; -} - -/* Shut down audio */ -void digi_mixer_close() { - if (MIX_DIGI_DEBUG) con_printf(CON_DEBUG,"digi_close (SDL_Mixer)\n"); - if (!digi_initialised) return; - digi_initialised = 0; - Mix_CloseAudio(); -} - -/* channel management */ -int digi_mixer_find_channel() -{ - int i; - for (i = 0; i < digi_max_channels; i++) - if (channels[i] == 0) - return i; - return -1; -} - -void digi_mixer_free_channel(int channel_num) -{ - channels[channel_num] = 0; -} - -/* - * Play-time conversion. Performs output conversion only once per sound effect used. - * Once the sound sample has been converted, it is cached in SoundChunks[] - */ -void mixdigi_convert_sound(int i) -{ - SDL_AudioCVT cvt; - Uint8 *data = GameSounds[i].data; - Uint32 dlen = GameSounds[i].length; - int freq = GameSounds[i].freq; - //int bits = GameSounds[i].bits; - - if (SoundChunks[i].abuf) return; //proceed only if not converted yet - - if (data) - { - if (MIX_DIGI_DEBUG) con_printf(CON_DEBUG,"converting %d (%d)\n", i, dlen); - SDL_BuildAudioCVT(&cvt, AUDIO_U8, 1, freq, MIX_OUTPUT_FORMAT, MIX_OUTPUT_CHANNELS, digi_sample_rate); - - cvt.buf = malloc(dlen * cvt.len_mult); - cvt.len = dlen; - memcpy(cvt.buf, data, dlen); - if (SDL_ConvertAudio(&cvt)) con_printf(CON_DEBUG,"conversion of %d failed\n", i); - - SoundChunks[i].abuf = cvt.buf; - SoundChunks[i].alen = dlen * cvt.len_mult; - SoundChunks[i].allocated = 1; - SoundChunks[i].volume = 128; // Max volume = 128 - } -} - -// Volume 0-F1_0 -int digi_mixer_start_sound(short soundnum, fix volume, int pan, int looping, int loop_start, int loop_end, int soundobj) -{ - int mix_vol = fix2byte(fixmul(digi_volume, volume)); - int mix_pan = fix2byte(pan); - int mix_loop = looping * -1; - int channel; - - if (!digi_initialised) return -1; - Assert(GameSounds[soundnum].data != (void *)-1); - - mixdigi_convert_sound(soundnum); - - if (MIX_DIGI_DEBUG) con_printf(CON_DEBUG,"digi_start_sound %d, volume %d, pan %d (start=%d, end=%d)\n", soundnum, mix_vol, mix_pan, loop_start, loop_end); - - channel = digi_mixer_find_channel(); - - Mix_PlayChannel(channel, &(SoundChunks[soundnum]), mix_loop); - Mix_SetPanning(channel, 255-mix_pan, mix_pan); - if (volume > F1_0) - Mix_SetDistance(channel, 0); - else - Mix_SetDistance(channel, 255-mix_vol); - channels[channel] = 1; - Mix_ChannelFinished(digi_mixer_free_channel); - - return channel; -} - -void digi_mixer_set_channel_volume(int channel, int volume) -{ - int mix_vol = fix2byte(volume); - if (!digi_initialised) return; - Mix_SetDistance(channel, 255-mix_vol); -} - -void digi_mixer_set_channel_pan(int channel, int pan) -{ - int mix_pan = fix2byte(pan); - Mix_SetPanning(channel, 255-mix_pan, mix_pan); -} - -void digi_mixer_stop_sound(int channel) -{ - if (!digi_initialised) return; - if (MIX_DIGI_DEBUG) con_printf(CON_DEBUG,"digi_stop_sound %d\n", channel); - Mix_HaltChannel(channel); - channels[channel] = 0; -} - -void digi_mixer_end_sound(int channel) -{ - digi_mixer_stop_sound(channel); - channels[channel] = 0; -} - -void digi_mixer_set_digi_volume( int dvolume ) -{ - digi_volume = dvolume; - if (!digi_initialised) return; - Mix_Volume(-1, fix2byte(dvolume)); -} - -int digi_mixer_is_sound_playing(int soundno) { return 0; } -int digi_mixer_is_channel_playing(int channel) { return 0; } - -void digi_mixer_reset() {} -void digi_mixer_stop_all_channels() -{ - Mix_HaltChannel(-1); - memset(channels, 0, MAX_SOUND_SLOTS); -} - -extern void digi_end_soundobj(int channel); - - //added on 980905 by adb to make sound channel setting work -void digi_mixer_set_max_channels(int n) { } -int digi_mixer_get_max_channels() { return digi_max_channels; } -// end edit by adb - - -#ifndef NDEBUG -void digi_mixer_debug() {} -#endif diff --git a/d2x-rebirth/arch/sdl/digi_mixer.c b/similar/arch/sdl/digi_mixer.c similarity index 91% rename from d2x-rebirth/arch/sdl/digi_mixer.c rename to similar/arch/sdl/digi_mixer.c index 85df5d370..8258bc6f4 100644 --- a/d2x-rebirth/arch/sdl/digi_mixer.c +++ b/similar/arch/sdl/digi_mixer.c @@ -55,10 +55,15 @@ ubyte channels[MAX_SOUND_SLOTS]; /* Initialise audio */ int digi_mixer_init() { +#if defined(DXX_BUILD_DESCENT_II) + unsigned +#endif + digi_sample_rate = SAMPLE_RATE_44K; + if (MIX_DIGI_DEBUG) con_printf(CON_DEBUG,"digi_init %d (SDL_Mixer)\n", MAX_SOUNDS); if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) Error("SDL audio initialisation failed: %s.", SDL_GetError()); - if (Mix_OpenAudio(SAMPLE_RATE_44K, MIX_OUTPUT_FORMAT, MIX_OUTPUT_CHANNELS, SOUND_BUFFER_SIZE)) + if (Mix_OpenAudio(digi_sample_rate, MIX_OUTPUT_FORMAT, MIX_OUTPUT_CHANNELS, SOUND_BUFFER_SIZE)) { //edited on 10/05/98 by Matt Mueller - should keep running, just with no sound. con_printf(CON_URGENT,"\nError: Couldn't open audio: %s\n", SDL_GetError()); @@ -109,18 +114,26 @@ void mixdigi_convert_sound(int i) SDL_AudioCVT cvt; Uint8 *data = GameSounds[i].data; Uint32 dlen = GameSounds[i].length; + int freq; int out_freq; Uint16 out_format; int out_channels; - +#if defined(DXX_BUILD_DESCENT_I) + out_freq = digi_sample_rate; + out_format = MIX_OUTPUT_FORMAT; + out_channels = MIX_OUTPUT_CHANNELS; + freq = GameSounds[i].freq; +#elif defined(DXX_BUILD_DESCENT_II) Mix_QuerySpec(&out_freq, &out_format, &out_channels); // get current output settings + freq = GameArg.SndDigiSampleRate; +#endif if (SoundChunks[i].abuf) return; //proceed only if not converted yet if (data) { if (MIX_DIGI_DEBUG) con_printf(CON_DEBUG,"converting %d (%d)\n", i, dlen); - SDL_BuildAudioCVT(&cvt, AUDIO_U8, 1, GameArg.SndDigiSampleRate, out_format, out_channels, out_freq); + SDL_BuildAudioCVT(&cvt, AUDIO_U8, 1, freq, out_format, out_channels, out_freq); cvt.buf = malloc(dlen * cvt.len_mult); cvt.len = dlen;