View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0002517 | FSSCP | sound | public | 2011-10-08 15:51 | 2011-10-10 16:52 |
| Reporter | torc | Assigned To | Eli2 | ||
| Priority | normal | Severity | minor | Reproducibility | always |
| Status | resolved | Resolution | fixed | ||
| Product Version | 3.6.13 | ||||
| Fixed in Version | 3.6.13 | ||||
| Summary | 0002517: loop sounds are always at 100% volume locked, and afterburner fade out sound not work | ||||
| Description | the loop sounds,as i said,are locked to 100% volume level,plus, when afterburner are engaged,before they running dry,the sound should fade out: Now the sound start clipping at the end of the loop. | ||||
| Tags | No tags attached. | ||||
|
2011-10-08 16:23
|
SoundPatchFix.svn.patch (4,050 bytes)
Index: code/sound/sound.cpp
===================================================================
--- code/sound/sound.cpp
+++ code/sound/sound.cpp
@@ -56,7 +56,20 @@ float Master_voice_volume = 0.7f; // range is 0 -> 1, used for all voice playbac
unsigned int SND_ENV_DEFAULT = 0;
-SCP_list<int> currentlyLoopingSoundHandles;
+struct LoopingSoundInfo {
+ int dsHandle;
+ float defaultVolume; //!< The default volume of this sound (from game_snd)
+ float dynamicVolume; //!< The dynamic volume before scripted volume adjustment is applied (is updated via snd_set_volume)
+
+ LoopingSoundInfo(int dsHandle, float defaultVolume, float dynamicVolume):
+ dsHandle(dsHandle),
+ defaultVolume(defaultVolume),
+ dynamicVolume(dynamicVolume)
+ {
+ }
+};
+
+SCP_list<LoopingSoundInfo> currentlyLoopingSoundInfos;
//For the adjust-audio-volume sexp
float aav_voice_volume = 1.0f;
@@ -811,7 +824,7 @@ int snd_play_looping( game_snd *gs, float pan, int start_loop, int stop_loop, fl
handle = ds_play( snd->sid, gs->id_sig, DS_MUST_PLAY, volume, pan, 1);
if(handle != -1 && scriptingUpdateVolume) {
- currentlyLoopingSoundHandles.push_back(handle);
+ currentlyLoopingSoundInfos.push_back(LoopingSoundInfo(handle, gs->default_volume, vol_scale));
}
}
@@ -834,12 +847,11 @@ void snd_stop( int sig )
if ( channel == -1 )
return;
- SCP_list<int>::iterator iter = currentlyLoopingSoundHandles.begin();
- while (iter != currentlyLoopingSoundHandles.end())
+ SCP_list<LoopingSoundInfo>::iterator iter = currentlyLoopingSoundInfos.begin();
+ while (iter != currentlyLoopingSoundInfos.end())
{
- int handle = *iter;
- if(handle == sig) {
- iter = currentlyLoopingSoundHandles.erase(iter);
+ if(iter->dsHandle == sig) {
+ iter = currentlyLoopingSoundInfos.erase(iter);
} else {
++iter;
}
@@ -859,18 +871,16 @@ void snd_stop_all()
if (!ds_initialized)
return;
- currentlyLoopingSoundHandles.clear();
+ currentlyLoopingSoundInfos.clear();
ds_stop_channel_all();
}
-// ---------------------------------------------------------------------------------------
-// snd_set_volume()
-//
-// Set the volume of a currently playing sound
-//
-// parameters: sig => handle to sound, what is returned from snd_play()
-// volume => volume of sound (range: 0.0 -> 1.0)
-//
+/**
+ * Set the volume of a currently playing sound
+ *
+ * @param sig handle to sound, what is returned from snd_play()
+ * @param volume volume of sound (range: 0.0 -> 1.0)
+ */
void snd_set_volume( int sig, float volume )
{
int channel;
@@ -888,8 +898,23 @@ void snd_set_volume( int sig, float volume )
return;
}
- new_volume = volume * (Master_sound_volume * aav_effect_volume);
- ds_set_volume( channel, new_volume );
+ bool isLoopingSound = false;
+
+ SCP_list<LoopingSoundInfo>::iterator iter;
+ for (iter = currentlyLoopingSoundInfos.begin(); iter != currentlyLoopingSoundInfos.end(); ++iter) {
+ if(iter->dsHandle == sig) {
+ iter->dynamicVolume = volume;
+
+ isLoopingSound = true;
+ break;
+ }
+ }
+
+ //looping sound volumes are updated in snd_do_frame
+ if(!isLoopingSound) {
+ new_volume = volume * (Master_sound_volume * aav_effect_volume);
+ ds_set_volume( channel, new_volume );
+ }
}
// ---------------------------------------------------------------------------------------
@@ -1345,10 +1370,11 @@ void snd_do_frame()
adjust_volume_on_frame(&aav_voice_volume, &aav_data[AAV_VOICE]);
adjust_volume_on_frame(&aav_effect_volume, &aav_data[AAV_EFFECTS]);
- SCP_list<int>::iterator iter;
- for (iter = currentlyLoopingSoundHandles.begin(); iter != currentlyLoopingSoundHandles.end(); ++iter) {
- int handle = *iter;
- snd_set_volume(handle, 1.0f);
+ SCP_list<LoopingSoundInfo>::iterator iter;
+ for (iter = currentlyLoopingSoundInfos.begin(); iter != currentlyLoopingSoundInfos.end(); ++iter) {
+
+ float new_volume = iter->defaultVolume * iter->dynamicVolume * (Master_sound_volume * aav_effect_volume);
+ ds_set_volume(ds_get_channel(iter->dsHandle), new_volume);
}
ds_do_frame();
|
|
|
I attached a patch, that should fix this issue. Tested by torc. |
|
|
I've succesfully tested the patch as well - committed to trunk in 7885 |
|
|
it works good... issue solved |
|
|
Crediting Eli2 for the fix, per request. |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2011-10-08 15:51 | torc | New Issue | |
| 2011-10-08 16:23 | Eli2 | File Added: SoundPatchFix.svn.patch | |
| 2011-10-08 16:24 | Eli2 | Note Added: 0012883 | |
| 2011-10-09 11:09 | niffiwan | Note Added: 0012887 | |
| 2011-10-09 11:13 | niffiwan | Status | new => assigned |
| 2011-10-09 11:13 | niffiwan | Assigned To | => niffiwan |
| 2011-10-09 11:13 | niffiwan | Status | assigned => feedback |
| 2011-10-09 19:01 | torc | Note Added: 0012888 | |
| 2011-10-10 09:38 | niffiwan | Status | feedback => resolved |
| 2011-10-10 09:38 | niffiwan | Fixed in Version | => 3.6.13 |
| 2011-10-10 09:38 | niffiwan | Resolution | open => fixed |
| 2011-10-10 16:52 | Goober5000 | Note Added: 0012890 | |
| 2011-10-10 16:52 | Goober5000 | Assigned To | niffiwan => Eli2 |