diff --git a/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs b/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs index bf49dbf963..66c78773c0 100644 --- a/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs +++ b/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs @@ -268,7 +268,7 @@ namespace OpenSim.Region.CoreModules.World.Sound StopSound(m_host); } - private static void StopSound(SceneObjectPart m_host) + public void StopSound(SceneObjectPart m_host) { m_host.Sound = UUID.Zero; m_host.SoundFlags = (byte)SoundFlags.STOP; @@ -290,10 +290,30 @@ namespace OpenSim.Region.CoreModules.World.Sound } radius *= 4.0f * radius; // avatars and prims do move - m_scene.ForEachRootScenePresence(delegate(ScenePresence sp) + m_scene.ForEachRootScenePresence(delegate (ScenePresence sp) { if (Vector3.DistanceSquared(sp.AbsolutePosition, part.AbsolutePosition) < radius) - sp.ControllingClient.SendPreLoadSound(objectID, objectID, soundID); + sp.ControllingClient.SendPreLoadSound(objectID, part.OwnerID, soundID); + }); + } + + public virtual void PreloadSound(SceneObjectPart part, UUID soundID) + { + if (soundID.IsZero()) + return; + + float radius = (float)part.SoundRadius; + if (radius == 0) + { + radius = MaxDistance; + part.SoundRadius = radius; + } + + radius *= 4.0f * radius; // avatars and prims do move + m_scene.ForEachRootScenePresence(delegate (ScenePresence sp) + { + if (Vector3.DistanceSquared(sp.AbsolutePosition, part.AbsolutePosition) < radius) + sp.ControllingClient.SendPreLoadSound(part.UUID, part.OwnerID, soundID); }); } @@ -330,6 +350,28 @@ namespace OpenSim.Region.CoreModules.World.Sound m_host.SendFullUpdateToAllClients(); } + public void LoopSound(SceneObjectPart host, UUID soundID, + double volume, bool isMaster, bool isSlave) + { + byte iflags = 1; // looping + if (isMaster) + iflags |= (byte)SoundFlags.SYNC_MASTER; + // TODO check viewer seems to accept both + if (isSlave) + iflags |= (byte)SoundFlags.SYNC_SLAVE; + if (host.SoundQueueing) + iflags |= (byte)SoundFlags.QUEUE; + + host.Sound = soundID; + host.SoundGain = volume; + host.SoundFlags = iflags; + if (host.SoundRadius == 0) + host.SoundRadius = MaxDistance; + + host.ScheduleFullUpdate(); + host.SendFullUpdateToAllClients(); + } + public void SendSound(UUID objectID, UUID soundID, double volume, bool triggered, byte flags, bool useMaster, bool isMaster) @@ -342,13 +384,38 @@ namespace OpenSim.Region.CoreModules.World.Sound volume = Utils.Clamp(volume, 0, 1); - UUID parentID = part.ParentGroup.UUID; + Vector3 position = part.AbsolutePosition; // region local + ulong regionHandle = m_scene.RegionInfo.RegionHandle; + + if (triggered) + TriggerSound(soundID, part.OwnerID, part.UUID, part.ParentGroup.UUID, volume, position, regionHandle); + else + { + byte bflags = 0; + + if (isMaster) + bflags |= (byte)SoundFlags.SYNC_MASTER; + // TODO check viewer seems to accept both + if (useMaster) + bflags |= (byte)SoundFlags.SYNC_SLAVE; + PlayAttachedSound(soundID, part.OwnerID, part.UUID, volume, position, bflags); + } + } + + public void SendSound(SceneObjectPart part, UUID soundID, double volume, + bool triggered, byte flags, bool useMaster, + bool isMaster) + { + if (soundID.IsZero()) + return; + + volume = Utils.Clamp(volume, 0, 1); Vector3 position = part.AbsolutePosition; // region local ulong regionHandle = m_scene.RegionInfo.RegionHandle; - if(triggered) - TriggerSound(soundID, part.OwnerID, part.UUID, parentID, volume, position, regionHandle); + if (triggered) + TriggerSound(soundID, part.OwnerID, part.UUID, part.ParentGroup.UUID, volume, position, regionHandle); else { byte bflags = 0; diff --git a/OpenSim/Region/Framework/Interfaces/ISoundModule.cs b/OpenSim/Region/Framework/Interfaces/ISoundModule.cs index 60409901a9..c11f30b069 100644 --- a/OpenSim/Region/Framework/Interfaces/ISoundModule.cs +++ b/OpenSim/Region/Framework/Interfaces/ISoundModule.cs @@ -27,6 +27,7 @@ using System; using OpenMetaverse; +using OpenSim.Region.Framework.Scenes; namespace OpenSim.Region.Framework.Interfaces { @@ -75,6 +76,7 @@ namespace OpenSim.Region.Framework.Interfaces /// /// Sound source ID void StopSound(UUID objectID); + void StopSound(SceneObjectPart sop); /// /// Preload sound to viewers within range. @@ -83,6 +85,7 @@ namespace OpenSim.Region.Framework.Interfaces /// Sound asset ID /// void PreloadSound(UUID objectID, UUID soundID); + void PreloadSound(SceneObjectPart sop, UUID soundID); /// /// Loop specified sound at specified volume with specified radius, @@ -95,6 +98,9 @@ namespace OpenSim.Region.Framework.Interfaces void LoopSound(UUID objectID, UUID soundID, double gain, bool isMaster, bool isSlave); + void LoopSound(SceneObjectPart sop, UUID soundID, double gain, + bool isMaster, bool isSlave); + /// /// Trigger or play an attached sound in this part's inventory. /// @@ -108,6 +114,10 @@ namespace OpenSim.Region.Framework.Interfaces bool triggered, byte flags, bool useMaster, bool isMaster); + void SendSound(SceneObjectPart sop, UUID sound, double volume, + bool triggered, byte flags, bool useMaster, + bool isMaster); + /// /// Trigger a sound to be played to all agents within an axis-aligned /// bounding box. diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 9d6801569e..8c1f934e8d 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -2900,11 +2900,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; UUID soundID = ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound, AssetType.Sound); - if(soundID.IsZero()) - return; - - // send the sound, once, to all clients in range - m_SoundModule.SendSound(m_host.UUID, soundID, volume, false, 0, false, false); + if(soundID.IsNotZero()) + m_SoundModule.SendSound(m_host, soundID, volume, false, 0, false, false); } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -2932,23 +2929,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { case 0: // play foreach (SceneObjectPart sop in parts) - m_SoundModule.SendSound(sop.UUID, soundID, volume, false, 0, false, false); + m_SoundModule.SendSound(sop, soundID, volume, false, 0, false, false); break; case 1: // loop foreach (SceneObjectPart sop in parts) - m_SoundModule.LoopSound(sop.UUID, soundID, volume, false, false); + m_SoundModule.LoopSound(sop, soundID, volume, false, false); break; case 2: //trigger foreach (SceneObjectPart sop in parts) - m_SoundModule.SendSound(sop.UUID, soundID, volume, true, 0, false, false); + m_SoundModule.SendSound(sop, soundID, volume, true, 0, false, false); break; case 4: // play slave foreach (SceneObjectPart sop in parts) - m_SoundModule.SendSound(sop.UUID, soundID, volume, false, 0, true, false); + m_SoundModule.SendSound(sop, soundID, volume, false, 0, true, false); break; case 5: // loop slave foreach (SceneObjectPart sop in parts) - m_SoundModule.LoopSound(sop.UUID, soundID, volume, false, true); + m_SoundModule.LoopSound(sop, soundID, volume, false, true); break; } } @@ -2963,7 +2960,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if(soundID.IsZero()) return; - m_SoundModule.LoopSound(m_host.UUID, soundID, volume, false,false); + m_SoundModule.LoopSound(m_host, soundID, volume, false, false); } public void llLoopSoundMaster(string sound, double volume) @@ -2975,7 +2972,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if(soundID.IsZero()) return; - m_SoundModule.LoopSound(m_host.UUID, soundID, volume, true, false); + m_SoundModule.LoopSound(m_host, soundID, volume, true, false); } public void llLoopSoundSlave(string sound, double volume) @@ -2987,7 +2984,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if(soundID.IsZero()) return; - m_SoundModule.LoopSound(m_host.UUID, soundID, volume, false, true); + m_SoundModule.LoopSound(m_host, soundID, volume, false, true); } public void llPlaySoundSlave(string sound, double volume) @@ -3000,7 +2997,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; // send the sound, once, to all clients in range - m_SoundModule.SendSound(m_host.UUID, soundID, volume, false, 0, true, false); + m_SoundModule.SendSound(m_host, soundID, volume, false, 0, true, false); } public void llTriggerSound(string sound, double volume) @@ -3013,12 +3010,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; // send the sound, once, to all clients in rangeTrigger or play an attached sound in this part's inventory. - m_SoundModule.SendSound(m_host.UUID, soundID, volume, true, 0, false, false); + m_SoundModule.SendSound(m_host, soundID, volume, true, 0, false, false); } public void llStopSound() { - m_SoundModule?.StopSound(m_host.UUID); + m_SoundModule?.StopSound(m_host); } public void llLinkStopSound(LSL_Integer linknumber) @@ -3026,7 +3023,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (m_SoundModule is not null) { foreach(SceneObjectPart sop in GetLinkParts(linknumber)) - m_SoundModule.StopSound(sop.UUID); + m_SoundModule.StopSound(sop); } } @@ -3039,7 +3036,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if(soundID.IsZero()) return; - m_SoundModule.PreloadSound(m_host.UUID, soundID); + m_SoundModule.PreloadSound(m_host, soundID); ScriptSleep(m_sleepMsOnPreloadSound); } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index b3b9643f98..56d1c66fa4 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -5008,7 +5008,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; // send the sound, once, to all clients in range - m_SoundModule.SendSound(sop.UUID, soundID, volume, false, 0, false, false); + m_SoundModule.SendSound(sop, soundID, volume, false, 0, false, false); } public void osLoopSound(LSL_Integer linknum, LSL_String sound, LSL_Float volume) @@ -5024,7 +5024,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (soundID.IsZero()) return; - m_SoundModule.LoopSound(sop.UUID, soundID, volume, false,false); + m_SoundModule.LoopSound(sop, soundID, volume, false, false); } public void osLoopSoundMaster(LSL_Integer linknum, LSL_String sound, LSL_Float volume) @@ -5040,7 +5040,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (soundID.IsZero()) return; - m_SoundModule.LoopSound(sop.UUID, soundID, volume, true, false); + m_SoundModule.LoopSound(sop, soundID, volume, true, false); } public void osLoopSoundSlave(LSL_Integer linknum, LSL_String sound, LSL_Float volume) @@ -5053,10 +5053,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; UUID soundID = ScriptUtils.GetAssetIdFromKeyOrItemName(sop, m_host, sound, AssetType.Sound); - if (soundID.IsZero()) - return; - - m_SoundModule.LoopSound(sop.UUID, soundID, volume, false, true); + if (soundID.IsNotZero()) + m_SoundModule.LoopSound(sop, soundID, volume, false, true); } public void osPlaySoundSlave(LSL_Integer linknum, LSL_String sound, LSL_Float volume) @@ -5069,11 +5067,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; UUID soundID = ScriptUtils.GetAssetIdFromKeyOrItemName(sop, m_host, sound, AssetType.Sound); - if (soundID.IsZero()) - return; - - // send the sound, once, to all clients in range - m_SoundModule.SendSound(sop.UUID, soundID, volume, false, 0, true, false); + if (soundID.IsNotZero()) + m_SoundModule.SendSound(sop, soundID, volume, false, 0, true, false); } public void osTriggerSound(LSL_Integer linknum, LSL_String sound, LSL_Float volume) @@ -5086,11 +5081,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; UUID soundID = ScriptUtils.GetAssetIdFromKeyOrItemName(sop, m_host, sound, AssetType.Sound); - if (soundID.IsZero()) - return; - - // send the sound, once, to all clients in rangeTrigger or play an attached sound in this part's inventory. - m_SoundModule.SendSound(sop.UUID, soundID, volume, true, 0, false, false); + if (soundID.IsNotZero()) + m_SoundModule.SendSound(sop, soundID, volume, true, 0, false, false); } public void osTriggerSoundLimited(LSL_Integer linknum, LSL_String sound, LSL_Float volume, @@ -5104,10 +5096,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; UUID soundID = ScriptUtils.GetAssetIdFromKeyOrItemName(sop, m_host, sound, AssetType.Sound); - if (soundID.IsZero()) - return; - - m_SoundModule.TriggerSoundLimited(sop.UUID, soundID, volume, + if (soundID.IsNotZero()) + m_SoundModule.TriggerSoundLimited(sop.UUID, soundID, volume, bottom_south_west, top_north_east); } @@ -5124,7 +5114,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if(sops is null || sops.Count == 0) return; for(int i = 0; i < sops.Count; ++i) - m_SoundModule.StopSound(sops[i].UUID); + m_SoundModule.StopSound(sops[i]); } public void osPreloadSound(LSL_Integer linknum, LSL_String sound) @@ -5140,7 +5130,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (soundID.IsZero()) return; - m_SoundModule.PreloadSound(sop.UUID, soundID); + m_SoundModule.PreloadSound(sop, soundID); ScriptSleep(1000); }