mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-26 09:35:28 +00:00
Keep a handle on played sounds
This commit is contained in:
parent
656863ec6e
commit
9adf1e8461
@ -76,6 +76,8 @@ namespace MWSound
|
|||||||
|
|
||||||
SoundManager::~SoundManager()
|
SoundManager::~SoundManager()
|
||||||
{
|
{
|
||||||
|
LooseSounds.clear();
|
||||||
|
ActiveSounds.clear();
|
||||||
if(mMusic)
|
if(mMusic)
|
||||||
mMusic->Stop();
|
mMusic->Stop();
|
||||||
mMusic.reset();
|
mMusic.reset();
|
||||||
@ -113,7 +115,7 @@ namespace MWSound
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add a sound to the list and play it
|
// Add a sound to the list and play it
|
||||||
void SoundManager::add(const std::string &file,
|
void SoundManager::play3d(const std::string &file,
|
||||||
MWWorld::Ptr ptr,
|
MWWorld::Ptr ptr,
|
||||||
const std::string &id,
|
const std::string &id,
|
||||||
float volume, float pitch,
|
float volume, float pitch,
|
||||||
@ -125,7 +127,10 @@ namespace MWSound
|
|||||||
Sound *sound;
|
Sound *sound;
|
||||||
std::auto_ptr<Sound_Decoder> decoder(new DEFAULT_DECODER);
|
std::auto_ptr<Sound_Decoder> decoder(new DEFAULT_DECODER);
|
||||||
sound = Output->PlaySound3D(file, decoder, ptr, volume, pitch, min, max, loop);
|
sound = Output->PlaySound3D(file, decoder, ptr, volume, pitch, min, max, loop);
|
||||||
delete sound;
|
if(untracked)
|
||||||
|
LooseSounds[id] = SoundPtr(sound);
|
||||||
|
else
|
||||||
|
ActiveSounds[ptr][id] = SoundPtr(sound);
|
||||||
}
|
}
|
||||||
catch(std::exception &e)
|
catch(std::exception &e)
|
||||||
{
|
{
|
||||||
@ -137,6 +142,22 @@ namespace MWSound
|
|||||||
// remove the entire object and stop all its sounds.
|
// remove the entire object and stop all its sounds.
|
||||||
void SoundManager::remove(MWWorld::Ptr ptr, const std::string &id)
|
void SoundManager::remove(MWWorld::Ptr ptr, const std::string &id)
|
||||||
{
|
{
|
||||||
|
SoundMap::iterator snditer = ActiveSounds.find(ptr);
|
||||||
|
if(snditer == ActiveSounds.end())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(!id.empty())
|
||||||
|
{
|
||||||
|
IDMap::iterator iditer = snditer->second.find(id);
|
||||||
|
if(iditer != snditer->second.end())
|
||||||
|
{
|
||||||
|
snditer->second.erase(iditer);
|
||||||
|
if(snditer->second.size() == 0)
|
||||||
|
ActiveSounds.erase(snditer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ActiveSounds.erase(snditer);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SoundManager::isPlaying(MWWorld::Ptr ptr, const std::string &id) const
|
bool SoundManager::isPlaying(MWWorld::Ptr ptr, const std::string &id) const
|
||||||
@ -149,6 +170,14 @@ namespace MWSound
|
|||||||
// Remove all references to objects belonging to a given cell
|
// Remove all references to objects belonging to a given cell
|
||||||
void SoundManager::removeCell(const MWWorld::Ptr::CellStore *cell)
|
void SoundManager::removeCell(const MWWorld::Ptr::CellStore *cell)
|
||||||
{
|
{
|
||||||
|
SoundMap::iterator snditer = ActiveSounds.begin();
|
||||||
|
while(snditer != ActiveSounds.end())
|
||||||
|
{
|
||||||
|
if(snditer->first.getCell() == cell)
|
||||||
|
ActiveSounds.erase(snditer++);
|
||||||
|
else
|
||||||
|
snditer++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoundManager::updatePositions(MWWorld::Ptr ptr)
|
void SoundManager::updatePositions(MWWorld::Ptr ptr)
|
||||||
@ -260,7 +289,7 @@ namespace MWSound
|
|||||||
// The range values are not tested
|
// The range values are not tested
|
||||||
std::string filePath = Files::FileListLocator(mSoundFiles, filename, mFSStrict, true);
|
std::string filePath = Files::FileListLocator(mSoundFiles, filename, mFSStrict, true);
|
||||||
if(!filePath.empty())
|
if(!filePath.empty())
|
||||||
add(filePath, ptr, "_say_sound", 1, 1, 100, 20000, false);
|
play3d(filePath, ptr, "_say_sound", 1, 1, 100, 20000, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SoundManager::sayDone(MWWorld::Ptr ptr) const
|
bool SoundManager::sayDone(MWWorld::Ptr ptr) const
|
||||||
@ -280,7 +309,7 @@ namespace MWSound
|
|||||||
Sound *sound;
|
Sound *sound;
|
||||||
std::auto_ptr<Sound_Decoder> decoder(new DEFAULT_DECODER);
|
std::auto_ptr<Sound_Decoder> decoder(new DEFAULT_DECODER);
|
||||||
sound = Output->PlaySound(file, decoder, volume, pitch, loop);
|
sound = Output->PlaySound(file, decoder, volume, pitch, loop);
|
||||||
delete sound;
|
LooseSounds[soundId] = SoundPtr(sound);
|
||||||
}
|
}
|
||||||
catch(std::exception &e)
|
catch(std::exception &e)
|
||||||
{
|
{
|
||||||
@ -298,7 +327,7 @@ namespace MWSound
|
|||||||
float min, max;
|
float min, max;
|
||||||
std::string file = lookup(soundId, volume, min, max);
|
std::string file = lookup(soundId, volume, min, max);
|
||||||
if(!file.empty())
|
if(!file.empty())
|
||||||
add(file, ptr, soundId, volume, pitch, min, max, false);
|
play3d(file, ptr, soundId, volume, pitch, min, max, false);
|
||||||
else
|
else
|
||||||
std::cout << "Sound file " << soundId << " not found, skipping.\n";
|
std::cout << "Sound file " << soundId << " not found, skipping.\n";
|
||||||
}
|
}
|
||||||
@ -315,6 +344,9 @@ namespace MWSound
|
|||||||
|
|
||||||
void SoundManager::stopSound(const std::string& soundId)
|
void SoundManager::stopSound(const std::string& soundId)
|
||||||
{
|
{
|
||||||
|
IDMap::iterator iditer = LooseSounds.find(soundId);
|
||||||
|
if(iditer != LooseSounds.end())
|
||||||
|
LooseSounds.erase(iditer);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SoundManager::getSoundPlaying(MWWorld::Ptr ptr, const std::string& soundId) const
|
bool SoundManager::getSoundPlaying(MWWorld::Ptr ptr, const std::string& soundId) const
|
||||||
@ -382,7 +414,7 @@ namespace MWSound
|
|||||||
{
|
{
|
||||||
//play sound
|
//play sound
|
||||||
std::cout << "Sound: " << go <<" Chance:" << chance << "\n";
|
std::cout << "Sound: " << go <<" Chance:" << chance << "\n";
|
||||||
playSound(go, 20.0, 1.0);
|
playSound(go, 1.0f, 1.0f);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
pos += chance;
|
pos += chance;
|
||||||
@ -397,14 +429,24 @@ namespace MWSound
|
|||||||
if(timePassed > (1.0f/30.0f))
|
if(timePassed > (1.0f/30.0f))
|
||||||
{
|
{
|
||||||
timePassed = 0.0f;
|
timePassed = 0.0f;
|
||||||
Ogre::Camera *cam = mEnvironment.mWorld->getPlayer().getRenderer()->getCamera();
|
|
||||||
|
|
||||||
|
Ogre::Camera *cam = mEnvironment.mWorld->getPlayer().getRenderer()->getCamera();
|
||||||
Ogre::Vector3 nPos, nDir, nUp;
|
Ogre::Vector3 nPos, nDir, nUp;
|
||||||
nPos = cam->getRealPosition();
|
nPos = cam->getRealPosition();
|
||||||
nDir = cam->getRealDirection();
|
nDir = cam->getRealDirection();
|
||||||
nUp = cam->getRealUp();
|
nUp = cam->getRealUp();
|
||||||
|
|
||||||
Output->UpdateListener(&nPos[0], &nDir[0], &nUp[0]);
|
Output->UpdateListener(&nPos[0], &nDir[0], &nUp[0]);
|
||||||
|
|
||||||
|
|
||||||
|
IDMap::iterator snditer = LooseSounds.begin();
|
||||||
|
while(snditer != LooseSounds.end())
|
||||||
|
{
|
||||||
|
if(!snditer->second->isPlaying())
|
||||||
|
LooseSounds.erase(snditer++);
|
||||||
|
else
|
||||||
|
snditer++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
updateRegionSound(duration);
|
updateRegionSound(duration);
|
||||||
|
@ -52,9 +52,15 @@ namespace MWSound
|
|||||||
// Points to the current playlist of music files stored in the music library
|
// Points to the current playlist of music files stored in the music library
|
||||||
const Files::PathContainer* mCurrentPlaylist;
|
const Files::PathContainer* mCurrentPlaylist;
|
||||||
|
|
||||||
|
typedef boost::shared_ptr<Sound> SoundPtr;
|
||||||
|
typedef std::map<std::string,SoundPtr> IDMap;
|
||||||
|
typedef std::map<MWWorld::Ptr,IDMap> SoundMap;
|
||||||
|
SoundMap ActiveSounds;
|
||||||
|
IDMap LooseSounds;
|
||||||
|
|
||||||
std::string lookup(const std::string &soundId,
|
std::string lookup(const std::string &soundId,
|
||||||
float &volume, float &min, float &max);
|
float &volume, float &min, float &max);
|
||||||
void add(const std::string &file,
|
void play3d(const std::string &file,
|
||||||
MWWorld::Ptr ptr, const std::string &id,
|
MWWorld::Ptr ptr, const std::string &id,
|
||||||
float volume, float pitch, float min, float max,
|
float volume, float pitch, float min, float max,
|
||||||
bool loop, bool untracked=false);
|
bool loop, bool untracked=false);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user