preloadsound is suposed to send ownerid, plus save ns on useless dic searchs

This commit is contained in:
UbitUmarov
2023-05-31 21:44:48 +01:00
parent 8d5d985ba1
commit db1c739ef2
4 changed files with 111 additions and 47 deletions

View File

@@ -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;

View File

@@ -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
/// </summary>
/// <param name="objectID">Sound source ID</param>
void StopSound(UUID objectID);
void StopSound(SceneObjectPart sop);
/// <summary>
/// Preload sound to viewers within range.
@@ -83,6 +85,7 @@ namespace OpenSim.Region.Framework.Interfaces
/// <param name="soundID">Sound asset ID</param>
/// </param>
void PreloadSound(UUID objectID, UUID soundID);
void PreloadSound(SceneObjectPart sop, UUID soundID);
/// <summary>
/// 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);
/// <summary>
/// Trigger or play an attached sound in this part's inventory.
/// </summary>
@@ -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);
/// <summary>
/// Trigger a sound to be played to all agents within an axis-aligned
/// bounding box.

View File

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

View File

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