|
|
@ -20,9 +20,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
#include "../mwmechanics/actorutil.hpp"
|
|
|
|
#include "../mwmechanics/actorutil.hpp"
|
|
|
|
|
|
|
|
|
|
|
|
#include "sound_output.hpp"
|
|
|
|
|
|
|
|
#include "sound_buffer.hpp"
|
|
|
|
#include "sound_buffer.hpp"
|
|
|
|
#include "sound_decoder.hpp"
|
|
|
|
#include "sound_decoder.hpp"
|
|
|
|
|
|
|
|
#include "sound_output.hpp"
|
|
|
|
#include "sound.hpp"
|
|
|
|
#include "sound.hpp"
|
|
|
|
|
|
|
|
|
|
|
|
#include "openal_output.hpp"
|
|
|
|
#include "openal_output.hpp"
|
|
|
@ -577,6 +577,9 @@ namespace MWSound
|
|
|
|
Sound_Buffer *sfx = loadSound(Misc::StringUtils::lowerCase(soundId));
|
|
|
|
Sound_Buffer *sfx = loadSound(Misc::StringUtils::lowerCase(soundId));
|
|
|
|
if(!sfx) return nullptr;
|
|
|
|
if(!sfx) return nullptr;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Only one copy of given sound can be played at time, so stop previous copy
|
|
|
|
|
|
|
|
stopSound(sfx, MWWorld::ConstPtr());
|
|
|
|
|
|
|
|
|
|
|
|
Sound *sound = getSoundRef();
|
|
|
|
Sound *sound = getSoundRef();
|
|
|
|
sound->init(volume * sfx->mVolume, volumeFromType(type), pitch, mode|type|Play_2D);
|
|
|
|
sound->init(volume * sfx->mVolume, volumeFromType(type), pitch, mode|type|Play_2D);
|
|
|
|
if(!mOutput->playSound(sound, sfx->mHandle, offset))
|
|
|
|
if(!mOutput->playSound(sound, sfx->mHandle, offset))
|
|
|
@ -611,7 +614,7 @@ namespace MWSound
|
|
|
|
return nullptr;
|
|
|
|
return nullptr;
|
|
|
|
|
|
|
|
|
|
|
|
// Only one copy of given sound can be played at time on ptr, so stop previous copy
|
|
|
|
// Only one copy of given sound can be played at time on ptr, so stop previous copy
|
|
|
|
stopSound3D(ptr, soundId);
|
|
|
|
stopSound(sfx, ptr);
|
|
|
|
|
|
|
|
|
|
|
|
bool played;
|
|
|
|
bool played;
|
|
|
|
Sound *sound = getSoundRef();
|
|
|
|
Sound *sound = getSoundRef();
|
|
|
@ -678,12 +681,11 @@ namespace MWSound
|
|
|
|
mOutput->finishSound(sound);
|
|
|
|
mOutput->finishSound(sound);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SoundManager::stopSound3D(const MWWorld::ConstPtr &ptr, const std::string& soundId)
|
|
|
|
void SoundManager::stopSound(Sound_Buffer *sfx, const MWWorld::ConstPtr &ptr)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
SoundMap::iterator snditer = mActiveSounds.find(ptr);
|
|
|
|
SoundMap::iterator snditer = mActiveSounds.find(ptr);
|
|
|
|
if(snditer != mActiveSounds.end())
|
|
|
|
if(snditer != mActiveSounds.end())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Sound_Buffer *sfx = loadSound(Misc::StringUtils::lowerCase(soundId));
|
|
|
|
|
|
|
|
for(SoundBufferRefPair &snd : snditer->second)
|
|
|
|
for(SoundBufferRefPair &snd : snditer->second)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if(snd.second == sfx)
|
|
|
|
if(snd.second == sfx)
|
|
|
@ -692,6 +694,22 @@ namespace MWSound
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void SoundManager::stopSound(const std::string& soundId)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
Sound_Buffer *sfx = loadSound(Misc::StringUtils::lowerCase(soundId));
|
|
|
|
|
|
|
|
if (!sfx) return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
stopSound(sfx, MWWorld::ConstPtr());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void SoundManager::stopSound3D(const MWWorld::ConstPtr &ptr, const std::string& soundId)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
Sound_Buffer *sfx = loadSound(Misc::StringUtils::lowerCase(soundId));
|
|
|
|
|
|
|
|
if (!sfx) return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
stopSound(sfx, ptr);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SoundManager::stopSound3D(const MWWorld::ConstPtr &ptr)
|
|
|
|
void SoundManager::stopSound3D(const MWWorld::ConstPtr &ptr)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
SoundMap::iterator snditer = mActiveSounds.find(ptr);
|
|
|
|
SoundMap::iterator snditer = mActiveSounds.find(ptr);
|
|
|
@ -715,6 +733,7 @@ namespace MWSound
|
|
|
|
mOutput->finishSound(sndbuf.first);
|
|
|
|
mOutput->finishSound(sndbuf.first);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for(SaySoundMap::value_type &snd : mActiveSaySounds)
|
|
|
|
for(SaySoundMap::value_type &snd : mActiveSaySounds)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if(!snd.first.isEmpty() && snd.first != MWMechanics::getPlayer() && snd.first.getCell() == cell)
|
|
|
|
if(!snd.first.isEmpty() && snd.first != MWMechanics::getPlayer() && snd.first.getCell() == cell)
|
|
|
@ -722,20 +741,6 @@ namespace MWSound
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SoundManager::stopSound(const std::string& soundId)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
SoundMap::iterator snditer = mActiveSounds.find(MWWorld::ConstPtr());
|
|
|
|
|
|
|
|
if(snditer != mActiveSounds.end())
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
Sound_Buffer *sfx = loadSound(Misc::StringUtils::lowerCase(soundId));
|
|
|
|
|
|
|
|
for(SoundBufferRefPair &sndbuf : snditer->second)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if(sndbuf.second == sfx)
|
|
|
|
|
|
|
|
mOutput->finishSound(sndbuf.first);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void SoundManager::fadeOutSound3D(const MWWorld::ConstPtr &ptr,
|
|
|
|
void SoundManager::fadeOutSound3D(const MWWorld::ConstPtr &ptr,
|
|
|
|
const std::string& soundId, float duration)
|
|
|
|
const std::string& soundId, float duration)
|
|
|
|
{
|
|
|
|
{
|
|
|
|