| 207 | } |
| 208 | |
| 209 | bool AudioSource::play3D(double delayTime) { |
| 210 | AssertIf(_flags.isOn(Node::Cleanup), "can not operate on an invalid AudioSource"); |
| 211 | if (_handle != 0 && SharedAudio.isVoicePlaying(_handle)) { |
| 212 | return false; |
| 213 | } |
| 214 | _is3D = true; |
| 215 | if (auto audioFile = SharedAudioCache.load(_filename)) { |
| 216 | uint32_t busHandle = _bus ? _bus->getHandle() : 0; |
| 217 | Vec4 point; |
| 218 | Matrix::mulVec4(point, getWorld(), {0.0f, 0.0f, 0.0f, 1.0f}); |
| 219 | auto soloud = SharedAudio.getSoLoud(); |
| 220 | if (delayTime < 0) { |
| 221 | _handle = soloud->play3d(*audioFile->getSource(), point.x, point.y, point.z, 0.0f, 0.0f, 0.0f, _volume, false, busHandle); |
| 222 | } else { |
| 223 | _handle = soloud->play3dClocked(delayTime, *audioFile->getSource(), point.x, point.y, point.z, 0.0f, 0.0f, 0.0f, _volume, busHandle); |
| 224 | } |
| 225 | soloud->setInaudibleBehavior(_handle, true, false); |
| 226 | if (_protected) { |
| 227 | soloud->setProtectVoice(_handle, true); |
| 228 | } |
| 229 | if (_playSpeed != 1.0f) { |
| 230 | soloud->setRelativePlaySpeed(_handle, _playSpeed); |
| 231 | } |
| 232 | if (_loopStartTime > 0.0) { |
| 233 | soloud->setLoopPoint(_handle, _loopStartTime); |
| 234 | } |
| 235 | soloud->set3dSourceVelocity(_handle, _velocity.x, _velocity.y, _velocity.z); |
| 236 | soloud->set3dSourceMinMaxDistance(_handle, _minDistance, _maxDistance); |
| 237 | soloud->set3dSourceAttenuation(_handle, _attenuation, _attenuationFactor); |
| 238 | soloud->set3dSourceDopplerFactor(_handle, _dopplerFactor); |
| 239 | WRef<AudioSource> self(this); |
| 240 | SharedAudio.addRef(_handle, audioFile, [self](uint32_t handle) { |
| 241 | if (self && self->_handle == handle) { |
| 242 | self->_handle = 0; |
| 243 | self->emit("AudioEnd"sv, handle); |
| 244 | if (self->_autoRemove) { |
| 245 | self->removeFromParent(); |
| 246 | } |
| 247 | } |
| 248 | }); |
| 249 | return true; |
| 250 | } |
| 251 | return false; |
| 252 | } |
| 253 | |
| 254 | void AudioSource::setLoopPoint(double loopStartTime) { |
| 255 | _loopStartTime = loopStartTime; |
no test coverage detected