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.20 2003/10/06 11:26:47 toni Exp $ 00008 * $Date: 2003/10/06 11:26:47 $ 00009 * $Revision: 1.20 $ 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 mSamplingRate; //!< Sampling 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 UINT8 mPatternDelaySkip; //!< Flag for skipping pattern delay commands. 00076 00077 UINT8 mIsRead; //!< Flag indicating whether pattern data should be read. 00078 UINT8 mJumpFlag; //!< Flag for pattern jump and pattern break commands. 00079 00080 UINT8 mCurrentTick; //!< Tick index (0..tempo-1). 00081 UINT32 mTotalTicks; //!< Test tick counter. 00082 00083 REAL mVolumeRampDivOpt; //!< For volume ramping. 00084 00085 //! List of event handlers interested in events of this player. 00086 XFcLinkedList<XFuXMPlayerEventHandlerSlot> *mEventHandlers; 00087 00088 00089 INT loadXM(const CHAR *aFilename, XFcFile *aTextout); 00090 00091 00092 XFuXMFormatAtom getAtom(); 00093 00094 void dumpSongParameters(XFcFile *aTextout); 00095 00096 00097 UINT32 getPeriod(INT8 aNote, INT8 aFinetune); 00098 00099 UINT32 getSpeed(UINT32 aPeriod, FLOAT32 aSamplingRate); 00100 00101 void initChannel(XFuXMChannel &aCh); 00102 00103 void initSound(XFuXMChannel &aCh); 00104 00105 00106 //! Notify handlers of events. 00107 void notifyHandlers(XFuXMChannel &aCh); 00108 00109 void debugPrint(XFcFile *aTextout, char *aFmt, ...); 00110 00111 00112 XFuXMPlayer(FLOAT32 aSamplingRate, UINT32 aFlags); 00113 00114 public: 00115 //! Initializes the playhead to the beginning of a certain pattern. 00116 void initSong(INT16 aStartOrder); 00117 00118 //! Returns the player's internal tick. 00119 INT32 getTick(); 00120 00121 //! Returns the current order being played. 00122 INT16 getCurrentOrder(); 00123 00124 00125 //! Adds a new event handler to this player. 00126 void addHandler(XFuXMPlayerEvent aEvent, XFuXMPlayerEventHandler *aHandler); 00127 00128 //! Removes a specific event handler from this player. 00129 INT removeHandler(XFuXMPlayerEventHandler *aHandler); 00130 00131 //! Removes all event handlers from this player. 00132 void removeHandlers(); 00133 00134 00135 virtual void stop(); 00136 00137 virtual UINT32 stream(void *aBuffer, INT32 aTargetSamples, INT32 aOffset, 00138 INT32 aSamples); 00139 00140 //! Creates an XM-Player. 00141 /*! 00142 * Creates an XM-Player with the given module name, sampling rate and audio format. 00143 */ 00144 static XFuXMPlayer * create(const CHAR *aFilename, FLOAT32 aSamplingRate, 00145 UINT32 aFlags); 00146 00147 virtual ~XFuXMPlayer(); 00148 }; 00149 00150 00151 #endif // !XFUXMPLAYER_H_INCLUDED 00152
![]() | ||||
![]() |
Confidential Copyright © 2002-2003 Fathammer | with doxygen by Dimitri van Heesch |