All pastes #2067038 Raw Edit

Someone

public c v1 · immutable
#2067038 ·published 2011-05-22 16:59 UTC
rendered paste body
#include "stdafx.h"#include "PsFile.h"#include "global.h"#define scsi 1CPsFile::CPsFile(){	m_fIsFile = false;	m_pSectorBuffer[0] = NULL;	m_pPcmSctBuffer[0] = NULL;	m_fIsPcm = false;}CPsFile::~CPsFile(){}bool CPsFile::Open( CString file ){	RIFFHEADER riffHeader;	XASECTOR xaSct;	int i,j;	m_fileName = file;	m_fScsiReady = false;	if ( GetDriveType( file.Left(2) ) == DRIVE_CDROM ) {		m_fScsiReady = true;	} #ifdef scsi	if ( !m_PsXaFile.Open( 1, 5, file ) ) {		return false;	}	m_xaSctLength = m_PsXaFile.GetLength();#else	m_PsFile.Open( file, CFile::modeRead | CFile::typeBinary );	m_PsFile.Read( &riffHeader, sizeof( riffHeader ) );	if ( riffHeader.tag0 != mmioFOURCC('R','I','F','F') ) {		m_PsFile.Close();		return FALSE;	}	m_xaSctLength = riffHeader.dataLength / 2352;#endif	m_pcmPich = 0;	do {#ifdef scsi		m_PsXaFile.Read( (BYTE *)&xaSct, 1 );#else		m_PsFile.Read( &xaSct, sizeof( xaSct ) );#endif		m_pcmPich++;	} while ( xaSct.header.dataType != 0x64 );	m_pcmBlocks = m_xaSctLength / m_pcmPich;	m_fIsPcm = true;	m_waveFormat.nSamplesPerSec = 37800 - ((xaSct.header.status >> 2) & 1) * 18900;	m_waveFormat.wFormatTag = WAVE_FORMAT_PCM;	m_waveFormat.cbSize = 0;	m_waveFormat.nChannels = (xaSct.header.status & 1) + 1;	m_waveFormat.wBitsPerSample = 16;	m_waveFormat.nBlockAlign = m_waveFormat.wBitsPerSample / 8 * m_waveFormat.nChannels;	m_waveFormat.nAvgBytesPerSec = m_waveFormat.nBlockAlign * m_waveFormat.nSamplesPerSec;	i = 1;	do {		i++;#ifdef scsi		m_PsXaFile.Seek( m_xaSctLength - i, 0 );		m_PsXaFile.Read( (BYTE *)&xaSct, 1 );#else		m_PsFile.Seek( ( m_xaSctLength - i ) * 2352 + sizeof( riffHeader ), CFile::begin );		m_PsFile.Read( &xaSct, sizeof( xaSct ) );#endif	} while ( xaSct.header.dataType == 0x64 );	m_bmpInfo.biWidth = xaSct.data.movieData.header.StMDEC.StMOVIE_WIDTH;	m_bmpInfo.biHeight = xaSct.data.movieData.header.StMDEC.StMOVIE_HEIGHT;	m_bmpInfo.biSizeImage = ((m_bmpInfo.biWidth * 3 + 3) & ~3) * m_bmpInfo.biHeight ;	m_bmpInfo.biSize = sizeof( BITMAPINFOHEADER );	m_bmpInfo.biPlanes = 1;	m_bmpInfo.biBitCount = 24;	m_bmpInfo.biXPelsPerMeter = 0;	m_bmpInfo.biYPelsPerMeter = 0;	m_bmpInfo.biClrUsed = 0;	m_bmpInfo.biClrImportant = 0;	m_bmpInfo.biCompression = 0;	m_dataFrames = xaSct.data.movieData.header.StFRAME_NO;	m_TimeRate = (int)((float)m_dataFrames / (112.0 * 2.0 * 18.0 * m_pcmBlocks / 		 (float)m_waveFormat.nSamplesPerSec / (float)m_waveFormat.nChannels) + 0.5);	m_TimeScale = 1;	BYTE *buffer = (BYTE*)malloc( 32 * 2352 );	if ( buffer == NULL ) {		::MessageBox( NULL, "ÒÓØ‚ªŠm•ۏo—ˆ‚Ü‚¹‚ñ", NULL,			MB_TASKMODAL | MB_OK | MB_ICONSTOP );		return FALSE;	}	for ( i=0; i<32/m_pcmPich; i++ ) {		for ( j=0; j<m_pcmPich -1; j++ ) {			m_pSectorBuffer[(m_pcmPich - 1) * i + j] = (XASECTOR *)buffer;			buffer += 2352;		}		buffer += 2352;	}	m_imageBuffer = 32 - 32 / m_pcmPich;/*	BYTE *buffer = (BYTE*)malloc( ( m_pcmPich - 1 ) * sizeof( XASECTOR ) );	if ( buffer == NULL ) {		::MessageBox( NULL, "ÒÓØ‚ªŠm•ۏo—ˆ‚Ü‚¹‚ñ", NULL,			MB_TASKMODAL | MB_OK | MB_ICONSTOP );		return FALSE;	}	for ( i=0; i<m_pcmPich -1; i++ ) {		m_pSectorBuffer[i] = (XASECTOR *)buffer;		buffer += sizeof( XASECTOR );	}*/	buffer = (BYTE*)malloc( 32 * sizeof( XASECTOR ) );	if ( buffer == NULL ) {		::MessageBox( NULL, "ÒÓØ‚ªŠm•ۏo—ˆ‚Ü‚¹‚ñ", NULL,			MB_TASKMODAL | MB_OK | MB_ICONSTOP );		return FALSE;	}	for ( i=0; i<32; i++ ) {		m_pPcmSctBuffer[i] = (XASECTOR *)buffer;		buffer += sizeof( XASECTOR );	}	RewFrame();/*	WAVE_FMT waveHeader;	waveHeader.tag0 = 'FFIR';	waveHeader.tag1 = 'EVAW';	waveHeader.tag2 = ' tmf';	waveHeader.headerSize = 16;	waveHeader.formatTag = 1;	waveHeader.nChannels = 2;	waveHeader.nSamplesPerSec = 37800;	waveHeader.nAvgBytesPerSec = 37800 * 4;	waveHeader.nBlockAlign = 4;	waveHeader.nDataBit = 16;	waveHeader.tag3 = 'atad';	waveHeader.dataSize = 18*112*2*2 * m_pcmBlocks;	waveHeader.allSize =waveHeader.dataSize + sizeof( waveHeader) - 8;	FILE *outFile = fopen( "d:\\test.wav", "wb" );	if ( outFile == NULL ) {		fclose( outFile );	}	fwrite( &waveHeader, sizeof( waveHeader ), 1, outFile );	short buffer1[18*112*2];	for ( i=0; i<m_pcmBlocks; i++ ) {		m_PsFile.Seek( 2352 * 7, CFile::current );		m_PsFile.Read( m_pPcmSctBuffer[0], sizeof( XASECTOR ) );		decodeStereo( (char *)&(m_pPcmSctBuffer[0]->data.pcmData), buffer1 );		fwrite( buffer1, 18*112*2*2, 1, outFile );	}	fclose( outFile );*/		m_fIsFile = true;	return TRUE;}void CPsFile::Close(){	if ( m_fIsFile ) {		free( m_pSectorBuffer[0] );		m_pSectorBuffer[0] = NULL;		if ( m_pPcmSctBuffer[0] ) {			free( m_pPcmSctBuffer[0] );			m_pPcmSctBuffer[0] = NULL;		}		m_fIsPcm = false;		m_fIsFile = false;#ifdef scsi		m_PsXaFile.Close();#else		m_PsFile.Close();#endif	}}DWORD CPsFile::GetVideoRate(){	return m_TimeRate;}DWORD CPsFile::GetVideoScale(){	return m_TimeScale;}DWORD CPsFile::GetLength(){	return m_dataFrames;}CString CPsFile::GetFileName(){	return m_fileName;}void CPsFile::RewFrame(){	m_remainBuffer = 0;//	m_bufferPoint = 0;	m_ReadPcmBuffPoint = 0;	m_DecPcmBuffPoint = 0;//	m_nowPcmData = 0;	m_t1R = 0;	m_t2R = 0;	m_t1L = 0;	m_t2L = 0;#ifdef scsi	m_PsXaFile.Seek( 0, 0 );#else	m_PsFile.Seek( sizeof( RIFFHEADER), CFile::begin );#endif}int CPsFile::IsAudio(){	if ( m_fIsPcm ) {		return 18 * 112 * 2 * 2;	} else {		return 0;	}}BOOL CPsFile::GetBmpInfo( BITMAPINFOHEADER *bmp ){	if ( m_fIsFile ) {		*bmp = m_bmpInfo;		return TRUE;	}	return FALSE;}void CPsFile::GetWaveInfo( WAVEFORMATEX *wav ){	*wav = m_waveFormat;}POINT CPsFile::GetSize(){	POINT size;	if ( m_fIsFile ) {		size.x = (int)m_bmpInfo.biWidth;		size.y = (int)m_bmpInfo.biHeight;		return size;	} else {		size.x = 0;		size.y = 0;		return size;	}}int CPsFile::GetFrame( BYTE *buffer ){	int count = 0, loop, length, i, j;	DWORD *src;	DWORD *dst = (DWORD *)buffer;	DWORD *pcmSrc;	DWORD *pcmDst;	if ( !m_remainBuffer ) {#ifdef scsi		m_PsXaFile.Read( (BYTE *)m_pSectorBuffer[0], 32 );//		m_PsXaFile.Read( (BYTE *)m_pPcmSctBuffer[m_ReadPcmBuffPoint & 0x1f], 1 );#else		m_PsFile.Read( m_pSectorBuffer[0], sizeof( XASECTOR ) * 32 );//		m_PsFile.Read( m_pPcmSctBuffer[m_ReadPcmBuffPoint & 0x1f], sizeof( XASECTOR ) );#endif		for ( i=0; i<32/m_pcmPich; i++ ) {			pcmDst = (DWORD *)m_pPcmSctBuffer[m_ReadPcmBuffPoint & 0x1f];			pcmSrc = (DWORD *)(m_pSectorBuffer[0] + ( m_pcmPich * ( i + 1 ) - 1 ) );			m_ReadPcmBuffPoint++;			for ( j=0; j<2352/4; j++ ) {				*pcmDst++ = *pcmSrc++;			}		}		m_remainBuffer = m_imageBuffer;	}//	loop = m_pSectorBuffer[m_pcmPich - 1 - m_remainBuffer]->data.movieData.header.StSECTOR_SIZE;//	length = m_pSectorBuffer[m_pcmPich - 1 - m_remainBuffer]->data.movieData.header.StFRAME_SIZE;	loop = m_pSectorBuffer[m_imageBuffer - m_remainBuffer]->data.movieData.header.StSECTOR_SIZE;	length = m_pSectorBuffer[m_imageBuffer - m_remainBuffer]->data.movieData.header.StFRAME_SIZE;	do {		if ( loop <= (int)m_remainBuffer ) {			for ( i=0; i<loop; i++ ) {				src = (DWORD *)(&m_pSectorBuffer[m_imageBuffer-m_remainBuffer+i]->data.movieData.data[0]);				for ( j=0; j<(2048-32)/4; j++ ) {					*dst++ = *src++;				}			}			m_remainBuffer -= loop;			loop = 0;		} else {			for ( i=0; i<(int)m_remainBuffer; i++ ) {				src = (DWORD *)(&m_pSectorBuffer[m_imageBuffer-m_remainBuffer+i]->data.movieData.data[0]);				for ( j=0; j<(2048-32)/4; j++ ) {					*dst++ = *src++;				}			}			loop -= m_remainBuffer;#ifdef scsi			m_PsXaFile.Read( (BYTE *)m_pSectorBuffer[0], 32 );//			m_PsXaFile.Read( (BYTE *)m_pPcmSctBuffer[m_ReadPcmBuffPoint & 0x1f], 1 );#else			m_PsFile.Read( m_pSectorBuffer[0], sizeof( XASECTOR ) * 32 );//			m_PsFile.Read( m_pPcmSctBuffer[m_ReadPcmBuffPoint & 0x1f], sizeof( XASECTOR ) );#endif			for ( i=0; i<32/m_pcmPich; i++ ) {				pcmDst = (DWORD *)m_pPcmSctBuffer[m_ReadPcmBuffPoint & 0x1f];				pcmSrc = (DWORD *)(m_pSectorBuffer[0] + ( m_pcmPich * ( i + 1 ) - 1 ) );				for ( j=0; j<2352/4; j++ ) {					*pcmDst++ = *pcmSrc++;				}				m_ReadPcmBuffPoint++;			}			m_remainBuffer = m_imageBuffer;		}	} while ( loop );	return length;}  int CPsFile::GetPCM( unsigned char* pcmDst ){//	if ( !m_nowPcmData ) return 0;	if ( m_waveFormat.nChannels == 1 ) {		decodeMono( (char *)&(m_pPcmSctBuffer[m_DecPcmBuffPoint & 0x1f]->data.pcmData), (short *)pcmDst );	} else {		decodeStereo( (char *)&(m_pPcmSctBuffer[m_DecPcmBuffPoint & 0x1f]->data.pcmData), (short *)pcmDst );	}//	m_nowPcmData--;	m_DecPcmBuffPoint++;	return 18 * 112 * 2 * 2;}DWORD CPsFile::long_exg( unsigned char *data ) {  int i;  unsigned int tempo = 0;  for ( i=0; i<4; i++ ) {    tempo <<= 8;    tempo += *data++;  }  return tempo;}////////////////////////////////////* endian •ÏŠ· short */WORD CPsFile::short_exg( unsigned char *data ) {  int i;  unsigned short tempo = 0;  for ( i=0; i<2; i++ ) {    tempo <<= 8;    tempo += *data++;  }  return tempo;}/* ‚PƒuƒƒbƒN‚ðƒ‚ƒmƒ‰ƒ‹‚Å•œ†‰» */void CPsFile::decodeMono(char *adpcm, short *data){	char filt, range;	short decoded;	char *adpcmData;	char *table;	char *pTemp;	int unit, sample;	int t, i;	int tmp2, tmp3, tmp4, tmp5;	for ( i=0; i<18; i++ ) {		table = adpcm + 4;		adpcmData = adpcm + 16;		for (unit = 0; unit < 4; unit++) {			range = 12 - (*table & 0x0f);			filt = *table++ >> 4;    // 3ˆÈ‰º‚¾‚©‚畉‚ɂ͂Ȃç‚È‚¢			pTemp = adpcmData;			for ( sample = 0; sample < 28; sample++ ) {				tmp2 = (int)( *pTemp & 0x0f );				if ( tmp2 > 7 ) {					tmp2 -= 16;				}				tmp2 <<= range;				pTemp +=4;				tmp3 = tmp2 * 2;				tmp4 = K0[filt] * m_t1L;				tmp5 = K1[filt] * m_t2L;				t = tmp3 + (( tmp4 + tmp5 ) >> 8);				m_t2L = m_t1L;				m_t1L = t;				t /= 2;				if ( t > 32767 ){					decoded = 32767;				} else if ( t < -32768) {					decoded = -32768;				} else {					decoded = (short)t;				}				*data++ = decoded;			}			range = 12 - (*table & 0x0f);			filt = (*table++ >> 4) & 0x0f;			pTemp = adpcmData;			adpcmData++;			for ( sample = 0; sample < 28; sample++ ) {				tmp2 = ((int)( *pTemp >> 4)) << range;				pTemp += 4;				tmp3 = tmp2 * 2;				tmp4 = K0[filt] * m_t1L;				tmp5 = K1[filt] * m_t2L;				t = tmp3 + (( tmp4 + tmp5 ) >> 8);				m_t2L = m_t1L;				m_t1L = t;				t /= 2;				if ( t > 32767 ){					decoded = 32767;				} else if ( t < -32768) {					decoded = -32768;				} else {					decoded = (short)t;				}				*data++ = decoded;			}		}		adpcm += 128;	}}/* ‚PƒTƒEƒ“ƒhƒZƒNƒ^‚ðƒXƒeƒŒƒI‚Å•œ†‰» */void CPsFile::decodeStereo(char *adpcm, short *data){	char filtL, rangeL;	char filtR, rangeR;	char *adpcmData;	char *pTemp;	char *table;	short decoded;	int unit, sample;	int t,i;	int tmp2, tmp3, tmp4, tmp5;	for ( i=0; i<18; i++ ) {		table = adpcm + 4;		adpcmData = adpcm + 16;		for (unit = 0; unit < 4; unit++) {			rangeL = 12 - (*table & 0x0f);			filtL = *table++ >> 4;			rangeR = 12 - (*table & 0x0f);			filtR = *table++ >> 4;			pTemp = adpcmData;			adpcmData++;			for (sample = 0; sample < 28; sample++) {				tmp2 = (int)( *pTemp & 0x0f );				if ( tmp2 > 7 ) {					tmp2 -= 16;				}				tmp2 <<= rangeL;				tmp3 = tmp2*2;				tmp4 = K0[filtL] * m_t1L;				tmp5 = K1[filtL] * m_t2L;				t = tmp3 + (( tmp4 + tmp5 ) >> 8);				m_t2L = m_t1L;				m_t1L = t;				t /= 2;				if ( t > 32767 ){					decoded = 32767;				} else if ( t < -32768) {					decoded = -32768;				} else {					decoded = (short)t;				}				*data++ = decoded;				tmp2 = ((int)( *pTemp >> 4)) << rangeR;				pTemp += 4;				tmp3 = tmp2 * 2;				tmp4 = K0[filtR] * m_t1R;				tmp5 = K1[filtR] * m_t2R;				t = tmp3 + (( tmp4 + tmp5 ) >> 8);				m_t2R = m_t1R;				m_t1R = t;				t /= 2;				if ( t > 32767 ){					decoded = 32767;				} else if ( t < -32768) {					decoded = -32768;				} else {					decoded = (short)t;				}				*data++ = decoded;			}		}		adpcm += 128;	}}