void CSoundManager::PlayAsGroup(const VfsPath& groupPath, CVector3D sourcePos, entity_id_t source, bool ownedSound) { // Make sure the sound group is loaded CSoundGroup* group; if (m_SoundGroups.find(groupPath.string()) == m_SoundGroups.end()) { group = new CSoundGroup(); if (!group->LoadSoundGroup(L"audio/" + groupPath.string())) { LOGERROR("Failed to load sound group '%s'", groupPath.string8()); delete group; group = NULL; } // Cache the sound group (or the null, if it failed) m_SoundGroups[groupPath.string()] = group; } else { group = m_SoundGroups[groupPath.string()]; } // Failed to load group -> do nothing if (group && (ownedSound || !group->TestFlag(eOwnerOnly))) group->PlayNext(sourcePos, source); }
virtual void PlaySoundGroup(std::wstring name, entity_id_t source) { #if CONFIG2_AUDIO // Make sure the sound group is loaded CSoundGroup* group; if (m_SoundGroups.find(name) == m_SoundGroups.end()) { group = new CSoundGroup(); if (!group->LoadSoundGroup(L"audio/" + name)) { LOGERROR(L"Failed to load sound group '%ls'", name.c_str()); delete group; group = NULL; } // Cache the sound group (or the null, if it failed) m_SoundGroups[name] = group; } else { group = m_SoundGroups[name]; } // Failed to load group -> do nothing if (!group) return; // Only play the sound if the entity is visible CmpPtr<ICmpRangeManager> cmpRangeManager(GetSimContext(), SYSTEM_ENTITY); ICmpRangeManager::ELosVisibility vis = cmpRangeManager->GetLosVisibility(source, GetSimContext().GetCurrentDisplayedPlayer()); if (vis == ICmpRangeManager::VIS_VISIBLE) { // Find the source's position, if possible // (TODO: we should do something more sensible if there's no position available) CVector3D sourcePos(0, 0, 0); if (source != INVALID_ENTITY) { CmpPtr<ICmpPosition> cmpPosition(GetSimContext(), source); if (cmpPosition && cmpPosition->IsInWorld()) sourcePos = CVector3D(cmpPosition->GetPosition()); } group->PlayNext(sourcePos); } #else // !CONFIG2_AUDIO UNUSED2(name); UNUSED2(source); #endif // !CONFIG2_AUDIO }