//--------------------------------------------------------------------------- #ifndef AudioTrackH #define AudioTrackH //--------------------------------------------------------------------------- #include "FxDef.h" #include "BaseTrack.h" #include using namespace std; #define MODE_INIT 0 #define MODE_CHANGE 1 #define MODE_INSERT 2 #define MODE_DELETE 3 //删除小节 #define MODE_MOVE 4 //移动(小节/音频) #define MODE_COPY 5 //复制(小节/音频) #define MODE_ERASE 6 //擦除音频 #define MODE_LOAD 7 #define MODE_RECORD 8 #define MODE_RELOAD 9 #define OPT_BARS 0x10 #define POINTS_PER_BAR 120 #define MAX_AUDIOTRACK 17 typedef struct tagWaveBar //波形小节 { //每小节最多POINTS_PER_BAR个音量值 DWORD aVols[POINTS_PER_BAR]; tagWaveBar() { memset( this, 0, sizeof(tagWaveBar) ); } tagWaveBar( tagWaveBar* pSrc ) { memcpy( this, pSrc, sizeof(tagWaveBar)); } } TWaveBar; typedef vector TWaveBarList; typedef vector TAudioFxList; class TAudioTrack : public TBaseTrack { public: TWaveBarList lstBars; TAudioFxList lstFxs; TAudioTrack() : TBaseTrack() { } TAudioTrack( TAudioTrack* pSrc ) : TBaseTrack( pSrc->state, pSrc->volume, pSrc->pan, pSrc->gain ) { } ~TAudioTrack() { while( !lstBars.empty() ){ delete lstBars.back(); lstBars.pop_back(); } while( !lstFxs.empty() ){ delete lstFxs.back(); lstFxs.pop_back(); } } }; typedef vector TAudioTrackList; class TAudio { private: TAudioTrackList m_lstTracks; public: TAudioTrackList& AudioTracks() { return m_lstTracks; }; void CopyTrackList( int iStartBar, int nCopyBars, TAudioTrackList* lstAudio, bool bFx=false ); TAudioTrack* CopyTrack( int iTrack, int iStartBar, int nCopyBars, bool bFx=false, TAudioTrack* pDest=NULL ); void ResetTracks( TAudioTrackList* lstAudio ); void RestoreAudio( TOpusStageList* lstStages, TAudioTrackList* lstAudio, bool bUndo ); bool Empty(){ return m_lstTracks.size()==1 && m_lstTracks[0]->lstBars.empty(); }; void WriteProj( FILE* pFile ); int ReadProj( FILE* pFile, DWORD dwVersion ); TAudio() { m_lstTracks.push_back( new TAudioTrack ); }; ~TAudio(){ while( m_lstTracks.size()>0 ){ delete m_lstTracks.back(); m_lstTracks.pop_back(); } } }; extern TAudio g_Audio; extern int g_iSelAudio; //当前处理的音轨 extern TAudioTrackList& g_aAudioTracks; //全曲音频轨道(最大4组) ///////////////////////////////////////////// //兼容早期版本 typedef struct tagEffect { int iBarStart, iBarEnd; int iPointStart, iPointEnd; bool bOn; int iPreset; float *aParams; tagEffect* pNext; tagEffect(){ memset( this, 0, sizeof(tagEffect) ); iPreset = -1; } tagEffect( tagEffect* pSrc ){ pNext = NULL; iBarStart = pSrc->iBarStart; iBarEnd = pSrc->iBarEnd; iPointStart = pSrc->iPointStart; iPointEnd = pSrc->iPointEnd; iPreset = pSrc->iPreset; bOn = pSrc->bOn; if( pSrc->aParams ){ aParams = new float[6]; memcpy( aParams, pSrc->aParams, sizeof(float)*6 ); } } ~tagEffect(){ if( aParams ) delete aParams; } }TEffect, *PTEffect; // ////////////////////////////////////////////// /***************************************************************************************/ // 全局函数 /***************************************************************************************/ TAudioTrack* NewAudioTrack( int nBar, bool bAddUndo=true ); void DeleteAudioTrack( int iTrack, bool bAddUndo=true ); void DuplicateRawBars(); TAudioTrack* DuplicateAudioTrack( TAudioTrack* pSrc ); bool MoveAudio( int iSrcTrack, double dblStart, double dblEnd, int iDestTrack, double dblInsert, int iOption ); //返回:是否刷新整个音轨 //int GetShowWave( int iTrack ); //获取当前显示的音轨 int CopyWave( int iTrack, int iStartBar, int iStartPoint, int iEndBar, int iEndPoint, DWORD** aWave ); //复制波形 void RemoveWaveBars( int iTrack, int iStartBar, int nDelBars ); void InsertWaveBars( int iTrack, int iInsertBar, TWaveBarList lstCopyBars ); void RestoreWaveBars( int iInsBar, int nBars, DWORD* aWave ); TAudioTrack* CopyAudioTrack( int iTrack, int iStartBar, int nCopyBars ); void InsertAudioTrack( int iTrack, int iInsertBar, int nBars, TAudioTrack* pSrcTrack, int iStartBar=0 ); //--------------------------------------------------------------------------- #endif