OSDN Git Service

7d2e4e01f0cdaf9c57af1ce1bbffc6b8b93f469c
[radegast/radegast.git] / Radegast / Core / Media / MediaObject.cs
1 // 
2 // Radegast Metaverse Client
3 // Copyright (c) 2009, Radegast Development Team
4 // All rights reserved.
5 // 
6 // Redistribution and use in source and binary forms, with or without
7 // modification, are permitted provided that the following conditions are met:
8 // 
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.
17 // 
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.
28 //
29 // $Id$
30 //
31 using System;
32 using System.Collections.Generic;
33 using System.Text;
34 using System.Threading;
35 using FMOD;
36
37 namespace Radegast.Media
38 {
39     public abstract class MediaObject : Object, IDisposable
40     {
41         /// <summary>
42         /// Indicates if this object's resources have already been disposed
43         /// </summary>
44         public bool Disposed { get { return disposed; } }
45         private bool disposed = false;
46  
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();
50
51         /// Queue of sound commands
52         /// 
53         /// </summary>
54         protected static Queue<SoundDelegate> queue;
55
56         /// <summary>
57         /// FMOD channel controller, should not be used directly, add methods to Radegast.Media.Sound
58         /// </summary>
59         public Channel FMODChannel { get { return channel; } }
60         protected Channel channel = null;
61
62         /// <summary>
63         /// FMOD sound object, should not be used directly, add methods to Radegast.Media.Sound
64         /// </summary>
65         public FMOD.Sound FMODSound { get { return sound; } }
66         protected FMOD.Sound sound = null;
67
68         public FMOD.System FMODSystem { get { return system; } }
69         /// <summary>
70         /// Base FMOD system object, of which there is only one.
71         /// </summary>
72         protected static FMOD.System system = null;
73
74         public MediaObject()
75         {
76         }
77
78         public virtual void Dispose()
79         {
80             if (sound != null)
81             {
82                 sound.release();
83                 sound = null;
84             }
85
86             disposed = true;
87         }
88
89         public bool Active { get { return (sound != null); } }
90
91         /// <summary>
92         /// Put a delegate call on the command queue.
93         /// </summary>
94         /// <param name="action"></param>
95         protected void invoke(SoundDelegate action)
96         {
97             // Do nothing if queue not ready yet.
98             if (queue == null) return;
99
100             // Put that on the queue and wake up the background thread.
101             lock (queue)
102             {
103                 queue.Enqueue( action );
104                 Monitor.Pulse(queue);
105             }
106
107         }
108
109         /// <summary>
110         ///  Common actgions for all sound types.
111         /// </summary>
112         protected float volume = 0.5f;
113         public float Volume {
114             get
115             {
116                 return volume;
117             }
118             set
119             {
120                 invoke(new SoundDelegate(delegate
121                 {
122                     MediaManager.FMODExec(channel.setVolume(value));
123                     volume = value;
124                 }));
125             }
126         }
127     }
128 }