BOOLEAN BinkPollFlics(void) { UINT32 uiCount; BOOLEAN fFlicStatus=FALSE; DDSURFACEDESC SurfaceDescription; BINKFLIC *pBink=NULL; UINT32 uiCopyToBufferFlags = guiBinkPixelFormat; //loop through all the open flics for(uiCount=0; uiCount < BINK_NUM_FLICS; uiCount++) { pBink = &BinkList[uiCount]; if( pBink->uiFlags & BINK_FLIC_PLAYING ) { fFlicStatus = TRUE; //do we still have to wait for the frame to be finished being displayed if( !( BinkWait( pBink->BinkHandle ) ) ) { DDLockSurface( pBink->lpDDS, NULL, &SurfaceDescription, 0, NULL); BinkDoFrame( pBink->BinkHandle ); BinkCopyToBuffer( pBink->BinkHandle, SurfaceDescription.lpSurface, SurfaceDescription.lPitch, pBink->BinkHandle->Height, pBink->uiLeft, pBink->uiTop, uiCopyToBufferFlags ); DDUnlockSurface( pBink->lpDDS, SurfaceDescription.lpSurface); // Check to see if the flic is done the last frame if( pBink->BinkHandle->FrameNum == ( pBink->BinkHandle->Frames-1 ) ) { // If flic is looping, reset frame to 0 if( pBink->uiFlags & BINK_FLIC_LOOP) { BinkGoto( pBink->BinkHandle, 0, 0 ); } else if( pBink->uiFlags & BINK_FLIC_AUTOCLOSE) { BinkCloseFlic( pBink ); } } else { BinkNextFrame( BinkList[uiCount].BinkHandle ); } } } } return( fFlicStatus ); }
/*----------------------------------------------------------------------------- Name : binkDecodeSimply Description : simple frame decoder Inputs : Outputs : Return : ----------------------------------------------------------------------------*/ static void binkDecodeSimply(void) { if (systemActive && !BinkWait(bnk)) { binkDecodeFrameCount++; binkNextFrame(); binkUpdate = TRUE; binkDisplayFlags = BINKSURFACECOPYALL; if (g_decodeProc != NULL) { g_decodeProc(binkDecodeFrameCount); } } }
int PASCAL WinMain( HINSTANCE instance, HINSTANCE previous_instance, LPSTR cmd_line, int cmd_show ) { // // Win32 locals. // HWND window = 0; MSG msg; // // Miles locals // HDIGDRIVER digital=0; // // Try to create our window. // window = Build_window_handle( instance, previous_instance ); if ( !window ) { MessageBox( 0, "Error creating window.", "Windows", MB_OK | MB_ICONSTOP ); return( 1 ); } // // Open the Miles Sound System. AIL_startup(); #ifdef BINK51 digital = AIL_open_digital_driver( 44100, 16, MSS_MC_51_DISCRETE, 0 ); #else digital = AIL_open_digital_driver( 44100, 16, 2, 0 ); #endif if ( !digital ) { MessageBox( 0, AIL_last_error( ), "Error opening Miles", MB_OK | MB_ICONSTOP ); return( 2 ); } // // // Tell Bink to use the Miles Sound System (must be before BinkOpen)! // BinkSoundUseMiles( digital ); // // Try to open the Bink file. // #ifdef BINK51 { // // Tell Bink to play all of the 5.1 tracks // S32 volumes[ 6 ]; U32 TrackIDsToPlay[ 4 ] = { 0, 1, 2, 3 }; BinkSetSoundTrack( 4, TrackIDsToPlay ); // // Try to open the Bink file. // Bink = BinkOpen( cmd_line, BINKSNDTRACK ); // // Now route the sound tracks to the correct speaker // volumes[ 0 ] = 32768; volumes[ 1 ] = 32768; volumes[ 2 ] = 0; volumes[ 3 ] = 0; volumes[ 4 ] = 0; volumes[ 5 ] = 0; BinkSetMixBinVolumes( Bink, 0, 0, volumes, 6 ); volumes[ 0 ] = 0; volumes[ 1 ] = 0; volumes[ 2 ] = 32768; BinkSetMixBinVolumes( Bink, 1, 0, volumes, 6 ); volumes[ 2 ] = 0; volumes[ 3 ] = 32768; BinkSetMixBinVolumes( Bink, 2, 0, volumes, 6 ); volumes[ 3 ] = 0; volumes[ 4 ] = 32768; volumes[ 5 ] = 32768; BinkSetMixBinVolumes( Bink, 3, 0, volumes, 6 ); } #else Bink = BinkOpen( cmd_line, 0 ); #endif if ( !Bink ) { MessageBox( 0, BinkGetError( ), "Bink Error", MB_OK | MB_ICONSTOP ); DestroyWindow( window ); return( 3 ); } // // Try to open the Bink buffer. // Bink_buffer = BinkBufferOpen( window, Bink->Width, Bink->Height, 0 ); if ( !Bink_buffer ) { MessageBox( 0, BinkBufferGetError( ), "Bink Error", MB_OK | MB_ICONSTOP ); DestroyWindow( window ); BinkClose( Bink ); return( 4 ); } // // Size the window such that its client area exactly fits our Bink movie. // SetWindowPos( window, 0, 0, 0, Bink_buffer->WindowWidth, Bink_buffer->WindowHeight, SWP_NOMOVE ); // // Now display the window and start the message loop. // ShowWindow( window, cmd_show ); for ( ; ; ) { // // Are there any messages to handle? // if ( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) { // // Yup, handle them. // if ( msg.message == WM_QUIT ) break; TranslateMessage( &msg ); DispatchMessage( &msg ); } else { // // Is it time for a new Bink frame? // if ( !BinkWait( Bink ) ) { // // Yup, draw the next frame. // Show_next_frame( Bink, Bink_buffer, window ); } else { // // Nope, give the rest of the system a chance to run (1 ms). // Sleep( 1 ); } } } // // Close the Bink file. // if ( Bink ) { BinkClose( Bink ); Bink = 0; } // // Close the Bink buffer. // if ( Bink_buffer ) { BinkBufferClose( Bink_buffer ); Bink_buffer = 0; } // // Close Miles. // if ( digital ) { AIL_close_digital_driver( digital ); digital = 0; } AIL_shutdown( ); // // And exit. // return( 0 ); }
int PASCAL WinMain( HINSTANCE instance, HINSTANCE previous_instance, LPSTR cmd_line, int cmd_show ) { // // Win32 locals. // HWND window = 0; MSG msg; // // Miles locals // HDIGDRIVER digital=0; // // Try to create our window. // window = Build_window_handle( instance, previous_instance ); if ( !window ) { MessageBox( 0, "Error creating window.", "Windows", MB_OK | MB_ICONSTOP ); return( 1 ); } // // Open the Miles Sound System. AIL_startup(); digital = AIL_open_digital_driver( 44100, 16, 2, 0 ); if ( !digital ) { MessageBox( 0, AIL_last_error( ), "Error opening Miles", MB_OK | MB_ICONSTOP ); return( 2 ); } // // // Tell Bink to use the Miles Sound System (must be before BinkOpen)! // BinkSoundUseMiles( digital ); // // Try to open the Bink file. // Bink = BinkOpen( cmd_line, 0 ); if ( !Bink ) { MessageBox( 0, BinkGetError( ), "Bink Error", MB_OK | MB_ICONSTOP ); DestroyWindow( window ); return( 3 ); } // // Try to open the Bink buffer. // Bink_buffer = BinkBufferOpen( window, Bink->Width, Bink->Height, 0 ); if ( !Bink_buffer ) { MessageBox( 0, BinkBufferGetError( ), "Bink Error", MB_OK | MB_ICONSTOP ); DestroyWindow( window ); BinkClose( Bink ); return( 4 ); } // // Size the window such that its client area exactly fits our Bink movie. // SetWindowPos( window, 0, 0, 0, Bink_buffer->WindowWidth, Bink_buffer->WindowHeight, SWP_NOMOVE ); // // Now display the window and start the message loop. // ShowWindow( window, cmd_show ); for ( ; ; ) { // // Are there any messages to handle? // if ( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) { // // Yup, handle them. // if ( msg.message == WM_QUIT ) break; TranslateMessage( &msg ); DispatchMessage( &msg ); } else { // // Is it time for a new Bink frame? // if ( !BinkWait( Bink ) ) { // // Yup, draw the next frame. // Show_next_frame( Bink, Bink_buffer, window ); } else { // // Nope, give the rest of the system a chance to run (500 MICROseconds). // Good_sleep_us( 500 ); } } } // // Close the Bink file. // if ( Bink ) { BinkClose( Bink ); Bink = 0; } // // Close the Bink buffer. // if ( Bink_buffer ) { BinkBufferClose( Bink_buffer ); Bink_buffer = 0; } // // Close Miles. // if ( digital ) { AIL_close_digital_driver( digital ); digital = 0; } AIL_shutdown( ); // // And exit. // return( 0 ); }
/*----------------------------------------------------------------------------- Name : binkDecodeTimerProc Description : mmtimer callback proc for decoding a frame of Bink video Inputs : [all ignored] Outputs : Return : ----------------------------------------------------------------------------*/ void CALLBACK binkDecodeTimerProc(UINT uid, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2) { if (!systemActive) { binkUpdate = FALSE; binkStopNow = TRUE; return; } if (inDecode || binkStopNow) { if (binkStopNow) { binkUpdate = FALSE; } return; } inDecode = TRUE; soundEventUpdate(); speechEventUpdate(); if (bnk->FrameNum < 2) { binkTimeReset(); binkDecodeSimply(); inDecode = FALSE; return; } if (systemActive) { sdword diff, i; sdword idealFrame = binkIdealFrame(); (void)BinkWait(bnk); if (idealFrame >= bnk->Frames) { idealFrame = bnk->Frames - 1; binkStopNow = TRUE; inDecode = FALSE; binkUpdate = FALSE; if (binkTimerHandle != 0) { (void)timeKillEvent(binkTimerHandle); binkTimerHandle = 0; } return; } diff = idealFrame - bnk->FrameNum; if (diff < 0) { diff = 0; } binkDisplayFlags = (diff > 1) ? BINKSURFACECOPYALL : 0; for (i = 0; i < diff; i++) { if ((i > 0) && (!(i & 3))) { (void)BinkWait(bnk); } binkDecodeFrameCount++; binkNextFrame(); binkUpdate = TRUE; if (binkStopNow) { break; } } if (g_decodeProc != NULL) { g_decodeProc(binkDecodeFrameCount); } } if (binkStopNow) { binkUpdate = FALSE; } inDecode = FALSE; }