All pastes #545894 Raw Edit

Unnamed

public text v1 · immutable
·published 2007-06-06 22:10 UTC
rendered paste body
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

using KillShit.Engine.Audio.FMOD;

namespace KillShit.Engine.Audio
{
    public static class AudioManager
    {
        public static FMOD.System AudioEngine = null;

        private static List<preCachedSound> SoundPool = new List<preCachedSound> ( );

        public static bool bDisposed = false;

        public static void Init ( )
        {
            FMOD.Factory.System_Create ( ref AudioEngine );
            AudioEngine.init ( 32, FMOD.INITFLAG.NORMAL, System.IntPtr.Zero );
            AudioEngine.set3DSettings ( 1, 15, 1 );

            Engine.Renderer.Driver.Debug.AddText ( "Audio Manager Initialization Successful!", System.Drawing.Color.Green.ToArgb ( ) );
        }

        public static void Dispose ( )
        {
            foreach ( preCachedSound preCachedSound in SoundPool )
            {
                if ( preCachedSound != null )
                {
                    preCachedSound.Dispose ( );
                }
            }

            SoundPool.Clear ( );

            if ( AudioEngine != null )
            {
                AudioEngine.close ( );
            }

            bDisposed = true;
        }

        public static void ClearPool ( TYPE Type )
        {
            foreach ( preCachedSound preCachedSound in SoundPool )
            {
                if ( preCachedSound != null && preCachedSound.enType == Type )
                {
                    preCachedSound.Dispose ( );
                }
            }

            SoundPool.Clear ( );
        }

        private static FMOD.VECTOR Vector3ToFMOD ( Microsoft.DirectX.Vector3 V )
        {
            VECTOR V2;
            V2.x = V.X;
            V2.y = V.Y;
            V2.z = V.Z;
            return V2;
        }

        public static void Update ( Engine.Rendering.Camera Camera )
        {
            if ( !bDisposed )
            {
                VECTOR Pos = Vector3ToFMOD ( Camera.Position );
                VECTOR Vel = Vector3ToFMOD ( new Microsoft.DirectX.Vector3 ( 0, 0, 0 ) );
                VECTOR ViewDir = Vector3ToFMOD ( Camera.ViewDirection );
                VECTOR Up = Vector3ToFMOD ( Camera.Up );
                AudioEngine.set3DListenerAttributes ( 0, ref Pos, ref Vel, ref ViewDir, ref Up );
                AudioEngine.update ( );
            }
        }

        public static void addSound ( string Path, TYPE Type, Engine.Audio.FMOD.MODE Mode )
        {
            preCachedSound tempSound = new preCachedSound ( Path, Type, Mode );

            foreach ( preCachedSound preCachedSound in SoundPool )
            {
                if ( tempSound.Equals ( preCachedSound ) )
                {
                    tempSound = null;
                    return;
                }
            }

            DirectoryInfo diPath = new DirectoryInfo ( Path );
            Engine.Renderer.Driver.Debug.AddText ( "Audio[Status] : '" + diPath.Parent + "/" + diPath.Name + "' pre-cached.", ( int ) Engine.Debug.MESSAGE_TYPE.INFORMATION );
            SoundPool.Add ( tempSound );
            diPath = null;
        }

        public static void playSound ( FMOD.CHANNELINDEX channelid, string Path, bool paused, ref FMOD.Channel Channel )
        {
            AudioManager.AudioEngine.playSound ( channelid, getPreCachedSound ( Path ).sdSound, paused, ref Channel );
        }

        public static void destroySound ( string Path )
        {
            int Index = SoundPool.IndexOf ( getPreCachedSound ( Path ) );
            if ( Index != -1 && !SoundPool [ Index ].bDisposed )
            {
                SoundPool [ Index ].Dispose ( );
            }
        }

        public static preCachedSound getPreCachedSound ( string Path )
        {
            foreach ( preCachedSound preCachedSound in SoundPool )
            {
                if ( Path == preCachedSound.strPath )
                    return preCachedSound;
            }

            return ( preCachedSound ) ( null );
        }
    }

    public enum TYPE
    {
        Map,
        Music,
        Effect,
        Custom,
    }

    public class preCachedSound : IDisposable
    {
        public string strPath = null;
        public TYPE enType;
        public bool bDisposed = false;

        public FMOD.MODE enMode;

        public FMOD.Sound sdSound = null;

        public preCachedSound ( string Path, TYPE Type, FMOD.MODE Mode )
        {
            strPath = Path;
            enType = Type;
            enMode = Mode;
            preCache ( );
        }

        public override bool Equals ( object o )
        {
            preCachedSound Clone = ( preCachedSound ) o;

            if ( Clone.strPath == this.strPath )
            {
                Clone = null;
                return true;
            }
            else
            {
                Clone = null;
                return false;
            }
        }

        public void preCache ( )
        {
            AudioManager.AudioEngine.createSound ( strPath, enMode, ref sdSound );
        }

        public void Dispose ( )
        {
            if ( sdSound != null )
            {
                sdSound.release ( );
                sdSound = null;
                bDisposed = true;
            }
        }

        public override int GetHashCode ( )
        {
            return base.GetHashCode ( );
        }
    }
}