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; }}