All pastes #545808 Raw Edit

Stuff

public text v1 · immutable
·published 2007-06-06 21:35 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: Music.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.                         //
//                                                                                      //
//  ==================================================================================  //

//#define STOPMUSIC

using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

using KillShit.Engine.Audio;

namespace KillShit.Game.Audio
{
    public class MusicManager
    {
        public bool bDisposed = false;

        Engine.Audio.FMOD.Channel chMusicChannel;

        public bool bShuffle = true;
        bool bIsPlaying = false;

        List<FileInfo> fiSongs;

        int iCurrentSong = 0;
        int iNextSong = 0;

        string strSongTitle = null;
        string strSongArtist = null;

        Vector2 v2Position = Vector2.Empty;
        Vector2 v2Length = Vector2.Empty;

        string strPosition;
        string strLength;

        DirectoryInfo diMusicDirectory = new DirectoryInfo ( Game.Misc.IOFunc.BaseDir + "Sound\\Music" );

        public MusicManager ( )
        {
            fiSongs = new List<FileInfo> ( );
        }

        public void Init ( )
        {
            if ( fiSongs.Count > 1 )
            {
                Engine.Renderer.Driver.Debug.AddText ( fiSongs.Count + " songs added from the Music Directory.", System.Drawing.Color.LightGreen.ToArgb ( ) );
            }

            Engine.Renderer.Driver.Debug.AddText ( "Music Manager Initialization Successful!", (int)Engine.Debug.MESSAGE_TYPE.INITIALIZE );
            
            DoAll ( );
        }

        public void Update ( float DeltaTime )
        {
            chMusicChannel.isPlaying ( ref bIsPlaying );

            if ( !bIsPlaying )
            {
                DoAll ( );
            }

            GetPosition ( );

            RenderSongInfo ( );
        }

        private void DoAll ( )
        {
            UpdateSongList ( );

            CheckPlayModes ( );

            if ( bShuffle )
                SelectRandomSong ( );

            PlayNextSong ( );

            GetTagInfo ( );

            GetLength ( );
        }

        private void PlayNextSong ( )
        {
            AudioManager.getPreCachedSound ( fiSongs [ iNextSong ].FullName ).sdSound.setMode ( Engine.Audio.FMOD.MODE.LOOP_OFF );
            AudioManager.playSound ( KillShit.Engine.Audio.FMOD.CHANNELINDEX.REUSE, fiSongs [ iNextSong ].FullName, false, ref chMusicChannel );

            Engine.Renderer.Driver.Debug.AddText ( "Music Manager[Status] : Switching to next song.", ( int ) Engine.Debug.MESSAGE_TYPE.INFORMATION );

            iCurrentSong = iNextSong;
        }

        private void RenderSongInfo ( )
        {
            string finalOutput = "Currently Playing : " + strSongTitle + " by " + strSongArtist + " - [" + strPosition + " / " + strLength + "]";
            int Width = Engine.Renderer.Driver.Text.MeasureSize ( finalOutput ).Width;
            Engine.Renderer.Driver.Text.RenderText ( finalOutput, frmMain.pWidth - Width - frmMain.pWidthPad, 0, Color.FromArgb ( 255, 128, 192, 255 ).ToArgb ( ) );
        }

        private void GetTagInfo ( )
        {
            Engine.Audio.FMOD.TAG Tag = new Engine.Audio.FMOD.TAG ( );

            //  TITLE
            if ( AudioManager.getPreCachedSound ( fiSongs [ iCurrentSong ].FullName ).sdSound.getTag ( "TITLE", 0, ref Tag ) == Engine.Audio.FMOD.RESULT.OK )
            {
                strSongTitle = "" + Marshal.PtrToStringAnsi ( Tag.data );
            }
            else
            {
                strSongTitle = "Unknown Title";
            }

            //  ARTIST
            if ( AudioManager.getPreCachedSound ( fiSongs [ iCurrentSong ].FullName ).sdSound.getTag ( "ARTIST", 0, ref Tag ) == Engine.Audio.FMOD.RESULT.OK )
            {
                strSongArtist = "" + Marshal.PtrToStringAnsi ( Tag.data );
            }
            else
            {
                strSongArtist = "Unknown Artist";
            }
        }

        private void GetLength ( )
        {
            uint uiLength = 0;
            AudioManager.getPreCachedSound ( fiSongs [ iCurrentSong ].FullName ).sdSound.getLength ( ref uiLength, Engine.Audio.FMOD.TIMEUNIT.MS );

            uiLength /= 1000;

            v2Length.X = ( float ) Math.Floor ( ( float ) uiLength / 60 );
            v2Length.Y = ( float ) Math.Floor ( ( float ) uiLength % 60 );

            string LengthFinalY = v2Length.Y.ToString ( );

            //  Add leading zero.
            if ( v2Length.Y < 10 )
            {
                LengthFinalY = "0" + v2Length.Y;
            }

            strLength = v2Length.X + ":" + LengthFinalY;
        }

        private void GetPosition ( )
        {
            uint uiPosition = 0;
            chMusicChannel.getPosition ( ref uiPosition, Engine.Audio.FMOD.TIMEUNIT.MS );

            uiPosition /= 1000;

            v2Position.X = ( float ) Math.Floor ( ( float ) uiPosition / 60 );
            v2Position.Y = ( float ) Math.Floor ( ( float ) uiPosition % 60 );

            string PositionY = v2Position.Y.ToString ( );

            //  Add leading zero.
            if ( v2Position.Y < 10 )
            {
                PositionY = "0" + v2Position.Y;
            }

            strPosition = v2Position.X + ":" + PositionY;
        }

        private void CheckPlayModes ( )
        {
            if ( bShuffle )
            {
                SelectRandomSong ( );
            }
            else
            {
                iNextSong = iCurrentSong;
            }
        }

        public void SelectRandomSong ( )
        {
            if ( fiSongs.Count > 1 )
            {
                Random RandomSongSelector = new Random ( );

                iNextSong = iCurrentSong;

                while ( iNextSong == iCurrentSong )
                {
                    iNextSong = RandomSongSelector.Next ( fiSongs.Count );
                }
            }
            else if ( fiSongs.Count == 1 )
            {
                iNextSong = 0;
                Engine.Renderer.Driver.Debug.AddText ( "Music Manager[Warning] : Only one song was in the Music Directory, it will continue to loop.", ( int ) Engine.Debug.MESSAGE_TYPE.WARNING );
            }
            else
            {
                Engine.Renderer.Driver.Debug.AddText ( "Music Manager[Warning] : Couldn't find any songs in the Music Directory.", ( int ) Engine.Debug.MESSAGE_TYPE.WARNING );
                return;
            }
        }

        private void UpdateSongList ( )
        {
            FileInfo [ ] fiFiles;

            fiFiles = diMusicDirectory.GetFiles ( );

            fiSongs.Clear ( );

            foreach ( FileInfo fiFile in fiFiles )
            {
                if ( fiFile.Extension == ".mp3" || fiFile.Extension == ".wav" || fiFile.Extension == ".ogg" )
                {
                    fiSongs.Add ( fiFile );
                }
            }

            foreach ( FileInfo Song in fiSongs )
            {
                AudioManager.addSound ( Song.FullName, TYPE.Music, ( Engine.Audio.FMOD.MODE._2D | Engine.Audio.FMOD.MODE.HARDWARE | Engine.Audio.FMOD.MODE.CREATESTREAM ) );
            }
        }

        public void Dispose ( )
        {
            foreach( FileInfo Song in fiSongs )
            {
                AudioManager.destroySound ( fiSongs [ iCurrentSong ].FullName );
            }

            bDisposed = true;
        }
    }
}