Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Related Pages  

XFuXMPlayer.h

Go to the documentation of this file.
00001 /*! \file 
00002  * X-Forge Util <br>
00003  * Copyright 2000-2003 Fathammer Ltd
00004  * 
00005  * \brief XM player header file
00006  * 
00007  * $Id: XFuXMPlayer.h,v 1.15 2003/03/20 13:19:59 jetro Exp $
00008  * $Date: 2003/03/20 13:19:59 $
00009  * $Revision: 1.15 $
00010  */
00011 
00012 #ifndef XFUXMPLAYER_H_INCLUDED
00013 #define XFUXMPLAYER_H_INCLUDED
00014 
00015 #include <xfcore/XFcAudioStream.h>
00016 #include <xfutil/XFuXMPlayer_internal.h>
00017 #include <xfutil/XFuXMPlayerEventHandler.h>
00018 
00019 
00020 template<class T> class XFcLinkedList;
00021 
00022 
00023 class XFuXMPlayerEventHandlerSlot
00024 {
00025 public:
00026     XFuXMPlayerEvent mEvent;
00027     XFuXMPlayerEventHandler *mHandler;
00028 
00029     INT operator != (const XFuXMPlayerEventHandlerSlot &aRef) const
00030     {
00031         return !(mHandler == aRef.mHandler);
00032     }
00033 
00034     INT operator == (const XFuXMPlayerEventHandlerSlot &aRef) const
00035     {
00036         return (mHandler == aRef.mHandler);
00037     }
00038 };
00039 
00040 
00041 //! Plays XM music files.
00042 class XFuXMPlayer : public XFcAudioStream
00043 {
00044 protected:
00045     FLOAT32 mSampleRate;                //!< Sample rate
00046     UINT32 mFlags;                      //!< Format flags
00047     INT32 mTgtXor;                      //!< Signed/unsigned xor value
00048 
00049     XFuXMFormatHeader mXMHeader;        //!< XM file header
00050     XFuXMSong mSong;                    //!< Module
00051 
00052     XFuXMFormatPatternHeader *mXMPatternHeaders;    //!< XM pattern headers
00053     XFuXMPattern *mPatternData;                     //!< Pattern data
00054 
00055     XFuXMInstrument *mInstruments;      //!< Instruments
00056 
00057     XFuXMChannel *mChannels;            //!< Channels
00058 
00059     INT16 mSineWaveTable[XMFORMAT_SIZEOF_WAVEFORM];
00060     INT16 mSquareWaveTable[XMFORMAT_SIZEOF_WAVEFORM];
00061     INT16 mRampUpTable[XMFORMAT_SIZEOF_WAVEFORM];
00062     INT16 mRampDownTable[XMFORMAT_SIZEOF_WAVEFORM];
00063 
00064     UINT32 mPpoint;                     //!< Pattern data index
00065     INT16 mCurrentOrder;                //!< Order index
00066     INT16 mPatternNb;                   //!< Pattern index
00067     INT16 mCurrentRow;                  //!< Row index
00068     INT32 mSamplesPerTick;              //!< Amount of samples in one tick
00069     INT32 mSamplePointer;               //!< Counter
00070     FLOAT32 mTickRate;                  //!< Tick speed in Hz
00071     INT32 mRamp;
00072 
00073     UINT8 mPatternDelayCounter;         //!< Pattern delay counter
00074     UINT8 mPatternDelayCounterTemp;     //!< Temporary pattern delay counter
00075 
00076     UINT8 mIsRead;                      //!< Flag indicating whether pattern data should be read.
00077     UINT8 mJumpFlag;                    //!< Flag for pattern jump and pattern break commands
00078 
00079     UINT8 mCurrentTick;                 //!< Tick index (0..tempo-1)
00080     UINT32 mTotalTicks;                 //!< Test tick counter
00081 
00082     REAL mVolumeRampDivOpt;             //!< For volume ramping.
00083 
00084     //! List of event handlers interested in events of this player.
00085     XFcLinkedList<XFuXMPlayerEventHandlerSlot> *mEventHandlers;
00086 
00087     
00088     INT32 loadXM(const CHAR *aFilename, XFcFile *aTextout);
00089 
00090     
00091     XFuXMFormatAtom getAtom();
00092     
00093     void dumpSongParameters(XFcFile *aTextout);
00094 
00095 
00096     UINT32 getPeriod(INT8 aNote, INT8 aFinetune);
00097     
00098     UINT32 getSpeed(UINT32 aPeriod, FLOAT32 aSamplingRate);
00099     
00100     void initChannel(XFuXMChannel &aCh);
00101 
00102     void initSound(XFuXMChannel &aCh);
00103 
00104 
00105     //! Notify handlers of events.
00106     void notifyHandlers(XFuXMChannel &aCh);
00107 
00108 
00109     XFuXMPlayer(FLOAT32 aSampleRate, UINT32 aFlags);
00110  
00111 public:
00112     //! Initializes the playhead to the beginning of a certain pattern.
00113     void initSong(INT16 aStartOrder);
00114 
00115     //! Returns the player's internal tick.
00116     INT32 getTick();
00117 
00118     //! Returns the current order being played.
00119     INT16 getCurrentOrder();
00120 
00121 
00122     //! Adds a new event handler to this player.
00123     void addHandler(XFuXMPlayerEvent aEvent, XFuXMPlayerEventHandler *aHandler);
00124 
00125     //! Removes a specific event handler from this player.
00126     INT removeHandler(XFuXMPlayerEventHandler *aHandler);
00127 
00128     //! Removes all event handlers from this player.
00129     void removeHandlers();
00130 
00131 
00132     virtual void stop();
00133 
00134     virtual UINT32 stream(void *aBuf, INT32 aSamples);
00135 
00136     //! Creates an XM-Player.
00137     /*! 
00138      * Creates an XM-Player with the given module name, sampling rate and audio format.
00139      */
00140     static XFuXMPlayer * create(const CHAR *aFilename,
00141         FLOAT32 aSamplingRate, UINT32 aFlags);
00142 
00143     virtual ~XFuXMPlayer();
00144 };
00145 
00146 
00147 #endif // !XFUXMPLAYER_H_INCLUDED

   
X-Forge Documentation
Confidential
Copyright © 2002-2003 Fathammer
   
Documentation generated
with doxygen
by Dimitri van Heesch