diff options
4 files changed, 66 insertions, 102 deletions
diff --git a/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs b/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs index d093224..34253d5 100644 --- a/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs +++ b/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs | |||
@@ -48,6 +48,18 @@ namespace OpenSim.Region.CoreModules.World.Sound | |||
48 | 48 | ||
49 | private Scene m_scene; | 49 | private Scene m_scene; |
50 | 50 | ||
51 | public enum SoundFlags: byte | ||
52 | { | ||
53 | NONE = 0, | ||
54 | LOOP = 1 << 0, | ||
55 | SYNC_MASTER = 1<<1, | ||
56 | SYNC_SLAVE = 1<<2, | ||
57 | SYNC_PENDING = 1<<3, | ||
58 | QUEUE = 1<<4, | ||
59 | STOP = 1<<5, | ||
60 | SYNC_MASK = SYNC_MASTER | SYNC_SLAVE | SYNC_PENDING | ||
61 | } | ||
62 | |||
51 | public bool Enabled { get; private set; } | 63 | public bool Enabled { get; private set; } |
52 | 64 | ||
53 | public float MaxDistance { get; private set; } | 65 | public float MaxDistance { get; private set; } |
@@ -124,26 +136,19 @@ namespace OpenSim.Region.CoreModules.World.Sound | |||
124 | if (radius == 0) | 136 | if (radius == 0) |
125 | radius = MaxDistance; | 137 | radius = MaxDistance; |
126 | 138 | ||
139 | if (part.SoundQueueing) | ||
140 | flags |= (byte)SoundFlags.QUEUE; | ||
141 | |||
127 | m_scene.ForEachRootScenePresence(delegate(ScenePresence sp) | 142 | m_scene.ForEachRootScenePresence(delegate(ScenePresence sp) |
128 | { | 143 | { |
129 | double dis = Util.GetDistanceTo(sp.AbsolutePosition, position); | ||
130 | if (dis > MaxDistance) // Max audio distance | ||
131 | return; | ||
132 | |||
133 | if (grp.IsAttachment) | 144 | if (grp.IsAttachment) |
134 | { | 145 | { |
135 | if (grp.HasPrivateAttachmentPoint && sp.ControllingClient.AgentId != grp.OwnerID) | 146 | if (grp.HasPrivateAttachmentPoint && sp.ControllingClient.AgentId != grp.OwnerID) |
136 | return; | 147 | return; |
137 | |||
138 | if (sp.ControllingClient.AgentId == grp.OwnerID) | ||
139 | dis = 0; | ||
140 | } | 148 | } |
141 | 149 | // no radius ? | |
142 | // Scale by distance | ||
143 | double thisSpGain = gain * ((radius - dis) / radius); | ||
144 | |||
145 | sp.ControllingClient.SendPlayAttachedSound(soundID, objectID, | 150 | sp.ControllingClient.SendPlayAttachedSound(soundID, objectID, |
146 | ownerID, (float)thisSpGain, flags); | 151 | ownerID, (float)gain, flags); |
147 | }); | 152 | }); |
148 | } | 153 | } |
149 | 154 | ||
@@ -161,9 +166,9 @@ namespace OpenSim.Region.CoreModules.World.Sound | |||
161 | { | 166 | { |
162 | SceneObjectGroup grp = part.ParentGroup; | 167 | SceneObjectGroup grp = part.ParentGroup; |
163 | 168 | ||
164 | if (grp.IsAttachment && grp.AttachmentPoint > 30) | 169 | if (grp.IsAttachment && grp.HasPrivateAttachmentPoint) |
165 | { | 170 | { |
166 | objectID = ownerID; | 171 | // objectID = ownerID; |
167 | parentID = ownerID; | 172 | parentID = ownerID; |
168 | } | 173 | } |
169 | } | 174 | } |
@@ -174,16 +179,12 @@ namespace OpenSim.Region.CoreModules.World.Sound | |||
174 | m_scene.ForEachRootScenePresence(delegate(ScenePresence sp) | 179 | m_scene.ForEachRootScenePresence(delegate(ScenePresence sp) |
175 | { | 180 | { |
176 | double dis = Util.GetDistanceTo(sp.AbsolutePosition, position); | 181 | double dis = Util.GetDistanceTo(sp.AbsolutePosition, position); |
177 | 182 | if (dis > radius) // Max audio distance | |
178 | if (dis > MaxDistance) // Max audio distance | ||
179 | return; | 183 | return; |
180 | 184 | ||
181 | // Scale by distance | ||
182 | double thisSpGain = gain * ((radius - dis) / radius); | ||
183 | |||
184 | sp.ControllingClient.SendTriggeredSound(soundId, ownerID, | 185 | sp.ControllingClient.SendTriggeredSound(soundId, ownerID, |
185 | objectID, parentID, handle, position, | 186 | objectID, parentID, handle, position, |
186 | (float)thisSpGain); | 187 | (float)gain); |
187 | }); | 188 | }); |
188 | } | 189 | } |
189 | 190 | ||
@@ -199,39 +200,12 @@ namespace OpenSim.Region.CoreModules.World.Sound | |||
199 | private static void StopSound(SceneObjectPart m_host) | 200 | private static void StopSound(SceneObjectPart m_host) |
200 | { | 201 | { |
201 | m_host.AdjustSoundGain(0); | 202 | m_host.AdjustSoundGain(0); |
202 | // Xantor 20080528: Clear prim data of sound instead | 203 | m_host.Sound = UUID.Zero; |
203 | if (m_host.ParentGroup.LoopSoundSlavePrims.Contains(m_host)) | 204 | m_host.SoundFlags = (byte)SoundFlags.STOP; |
204 | { | 205 | m_host.SoundRadius = 0; |
205 | if (m_host.ParentGroup.LoopSoundMasterPrim == m_host) | 206 | m_host.SoundGain = 0; |
206 | { | 207 | m_host.ScheduleFullUpdate(); |
207 | foreach (SceneObjectPart part in m_host.ParentGroup.LoopSoundSlavePrims) | 208 | m_host.SendFullUpdateToAllClients(); |
208 | { | ||
209 | part.Sound = UUID.Zero; | ||
210 | part.SoundFlags = 1 << 5; | ||
211 | part.SoundRadius = 0; | ||
212 | part.ScheduleFullUpdate(); | ||
213 | part.SendFullUpdateToAllClients(); | ||
214 | } | ||
215 | m_host.ParentGroup.LoopSoundMasterPrim = null; | ||
216 | m_host.ParentGroup.LoopSoundSlavePrims.Clear(); | ||
217 | } | ||
218 | else | ||
219 | { | ||
220 | m_host.Sound = UUID.Zero; | ||
221 | m_host.SoundFlags = 1 << 5; | ||
222 | m_host.SoundRadius = 0; | ||
223 | m_host.ScheduleFullUpdate(); | ||
224 | m_host.SendFullUpdateToAllClients(); | ||
225 | } | ||
226 | } | ||
227 | else | ||
228 | { | ||
229 | m_host.Sound = UUID.Zero; | ||
230 | m_host.SoundFlags = 1 << 5; | ||
231 | m_host.SoundRadius = 0; | ||
232 | m_host.ScheduleFullUpdate(); | ||
233 | m_host.SendFullUpdateToAllClients(); | ||
234 | } | ||
235 | } | 209 | } |
236 | 210 | ||
237 | public virtual void PreloadSound(UUID objectID, UUID soundID, float radius) | 211 | public virtual void PreloadSound(UUID objectID, UUID soundID, float radius) |
@@ -248,7 +222,7 @@ namespace OpenSim.Region.CoreModules.World.Sound | |||
248 | 222 | ||
249 | m_scene.ForEachRootScenePresence(delegate(ScenePresence sp) | 223 | m_scene.ForEachRootScenePresence(delegate(ScenePresence sp) |
250 | { | 224 | { |
251 | if (!(Util.GetDistanceTo(sp.AbsolutePosition, part.AbsolutePosition) >= MaxDistance)) | 225 | if (Util.GetDistanceTo(sp.AbsolutePosition, part.AbsolutePosition) < radius) |
252 | sp.ControllingClient.SendPreLoadSound(objectID, objectID, soundID); | 226 | sp.ControllingClient.SendPreLoadSound(objectID, objectID, soundID); |
253 | }); | 227 | }); |
254 | } | 228 | } |
@@ -262,21 +236,31 @@ namespace OpenSim.Region.CoreModules.World.Sound | |||
262 | // 20080530 Updated to remove code duplication | 236 | // 20080530 Updated to remove code duplication |
263 | // 20080530 Stop sound if there is one, otherwise volume only changes don't work | 237 | // 20080530 Stop sound if there is one, otherwise volume only changes don't work |
264 | public void LoopSound(UUID objectID, UUID soundID, | 238 | public void LoopSound(UUID objectID, UUID soundID, |
265 | double volume, double radius, bool isMaster) | 239 | double volume, double radius, bool isMaster, bool isSlave) |
266 | { | 240 | { |
267 | SceneObjectPart m_host; | 241 | SceneObjectPart m_host; |
268 | if (!m_scene.TryGetSceneObjectPart(objectID, out m_host)) | 242 | if (!m_scene.TryGetSceneObjectPart(objectID, out m_host)) |
269 | return; | 243 | return; |
270 | 244 | ||
271 | if (isMaster) | 245 | // if (isMaster) |
272 | m_host.ParentGroup.LoopSoundMasterPrim = m_host; | 246 | // m_host.ParentGroup.LoopSoundMasterPrim = m_host; |
273 | 247 | ||
274 | if (m_host.Sound != UUID.Zero) | 248 | // sl does not stop previus sound, volume changes don't work (wiki) |
275 | StopSound(m_host); | 249 | // if (m_host.Sound != UUID.Zero) |
250 | // StopSound(m_host); | ||
251 | |||
252 | byte iflags = 1; // looping | ||
253 | if (isMaster) | ||
254 | iflags |= (byte)SoundFlags.SYNC_MASTER; | ||
255 | // TODO check viewer seems to accept both | ||
256 | if (isSlave) | ||
257 | iflags |= (byte)SoundFlags.SYNC_SLAVE; | ||
258 | if (m_host.SoundQueueing) | ||
259 | iflags |= (byte)SoundFlags.QUEUE; | ||
276 | 260 | ||
277 | m_host.Sound = soundID; | 261 | m_host.Sound = soundID; |
278 | m_host.SoundGain = volume; | 262 | m_host.SoundGain = volume; |
279 | m_host.SoundFlags = 1; // looping | 263 | m_host.SoundFlags = iflags; |
280 | m_host.SoundRadius = radius; | 264 | m_host.SoundRadius = radius; |
281 | 265 | ||
282 | m_host.ScheduleFullUpdate(); | 266 | m_host.ScheduleFullUpdate(); |
@@ -301,42 +285,19 @@ namespace OpenSim.Region.CoreModules.World.Sound | |||
301 | Vector3 position = part.AbsolutePosition; // region local | 285 | Vector3 position = part.AbsolutePosition; // region local |
302 | ulong regionHandle = m_scene.RegionInfo.RegionHandle; | 286 | ulong regionHandle = m_scene.RegionInfo.RegionHandle; |
303 | 287 | ||
304 | if (useMaster) | 288 | if(triggered) |
305 | { | 289 | TriggerSound(soundID, part.OwnerID, part.UUID, parentID, volume, position, regionHandle, radius); |
306 | if (isMaster) | ||
307 | { | ||
308 | if (triggered) | ||
309 | TriggerSound(soundID, part.OwnerID, part.UUID, parentID, volume, position, regionHandle, radius); | ||
310 | else | ||
311 | PlayAttachedSound(soundID, part.OwnerID, part.UUID, volume, position, flags, radius); | ||
312 | part.ParentGroup.PlaySoundMasterPrim = part; | ||
313 | if (triggered) | ||
314 | TriggerSound(soundID, part.OwnerID, part.UUID, parentID, volume, position, regionHandle, radius); | ||
315 | else | ||
316 | PlayAttachedSound(soundID, part.OwnerID, part.UUID, volume, position, flags, radius); | ||
317 | foreach (SceneObjectPart prim in part.ParentGroup.PlaySoundSlavePrims) | ||
318 | { | ||
319 | position = prim.AbsolutePosition; // region local | ||
320 | if (triggered) | ||
321 | TriggerSound(soundID, part.OwnerID, prim.UUID, parentID, volume, position, regionHandle, radius); | ||
322 | else | ||
323 | PlayAttachedSound(soundID, part.OwnerID, prim.UUID, volume, position, flags, radius); | ||
324 | } | ||
325 | part.ParentGroup.PlaySoundSlavePrims.Clear(); | ||
326 | part.ParentGroup.PlaySoundMasterPrim = null; | ||
327 | } | ||
328 | else | ||
329 | { | ||
330 | part.ParentGroup.PlaySoundSlavePrims.Add(part); | ||
331 | } | ||
332 | } | ||
333 | else | 290 | else |
334 | { | 291 | { |
335 | if (triggered) | 292 | byte bflags = 0; |
336 | TriggerSound(soundID, part.OwnerID, part.UUID, parentID, volume, position, regionHandle, radius); | 293 | |
337 | else | 294 | if (isMaster) |
338 | PlayAttachedSound(soundID, part.OwnerID, part.UUID, volume, position, flags, radius); | 295 | bflags |= (byte)SoundFlags.SYNC_MASTER; |
339 | } | 296 | // TODO check viewer seems to accept both |
297 | if (useMaster) | ||
298 | bflags |= (byte)SoundFlags.SYNC_SLAVE; | ||
299 | PlayAttachedSound(soundID, part.OwnerID, part.UUID, volume, position, bflags, radius); | ||
300 | } | ||
340 | } | 301 | } |
341 | 302 | ||
342 | public void TriggerSoundLimited(UUID objectID, UUID sound, | 303 | public void TriggerSoundLimited(UUID objectID, UUID sound, |
diff --git a/OpenSim/Region/Framework/Interfaces/ISoundModule.cs b/OpenSim/Region/Framework/Interfaces/ISoundModule.cs index 8372ddd..f7c6513 100644 --- a/OpenSim/Region/Framework/Interfaces/ISoundModule.cs +++ b/OpenSim/Region/Framework/Interfaces/ISoundModule.cs | |||
@@ -95,7 +95,7 @@ namespace OpenSim.Region.Framework.Interfaces | |||
95 | /// <param name="radius">Sound radius</param> | 95 | /// <param name="radius">Sound radius</param> |
96 | /// <param name="isMaster">Set object to sync master if true</param> | 96 | /// <param name="isMaster">Set object to sync master if true</param> |
97 | void LoopSound(UUID objectID, UUID soundID, double gain, | 97 | void LoopSound(UUID objectID, UUID soundID, double gain, |
98 | double radius, bool isMaster); | 98 | double radius, bool isMaster, bool isSlave); |
99 | 99 | ||
100 | /// <summary> | 100 | /// <summary> |
101 | /// Trigger or play an attached sound in this part's inventory. | 101 | /// Trigger or play an attached sound in this part's inventory. |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 9527fa5..ba97c47 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -908,14 +908,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
908 | } | 908 | } |
909 | } | 909 | } |
910 | } | 910 | } |
911 | 911 | // PlaySoundMasterPrim no longer in use to remove | |
912 | private SceneObjectPart m_PlaySoundMasterPrim = null; | 912 | private SceneObjectPart m_PlaySoundMasterPrim = null; |
913 | public SceneObjectPart PlaySoundMasterPrim | 913 | public SceneObjectPart PlaySoundMasterPrim |
914 | { | 914 | { |
915 | get { return m_PlaySoundMasterPrim; } | 915 | get { return m_PlaySoundMasterPrim; } |
916 | set { m_PlaySoundMasterPrim = value; } | 916 | set { m_PlaySoundMasterPrim = value; } |
917 | } | 917 | } |
918 | 918 | // PlaySoundSlavePrims no longer in use to remove | |
919 | private List<SceneObjectPart> m_PlaySoundSlavePrims = new List<SceneObjectPart>(); | 919 | private List<SceneObjectPart> m_PlaySoundSlavePrims = new List<SceneObjectPart>(); |
920 | public List<SceneObjectPart> PlaySoundSlavePrims | 920 | public List<SceneObjectPart> PlaySoundSlavePrims |
921 | { | 921 | { |
@@ -923,6 +923,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
923 | set { m_PlaySoundSlavePrims = value; } | 923 | set { m_PlaySoundSlavePrims = value; } |
924 | } | 924 | } |
925 | 925 | ||
926 | // LoopSoundMasterPrim no longer in use to remove | ||
926 | private SceneObjectPart m_LoopSoundMasterPrim = null; | 927 | private SceneObjectPart m_LoopSoundMasterPrim = null; |
927 | public SceneObjectPart LoopSoundMasterPrim | 928 | public SceneObjectPart LoopSoundMasterPrim |
928 | { | 929 | { |
@@ -930,6 +931,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
930 | set { m_LoopSoundMasterPrim = value; } | 931 | set { m_LoopSoundMasterPrim = value; } |
931 | } | 932 | } |
932 | 933 | ||
934 | // m_LoopSoundSlavePrims no longer in use to remove | ||
933 | private List<SceneObjectPart> m_LoopSoundSlavePrims = new List<SceneObjectPart>(); | 935 | private List<SceneObjectPart> m_LoopSoundSlavePrims = new List<SceneObjectPart>(); |
934 | public List<SceneObjectPart> LoopSoundSlavePrims | 936 | public List<SceneObjectPart> LoopSoundSlavePrims |
935 | { | 937 | { |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 4cb65d4..c65f933 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -2844,7 +2844,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2844 | m_SoundModule.SendSound( | 2844 | m_SoundModule.SendSound( |
2845 | m_host.UUID, | 2845 | m_host.UUID, |
2846 | ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound, AssetType.Sound), | 2846 | ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound, AssetType.Sound), |
2847 | volume, false, m_host.SoundQueueing ? (byte)SoundFlags.Queue : (byte)SoundFlags.None, | 2847 | volume, false, 0, |
2848 | 0, false, false); | 2848 | 0, false, false); |
2849 | } | 2849 | } |
2850 | } | 2850 | } |
@@ -2855,7 +2855,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2855 | if (m_SoundModule != null) | 2855 | if (m_SoundModule != null) |
2856 | { | 2856 | { |
2857 | m_SoundModule.LoopSound(m_host.UUID, ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound), | 2857 | m_SoundModule.LoopSound(m_host.UUID, ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound), |
2858 | volume, 20, false); | 2858 | volume, 20, false,false); |
2859 | } | 2859 | } |
2860 | } | 2860 | } |
2861 | 2861 | ||
@@ -2865,16 +2865,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2865 | if (m_SoundModule != null) | 2865 | if (m_SoundModule != null) |
2866 | { | 2866 | { |
2867 | m_SoundModule.LoopSound(m_host.UUID, ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound), | 2867 | m_SoundModule.LoopSound(m_host.UUID, ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound), |
2868 | volume, 20, true); | 2868 | volume, 20, true, false); |
2869 | } | 2869 | } |
2870 | } | 2870 | } |
2871 | 2871 | ||
2872 | public void llLoopSoundSlave(string sound, double volume) | 2872 | public void llLoopSoundSlave(string sound, double volume) |
2873 | { | 2873 | { |
2874 | m_host.AddScriptLPS(1); | 2874 | m_host.AddScriptLPS(1); |
2875 | lock (m_host.ParentGroup.LoopSoundSlavePrims) | 2875 | if (m_SoundModule != null) |
2876 | { | 2876 | { |
2877 | m_host.ParentGroup.LoopSoundSlavePrims.Add(m_host); | 2877 | m_SoundModule.LoopSound(m_host.UUID, ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound), |
2878 | volume, 20, false, true); | ||
2878 | } | 2879 | } |
2879 | } | 2880 | } |
2880 | 2881 | ||