/* ** Command & Conquer Renegade(tm) ** Copyright 2025 Electronic Arts Inc. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . */ /*********************************************************************************************** *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S *** *********************************************************************************************** * * * Project Name : WWAudio * * * * $Archive:: /Commando/Code/WWAudio/FilteredSound.cpp $* * * * Author:: Patrick Smith * * * * $Modtime:: 1/25/02 12:09p $* * * * $Revision:: 5 $* * * *---------------------------------------------------------------------------------------------* * Functions: * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #include "filteredsound.h" #include "wwaudio.h" #include "soundscene.h" #include "soundchunkids.h" #include "persistfactory.h" #include "soundhandle.h" ////////////////////////////////////////////////////////////////////////////////// // // Static factories // ////////////////////////////////////////////////////////////////////////////////// SimplePersistFactoryClass _FilteredSoundPersistFactory; ///////////////////////////////////////////////////////////////////////////////// // // FilteredSoundClass // ///////////////////////////////////////////////////////////////////////////////// FilteredSoundClass::FilteredSoundClass (void) : m_hFilter (INVALID_MILES_HANDLE) { return ; } //////////////////////////////////////////////////////////////////////////////////////////////// // // FilteredSoundClass // //////////////////////////////////////////////////////////////////////////////////////////////// FilteredSoundClass::FilteredSoundClass (const FilteredSoundClass &src) : m_hFilter (INVALID_MILES_HANDLE), SoundPseudo3DClass (src) { (*this) = src; return ; } ///////////////////////////////////////////////////////////////////////////////// // // ~FilteredSoundClass // ///////////////////////////////////////////////////////////////////////////////// FilteredSoundClass::~FilteredSoundClass (void) { return ; } //////////////////////////////////////////////////////////////////////////////////////////////// // // operator= // //////////////////////////////////////////////////////////////////////////////////////////////// const FilteredSoundClass & FilteredSoundClass::operator= (const FilteredSoundClass &src) { // Call the base class SoundPseudo3DClass::operator= (src); return (*this); } ///////////////////////////////////////////////////////////////////////////////// // // Initialize_Miles_Handle // ///////////////////////////////////////////////////////////////////////////////// void FilteredSoundClass::Initialize_Miles_Handle (void) { SoundPseudo3DClass::Initialize_Miles_Handle (); m_hFilter = WWAudioClass::Get_Instance ()->Get_Reverb_Filter (); if ((m_SoundHandle != NULL) && (m_hFilter != INVALID_MILES_HANDLE)) { // // Pass the filter onto the sample // ::AIL_set_sample_processor (m_SoundHandle->Get_HSAMPLE (), DP_FILTER, m_hFilter); // // Change the reverb's settings to simulate a 'tinny' effect. // F32 reverb_level = 0.3F; F32 reverb_reflect = 0.01F; F32 reverb_decay = 0.535F; ::AIL_set_filter_sample_preference (m_SoundHandle->Get_HSAMPLE (), "Reverb level", &reverb_level); ::AIL_set_filter_sample_preference (m_SoundHandle->Get_HSAMPLE (), "Reverb reflect time", &reverb_reflect); ::AIL_set_filter_sample_preference (m_SoundHandle->Get_HSAMPLE (), "Reverb decay time", &reverb_decay); } Update_Volume (); return ; } ///////////////////////////////////////////////////////////////////////////////// // // Update_Volume // ///////////////////////////////////////////////////////////////////////////////// void FilteredSoundClass::Update_Volume (void) { if (m_SoundHandle != NULL) { // Determine the listener's position and the sound's position SoundSceneClass *scene = WWAudioClass::Get_Instance ()->Get_Sound_Scene (); if (scene != NULL) { Listener3DClass *listener = scene->Peek_2nd_Listener (); if (listener != NULL) { Vector3 listener_pos = listener->Get_Position (); Vector3 sound_pos = m_Transform.Get_Translation (); // Determine a normalized volume from the position float distance = (sound_pos - listener_pos).Quick_Length (); Update_Pseudo_Volume (distance); } } } return ; } ///////////////////////////////////////////////////////////////////////////////// // // Get_Factory // ///////////////////////////////////////////////////////////////////////////////// const PersistFactoryClass & FilteredSoundClass::Get_Factory (void) const { return _FilteredSoundPersistFactory; }