unit sdlmpegpanel;
interface
{$IFDEF UNIX}
{$DEFINE CLX}
{$ELSE}
{$DEFINE VCL}
{$ENDIF}
uses
SysUtils,
Classes,
{$IFDEF VCL}
Graphics,
Controls,
Forms,
Dialogs,
ExtCtrls,
{$ENDIF}
{$IFDEF CLX}
Types,
QGraphics,
QControls,
QForms,
QDialogs,
QExtCtrls,
{$ENDIF}
sdl,
smpeg;
type
TSDLMPEGPanel = class( TPanel )
private
{ Private declarations }
FSurface : PSDL_Surface;
FSMPEGHandle : PSMPEG;
FMPEGFile : TFileName;
FMPEGInfo : TSMPEG_Info;
FPlaying : Boolean;
FSound : Integer;
function GetSound : Boolean;
procedure SetSound( const Value : Boolean );
protected
{ Protected declarations }
public
{ Public declarations }
procedure Play;
procedure Stop;
procedure Pause;
published
{ Published declarations }
property MPEGFile : TFileName read FMPEGFile write FMPEGFile;
property Sound : Boolean read GetSound write SetSound;
end;
procedure Register;
implementation
{$IFDEF CLX}
uses
Libc,
Qt;
{$ENDIF}
procedure TSDLMPEGPanel.Play;
var
EnvVal : string;
begin
if FPlaying then
Exit;
FPlaying := True;
if SDL_getenv( 'SDL_WINDOWID' ) = '' then
begin
{$IFDEF VCL}
SDL_putenv( 'SDL_VIDEODRIVER=windib' );
EnvVal := 'SDL_WINDOWID=' + inttostr( Integer( Handle ) );
{$ENDIF}
{$IFDEF CLX}
EnvVal := 'SDL_WINDOWID=' + inttostr( QWidget_WinId( ChildHandle ) );
{$ENDIF}
SDL_putenv( PChar( EnvVal ) );
end;
if SDL_getenv( 'SDL_VIDEO_YUV_HWACCEL' ) = '' then
SDL_putenv( 'SDL_VIDEO_YUV_HWACCEL=0' );
if SDL_Init( SDL_INIT_VIDEO or SDL_INIT_NOPARACHUTE ) < 0 then
raise Exception.Create( 'SDL_Init failed' );
{$IFDEF VCL}
FSurface := SDL_SetVideoMode( Width, Height, 16, SDL_SWSURFACE );
{$ENDIF}
{$IFDEF CLX}
FSurface := SDL_SetVideoMode( Width, Height, QPixmap_depth( Bitmap.Handle ), SDL_SWSURFACE );
{$ENDIF}
if FSurface = nil then
raise Exception.Create( 'SDL_SetVideoMode failed' );
FSMPEGHandle := SMPEG_new( PChar( FMPEGFile ), @FMPEGInfo, FSound );
if FSMPEGHandle = nil then
raise Exception.Create( 'Cannot create MPEG stream' );
if FSound = 0 then
SMPEG_enableaudio( FSMPEGHandle, 0 );
SMPEG_scaleXY( FSMPEGHandle, Width, Height );
SMPEG_setdisplay( FSMPEGHandle, FSurface, nil, nil );
SMPEG_play( FSMPEGHandle );
end;
procedure TSDLMPEGPanel.Stop;
begin
if not FPlaying then
Exit;
FPlaying := False;
SMPEG_stop( FSMPEGHandle );
SMPEG_delete( FSMPEGHandle );
SDL_Quit;
end;
procedure TSDLMPEGPanel.Pause;
begin
if FPlaying then
SMPEG_pause( FSMPEGHandle );
end;
function TSDLMPEGPanel.GetSound : Boolean;
begin
Result := Boolean( FSound );
end;
procedure TSDLMPEGPanel.SetSound( const Value : Boolean );
begin
FSound := Integer( Value );
end;
procedure Register;
begin
RegisterComponents( 'SDL', [ TSDLMPEGPanel ] );
end;
end.