ClResult ClSoundDS::playVoice(int &handle,int arcFileNum,char *fname,BOOL bLoop) { char workBuf[64]; BOOL ret; ClSoundBuffer *lpSoundBuffer; wsprintf(workBuf,"%s.ogg",fname); int num = readFile->SearchFile(arcFileNum,workBuf); if(num==-1){ myOutputDebugString("Voiceファイル『%s』が見つかりませんでした。\n",workBuf); return Cl_PCM_NOTFOUND; } if(0==sysInf.voiceVolume)return Cl_OK; if(keyState.data_skip || sysInf.bAlreadyRead)return Cl_OK; lpSoundBuffer = SelectSoundBuffer(handle); if(lpSoundBuffer){ int status = GetStatus(handle); if(status != PCM_STOP){ Stop(handle); } ret = CreateStreamBuffer(handle,arcFileNum,num); if(-1==ret)return Cl_PCM_NOTFOUND; }else{ CreateSoundObj(handle,arcFileNum,num,TRUE); if(-1==handle)return Cl_PCM_NOTFOUND; } int volume = sysInf.voiceVolume*0xff /10; SetVolume(handle,volume); if(FALSE==bLoop){ play(handle,1); }else{ play(handle,0); } return Cl_OK; } // ClSoundDS::playVoice
BOOL OpenPackFile() { int i,ret; char packfileName[pack_tail][28] = { "BGMFILE", "SOUNDDS","VOICE","GPARTS", "EVENTCG","SCRIPT","ANIME"}; readFile = new ClReadFile; for(i=0;i<pack_tail;i++){ ret = readFile->OpenPackFile(packfileName[i]); if(-1 == ret){ myOutputDebugString("ファイル『%s.PAK』が見つかりませんでした。ゲームは起動できません。\n",packfileName[i]); my_delete(readFile); return FALSE; } } return TRUE; } // OpenPackFile
BOOL ClSoundDS::AddSoundBuffer(int handle,char *fileBuf,BOOL b3DSound) { HRESULT hr; RiffHead riffHead; FmtHead fmtHead; PCMWAVEFORMAT pcmFormat; LPBYTE lpBlockAdd1, lpBlockAdd2; DWORD blockSize1, blockSize2; CopyMemory(&riffHead,fileBuf,sizeof(RiffHead)); fileBuf += sizeof(RiffHead); if(strncmp(riffHead.riff,"RIFF",4) || strncmp(riffHead.type,"WAVE",4)){ return FALSE; } if(NULL==lpDSBufferTop){ lpDSBufferTop = lpDSBufferTail = new ClSoundBuffer; }else{ lpDSBufferTail->lpNext = new ClSoundBuffer; lpDSBufferTail->lpNext->lpPrev = lpDSBufferTail; lpDSBufferTail = lpDSBufferTail->lpNext; } lpDSBufferTail->bufType = memory_sound; CopyMemory(&fmtHead,fileBuf,sizeof(FmtHead)); fileBuf += sizeof(FmtHead); CopyMemory(&pcmFormat,fileBuf,sizeof(PCMWAVEFORMAT)); if(pcmFormat.wf.wFormatTag == WAVE_FORMAT_PCM){ fileBuf += fmtHead.size; CopyMemory(&fmtHead,fileBuf,sizeof(FmtHead)); fileBuf += sizeof(FmtHead); while(0!=strncmp(fmtHead.fmt,"data",4)){ fileBuf += fmtHead.size; CopyMemory(&fmtHead,fileBuf,sizeof(FmtHead)); fileBuf += sizeof(FmtHead); } DSBUFFERDESC dsbdesc; WAVEFORMATEX audioFmt; ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC)); dsbdesc.dwSize = sizeof(DSBUFFERDESC); dsbdesc.dwFlags = DSBCAPS_STATIC | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_LOCSOFTWARE | DSBCAPS_GLOBALFOCUS; if(b3DSound) dsbdesc.dwFlags |= (DSBCAPS_CTRL3D | DSBCAPS_MUTE3DATMAXDISTANCE); dsbdesc.dwBufferBytes = fmtHead.size; CopyMemory(&audioFmt,&pcmFormat,sizeof(WAVEFORMAT)); audioFmt.wBitsPerSample = pcmFormat.wBitsPerSample; audioFmt.cbSize = 0; dsbdesc.lpwfxFormat = &audioFmt; hr = lpDSound->CreateSoundBuffer(&dsbdesc, &lpTmpBuffer, NULL); lpTmpBuffer->QueryInterface(IID_IDirectSoundBuffer8,(LPVOID *)&lpDSBufferTail->lpDSBuffer); RELEASE(lpTmpBuffer); hr = lpDSBufferTail->lpDSBuffer->Lock(0,fmtHead.size, (LPVOID*)&lpBlockAdd1, &blockSize1,(LPVOID*)&lpBlockAdd2, &blockSize2, 0); if(DS_OK==hr){ CopyMemory(lpBlockAdd1,fileBuf,blockSize1); if(fmtHead.size>blockSize1){ CopyMemory(lpBlockAdd2,fileBuf+blockSize1,blockSize2); } lpDSBufferTail->lpDSBuffer->Unlock(lpBlockAdd1, blockSize1, lpBlockAdd2, blockSize2); } lpDSBufferTail->handle = handle; }else{ WAVEFORMATEX dstWF; WAVEFORMATEX *pwfxInfo; WORD cbExtraAlloc; MMRESULT mmResult; fileBuf += sizeof(PCMWAVEFORMAT); CopyMemory(&cbExtraAlloc,fileBuf,sizeof(WORD)); fileBuf += sizeof(WORD); pwfxInfo = (WAVEFORMATEX *)cl_malloc(sizeof(WAVEFORMATEX) +cbExtraAlloc); CopyMemory(pwfxInfo,&pcmFormat,sizeof(PCMWAVEFORMAT)); pwfxInfo->cbSize = cbExtraAlloc; CopyMemory((char *)pwfxInfo +sizeof(WAVEFORMATEX),fileBuf,cbExtraAlloc); fileBuf += (fmtHead.size -sizeof(WAVEFORMATEX)); CopyMemory(&fmtHead,fileBuf,sizeof(FmtHead)); fileBuf += sizeof(FmtHead); while(0!=strncmp(fmtHead.fmt,"data",4)){ fileBuf += fmtHead.size; CopyMemory(&fmtHead,fileBuf,sizeof(FmtHead)); fileBuf += sizeof(FmtHead); } ZeroMemory(&dstWF,sizeof(dstWF)); dstWF.wFormatTag = WAVE_FORMAT_PCM; mmResult = acmFormatSuggest( NULL, pwfxInfo, &dstWF, sizeof(dstWF), ACM_FORMATSUGGESTF_WFORMATTAG); if(mmResult != 0){ myOutputDebugString("オーディオ圧縮が無効です\n"); return FALSE; } HACMSTREAM hAcm = NULL; ACMSTREAMHEADER ash; AcmBuffer acmDst; AcmBuffer acmSrc; acmStreamOpen(&hAcm, NULL,pwfxInfo,&dstWF, NULL, 0L, 0L, ACM_STREAMOPENF_NONREALTIME); acmSrc.dwStreamSize = fmtHead.size; acmStreamSize(hAcm, acmSrc.dwStreamSize, &acmDst.dwStreamSize, ACM_STREAMSIZEF_SOURCE); cl_free(pwfxInfo); acmSrc.lpStream = (LPBYTE)cl_malloc(acmSrc.dwStreamSize); acmDst.lpStream = (LPBYTE)cl_malloc(acmDst.dwStreamSize); ZeroMemory(&ash,sizeof(ash)); ash.cbStruct = sizeof(ash); ash.pbSrc = acmSrc.lpStream; ash.cbSrcLength = acmSrc.dwStreamSize; ash.dwSrcUser = acmSrc.dwStreamSize; ash.pbDst = acmDst.lpStream; ash.cbDstLength = acmDst.dwStreamSize; ash.dwDstUser = acmDst.dwStreamSize; acmStreamPrepareHeader(hAcm,&ash,0); CopyMemory(acmSrc.lpStream,fileBuf,acmSrc.dwStreamSize); MMRESULT nError = acmStreamConvert(hAcm,&ash, ACM_STREAMCONVERTF_BLOCKALIGN); DSBUFFERDESC dsbdesc; ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC)); dsbdesc.dwSize = sizeof(DSBUFFERDESC); dsbdesc.dwFlags = DSBCAPS_STATIC | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_LOCSOFTWARE | DSBCAPS_GLOBALFOCUS; if(b3DSound) dsbdesc.dwFlags |= (DSBCAPS_CTRL3D | DSBCAPS_MUTE3DATMAXDISTANCE); dsbdesc.dwBufferBytes = ash.cbDstLengthUsed; dsbdesc.lpwfxFormat = &dstWF; hr = lpDSound->CreateSoundBuffer(&dsbdesc, &lpTmpBuffer, NULL); lpTmpBuffer->QueryInterface(IID_IDirectSoundBuffer8,(LPVOID *)&lpDSBufferTail->lpDSBuffer); RELEASE(lpTmpBuffer); hr = lpDSBufferTail->lpDSBuffer->Lock(0,ash.cbDstLengthUsed, (LPVOID*)&lpBlockAdd1, &blockSize1,(LPVOID*)&lpBlockAdd2, &blockSize2, 0); if(DS_OK==hr){ if(ash.cbDstLengthUsed < blockSize1){ CopyMemory(lpBlockAdd1, acmDst.lpStream, ash.cbDstLengthUsed); ZeroMemory(lpBlockAdd1 +ash.cbDstLengthUsed, blockSize1 -ash.cbDstLengthUsed); if(blockSize2)ZeroMemory(lpBlockAdd2,blockSize2); }else{ CopyMemory(lpBlockAdd1, acmDst.lpStream, blockSize1); if(blockSize2){ CopyMemory(lpBlockAdd2, acmDst.lpStream+blockSize1, ash.cbDstLengthUsed -blockSize1); } } lpDSBufferTail->lpDSBuffer->Unlock(lpBlockAdd1, blockSize1, lpBlockAdd2, blockSize2); } if(hAcm){ acmStreamUnprepareHeader(hAcm,&ash,0); acmStreamClose(hAcm,0); cl_free(acmSrc.lpStream); cl_free(acmDst.lpStream); } lpDSBufferTail->handle = handle; } return TRUE; } // ClSoundDS::AddSoundBuffer
BOOL ClSoundDS::CreateStreamBuffer(int handle,int arcFileNum,int playNum) { int size,stream,dataTopOffset,nextStream = -1; HRESULT hr; RiffHead riffHead; FmtHead fmtHead; PCMWAVEFORMAT pcmFormat; BOOL bOGG = FALSE; ReleaseSoundBuffer(handle); stream = lpReadFile->StreamOpenFileNum(arcFileNum,playNum,size); if(pack_bgmfile!=arcFileNum && pack_voice!=arcFileNum){ lpReadFile->StreamReadFile(arcFileNum,stream,(char *)&riffHead,sizeof(RiffHead)); if(strncmp(riffHead.riff,"RIFF",4) || strncmp(riffHead.type,"WAVE",4)){ lpReadFile->StreamCloseFile(arcFileNum,stream); return FALSE; } lpReadFile->StreamReadFile(arcFileNum,stream,(char *)&fmtHead,sizeof(FmtHead)); lpReadFile->StreamReadFile(arcFileNum,stream,(char *)&pcmFormat,sizeof(PCMWAVEFORMAT)); }else{ char chkFmt[4]; bOGG = TRUE; char *fname = lpReadFile->GetFileName(arcFileNum,playNum); lpReadFile->StreamReadFile(arcFileNum,stream,(char *)&chkFmt,4); lpReadFile->StreamSeekFile(arcFileNum,stream,0,FILE_BEGIN); if(0!=strncmp(chkFmt,"OggS",4))return FALSE; dataTopOffset = 0; if(NULL==lpDSBufferTop){ lpDSBufferTop = lpDSBufferTail = new ClSoundBuffer; }else{ lpDSBufferTail->lpNext = new ClSoundBuffer; lpDSBufferTail->lpNext->lpPrev = lpDSBufferTail; lpDSBufferTail = lpDSBufferTail->lpNext; } lpDSBufferTail->dataTopOffset = dataTopOffset; lpDSBufferTail->o_dat = new OggDec; if(_strnicmp(&fname[strlen(fname)-6],"_A.",3) == 0){ char workBuf[32]; strcpy(workBuf,fname); workBuf[strlen(fname)-5] = 'B'; nextStream = lpReadFile->SearchFile(arcFileNum,workBuf); } WAVEFORMATEX dstWF; char workBuf[4096]; lpReadFile->StreamReadFile(arcFileNum,stream,workBuf,4096); lpDSBufferTail->o_dat->GetWaveformat(&dstWF,workBuf); DSBUFFERDESC dsbdesc; ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC)); dsbdesc.dwSize = sizeof(DSBUFFERDESC); dsbdesc.dwFlags = DSBCAPS_STATIC | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_LOCSOFTWARE | DSBCAPS_GLOBALFOCUS; dsbdesc.dwBufferBytes = dstWF.nAvgBytesPerSec *2; dsbdesc.lpwfxFormat = &dstWF; hr = lpDSound->CreateSoundBuffer(&dsbdesc, &lpTmpBuffer, NULL); lpTmpBuffer->QueryInterface(IID_IDirectSoundBuffer8,(LPVOID *)&lpDSBufferTail->lpDSBuffer); RELEASE(lpTmpBuffer); lpDSBufferTail->streamBlockSize = dstWF.nAvgBytesPerSec; } if(bOGG){ pcmFormat.wf.wFormatTag = WAVE_FORMAT_OGG; }else if(pcmFormat.wf.wFormatTag != WAVE_FORMAT_PCM){ WAVEFORMATEX dstWF; WAVEFORMATEX *pwfxInfo; WORD cbExtraAlloc; MMRESULT mmResult; lpReadFile->StreamReadFile(arcFileNum,stream,(char *)&cbExtraAlloc,sizeof(WORD)); pwfxInfo = (WAVEFORMATEX *)cl_malloc(sizeof(WAVEFORMATEX) +cbExtraAlloc); CopyMemory(pwfxInfo,&pcmFormat,sizeof(PCMWAVEFORMAT)); pwfxInfo->cbSize = cbExtraAlloc; lpReadFile->StreamReadFile(arcFileNum,stream,(char *)pwfxInfo +sizeof(WAVEFORMATEX),cbExtraAlloc); lpReadFile->StreamSeekFile(arcFileNum,stream,sizeof(RiffHead),FILE_BEGIN); lpReadFile->StreamReadFile(arcFileNum,stream,(char *)&fmtHead,sizeof(FmtHead)); dataTopOffset = sizeof(RiffHead) +sizeof(FmtHead); while(0!=strncmp(fmtHead.fmt,"data",4)){ lpReadFile->StreamSeekFile(arcFileNum,stream,fmtHead.size,FILE_CURRENT); dataTopOffset += fmtHead.size; lpReadFile->StreamReadFile(arcFileNum,stream,(char *)&fmtHead,sizeof(FmtHead)); dataTopOffset += sizeof(FmtHead); } ZeroMemory(&dstWF,sizeof(dstWF)); dstWF.wFormatTag = WAVE_FORMAT_PCM; mmResult = acmFormatSuggest( NULL, pwfxInfo, &dstWF, sizeof(dstWF), ACM_FORMATSUGGESTF_WFORMATTAG); if(mmResult != 0){ myOutputDebugString("オーディオ圧縮が無効です\n"); return FALSE; } if(NULL==lpDSBufferTop){ lpDSBufferTop = lpDSBufferTail = new ClSoundBuffer; }else{ lpDSBufferTail->lpNext = new ClSoundBuffer; lpDSBufferTail->lpNext->lpPrev = lpDSBufferTail; lpDSBufferTail = lpDSBufferTail->lpNext; } lpDSBufferTail->dataTopOffset = dataTopOffset; acmStreamOpen(&lpDSBufferTail->hAcm, NULL,pwfxInfo,&dstWF, NULL, 0L, 0L, ACM_STREAMOPENF_NONREALTIME); size = pwfxInfo->nAvgBytesPerSec; if(size % pwfxInfo->nBlockAlign){ size = (size/pwfxInfo->nBlockAlign +1)*pwfxInfo->nBlockAlign; } acmStreamSize(lpDSBufferTail->hAcm,size, &lpDSBufferTail->acmDst.dwStreamSize, ACM_STREAMSIZEF_SOURCE); acmStreamSize(lpDSBufferTail->hAcm, lpDSBufferTail->acmDst.dwStreamSize, &lpDSBufferTail->acmSrc.dwStreamSize, ACM_STREAMSIZEF_DESTINATION); acmStreamSize(lpDSBufferTail->hAcm, lpDSBufferTail->acmSrc.dwStreamSize, &lpDSBufferTail->acmDst.dwStreamSize, ACM_STREAMSIZEF_SOURCE); cl_free(pwfxInfo); if(fmtHead.size < lpDSBufferTail->acmSrc.dwStreamSize*2){ acmStreamClose(lpDSBufferTail->hAcm, 0); lpDSBufferTail->hAcm = NULL; lpReadFile->StreamCloseFile(arcFileNum,stream); if(lpDSBufferTop == lpDSBufferTail){ delete lpDSBufferTail; lpDSBufferTop = lpDSBufferTail = NULL; }else{ lpDSBufferTail = lpDSBufferTail->lpPrev; delete(lpDSBufferTail->lpNext); lpDSBufferTail->lpNext = NULL; } return -1; } lpDSBufferTail->acmSrc.lpStream = (LPBYTE)cl_malloc(lpDSBufferTail->acmSrc.dwStreamSize); lpDSBufferTail->acmDst.lpStream = (LPBYTE)cl_malloc(lpDSBufferTail->acmDst.dwStreamSize); ZeroMemory(&lpDSBufferTail->ash,sizeof(lpDSBufferTail->ash)); lpDSBufferTail->ash.cbStruct = sizeof(lpDSBufferTail->ash); lpDSBufferTail->ash.pbSrc = lpDSBufferTail->acmSrc.lpStream; lpDSBufferTail->ash.cbSrcLength = lpDSBufferTail->acmSrc.dwStreamSize; lpDSBufferTail->ash.dwSrcUser = lpDSBufferTail->acmSrc.dwStreamSize; lpDSBufferTail->ash.pbDst = lpDSBufferTail->acmDst.lpStream; lpDSBufferTail->ash.cbDstLength = lpDSBufferTail->acmDst.dwStreamSize; lpDSBufferTail->ash.dwDstUser = lpDSBufferTail->acmDst.dwStreamSize; acmStreamPrepareHeader(lpDSBufferTail->hAcm,&lpDSBufferTail->ash,0); DSBUFFERDESC dsbdesc; ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC)); dsbdesc.dwSize = sizeof(DSBUFFERDESC); dsbdesc.dwFlags = DSBCAPS_STATIC | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_LOCSOFTWARE | DSBCAPS_GLOBALFOCUS; dsbdesc.dwBufferBytes = lpDSBufferTail->acmDst.dwStreamSize *2; dsbdesc.lpwfxFormat = &dstWF; hr = lpDSound->CreateSoundBuffer(&dsbdesc, &lpTmpBuffer, NULL); lpTmpBuffer->QueryInterface(IID_IDirectSoundBuffer8,(LPVOID *)&lpDSBufferTail->lpDSBuffer); RELEASE(lpTmpBuffer); lpDSBufferTail->streamBlockSize = lpDSBufferTail->acmDst.dwStreamSize; }else{ dataTopOffset = sizeof(RiffHead) +sizeof(FmtHead) +fmtHead.size; lpReadFile->StreamSeekFile(arcFileNum,stream,fmtHead.size -sizeof(PCMWAVEFORMAT),FILE_CURRENT); lpReadFile->StreamReadFile(arcFileNum,stream,(char *)&fmtHead,sizeof(FmtHead)); dataTopOffset += sizeof(FmtHead); while(0!=strncmp(fmtHead.fmt,"data",4)){ lpReadFile->StreamSeekFile(arcFileNum,stream,fmtHead.size,FILE_CURRENT); dataTopOffset += fmtHead.size; lpReadFile->StreamReadFile(arcFileNum,stream,(char *)&fmtHead,sizeof(FmtHead)); dataTopOffset += sizeof(FmtHead); } if(fmtHead.size < pcmFormat.wf.nAvgBytesPerSec*2){ lpReadFile->StreamCloseFile(arcFileNum,stream); return -1; } if(NULL==lpDSBufferTop){ lpDSBufferTop = lpDSBufferTail = new ClSoundBuffer; }else{ lpDSBufferTail->lpNext = new ClSoundBuffer; lpDSBufferTail->lpNext->lpPrev = lpDSBufferTail; lpDSBufferTail = lpDSBufferTail->lpNext; } lpDSBufferTail->dataTopOffset = dataTopOffset; DSBUFFERDESC dsbdesc; WAVEFORMATEX audioFmt; ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC)); dsbdesc.dwSize = sizeof(DSBUFFERDESC); dsbdesc.dwFlags = DSBCAPS_STATIC | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_LOCSOFTWARE | DSBCAPS_GLOBALFOCUS; CopyMemory(&audioFmt,&pcmFormat,sizeof(WAVEFORMAT)); audioFmt.wBitsPerSample = pcmFormat.wBitsPerSample; audioFmt.cbSize = 0; dsbdesc.dwBufferBytes = audioFmt.nAvgBytesPerSec *2; dsbdesc.lpwfxFormat = &audioFmt; hr = lpDSound->CreateSoundBuffer(&dsbdesc, &lpTmpBuffer, NULL); lpTmpBuffer->QueryInterface(IID_IDirectSoundBuffer8,(LPVOID *)&lpDSBufferTail->lpDSBuffer); RELEASE(lpTmpBuffer); lpDSBufferTail->streamBlockSize = audioFmt.nAvgBytesPerSec; } lpDSBufferTail->arcFileNum = arcFileNum; lpDSBufferTail->musicNum = lpDSBufferTail->orgMusicNum = playNum; lpDSBufferTail->streamNum = stream; lpDSBufferTail->nextStream = nextStream; lpDSBufferTail->handle = handle; lpDSBufferTail->bufType = stream_sound; lpDSBufferTail->readFile = lpReadFile; lpDSBufferTail->wFormatTag = pcmFormat.wf.wFormatTag; return TRUE; } // ClSoundDS::CreateStreamBuffer
BOOL CMovie::DecodeMovie() { BOOL bSkip = FALSE,bLost = FALSE; HRESULT hr; int ret = FALSE; if((-1)==stream)return FALSE; if(bPause)return FALSE; if(skip_cnt){ xvidDec.SetSkip(TRUE); bSkip = TRUE; } REDRAW: if(lpSrcSurface){ DDSURFACEDESC2 ddsd; INIT_DIRECTDRAW_STRUCT(ddsd); if(DD_OK != (hr=lpPrimary->IsLost())){ bLost = TRUE; }else{ hr =lpSrcSurface->Lock( NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WAIT, NULL); } if(DD_OK!=hr || bLost){ xvidDec.SetSkip(TRUE); bSkip = TRUE; } ret = xvidDec.DecodeXviD(readBuf,read_size,&rest,(LPBYTE)ddsd.lpSurface,ddsd.lPitch); if(DD_OK==hr) lpSrcSurface->Unlock(NULL); }else{ ret = xvidDec.DecodeXviD(readBuf,read_size,&rest,g_DibInf.colorBuf.pBuf,WIN_SIZEX*3); } xvidDec.SetSkip(FALSE); switch(ret){ case XviD_DEC_NEEDMORE: read_size = readFile->StreamReadFile(pack_sound,stream,(char *)readBuf+rest,buffer_size-rest); break; case XviD_DEC_END: if(bLoop){ xvidDec.SetInit(); readFile->StreamSeekFile(pack_sound,stream,0,FILE_BEGIN); read_size = readFile->StreamReadFile(pack_sound,stream,(char *)readBuf,buffer_size); goto REDRAW; }else{ xvidDec.Clear_XviD(); bPlay = FALSE; bExitMovieThread = TRUE; return TRUE; } break; } DWORD now_time = timeGetTime(); DWORD play_time = DWORD(start_time+frame_cnt*fpms/1000); if(now_time<play_time && 0==skip_cnt){ Sleep(play_time- now_time); }else if(frame_cnt>0 && now_time>play_time+fpms/1000){ myOutputDebugString("skip%d\n",total_skip_cnt++); skip_cnt ++; if(skip_cnt >= 20){ skip_cnt = 0; } }else{ skip_cnt = 0; } if(bSkip){ frame_cnt ++; return FALSE; } DrawMovie(); return TRUE; } // CMovie::DecodeMovie
LRESULT APIENTRY MainWndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { int i; PAINTSTRUCT ps; switch( message ){ case WM_CREATE: InitCommonControls(); break; case WM_MOUSEWHEEL: sysInf.zDelta = (short) HIWORD(wParam); break; case WM_DESTROY: case WM_QUIT: case WM_CLOSE: #ifdef _MASTER if(IDYES==MessageBox(sysInf.hWnd,"鎖−クサリ− を終了します。よろしいですか?","終了確認",MB_YESNO)){ sysInf.bGameEnd = on; } #else sysInf.bGameEnd = on; #endif return 0; case WM_ACTIVATE: for(i=0;i<g_iDIDeviceNum;i++){ if(LOWORD(wParam) == WA_INACTIVE){ g_pDIDevice[i]->Unacquire(); }else{ g_pDIDevice[i]->Acquire(); g_pDIDevice[i]->Poll(); } } sysInf.bIsActive = LOWORD(wParam) ? TRUE : FALSE; if(sysInf.bIsActive)myOutputDebugString("ActivateHandle: Active\n"); else myOutputDebugString("ActivateHandle: Non Active\n"); if(sysInf.bIsActive)clearPadState(); break; case WM_KEYDOWN: #ifndef _MASTER switch(wParam){ case (VK_F2): sysInf.bInfo = !sysInf.bInfo; if(!sysInf.bInfo && sysInf.hDebugWnd){ SendMessage(sysInf.hDebugWnd,WM_CLOSE,0,0); }else if(sysInf.bInfo && NULL==sysInf.hDebugWnd){ sysInf.hDebugWnd = CreateDialog( sysInf.hInstance, MAKEINTRESOURCE(IDD_DEBUGWND), sysInf.hWnd, (DLGPROC)DebugDlgProc); } break; } #endif break; case WM_COMMAND: switch( LOWORD(wParam) ){ case ID_END: sysInf.bGameEnd = on; return 0; case ID_MYAPP_EXIT: #ifdef _MASTER if(IDYES==MessageBox(sysInf.hWnd,"鎖−クサリ− を終了します。よろしいですか?","終了確認",MB_YESNO)){ sysInf.bGameEnd = on; } #else sysInf.bGameEnd = on; #endif return 0; case ID_DISPCHANGE: if(0==sysInf.full_screen){ if(CheckOSw2k()){ SendMessage(hWnd,WM_COMMAND,ID_SUBMENU,0); }else{ SendMessage(hWnd,WM_COMMAND,ID_DISPFULL,0); } }else{ SendMessage(hWnd,WM_COMMAND,ID_DISPWINDOW,0); } break; case ID_DISPFULL: if(lpMovie) return 0; ScreenChange(1,0); EnableMenuItem( sysInf.hMenu,ID_DISPFULL, MF_GRAYED ); CheckMenuItem( sysInf.hMenu, ID_DISPFULL, MF_CHECKED ); EnableMenuItem( sysInf.hMenu,ID_DISPWINDOW, MF_ENABLED ); CheckMenuItem( sysInf.hMenu, ID_DISPWINDOW, MF_UNCHECKED ); break; case ID_DISPWINDOW: if(lpMovie) return 0; ScreenChange(0,0); if(CheckOSw2k()){ for(i=0;i<DispFreqMax;i++){ EnableMenuItem( sysInf.hMenu, ID_SUBMENU+i, MF_ENABLED ); CheckMenuItem( sysInf.hMenu, ID_SUBMENU+i, MF_UNCHECKED ); } }else{ EnableMenuItem( sysInf.hMenu, ID_DISPFULL, MF_ENABLED ); CheckMenuItem( sysInf.hMenu, ID_DISPFULL, MF_UNCHECKED ); } EnableMenuItem( sysInf.hMenu, ID_DISPWINDOW, MF_GRAYED ); CheckMenuItem( sysInf.hMenu, ID_DISPWINDOW, MF_CHECKED ); break; case ID_SUBMENU: case ID_SUBMENU+1: case ID_SUBMENU+2: case ID_SUBMENU+3: case ID_SUBMENU+4: case ID_SUBMENU+5: case ID_SUBMENU+6: case ID_SUBMENU+7: if(lpMovie) return 0; ScreenChange( wParam-ID_SUBMENU+1 ,TRUE); for(i=0;i<DispFreqMax;i++){ EnableMenuItem( sysInf.hMenu, ID_SUBMENU+i, MF_ENABLED ); CheckMenuItem( sysInf.hMenu, ID_SUBMENU+i, MF_UNCHECKED ); } EnableMenuItem( sysInf.hMenu, LOWORD(wParam), MF_GRAYED ); CheckMenuItem( sysInf.hMenu, LOWORD(wParam), MF_CHECKED ); EnableMenuItem( sysInf.hMenu, ID_DISPWINDOW, MF_ENABLED ); CheckMenuItem( sysInf.hMenu, ID_DISPWINDOW, MF_UNCHECKED ); break; case ID_AUTOREAD: msgWnd.toggleAutoRead(); break; case ID_READSKIP: msgWnd.toggleMessageSkip(); break; case ID_UPDATE: ShellExecute( sysInf.hWnd, NULL, "http://leaf.aquaplus.co.jp", NULL, NULL, SW_SHOWNORMAL ); break; case ID_VER: DialogBox( sysInf.hInstance, MAKEINTRESOURCE(IDD_ABOUTDIALOG), sysInf.hWnd, AboutDialogBoxProc ); break; case ID_SYSTEMINFO: DialogBox( sysInf.hInstance, MAKEINTRESOURCE(IDD_INFODIALOG), sysInf.hWnd, InfoDialogBoxProc ); break; case ID_CONFIG: if(NULL==optionWnd) optionWnd = new OptionMode; break; #ifndef _MASTER case ID_FLAGEDIT: DialogBox( sysInf.hInstance, MAKEINTRESOURCE(IDD_FLAGEDIT), sysInf.hWnd, FlagDialogBoxProc ); break; #endif case ID_LOADEXEC: if(ESC_GetFlag(_セーブロード無効))break; switch(sysInf.execMode){ case event_exec_mode: case select_exec_mode: case opening_mode: if(NULL==EXEC_LangBuf){ EXEC_LangBuf = (char *)&LangData.LangBuf; EXEC_LangInfo = &LangData; } if(NULL==saveWnd)saveWnd = new SaveWnd(load_mode); break; } break; case ID_SAVEEXEC: if(ESC_GetFlag(_セーブロード無効))break; if(NULL==EXEC_LangBuf)break; switch(sysInf.execMode){ case event_exec_mode: case select_exec_mode: if(NULL==saveWnd)saveWnd = new SaveWnd(save_mode); break; } break; case ID_BACKTITLE: ReturnTitile(TRUE); break; case ID_BACKSELECT: SAV_Load( 98 ); break; case ID_MOVIEHI: sysInf.movieQuality = 2; CheckMenuItem( sysInf.hMenu, ID_MOVIEHI, MF_CHECKED ); CheckMenuItem( sysInf.hMenu, ID_MOVIEMID, MF_UNCHECKED ); CheckMenuItem( sysInf.hMenu, ID_MOVIELOW, MF_UNCHECKED ); break; case ID_MOVIEMID: sysInf.movieQuality = 1; CheckMenuItem( sysInf.hMenu, ID_MOVIEHI, MF_UNCHECKED ); CheckMenuItem( sysInf.hMenu, ID_MOVIEMID, MF_CHECKED ); CheckMenuItem( sysInf.hMenu, ID_MOVIELOW, MF_UNCHECKED ); break; case ID_MOVIELOW: sysInf.movieQuality = 0; CheckMenuItem( sysInf.hMenu, ID_MOVIEHI, MF_UNCHECKED ); CheckMenuItem( sysInf.hMenu, ID_MOVIEMID, MF_UNCHECKED ); CheckMenuItem( sysInf.hMenu, ID_MOVIELOW, MF_CHECKED ); break; case ID_NOUSEOVERLAY: sysInf.nouseOverlay = !sysInf.nouseOverlay; if(sysInf.nouseOverlay){ CheckMenuItem( sysInf.hMenu, ID_NOUSEOVERLAY, MF_CHECKED ); }else{ CheckMenuItem( sysInf.hMenu, ID_NOUSEOVERLAY, MF_UNCHECKED ); } break; case ID_FPS60: sysInf.setFPS = 2; CheckMenuItem( sysInf.hMenu, ID_FPS60, MF_CHECKED ); CheckMenuItem( sysInf.hMenu, ID_FPS30, MF_UNCHECKED ); CheckMenuItem( sysInf.hMenu, ID_FPS20, MF_UNCHECKED ); break; case ID_FPS30: sysInf.setFPS = 1; CheckMenuItem( sysInf.hMenu, ID_FPS60, MF_UNCHECKED ); CheckMenuItem( sysInf.hMenu, ID_FPS30, MF_CHECKED ); CheckMenuItem( sysInf.hMenu, ID_FPS20, MF_UNCHECKED ); break; case ID_FPS20: sysInf.setFPS = 0; CheckMenuItem( sysInf.hMenu, ID_FPS60, MF_UNCHECKED ); CheckMenuItem( sysInf.hMenu, ID_FPS30, MF_UNCHECKED ); CheckMenuItem( sysInf.hMenu, ID_FPS20, MF_CHECKED ); break; } break; case WM_SYSCOMMAND: if(sysInf.full_screen){ switch (wParam) { case SC_KEYMENU : return 0; } }else{ switch(wParam & 0xfff0){ case SC_MAXIMIZE: if(lpMovie) return 0; ScreenChange(1,0); EnableMenuItem( sysInf.hMenu,ID_DISPFULL, MF_GRAYED ); CheckMenuItem( sysInf.hMenu, ID_DISPFULL, MF_CHECKED ); EnableMenuItem( sysInf.hMenu,ID_DISPWINDOW, MF_ENABLED ); CheckMenuItem( sysInf.hMenu, ID_DISPWINDOW, MF_UNCHECKED ); return 0; } } break; case WM_DISPLAYCHANGE: if(!sysInf.bDisplayChange)break; SetTimer(sysInf.hWnd, 1, 500, NULL); break; case WM_TIMER: if(!sysInf.bDisplayChange || 1!=wParam)break; KillTimer(sysInf.hWnd, wParam); if(0==sysInf.full_screen){ MoveWindow(sysInf.hWnd, (GetSystemMetrics(SM_CXSCREEN)-sysInf.ScreenW)/2,(GetSystemMetrics(SM_CYSCREEN)-sysInf.ScreenH)/2, sysInf.ScreenW +GetSystemMetrics(SM_CXDLGFRAME)*2, sysInf.ScreenH +GetSystemMetrics(SM_CYDLGFRAME)*2 +GetSystemMetrics(SM_CYBORDER)+GetSystemMetrics(SM_CYSIZE) +GetSystemMetrics(SM_CYMENU), TRUE); }else{ MoveWindow(sysInf.hWnd, 0, 0, sysInf.ScreenW, sysInf.ScreenH, TRUE); if(NULL==sysInf.hMenuWnd){ sysInf.hMenuWnd = CreateWindow(className,"menuWnd",WS_POPUP, 0,0, WIN_SIZEX,GetSystemMetrics(SM_CYMENUSIZE),sysInf.hWnd,sysInf.hMenu,sysInf.hInstance,NULL); } } sysInf.bDisplayChange = FALSE; break; case WM_PAINT: if(lpMovie){ myOutputDebugString("movie WM_PAINT\n"); if(lpMovie->forccNum<3){ BeginPaint( sysInf.hWnd, &ps ); EndPaint( sysInf.hWnd, &ps ); } }else{ BeginPaint( sysInf.hWnd, &ps ); BitBlt( ps.hdc, 0, 0, WIN_SIZEX, WIN_SIZEY, g_DibInf.memDC, 0, 0, SRCCOPY ); EndPaint( sysInf.hWnd, &ps ); } break; case WM_SETCURSOR: default: break; } return DefWindowProc(hWnd, message, wParam, lParam); } // MainWndProc
LRESULT APIENTRY MainWndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { int i; PAINTSTRUCT ps; switch( message ){ case WM_CREATE: InitCommonControls(); break; case WM_MOUSEWHEEL: sysInf.zDelta = (short) HIWORD(wParam); break; case WM_DESTROY: case WM_QUIT: case WM_CLOSE: if(IDYES==MessageBox(sysInf.hWnd,"アルルゥとあそぼ!!を終了してよろしいですか?","終了確認",MB_YESNO)){ sysInf.bGameEnd = on; } return 0; case WM_ACTIVATE: for(i=0;i<g_iDIDeviceNum;i++){ if(LOWORD(wParam) == WA_INACTIVE){ g_pDIDevice[i]->Unacquire(); }else{ g_pDIDevice[i]->Acquire(); g_pDIDevice[i]->Poll(); } } sysInf.bIsActive = LOWORD(wParam) ? TRUE : FALSE; myOutputDebugString("ActivateHandle: "); if(sysInf.bIsActive)myOutputDebugString("Active\n"); else myOutputDebugString("Non Active\n"); if(sysInf.bIsActive)clearPadState(); break; case WM_COMMAND: switch( LOWORD(wParam) ){ case ID_MYAPP_EXIT: if(IDYES==MessageBox(sysInf.hWnd,"アルルゥとあそぼ!!を終了してよろしいですか?","終了確認",MB_YESNO)){ sysInf.bGameEnd = on; } return 0; case ID_DISPCHANGE: if(lpMovie) lpMovie->StopMovie(); if(0==sysInf.full_screen){ if(CheckOSw2k()){ ScreenChange( 1 ,TRUE); for(i=0;i<DispFreqMax;i++){ EnableMenuItem( sysInf.hMenu, ID_SUBMENU+i, MF_ENABLED ); CheckMenuItem( sysInf.hMenu, ID_SUBMENU+i, MF_UNCHECKED ); } EnableMenuItem( sysInf.hMenu, ID_SUBMENU, MF_GRAYED ); CheckMenuItem( sysInf.hMenu, ID_SUBMENU, MF_CHECKED ); EnableMenuItem( sysInf.hMenu, ID_DISPWINDOW, MF_ENABLED ); CheckMenuItem( sysInf.hMenu, ID_DISPWINDOW, MF_UNCHECKED ); }else{ ScreenChange(1,0); EnableMenuItem( sysInf.hMenu,ID_DISPFULL, MF_GRAYED ); CheckMenuItem( sysInf.hMenu, ID_DISPFULL, MF_CHECKED ); EnableMenuItem( sysInf.hMenu,ID_DISPWINDOW, MF_ENABLED ); CheckMenuItem( sysInf.hMenu, ID_DISPWINDOW, MF_UNCHECKED ); } }else{ ScreenChange(0,0); if(CheckOSw2k()){ for(i=0;i<DispFreqMax;i++){ EnableMenuItem( sysInf.hMenu, ID_SUBMENU+i, MF_ENABLED ); CheckMenuItem( sysInf.hMenu, ID_SUBMENU+i, MF_UNCHECKED ); } }else{ EnableMenuItem( sysInf.hMenu, ID_DISPFULL, MF_ENABLED ); CheckMenuItem( sysInf.hMenu, ID_DISPFULL, MF_UNCHECKED ); } EnableMenuItem( sysInf.hMenu, ID_DISPWINDOW, MF_GRAYED ); CheckMenuItem( sysInf.hMenu, ID_DISPWINDOW, MF_CHECKED ); } break; case ID_DISPFULL: if(lpMovie) lpMovie->StopMovie(); ScreenChange(1,0); EnableMenuItem( sysInf.hMenu,ID_DISPFULL, MF_GRAYED ); CheckMenuItem( sysInf.hMenu, ID_DISPFULL, MF_CHECKED ); EnableMenuItem( sysInf.hMenu,ID_DISPWINDOW, MF_ENABLED ); CheckMenuItem( sysInf.hMenu, ID_DISPWINDOW, MF_UNCHECKED ); break; case ID_DISPWINDOW: if(lpMovie) lpMovie->StopMovie(); ScreenChange(0,0); if(CheckOSw2k()){ for(i=0;i<DispFreqMax;i++){ EnableMenuItem( sysInf.hMenu, ID_SUBMENU+i, MF_ENABLED ); CheckMenuItem( sysInf.hMenu, ID_SUBMENU+i, MF_UNCHECKED ); } }else{ EnableMenuItem( sysInf.hMenu, ID_DISPFULL, MF_ENABLED ); CheckMenuItem( sysInf.hMenu, ID_DISPFULL, MF_UNCHECKED ); } EnableMenuItem( sysInf.hMenu, ID_DISPWINDOW, MF_GRAYED ); CheckMenuItem( sysInf.hMenu, ID_DISPWINDOW, MF_CHECKED ); break; case ID_SUBMENU: case ID_SUBMENU+1: case ID_SUBMENU+2: case ID_SUBMENU+3: case ID_SUBMENU+4: case ID_SUBMENU+5: case ID_SUBMENU+6: case ID_SUBMENU+7: if(lpMovie) lpMovie->StopMovie(); ScreenChange( wParam-ID_SUBMENU+1 ,TRUE); for(i=0;i<DispFreqMax;i++){ EnableMenuItem( sysInf.hMenu, ID_SUBMENU+i, MF_ENABLED ); CheckMenuItem( sysInf.hMenu, ID_SUBMENU+i, MF_UNCHECKED ); } EnableMenuItem( sysInf.hMenu, LOWORD(wParam), MF_GRAYED ); CheckMenuItem( sysInf.hMenu, LOWORD(wParam), MF_CHECKED ); EnableMenuItem( sysInf.hMenu, ID_DISPWINDOW, MF_ENABLED ); CheckMenuItem( sysInf.hMenu, ID_DISPWINDOW, MF_UNCHECKED ); break; case ID_AUTOREAD: sysInf.bAutoRead = !sysInf.bAutoRead; if(sysInf.bAutoRead){ CheckMenuItem( sysInf.hMenu, ID_AUTOREAD, MF_CHECKED ); }else{ CheckMenuItem( sysInf.hMenu, ID_AUTOREAD, MF_UNCHECKED ); } break; case ID_READSKIP: sysInf.bReadSkip = !sysInf.bReadSkip; if(sysInf.bReadSkip){ CheckMenuItem( sysInf.hMenu, ID_READSKIP, MF_CHECKED ); sysInf.bAlreadyRead = AVG_CheckScenarioFlag(); }else{ CheckMenuItem( sysInf.hMenu, ID_READSKIP, MF_UNCHECKED ); } break; case ID_UPDATE: ShellExecute( sysInf.hWnd, NULL, "http://leaf.aquaplus.co.jp", NULL, NULL, SW_SHOWNORMAL ); break; case ID_VER: DialogBox( sysInf.hInstance, MAKEINTRESOURCE(IDD_ABOUTDIALOG), sysInf.hWnd, AboutDialogBoxProc ); break; case ID_CONFIG: DialogBox( sysInf.hInstance, MAKEINTRESOURCE(IDD_CONFIGDIALOG), sysInf.hWnd, ConfDialogBoxProc ); break; case ID_LOADEXEC: if(lpMovie)break; if(NULL==EXEC_LangBuf){ EXEC_LangBuf = (char *)&LangData.LangBuf; EXEC_LangInfo = &LangData; } if(NULL==saveWnd)saveWnd = new SaveWnd(load_mode); break; case ID_SAVEEXEC: if(lpMovie || NULL==EXEC_LangBuf)break; if(NULL==saveWnd)saveWnd = new SaveWnd(save_mode); break; case ID_BACKTITLE: selectWnd.selectEnd(); ESC_InitEOprFlag(); lpSoundDS->ChangeMusic(bgmHandle,pack_bgmfile,2,FALSE,0); my_delete(lpMenuWnd); my_delete(lpKabeSetWnd); my_delete(lpStaffmodeWnd); my_delete(lpStaffRoll); my_delete(lpMovie); lpMovie = new CMovie; lpMovie->OpenMovie("title.avi",-1,TRUE); break; } break; case WM_SYSCOMMAND: if(sysInf.full_screen){ switch (wParam) { case SC_KEYMENU : return 0; } } break; case WM_DISPLAYCHANGE: if(!sysInf.bDisplayChange)break; SetTimer(sysInf.hWnd,1,500,NULL); break; case WM_TIMER: if(!sysInf.bDisplayChange || 1!=wParam)break; KillTimer(sysInf.hWnd,1); if(0==sysInf.full_screen){ MoveWindow(sysInf.hWnd, (GetSystemMetrics(SM_CXSCREEN)-sysInf.ScreenW)/2,(GetSystemMetrics(SM_CYSCREEN)-sysInf.ScreenH)/2, sysInf.ScreenW +GetSystemMetrics(SM_CXDLGFRAME)*2, sysInf.ScreenH +GetSystemMetrics(SM_CYDLGFRAME)*2 +GetSystemMetrics(SM_CYBORDER)+GetSystemMetrics(SM_CYSIZE) +GetSystemMetrics(SM_CYMENU), TRUE); }else{ MoveWindow(sysInf.hWnd, 0, 0, sysInf.ScreenW, sysInf.ScreenH, TRUE); if(NULL==sysInf.hMenuWnd){ sysInf.hMenuWnd = CreateWindow(className,"menuWnd",WS_POPUP, 0,0, WIN_SIZEX,GetSystemMetrics(SM_CYMENUSIZE),sysInf.hWnd,sysInf.hMenu,sysInf.hInstance,NULL); } } sysInf.bDisplayChange = FALSE; break; case WM_PAINT: if(lpMovie)break; BeginPaint( sysInf.hWnd, &ps ); BitBlt( ps.hdc, 0, 0, WIN_SIZEX, WIN_SIZEY, g_DibInf.memDC, 0, 0, SRCCOPY ); EndPaint( sysInf.hWnd, &ps ); break; case WM_SETCURSOR: default: break; } return DefWindowProc(hWnd, message, wParam, lParam); } // MainWndProc