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);
}