From a229bc7840d3687ae5ecabc35e425fe358c2978a Mon Sep 17 00:00:00 2001 From: pouillot Date: Sat, 31 Oct 2009 21:07:52 +0000 Subject: [PATCH] Added master volume control in Sound config menu (and changed little necessary stuff in ssggraph) git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@1703 30fe4595-0a0c-4342-8851-515496e4dcbd Former-commit-id: 4322267d309ecee969d353b49a1b6f9943498454 Former-commit-id: a2ad472a7e6607039754ab35ecd63d79ffe34ea1 --- src/libs/confscreens/soundconfig.cpp | 28 +++++++--- .../graphic/ssggraph/OpenalSoundInterface.cpp | 1 - .../graphic/ssggraph/PlibSoundInterface.cpp | 1 - .../graphic/ssggraph/SoundInterface.cpp | 1 + src/modules/graphic/ssggraph/SoundInterface.h | 37 +++++++----- src/modules/graphic/ssggraph/grsound.cpp | 56 ++++++++++--------- 6 files changed, 72 insertions(+), 52 deletions(-) diff --git a/src/libs/confscreens/soundconfig.cpp b/src/libs/confscreens/soundconfig.cpp index 859811fe..1434bb01 100644 --- a/src/libs/confscreens/soundconfig.cpp +++ b/src/libs/confscreens/soundconfig.cpp @@ -45,11 +45,11 @@ static int SoundOptionId; // volume static float VolumeValue = 100.0f; -//static int VolumeValueId; +static int VolumeValueId; // gui screen handles. -static void *scrHandle = NULL; -static void *prevHandle = NULL; +static void *scrHandle = NULL; +static void *prevHandle = NULL; // Read sound configuration. @@ -59,6 +59,7 @@ static void readSoundCfg(void) int i; char buf[1024]; + // Sound interface. sprintf(buf, "%s%s", GetLocalDir(), GR_SOUND_PARM_CFG); void *paramHandle = GfParmReadFile(buf, GFPARM_RMODE_REREAD | GFPARM_RMODE_CREAT); optionName = GfParmGetStr(paramHandle, GR_SCT_SOUND, GR_ATT_SOUND_STATE, soundOptionList[0]); @@ -70,17 +71,21 @@ static void readSoundCfg(void) } } + GfuiLabelSetText(scrHandle, SoundOptionId, soundOptionList[curOption]); + + // Sound volume. VolumeValue = GfParmGetNum(paramHandle, GR_SCT_SOUND, GR_ATT_SOUND_VOLUME, "%", 100.0f); if (VolumeValue>100.0f) { VolumeValue = 100.0f; } - if (VolumeValue < 0.0f) { + else if (VolumeValue < 0.0f) { VolumeValue = 0.0f; } - GfParmReleaseHandle(paramHandle); + sprintf(buf, "%g", VolumeValue); + GfuiEditboxSetString(scrHandle, VolumeValueId, buf); - GfuiLabelSetText(scrHandle, SoundOptionId, soundOptionList[curOption]); + GfParmReleaseHandle(paramHandle); } @@ -118,17 +123,22 @@ static void changeSoundState(void *vp) GfuiLabelSetText(scrHandle, SoundOptionId, soundOptionList[curOption]); } -/*// Volume +// Volume static void changeVolume(void * ) { char *val; char buf[256]; val = GfuiEditboxGetString(scrHandle, VolumeValueId); sscanf(val, "%g", &VolumeValue); + if (VolumeValue > 100.0f) { + VolumeValue = 100.0f; + } + else if (VolumeValue < 0.0f) { + VolumeValue = 0.0f; + } sprintf(buf, "%g", VolumeValue); GfuiEditboxSetString(scrHandle, VolumeValueId, buf); } -*/ static void onActivate(void * /* dummy */) { @@ -158,6 +168,8 @@ void * SoundMenuInit(void *prevMenu) CreateButtonControl(scrHandle,param,"accept",NULL,saveSoundOption); CreateButtonControl(scrHandle,param,"cancel",prevMenu,GfuiScreenActivate); + VolumeValueId = CreateEditControl(scrHandle,param,"volumeedit",NULL,NULL,changeVolume); + GfParmReleaseHandle(param); GfuiAddKey(scrHandle, 13, "Save", NULL, saveSoundOption, NULL); diff --git a/src/modules/graphic/ssggraph/OpenalSoundInterface.cpp b/src/modules/graphic/ssggraph/OpenalSoundInterface.cpp index 0ece9196..d43547e8 100644 --- a/src/modules/graphic/ssggraph/OpenalSoundInterface.cpp +++ b/src/modules/graphic/ssggraph/OpenalSoundInterface.cpp @@ -132,7 +132,6 @@ OpenalSoundInterface::OpenalSoundInterface(float sampling_rate, int n_channels): } engpri = NULL; - global_gain = 1.0f; // initialise mappings grass.schar = &CarSoundData::grass; diff --git a/src/modules/graphic/ssggraph/PlibSoundInterface.cpp b/src/modules/graphic/ssggraph/PlibSoundInterface.cpp index 31a25cdf..a0e9116f 100644 --- a/src/modules/graphic/ssggraph/PlibSoundInterface.cpp +++ b/src/modules/graphic/ssggraph/PlibSoundInterface.cpp @@ -30,7 +30,6 @@ PlibSoundInterface::PlibSoundInterface(float sampling_rate, int n_channels) : So sched->setMaxConcurrent (n_channels); engpri = NULL; car_src = NULL; - global_gain = 1.0f; // initialise mappings grass.schar = &CarSoundData::grass; diff --git a/src/modules/graphic/ssggraph/SoundInterface.cpp b/src/modules/graphic/ssggraph/SoundInterface.cpp index e121b7f7..340bb94e 100644 --- a/src/modules/graphic/ssggraph/SoundInterface.cpp +++ b/src/modules/graphic/ssggraph/SoundInterface.cpp @@ -52,6 +52,7 @@ SoundInterface::SoundInterface(float sampling_rate, int n_channels) } else if (n_engine_sounds > MAX_N_ENGINE_SOUNDS) { n_engine_sounds = MAX_N_ENGINE_SOUNDS; } + global_gain = 1.0f; } void SoundInterface::SortSingleQueue (CarSoundData** car_sound_data, QueueSoundMap* smap, int n_cars) diff --git a/src/modules/graphic/ssggraph/SoundInterface.h b/src/modules/graphic/ssggraph/SoundInterface.h index a63ded0e..7b3fdc79 100644 --- a/src/modules/graphic/ssggraph/SoundInterface.h +++ b/src/modules/graphic/ssggraph/SoundInterface.h @@ -103,7 +103,7 @@ class SoundInterface { std::vector sound_list; ///< keeps track of sounds used SoundPri* engpri; ///< the engine priority, used for sorting - /// The following are mappings for sound prioritisation + /// The following are mappings for sound prioritisation QueueSoundMap road; QueueSoundMap grass; QueueSoundMap grass_skid; @@ -112,33 +112,36 @@ class SoundInterface { QueueSoundMap turbo; QueueSoundMap axle; - /** Find the max amplitude sound in car_sound_data and put it in smap */ + /// Global gain [0, 1] + float global_gain; + + /** Find the max amplitude sound in car_sound_data and put it in smap */ void SortSingleQueue (CarSoundData** car_sound_data, QueueSoundMap* smap, int n_cars); - /** Using the smap->id, get the appropriate entry in - car_sound_data and call apprioriate methods for smap->snd in order - to play the sound.*/ + /** Using the smap->id, get the appropriate entry in + car_sound_data and call apprioriate methods for smap->snd in order + to play the sound.*/ void SetMaxSoundCar(CarSoundData** car_sound_data, QueueSoundMap* smap); public: - /// Make a new sound interface + /// Make a new sound interface SoundInterface(float sampling_rate, int n_channels); - /// Destructor - does nothing + /// Destructor - does nothing virtual ~SoundInterface() {} - /// Set the number of cars - must be defined in children classes + /// Set the number of cars - must be defined in children classes virtual void setNCars(int n_cars) = 0; - /// Add a new sample - must be defined in children classes + /// Add a new sample - must be defined in children classes virtual TorcsSound* addSample (const char* filename, int flags = (ACTIVE_VOLUME|ACTIVE_PITCH), bool loop = false, bool static_pool = true) = 0; - /// initialised the pool of shared sources + /// initialised the pool of shared sources virtual void initSharedSourcePool() {} void setSkidSound (const char* sound_name) @@ -214,6 +217,7 @@ class SoundInterface { TorcsSound* sound = addSample (sound_name, 0, false); gear_change_sound = sound; } + /// Update sound for a given observer. virtual void update(CarSoundData** car_sound_data, int n_cars, sgVec3 p_obs, sgVec3 u_obs, @@ -221,10 +225,15 @@ class SoundInterface { { // do nothing } - virtual float getGlobalGain() {return 1.0f;} + + virtual float getGlobalGain() + { + return global_gain; + } + virtual void setGlobalGain(float g) { - fprintf (stderr, "Warning, gain setting not supported\n"); + global_gain = (g < 0.0 ? 0.0 : g > 1.0 ? 1.0 : g); } }; @@ -245,8 +254,7 @@ class PlibSoundInterface : public SoundInterface { SoundSource tyre_src[4]; void DopplerShift (SoundChar* sound, float* p_src, float* u_src, float* p, float* u); void SetMaxSoundCar(CarSoundData** car_sound_data, QueueSoundMap* smap); - float global_gain; - public: +public: PlibSoundInterface(float sampling_rate, int n_channels); virtual ~PlibSoundInterface(); virtual void setNCars(int n_cars); @@ -278,7 +286,6 @@ class OpenalSoundInterface : public SoundInterface { SoundSource tyre_src[4]; ALCcontext* cc; ALCdevice* dev; - float global_gain; int OSI_MAX_BUFFERS; int OSI_MAX_SOURCES; int OSI_MAX_STATIC_SOURCES; diff --git a/src/modules/graphic/ssggraph/grsound.cpp b/src/modules/graphic/ssggraph/grsound.cpp index 6be76eeb..40de8d15 100644 --- a/src/modules/graphic/ssggraph/grsound.cpp +++ b/src/modules/graphic/ssggraph/grsound.cpp @@ -80,7 +80,7 @@ void grInitSound(tSituation* s, int ncars) case DISABLED: return; default: - GfOut (" -- Unknown sound mode %d\n", sound_mode); + GfError ("Error: Unknown sound mode %d (%s)\n", sound_mode, optionName); exit(-1); } @@ -94,27 +94,27 @@ void grInitSound(tSituation* s, int ncars) tCarElt *car = s->cars[i]; const char* param; char filename[512]; - FILE *file = NULL; + FILE *file = NULL; // ENGINE PARAMS tdble rpm_scale; param = GfParmGetStr(handle, "Sound", "engine sample", "engine-1.wav"); rpm_scale = GfParmGetNum(handle, "Sound", "rpm scale", NULL, 1.0); - sprintf (filename, "cars/%s/%s", car->_carName, param); - file = fopen(filename, "r"); - if (!file) - { - sprintf (filename, "data/sound/%s", param); - } - else - { - fclose(file); - } + sprintf (filename, "cars/%s/%s", car->_carName, param); + file = fopen(filename, "r"); + if (!file) + { + sprintf (filename, "data/sound/%s", param); + } + else + { + fclose(file); + } car_sound_data[car->index] = new CarSoundData (car->index, sound_interface); TorcsSound* engine_sound = sound_interface->addSample(filename, ACTIVE_VOLUME | ACTIVE_PITCH | ACTIVE_LP_FILTER, true, false); car_sound_data[i]->setEngineSound (engine_sound, rpm_scale); - + // TURBO PARAMS float default_turbo_rpm = 100.0f;//0.5f*car->_enginerpmMaxTq; bool turbo_on; @@ -127,7 +127,7 @@ void grInitSound(tSituation* s, int ncars) } turbo_on = false; } - + float turbo_rpm = GfParmGetNum(handle, SECT_ENGINE, PRM_TURBO_RPM, NULL, default_turbo_rpm); float turbo_lag = GfParmGetNum(handle, SECT_ENGINE, PRM_TURBO_LAG, NULL, 1.0f); car_sound_data[i]->setTurboParameters (turbo_on, turbo_rpm, turbo_lag); @@ -144,10 +144,10 @@ void grInitSound(tSituation* s, int ncars) sound_interface->setTurboSound("data/sound/turbo1.wav"); sound_interface->setBackfireLoopSound("data/sound/backfire_loop.wav"); - for (i = 0; i < NB_CRASH_SOUND; i++) { + for (i = 0; i < NB_CRASH_SOUND; i++) { sprintf(buf, "data/sound/crash%d.wav", i+1); sound_interface->setCrashSound(buf, i); - } + } sound_interface->setBangSound("data/sound/boom.wav"); sound_interface->setBottomCrashSound("data/sound/bottom_crash.wav"); @@ -155,7 +155,8 @@ void grInitSound(tSituation* s, int ncars) sound_interface->setGearChangeSound("data/sound/gear_change1.wav"); sound_interface->setNCars(ncars); - soundInitialized = 1; + soundInitialized = 1; + // Must happen after all static non-shared have been allocated. sound_interface->initSharedSourcePool(); } @@ -166,16 +167,16 @@ grShutdownSound(int ncars) { GfOut("-- grShutdownSound\n"); - if (sound_mode == DISABLED) { - return; - } + if (sound_mode == DISABLED) { + return; + } if (!soundInitialized) { return; } soundInitialized = 0; - delete sound_interface; + delete sound_interface; if (__slPendingError) { GfOut("!!! error ignored: %s\n", __slPendingError); @@ -199,11 +200,12 @@ grRefreshSound(tSituation *s, cGrCamera *camera) } lastUpdated = s->currentTime; - tCarElt *car;//= s->cars[s->current]; + tCarElt *car;//= s->cars[s->current]; - // TODO: Fix for a lot of cars. I guess in this implementation we can change the Update() call to have _ncars = 1? + // TODO: Fix for a lot of cars. + // I guess in this implementation we can change the Update() call to have _ncars = 1? - // TODO: Just consider cars near the camera, doing computations just for them? + // TODO: Just consider cars near the camera, doing computations just for them? if (camera) { sgVec3* p_camera = camera->getPosv(); @@ -224,9 +226,9 @@ grRefreshSound(tSituation *s, cGrCamera *camera) car_sound_data[car->index]->update(car); } - sound_interface->update (car_sound_data, s->_ncars, *p_camera, *u_camera, c_camera, *a_camera); - - + sound_interface->update (car_sound_data, s->_ncars, + *p_camera, *u_camera, c_camera, *a_camera); } + return 0.0f; }