aboutsummaryrefslogtreecommitdiffstats
path: root/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/sdlmpegpanel.pas
blob: 6e7e87def93b1bd49130be758433a61b70dc662e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
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.