00001 #region --- OpenTK.OpenAL License ---
00002
00003
00004
00005
00006
00007
00008 #endregion
00009
00010 using System;
00011 using System.Diagnostics;
00012 using System.Runtime.InteropServices;
00013
00014 namespace OpenTK.Audio.OpenAL
00015 {
00016
00021 [CLSCompliant(true)]
00022 public sealed class XRamExtension
00023 {
00024 #region Instance state
00025
00026 private bool _valid = false;
00027
00029 public bool IsInitialized
00030 {
00031 get { return _valid; }
00032 }
00033
00034 #endregion Instance state
00035
00036 #region X-RAM Function pointer definitions
00037
00038
00039 private delegate bool Delegate_SetBufferMode(int n, ref uint buffers, int value);
00040
00041
00042
00043 private delegate int Delegate_GetBufferMode(uint buffer, IntPtr value);
00044
00045
00046
00047 private Delegate_SetBufferMode Imported_SetBufferMode;
00048
00049 private Delegate_GetBufferMode Imported_GetBufferMode;
00050
00051 #endregion X-RAM Function pointer definitions
00052
00053 #region X-RAM Tokens
00054
00055 private int AL_EAX_RAM_SIZE, AL_EAX_RAM_FREE,
00056 AL_STORAGE_AUTOMATIC, AL_STORAGE_HARDWARE, AL_STORAGE_ACCESSIBLE;
00057
00058 #endregion X-RAM Tokens
00059
00060 #region Constructor / Extension Loading
00061
00065 public XRamExtension()
00066 {
00067 _valid = false;
00068 if (AL.IsExtensionPresent("EAX-RAM") == false)
00069 return;
00070
00071 AL_EAX_RAM_SIZE = AL.GetEnumValue("AL_EAX_RAM_SIZE");
00072 AL_EAX_RAM_FREE = AL.GetEnumValue("AL_EAX_RAM_FREE");
00073 AL_STORAGE_AUTOMATIC = AL.GetEnumValue("AL_STORAGE_AUTOMATIC");
00074 AL_STORAGE_HARDWARE = AL.GetEnumValue("AL_STORAGE_HARDWARE");
00075 AL_STORAGE_ACCESSIBLE = AL.GetEnumValue("AL_STORAGE_ACCESSIBLE");
00076
00077
00078
00079 if (AL_EAX_RAM_SIZE == 0 ||
00080 AL_EAX_RAM_FREE == 0 ||
00081 AL_STORAGE_AUTOMATIC == 0 ||
00082 AL_STORAGE_HARDWARE == 0 ||
00083 AL_STORAGE_ACCESSIBLE == 0)
00084 {
00085 Debug.WriteLine("X-Ram: Token values could not be retrieved.");
00086 return;
00087 }
00088
00089
00090
00091 try
00092 {
00093 Imported_GetBufferMode = (Delegate_GetBufferMode)Marshal.GetDelegateForFunctionPointer(AL.GetProcAddress("EAXGetBufferMode"), typeof(Delegate_GetBufferMode));
00094 Imported_SetBufferMode = (Delegate_SetBufferMode)Marshal.GetDelegateForFunctionPointer(AL.GetProcAddress("EAXSetBufferMode"), typeof(Delegate_SetBufferMode));
00095 }
00096 catch (Exception e)
00097 {
00098 Debug.WriteLine("X-Ram: Attempt to marshal function pointers with AL.GetProcAddress failed. " + e.ToString());
00099 return;
00100 }
00101
00102 _valid = true;
00103 }
00104
00105 #endregion Constructor / Extension Loading
00106
00107 #region Public Methods
00108
00110 public int GetRamSize
00111 {
00112 get
00113 {
00114 return AL.Get((ALGetInteger)AL_EAX_RAM_SIZE);
00115 }
00116 }
00117
00119 public int GetRamFree
00120 {
00121 get
00122 {
00123 return AL.Get((ALGetInteger)AL_EAX_RAM_FREE);
00124 }
00125 }
00126
00128 public enum XRamStorage : byte
00129 {
00131 Automatic = 0,
00133 Hardware = 1,
00135 Accessible = 2,
00136 }
00137
00143 [CLSCompliant(false)]
00144 public bool SetBufferMode(int n, ref uint buffer, XRamStorage mode)
00145 {
00146 switch (mode)
00147 {
00148 case XRamStorage.Accessible:
00149 return Imported_SetBufferMode(n, ref buffer, AL_STORAGE_ACCESSIBLE);
00150 case XRamStorage.Hardware:
00151 return Imported_SetBufferMode(n, ref buffer, AL_STORAGE_HARDWARE);
00152 default:
00153 return Imported_SetBufferMode(n, ref buffer, AL_STORAGE_AUTOMATIC);
00154 }
00155 }
00156
00162 [CLSCompliant(true)]
00163 public bool SetBufferMode(int n, ref int buffer, XRamStorage mode)
00164 {
00165 uint temp = (uint)buffer;
00166 return SetBufferMode(n, ref temp, mode);
00167 }
00168
00172 [CLSCompliant(false)]
00173 public XRamStorage GetBufferMode(ref uint buffer)
00174 {
00175 int tempresult = Imported_GetBufferMode(buffer, IntPtr.Zero);
00176
00177 if (tempresult == AL_STORAGE_ACCESSIBLE)
00178 return XRamStorage.Accessible;
00179 if (tempresult == AL_STORAGE_HARDWARE)
00180 return XRamStorage.Hardware;
00181
00182 return XRamStorage.Automatic;
00183 }
00184
00188 [CLSCompliant(true)]
00189 public XRamStorage GetBufferMode(ref int buffer)
00190 {
00191 uint temp = (uint)buffer;
00192 return GetBufferMode(ref temp);
00193 }
00194
00195 #endregion Public Methods
00196 }
00197
00198 }
00199