Files
AC_Pro/AudioTrack.h
2026-06-13 00:05:19 +08:00

167 lines
4.2 KiB
C++

//---------------------------------------------------------------------------
#ifndef AudioTrackH
#define AudioTrackH
//---------------------------------------------------------------------------
#include "FxDef.h"
#include "BaseTrack.h"
#include <vector>
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<TWaveBar*> TWaveBarList;
typedef vector<TAudioFx*> 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<TAudioTrack*> 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