OSDN Git Service

Dynamic inworld volume adjustment.
authorMojito Sorbet <mojitotech@gmail.com>
Sun, 30 May 2010 13:53:46 +0000 (13:53 +0000)
committerMojito Sorbet <mojitotech@gmail.com>
Sun, 30 May 2010 13:53:46 +0000 (13:53 +0000)
Set initial control from config file.

git-svn-id: https://radegast.googlecode.com/svn/branches/sounds@660 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/Core/Media/BufferSound.cs
Radegast/Core/Media/MediaManager.cs
Radegast/Core/Media/MediaObject.cs
Radegast/GUI/Consoles/MediaConsole.cs

index 11d1e43..e6b880e 100644 (file)
@@ -46,6 +46,10 @@ namespace Radegast.Media
         private FMOD.MODE mode;\r
         public Sound Sound { get { return sound; } }\r
         private Boolean loopSound = false;\r
+        /// <summary>\r
+        /// The individual volume setting for THIS object\r
+        /// </summary>\r
+        private float volumeSetting = 0.5f;\r
 \r
         /// <summary>\r
         /// Creates a new sound object\r
@@ -71,7 +75,7 @@ namespace Radegast.Media
 \r
             Id = soundId;\r
             position = FromOMVSpace(worldpos);\r
-            volume = vol;\r
+            volumeSetting = vol;\r
             loopSound = loop;\r
 \r
             // Set flags to determine how it will be played.\r
@@ -118,6 +122,25 @@ namespace Radegast.Media
             }\r
         }\r
 \r
+        /// <summary>\r
+        /// Adjust volumes of all playing sounds to observe the new global sound volume\r
+        /// </summary>\r
+        public static void AdjustVolumes()\r
+        {\r
+            foreach (BufferSound s in allBuffers.Values)\r
+            {\r
+                s.AdjustVolume();\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Adjust the volume of THIS sound when all are being adjusted.\r
+        /// </summary>\r
+        private void AdjustVolume()\r
+        {\r
+            Volume = volumeSetting * AllObjectVolume;\r
+        }\r
+\r
         // A simpler constructor used by PreFetchSound.\r
         public BufferSound( UUID soundId )\r
             : base()\r
@@ -212,7 +235,7 @@ namespace Radegast.Media
 \r
                     // Allocate a channel and set initial volume.  Initially paused.\r
                     FMODExec(system.playSound(CHANNELINDEX.FREE, sound, true, ref channel));\r
-                    FMODExec(channel.setVolume(volume * m_objectVolume ));\r
+                    FMODExec(channel.setVolume(volumeSetting * AllObjectVolume ));\r
 \r
                     // Take note of when the sound is finished playing.\r
                     FMODExec(channel.setCallback(endCallback));\r
index b9b6f7b..fba9a2b 100644 (file)
@@ -73,6 +73,7 @@ namespace Radegast.Media
             listenerThread.Name = "ListenerThread";
             listenerThread.Start();
 
+            // Initial inworld-sound setting comes from Config.
             ObjectEnable = true;
         }
 
@@ -470,13 +471,23 @@ namespace Radegast.Media
                 p.SoundGain * ObjectVolume);
         }
 
+        /// <summary>
+        /// Control the volume of all inworld sounds
+        /// </summary>
         public float ObjectVolume
         {
-            set { m_objectVolume = value; }
-            get { return m_objectVolume; }
+            set
+            {
+                AllObjectVolume = value;
+                BufferSound.AdjustVolumes();
+            }
+            get { return AllObjectVolume; }
         }
 
         private bool m_objectEnabled = true;
+        /// <summary>
+        /// Enable and Disable inworld sounds
+        /// </summary>
         public bool ObjectEnable
         {
             set
@@ -491,7 +502,6 @@ namespace Radegast.Media
                     Instance.Client.Objects.ObjectPropertiesUpdated += new EventHandler<ObjectPropertiesUpdatedEventArgs>(Objects_ObjectPropertiesUpdated);
                     Instance.Client.Objects.KillObject += new EventHandler<KillObjectEventArgs>(Objects_KillObject);
                     Instance.Client.Network.SimChanged += new EventHandler<SimChangedEventArgs>(Network_SimChanged);
-
                 }
                 else
                 {
index 97b26cf..070ff72 100644 (file)
@@ -80,7 +80,7 @@ namespace Radegast.Media
         protected static FMOD.System system = null;
         public FMOD.System FMODSystem { get { return system; } }
 
-        protected static float m_objectVolume = 0.8f;
+        protected static float AllObjectVolume = 0.8f;
         public MediaObject()
         {
             // Zero out the extra info structure.
index 86d6459..6fb4ef4 100644 (file)
@@ -61,6 +61,13 @@ namespace Radegast
                 cbPlayAudioStream.Checked = s["parcel_audio_play"].AsBoolean();
             if (s["parcel_audio_keep_url"].Type != OSDType.Unknown)
                 cbKeep.Checked = s["parcel_audio_keep_url"].AsBoolean();
+            if (s["object_audio_enable"].Type != OSDType.Unknown)
+                ObjSoundEnable.Checked = s["object_audio_enable"].AsBoolean();
+            if (s["object_audio_vol"].Type != OSDType.Unknown)
+            {
+                instance.MediaManager.ObjectVolume = (float)s["parcel_audio_vol"].AsReal();
+                ObjVolume.Value = (int)(50f * instance.MediaManager.ObjectVolume);
+            }
 
             configTimer = new System.Threading.Timer(SaveConfig, null, System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);
 
@@ -216,12 +223,14 @@ namespace Radegast
         {
             configTimer.Change(saveConfigTimeout, System.Threading.Timeout.Infinite);
             instance.MediaManager.ObjectVolume = ObjVolume.Value / 50f;
+            configTimer.Change(saveConfigTimeout, System.Threading.Timeout.Infinite);
         }
 
         void cbObjEnableChanged(object sender, EventArgs e)
         {
             configTimer.Change(saveConfigTimeout, System.Threading.Timeout.Infinite);
             instance.MediaManager.ObjectEnable = ObjSoundEnable.Checked;
+            configTimer.Change(saveConfigTimeout, System.Threading.Timeout.Infinite);
         }
 
         private void txtAudioURL_TextChanged(object sender, EventArgs e)