program SMpegPlayer; {******************************************************************} { } { Object Pascal Example of using smpeg and SDL_Mixer } { Conversion of Console Smpeg player } { } { } { The original files are : Found on internet } { } { The original Pascal code is : SMpegPlayer.dpr } { The initial developer of the Pascal code is : } { Dominique Louis } { } { Portions created by Dominique Louis are } { Copyright (C) 2001 Dominique Louis. } { } { Contributor(s) } { -------------- } { } { } { Obtained through: } { Joint Endeavour of Delphi Innovators ( Project JEDI ) } { } { You may retrieve the latest version of this file at the Project } { JEDI home page, located at http://delphi-jedi.org } { } { The contents of this file are used with permission, subject to } { the Mozilla Public License Version 1.1 (the "License"); you may } { not use this file except in compliance with the License. You may } { obtain a copy of the License at } { http://www.mozilla.org/NPL/NPL-1_1Final.html } { } { Software distributed under the License is distributed on an } { "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or } { implied. See the License for the specific language governing } { rights and limitations under the License. } { } { Description } { ----------- } { SMpegPlayer : Shows how to load and play an Mpeg file using } { smpeg and SDL_Mixer for the sound } { } { Requires } { -------- } { SDL runtime libary for SDL, smpeg and OpenGL somewhere } { in your path . } { The Latest SDL runtimes can be found on http://www.libsdl.org } { } { Programming Notes } { ----------------- } { This demo shows how to load and play an mpeg file using smpeg } { with SDL_Mixer } { You will need Smpeg and SDL_Mixer libraris order for this demo } { } { Revision History } { ---------------- } { July 02 2001 - DL : Initial translation. } { } { November 23 2002 - DL : Fix PollMPeg as suggested by } { } { } {******************************************************************} uses SysUtils, sdl, sdl_mixer, smpeg; const SCREEN_WIDTH = 800; SCREEN_HEIGHT = 600; BPP = 0; TITLE = 'JEDI-SDL Console MpegPlayer'; var // Screen Surface screen : PSDL_Surface; // Audio Specs aspec : TSDL_AudioSpec; format : Uint16; freq, chan : integer; Islooping : Boolean; function OpenMpeg( FileName : string ) : PSMPEG; var Handle : PSMPEG; begin // Create a new Mpeg handle := SMPEG_new( PChar( fileName ), nil, 0 ); if handle = nil then begin //Display Error Halt; end; // Disable Audio SMPEG_enableaudio( handle, 0 ); // Query Mixer Mix_QuerySpec( freq, format, chan ); aspec.freq := freq; aspec.format := format; aspec.channels := chan; // Tell Smpeg what we want Smpeg_actualSpec( handle, @aspec ); // Hook the mixer audio playing function Mix_HookMusic( @SMPeg_PlayAudioSDL, handle ); // Reenable Audio SMPEG_enableaudio( handle, 1 ); // Set Max Volume SMPEG_setvolume( handle, 100 ); //Set up a video surface to display MPeg in SMPEG_setdisplay( Handle, Screen, nil, nil ); // Reenable Video SMPEG_enablevideo( handle, 1 ); // Retuen the handle in case we need it somewhere else Result := handle; end; // Free Mpeg procedure FreeMPeg( handle : PSMPEG ); begin SMPEG_delete( handle ); end; // Loop Mpeg procedure LoopMpeg( handle : PSMPEG ); begin if IsLooping then begin SMPEG_loop( handle, 1 ); isLooping := true; end else begin SMPEG_loop( handle, 0 ); isLooping := false; end; end; // Play Mpeg procedure PlayMpeg( handle : PSMPEG ); begin SMpeg_play( handle ); end; // Stop Mpeg procedure StopMpeg( handle : PSMPEG ); begin SMpeg_stop( handle ); end; function PollMPeg( handle : PSMPEG ) : TSMpegStatus; begin Result := SMPEG_status( handle ); end; function WaitMpeg( interval : Uint32; param : pointer ) : Uint32; var e : TSDL_Event; handle : PSMPEG; begin handle := PSMPEG( param ); // Has it stopped? If so, throw a User Event if PollMPeg( handle ) = STATUS_SMPEG_STOPPED then begin e.type_ := SDL_USEREVENT; e.user.code := 1; e.user.data1 := nil; e.user.data2 := nil; SDL_PushEvent( @e ); end; result := interval; end; procedure RunIntro( fileName : string ); var e : TSDL_Event; handle : PSMPEG; td : PSDL_TimerID; done : Boolean; begin done := false; // Create a Movie handle := OpenMpeg( fileName ); // Play the Movie PlayMPeg( Handle ); // Create a timer to see if the Movie has stopped td := SDL_AddTimer( 1000, @WaitMPeg, handle ); // wait for Movie to finish while not done do begin // wiat for out event to happen SDL_WaitEvent( @e ); case e.type_ of // Check to see if user want to skip the movie SDL_KEYDOWN : begin if e.key.keysym.sym = SDLK_ESCAPE then Done := true; end; SDL_USEREVENT : begin if PollMpeg( handle ) = STATUS_SMPEG_STOPPED then Done := true; end end; end; // Stop the movie StopMpeg( handle ); // Remove WaitMpegTimer SDL_RemoveTimer( td ); // Unhook mixer audio playback function Mix_HookMusic( nil, nil ); // Free out MPEG FreeMPeg( handle ); end; begin // Make sure we at least have a parameter if ParamCount <> 1 then begin Halt( 1 ); end; // Initialize SDL if SDL_Init( SDL_INIT_VIDEO or SDL_INIT_AUDIO or SDL_INIT_TIMER ) < 0 then begin // Display and error Halt( 1 ); end; // Open the Mixer before SDL_SetVideo to avoid the poping sound Mix_OpenAudio( 22050, AUDIO_S16, 2, 1024 ); SDL_WM_SetCaption( TITLE, nil ); // Set the video Mode screen := SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, BPP, SDL_DOUBLEBUF or SDL_ANYFORMAT ); if screen = nil then begin // Display and error Halt( 1 ); end; RunIntro( ParamStr( 1 ) ); Mix_CloseAudio; SDL_Quit; end.