diff options
Diffstat (limited to 'extern/audaspace')
-rw-r--r-- | extern/audaspace/include/devices/SoftwareDevice.h | 3 | ||||
-rw-r--r-- | extern/audaspace/src/devices/SoftwareDevice.cpp | 19 |
2 files changed, 21 insertions, 1 deletions
diff --git a/extern/audaspace/include/devices/SoftwareDevice.h b/extern/audaspace/include/devices/SoftwareDevice.h index e92a35e5402..a350550048b 100644 --- a/extern/audaspace/include/devices/SoftwareDevice.h +++ b/extern/audaspace/include/devices/SoftwareDevice.h @@ -72,6 +72,9 @@ protected: /// The channel mapper reader in between. std::shared_ptr<ChannelMapperReader> m_mapper; + /// Whether the source is being read for the first time. + bool m_first_reading; + /// Whether to keep the source if end of it is reached. bool m_keep; diff --git a/extern/audaspace/src/devices/SoftwareDevice.cpp b/extern/audaspace/src/devices/SoftwareDevice.cpp index 7186f8b9442..c8c1c6081c2 100644 --- a/extern/audaspace/src/devices/SoftwareDevice.cpp +++ b/extern/audaspace/src/devices/SoftwareDevice.cpp @@ -78,7 +78,7 @@ bool SoftwareDevice::SoftwareHandle::pause(bool keep) } SoftwareDevice::SoftwareHandle::SoftwareHandle(SoftwareDevice* device, std::shared_ptr<IReader> reader, std::shared_ptr<PitchReader> pitch, std::shared_ptr<ResampleReader> resampler, std::shared_ptr<ChannelMapperReader> mapper, bool keep) : - m_reader(reader), m_pitch(pitch), m_resampler(resampler), m_mapper(mapper), m_keep(keep), m_user_pitch(1.0f), m_user_volume(1.0f), m_user_pan(0.0f), m_volume(0.0f), m_old_volume(0.0f), m_loopcount(0), + m_reader(reader), m_pitch(pitch), m_resampler(resampler), m_mapper(mapper), m_first_reading(true), m_keep(keep), m_user_pitch(1.0f), m_user_volume(1.0f), m_user_pan(0.0f), m_volume(0.0f), m_old_volume(0.0f), m_loopcount(0), m_relative(true), m_volume_max(1.0f), m_volume_min(0), m_distance_max(std::numeric_limits<float>::max()), m_distance_reference(1.0f), m_attenuation(1.0f), m_cone_angle_outer(M_PI), m_cone_angle_inner(M_PI), m_cone_volume_outer(0), m_flags(RENDER_CONE), m_stop(nullptr), m_stop_data(nullptr), m_status(STATUS_PLAYING), m_device(device) @@ -106,6 +106,14 @@ void SoftwareDevice::SoftwareHandle::update() if(m_pitch->getSpecs().channels != CHANNELS_MONO) { m_volume = m_user_volume; + + // we don't know a previous volume if this source has never been read before + if(m_first_reading) + { + m_old_volume = m_volume; + m_first_reading = false; + } + m_pitch->setPitch(m_user_pitch); return; } @@ -214,6 +222,13 @@ void SoftwareDevice::SoftwareHandle::update() m_volume *= m_user_volume; } + // we don't know a previous volume if this source has never been read before + if(m_first_reading) + { + m_old_volume = m_volume; + m_first_reading = false; + } + // 3D Cue Quaternion orientation; @@ -754,6 +769,8 @@ void SoftwareDevice::mix(data_t* buffer, int length) { m_mixer->mix(buf, pos, len, sound->m_volume, sound->m_old_volume); + sound->m_old_volume = sound->m_volume; + pos += len; if(sound->m_loopcount > 0) |