All pastes #549807 Raw Edit

Stuff

public text v1 · immutable
·published 2007-06-08 07:06 UTC
rendered paste body
//  ===================  Copyright (C) 2007 Odorless Entertainment ===================  //
//                                                                                      //
//  This source file was written by the collective efforts of Odorless Entertainment:   //
//                                                                                      //
//  Nauful 'Cade' Shaikh [co-owner, lead technical director]                            //
//  Jonathan 'Blade' Bastnagel [co-owner, co-technical director]                        //
//  Maciek 'ManTis' Kozlowski [co-owner, lead toolset developer]                        //
//  Mats 'RBurn' Soderlund [co-owner, lead art director/lead designer]                  //
//                                                                                      //
//  File: Audio.cs
//  Purpose: [Write a brief description here]
//                                                                                      //
//  This program is free software; you can redistribute it and/or modify                //
//  it under the terms of the GNU General Public License as published by                //
//  the Free Software Foundation; either version 2 of the License, or                   //
//  (at your option) any later version.                                                 //
//                                                                                      //
//  This program is distributed in the hope that it will be useful,                     //
//  but WITHOUT ANY WARRANTY; without even the implied warranty of                      //
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                       //
//  GNU General Public License for more details.                                        //
//                                                                                      //
//  You should have received a copy of the GNU General Public License along             //
//  with this program; if not, write to the Free Software Foundation, Inc.,             //
//  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.                         //
//                                                                                      //
//  ==================================================================================  //

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.IO;
using System.Threading;

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 Game.Audio.MusicManager MusicManager = new Game.Audio.MusicManager ( );

        public static Thread MusicThread;

        private static Stopwatch AudioTimer;    //  Used for DeltaTime
        private static float AudioDeltaTime;

        public static Queue<string> MessageQueue;

        public static void Init ( )
        {
            MessageQueue = new Queue<string> ( );

            Engine.Renderer.Driver.Debug.AddText ( "Creating FMOD System...", System.Drawing.Color.Green.ToArgb ( ) );

            FMOD.Factory.System_Create ( ref AudioEngine );

            Engine.Renderer.Driver.Debug.AddText ( "FMOD System Created!", System.Drawing.Color.Green.ToArgb ( ) );

            System.Threading.Thread.Sleep ( 2000 );

            Engine.Renderer.Driver.Debug.AddText ( "Initializing FMOD System...", System.Drawing.Color.Green.ToArgb ( ) );

            AudioEngine.init ( 32, FMOD.INITFLAG.NORMAL, System.IntPtr.Zero );

            Engine.Renderer.Driver.Debug.AddText ( "FMOD System Initialized!", System.Drawing.Color.Green.ToArgb ( ) );

            Engine.Renderer.Driver.Debug.AddText ( "Setting 3D Audio Settings...", System.Drawing.Color.Green.ToArgb ( ) );

            AudioEngine.set3DSettings ( 1, 15, 1 );

            Engine.Renderer.Driver.Debug.AddText ( "3D Audio Settings Set!", System.Drawing.Color.Green.ToArgb ( ) );

            Engine.Renderer.Driver.Debug.AddText ( "Loading Music Manager...", System.Drawing.Color.Green.ToArgb ( ) );

            MusicManager.Init ( );

            AudioTimer = new Stopwatch ( );
            AudioTimer.Start ( );
        }

        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 SendMessage( string Message )
        {
            MessageQueue.Enqueue ( Message );
        }

        public static void Update ( Engine.Rendering.Camera Camera )
        {
            if ( !bDisposed )
            {
                if ( AudioTimer.IsRunning )
                {
                    AudioTimer.Stop ( );
                    AudioDeltaTime = ( float ) AudioTimer.ElapsedMilliseconds;
                    AudioTimer.Reset ( );
                }
                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 ( );
                MusicManager.Update ( MessageQueue, AudioDeltaTime );
                MessageQueue.Clear ( );
                AudioTimer.Start ( );
            }
        }

        public static void Render ( )
        {
            if ( MusicManager.bSongLoaded )
                MusicManager.Render ( );
        }

        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.Dispose ( );
                    tempSound = null;
                    return;
                }
            }

            if ( !Path.Contains ( "http:" ) )
            {
                DirectoryInfo diPath = new DirectoryInfo ( Path );
                Engine.Renderer.Driver.Debug.AddText ( "Audio[Status] : '" + diPath.Parent + "/" + diPath.Name + "' pre-cached.", ( int ) Engine.Debug.MESSAGE_TYPE.INFORMATION );
                diPath = null;
            }
            else
            {
                Engine.Renderer.Driver.Debug.AddText ( "Audio[Status] : Shoutcast stream added.", ( int ) Engine.Debug.MESSAGE_TYPE.INFORMATION );
            }

            SoundPool.Add ( tempSound );
            
            Engine.Renderer.Driver.Debug.AddText ( "Audio[Status] : The sound pool contains '" + SoundPool.Count + "' pre-cached audio files.", System.Drawing.Color.Green.ToArgb ( ) );
        }

        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 ( );
                SoundPool.RemoveAt ( Index );
            }
        }

        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 ( );
        }
    }
}