⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sequencedata.cpp

📁 游戏编程精粹2第六章源码
💻 CPP
字号:
/* Copyright (C) Scott Patterson, 2001. 
 * All rights reserved worldwide.
 *
 * This software is provided "as is" without express or implied
 * warranties. You may freely copy and compile this source into
 * applications you distribute provided that the copyright text
 * below is included in the resulting source code, for example:
 * "Portions Copyright (C) Scott Patterson, 2001"
 */

// SequenceData.cpp

#include "StdAfx.h"
#include "EventData.h"
#include "TrackData.h"
#include "SequenceData.h"
#include "Portable.h"

SequenceData_t::SequenceData_t()
{
    m_nChunkLength = 0;
    m_nChunkId[0] = 0;
    m_nChunkId[1] = 0;
    m_nChunkId[2] = 0;
    m_nChunkId[3] = 0;
    m_nFormat = 0;
    m_nTracks = 0;
    m_nPpq = 0;
	m_nTempo = 120;
    m_pFile = 0;
    m_pData = 0;
	m_pTrackVolumeVectorVector = 0;
}

SequenceData_t::~SequenceData_t()
{
	TrackDataPtrList_t::iterator iTDL;

	for( iTDL = m_TrackDataPtrList.begin(); iTDL != m_TrackDataPtrList.end(); ++iTDL )
	{
		delete *iTDL;
	}
}

void SequenceData_t::SetFileName( String_t &sFileName )
{
	m_sFileName = sFileName;
}

String_t SequenceData_t::GetFileName()
{
	return m_sFileName;
}

void SequenceData_t::SetID( int nID )
{
	m_nID = nID;
}

int SequenceData_t::GetID()
{
	return m_nID;
}

u32 SequenceData_t::GetPpq()
{
	return m_nPpq;
}

u32 SequenceData_t::GetTempo()
{
	return m_nTempo;
}

int SequenceData_t::GetTrackCount()
{
	return m_nTracks;
}

bool SequenceData_t::Load( const char *pFilename )
{
	if( !pFilename )
	{
		return false;
	}

	if( Open( pFilename ) )
	{
		for( int i=0; i<m_nTracks; i++ )
		{
			TrackData_t *pTrackData = new TrackData_t;

			pTrackData->Load( m_pData, i );
			if( pTrackData->IsTempoTrack() )
			{
				m_nTempo = pTrackData->GetTempo();
			}
			PushBackTrack( pTrackData );
		}

		Close();
		return true;
	}

	return false;
}

bool SequenceData_t::Open( const char *pFilename )
{
	u8 aHeader[14];
	u32 nFilelength,nBytesRemaining;
	
	if ((m_pFile=fopen(pFilename,"rb")) != NULL)
    {
		fseek(m_pFile,0,SEEK_END);
		nFilelength = ftell(m_pFile);
		fseek(m_pFile,0,SEEK_SET);
		
		fread(aHeader,1,sizeof(aHeader),m_pFile);
		memcpy(m_nChunkId,aHeader,sizeof(m_nChunkId));
		if( strncmp( "MThd", m_nChunkId, 4 ) )
		{
			fclose( m_pFile );
			return false;
		}

		m_nChunkLength=Portable_ConvertStringToS32(&aHeader[4]);
		m_nFormat=Portable_ConvertStringToU16(&aHeader[8]);
		m_nTracks=Portable_ConvertStringToU16(&aHeader[10]);
		m_nPpq=Portable_ConvertStringToU16(&aHeader[12]);
		if( m_nChunkLength > 6 )
		{
			fseek(m_pFile,m_nChunkLength-6,SEEK_CUR);
		}
		
		nBytesRemaining = nFilelength-(m_nChunkLength+8);
		m_pData=(u8 *)malloc(nBytesRemaining);
		fread(m_pData,1,nBytesRemaining,m_pFile);

		return true;
    }
	return false;
}

void SequenceData_t::Close()
{
	fclose(m_pFile);

	if(m_pData)
	{
		free(m_pData);
	}
}

void SequenceData_t::Print()
{
	TrackDataPtrList_t::iterator iTDL;

	printf( "Sequence: \n" );

	printf( "  Chunk Length: %d\n", m_nChunkLength );
	printf( "  Format: %d\n", m_nFormat );
	printf( "  Tracks: %d\n", m_nTracks );
	printf( "  Ppq: %d\n", m_nPpq );

	printf( "\n" );

	for( iTDL = m_TrackDataPtrList.begin(); iTDL != m_TrackDataPtrList.end(); ++iTDL )
	{
		TrackData_t *pTrackData = *iTDL;

		pTrackData->Print();
	}
}

void SequenceData_t::PushBackTrack( TrackData_t *pTrackData )
{
	m_TrackDataPtrList.push_back( pTrackData );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -