2 // Radegast Metaverse Client
3 // Copyright (c) 2009, Radegast Development Team
4 // All rights reserved.
6 // Redistribution and use in source and binary forms, with or without
7 // modification, are permitted provided that the following conditions are met:
9 // * Redistributions of source code must retain the above copyright notice,
10 // this list of conditions and the following disclaimer.
11 // * Redistributions in binary form must reproduce the above copyright
12 // notice, this list of conditions and the following disclaimer in the
13 // documentation and/or other materials provided with the distribution.
14 // * Neither the name of the application "Radegast", nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 using System.Collections.Generic;
34 using System.Threading;
37 namespace Radegast.Media
39 public abstract class MediaObject : Object, IDisposable
42 /// Indicates if this object's resources have already been disposed
44 public bool Disposed { get { return disposed; } }
45 private bool disposed = false;
47 /// All commands are made through queued delegate calls, so they
48 /// are guaranteed to take place in the same thread. FMOD requires this.
49 public delegate void SoundDelegate();
51 /// Queue of sound commands
54 protected static Queue<SoundDelegate> queue;
57 /// FMOD channel controller, should not be used directly, add methods to Radegast.Media.Sound
59 public Channel FMODChannel { get { return channel; } }
60 protected Channel channel = null;
63 /// FMOD sound object, should not be used directly, add methods to Radegast.Media.Sound
65 public FMOD.Sound FMODSound { get { return sound; } }
66 protected FMOD.Sound sound = null;
68 public FMOD.System FMODSystem { get { return system; } }
70 /// Base FMOD system object, of which there is only one.
72 protected static FMOD.System system = null;
78 public virtual void Dispose()
89 public bool Active { get { return (sound != null); } }
92 /// Put a delegate call on the command queue.
94 /// <param name="action"></param>
95 protected void invoke(SoundDelegate action)
97 // Do nothing if queue not ready yet.
98 if (queue == null) return;
100 // Put that on the queue and wake up the background thread.
103 queue.Enqueue( action );
104 Monitor.Pulse(queue);
110 /// Common actgions for all sound types.
112 protected float volume = 0.5f;
113 public float Volume {
120 invoke(new SoundDelegate(delegate
122 MediaManager.FMODExec(channel.setVolume(value));