Subversion Repositories spacemission

Compare Revisions

No changes between revisions

Regard whitespace Rev 3 → Rev 4

/VCL_DELPHIX_D6/SXMedia/MpSndSys.pas
0,0 → 1,237
(*
* This unit is free software; you can redistribute it and modify it
* under the terms of the GNU Library General Public License as published
* by the Free Software Foundation; either version 2 of the license or
* (at your option) any later version.
*
* Author of CPP header file : Olivier Lapicque <olivierl@jps.net>
* Author of Delphi conversion : Dean Ellis <Dean_Ellis@sillex.freeserve.co.uk>
*
* NOTE : The Origonal C++ Class declarations anc constants have been left in place
*
*)
unit MpSndSys;
 
interface
 
uses Windows,Classes;
 
const
//#ifndef MPP_SND_SYS_H
//#define MPP_SND_SYS_H
 
//#ifndef MPPDLLEXPORT
//#define MPPDLLEXPORT
//#endif
 
//#define MPPAPI __stdcall
//#define MPPCDECL __cdecl
//#define MPPAPI_VERSION 0x0140
 
//#define MPPAPI_VERSION 0x0140
 
MPPAPI_VERSION = $0141;
 
// Version-specific functions
//#define MPPVERSION_HAS_NAVIGATION 0x0139
//#define MPPVERSION_HAS_SONGTIME 0x0141
 
MPPVERSION_HAS_NAVIGATION = $0139;
MPPVERSION_HAS_SONGTIME = $0141;
 
// Error codes
//typedef long MPPERR;
//
//enum {
// MPPERR_NOERROR=0,
// MPPERR_FAILED,
// MPPERR_INVALIDPARAM,
//};
 
//enum {
// MPPSONG_INVALID=0,
// MPPSONG_MOD,
// MPPSONG_S3M,
// MPPSONG_XM,
// MPPSONG_IT,
// MPPSONG_MDL,
// MPPSONG_UNKNOWN=100
//};
MPPERR_NOERROR = 0;
MPPERR_FAILED = 1;
MPPERR_INVALIDPARAM = 2;
 
MPPSONG_INVALID = 0;
MPPSONG_MOD = 1;
MPPSONG_S3M = 2;
MPPSONG_XM = 3;
MPPSONG_IT = 4;
MPPSONG_MDL = 5;
MPPSONG_UNKNOWN = 100;
 
// Mixer Options MPPMIX_XXXX
//#define MPPMIX_NORESAMPLING 0x01 // Faster, but crappy quality
//#define MPPMIX_BASSEXPANSION 0x02 // Bass Expansion
//#define MPPMIX_SURROUND 0x04 // Surround Encoding
//#define MPPMIX_REVERB 0x08 // Reverb
//#define MPPMIX_LOOP 0x10 // Loop the song (backward jumps will be enabled)
//// v1.40+ flags
//#define MPPMIX_HIGHQUALITY 0x20 // HQ mixing (better resampling, dithering enabled)
//#define MPPMIX_GAINCONTROL 0x40 // Automatic Gain Control
//#define MPPMIX_NOISEREDUCTION 0x80 // Noise reduction (-6dB 22kHz lowpass filter)
 
MPPMIX_NORESAMPLING = $01; // Faster, but crappy quality
MPPMIX_BASSEXPANSION = $02; // Bass Expansion
MPPMIX_SURROUND = $04; // Surround Encoding
MPPMIX_REVERB = $08; // Reverb
MPPMIX_LOOP = $10; // Loop the song (backward jumps will be enabled)
// v1.40+ flags
MPPMIX_HIGHQUALITY = $20; // HQ mixing (better resampling, dithering enabled)
MPPMIX_GAINCONTROL = $40; // Automatic Gain Control
MPPMIX_NOISEREDUCTION = $80; // Noise reduction (-6dB 22kHz lowpass filter)
 
type
//==========================
//class MPPDLLEXPORT IModMixer
//==========================
(* {
public:
// Reference count: the initial reference count is 1, so you shouldn't have to call AddRef()
virtual unsigned long MPPAPI AddRef() = 0;
virtual unsigned long MPPAPI Release() = 0;
 
// API Version: you should refuse to continue if the returned value is smaller than MPPAPI_VERSION
virtual unsigned long MPPAPI GetVersion() = 0;
 
// Basic I/O Functions
virtual MPPERR MPPAPI LoadSong(const void *pmemfile, long len) = 0;
// Songs are always loaded from memory. The pointer pmemfile can be destroyed
// after the call to LoadSong. You can use memory-mapped files or a pointer returned
// by LockResource(), or whatever file in memory.
virtual MPPERR MPPAPI FreeSong() = 0; // Free the memory used by the song
 
// Audio Rendering Functions: example: (44100, 2, 16) for 44.1kHz, stereo, 16-bit
virtual MPPERR MPPAPI SetWaveFormat(long samplespersec, long channels, long bitspersample) = 0;
// return # of SAMPLES that have been written to the buffer, 0 if end has been reached
// Note: protect calls to Render() and SetMixerOptions() by a critical section, if they
// are used in different threads.
virtual long MPPAPI Render(void *pbuffer, unsigned long bufsize) = 0;
 
// Player Configuration: set of MPPMIX_XXXX
virtual MPPERR MPPAPI SetMixerOptions(unsigned long dwOptions) = 0;
virtual unsigned long MPPAPI GetMixerOptions() = 0;
 
// Song Information
virtual long MPPAPI GetSongType() = 0; // Return MPPSONG_XXXX
virtual void MPPAPI GetSongName(char *pszbuf) = 0; // pszbuf must be at least 32-bytes
 
//////////////////////////////////////////////////////////////////////////////////////
// v1.39+: Navigation functions
// The order is the position in the pattern sequence list: this allows you to
// jump to a specific part of a song. It can be useful in a game with a song that
// uses pattern position jump effects (or pattern loops).
// These function will not be available if GetVersion() returns a value smaller than 0x139 (MPPVERSION_HAS_NAVIGATION)
virtual unsigned long MPPAPI GetNumOrders() = 0;
virtual unsigned long MPPAPI GetCurrentOrder() = 0;
virtual MPPERR MPPAPI SetCurrentOrder(unsigned long neworder) = 0;
 
};
*)
MppError = longint;
 
PModMixer = ^IModMixer;
IModMixer = class
public
function AddRef:longint; virtual; stdcall; abstract;
function Release:longint; virtual; stdcall; abstract;
function GetVersion:longint; virtual; stdcall; abstract;
function LoadSong(const MemFile:pointer;Length:longint):MppError;virtual; stdcall; abstract;
function FreeSong:MppError;virtual; stdcall; abstract;
function SetWaveFormat(SamplesPerSec,channels,bitsPerSample:longint):MppError;virtual; stdcall; abstract;
function Render(Buffer:pointer;BufferSize:longint):MppError;virtual; stdcall; abstract;
function SetMixerOptions(dwOptions:longint):MppError;virtual; stdcall; abstract;
function GetMixerOptions:longint;virtual; stdcall; abstract;
function GetSongType:longint;virtual; stdcall; abstract;
procedure GetSongName(Buffer:PChar);virtual; stdcall; abstract;
function GetNumOrders:longint;virtual; stdcall; abstract;
function SetCurrentOrder(newOrder:longint):MppError;virtual; stdcall; abstract;
function GetSongLength:longint; virtual; stdcall; abstract;
end;
 
var
MppSdkLibLoaded:Boolean;
ModMixer:IModMixer;
 
implementation
 
const MppSdkLibrary = 'mppsdk.dll';
 
var MppSdkLibHandle:THandle;
 
//#define MPP_GETMODAPIFUNCNAME "MPP_GetModAPI"
//typedef MPPERR (MPPCDECL * MPP_GETMODAPIFUNC)(IModMixer **);
GetModAPI : function(MODMixer:PModMixer):MppError;cdecl;
 
(*
*
* To get a pointer to the IModMixer interface, you can use the following functions:
*
* HMODULE hMPPSDK = (HMODULE)LoadLibrary("mppsdk.dll");
* MPP_GETMODAPIFUNC pFunc = (MPP_GETMODAPIFUNC)GetProcAddress(hMPPSDK, MPP_GETMODAPIFUNCNAME);
* IModMixer *pMPPAPI;
* pFunc(&pMPPAPI);
* ...
* You can then access the MPP SDK API through the IModMixer interface
*
* When you are done:
*
* pMPPAPI->Release();
* FreeLibrary(hMPPSDK);
*
*)
 
//#endif // MPP_SND_SYS_H
 
 
{----------------------------------------------------------------------------}
{InitLibrary - will try to load the Mppsdk.dll and get the ModMixer object}
{----------------------------------------------------------------------------}
function InitLibrary:Boolean;
begin
Result := False;
 
MppSdkLibHandle := LoadLibrary(MppSdkLibrary);
 
if MppSdkLibHandle = 0 then
begin
Exit;
end;
 
try
GetModAPI := GetProcAddress(MppSdkLibHandle,'MPP_GetModAPI');
GetModAPI(@ModMixer);
Result := True;
except
Result := False;
end;
end;
{----------------------------------------------------------------------------}
{UnLoadLibrary - Will unload the Mppsdk.dll if it was loaded}
{----------------------------------------------------------------------------}
procedure UnLoadLibrary;
begin
if MppSdkLibLoaded then
begin
FreeLibrary(MppSdkLibHandle);
end;
end;
 
{----------------------------------------------------------------------------}
{Automatic initialization and finalization - comment out if you want to
do this manually}
{----------------------------------------------------------------------------}
initialization
MppSdkLibLoaded:=InitLibrary;
finalization
UnloadLibrary;
end.
/VCL_DELPHIX_D6/SXMedia/SXAbout.dfm
0,0 → 1,728
object AboutBox: TAboutBox
Left = 260
Top = 194
BorderStyle = bsDialog
Caption = 'About SXMedia'
ClientHeight = 186
ClientWidth = 244
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
FormStyle = fsStayOnTop
Position = poScreenCenter
PixelsPerInch = 96
TextHeight = 13
object InfoContainer: TPanel
Left = 0
Top = 0
Width = 245
Height = 153
BevelInner = bvLowered
BevelOuter = bvLowered
Color = clInactiveBorder
TabOrder = 0
object Version: TLabel
Left = 7
Top = 57
Width = 53
Height = 13
Caption = 'Version 1.0'
IsControl = True
end
object Copyright: TLabel
Left = 122
Top = 57
Width = 117
Height = 13
Caption = 'Copyright SXMedia 1999'
Transparent = True
IsControl = True
end
object Author: TLabel
Left = 76
Top = 74
Width = 87
Height = 13
Alignment = taCenter
Caption = 'Author : Dean Ellis'
end
object WebSite: TLabel
Left = 42
Top = 92
Width = 157
Height = 13
Caption = 'http://www.sillex.freeserve.co.uk'
IsControl = True
end
object Credits: TLabel
Left = 42
Top = 108
Width = 167
Height = 40
Alignment = taCenter
AutoSize = False
Caption =
'MOD Player Engine provided by'#13#10'Olivier Lapicque <olivierl@jps.ne' +
't>'#13#10'http://www/jps.net/olivierl/'
WordWrap = True
IsControl = True
end
object LogoContainer: TPanel
Left = 13
Top = 2
Width = 221
Height = 53
Color = clBlack
TabOrder = 0
object ProgramIcon: TImage
Left = 6
Top = 3
Width = 210
Height = 45
AutoSize = True
Center = True
IncrementalDisplay = True
Picture.Data = {
07544269746D61700A4A0000424D0A4A0000000000003600000028000000D200
00002D0000000100100000000000D44900000000000000000000000100000000
000000000000000080000080000000808000800000008000800080800000C0C0
C000C0DCC000F0CAA60018081000080000000800080008080800100008001008
0800100010001008100010101000180010001808100018081800250018002108
18001810100022091D0025102100181818002118180031042700311029003910
2D00211821002918210031182900262326003118310039183100352632004A14
3B006B0B520066255600493A4600653358006E3261006F4364008B176E00892E
71008E3375009C3184007E4171008E4279009C39840094468400A5007B00A510
7E00A5398400A5398C00A0467F00A0468400A04A8800AD007F00AD108400A542
8C00A54A9000C1009000B9229400D6009C00F5349500565256005A5A5A00635A
5E006363630075566D008452730088567B00A5636B00A55A7300AD637300A552
7B008C5A7B0094568400A1568800A0639400AD5A8400AD4A8C00AD528C00AD5A
8C00AD4A9400AD529400AD5A9400AD529C00AD5A9C00E75A7300E75A7B00EF52
7B00EF5A7B00EF4A8400EC4F89009E7A6100B5915C00B8C232007B7179008787
8700AF688A00B47B7E00CDAF4000C7CE2F00C0CA4500CE906000CB898000C0B6
5B00C4AB7600BDF70000C1F30400C6EF0800BDF70800C6F70800BDFF0000BDFF
0800C6FF0000C0E41000C1DE1800BDF31000CED62100C0E91800BDE22100C4E1
2D00D600A500D608A500DE00A500DE08A500E700A500DE00AD00EB00AD00EF00
B500F700B500F708B500F700BD00FF00B500FF08B500FF00BD00FF00C600E221
B100F721A500F714B900FF10B100FB10BD00FF08C600FC18C300EC29AF00EF2D
B500E241B700F92DC700FF39CE00E246BD00FF46D200A57B9C00AD639C00AD6B
9C00AD739C00B55A9C00B5639C00B56B9C00B563A500B56BA500B573A500BD7B
9C00BD5AA500BD6BA500BD73A500BD6BAD00D6739C00C66BAD00BD73AD00BD7B
AD00C67BAD00D65AB500D663B500CE6BB500CE73B500D66BB500D65ABD00DE52
BD00EF52C600FF5AD600FF67DA009C8C9C009C949C00AD8CA900AD94AD009C9C
9C00A59C9C00AD9CA500AD9CAD00B594AD00B59CAD00BD849C00C6849C00C68C
9C00C6949C00C68CA500C694A500C684AD00C68CAD00C67BB500C684B500CE7B
A500CE7BB500CE84BD00D68CC600E794CE00FF7BDE00FF84DE00FF84E700FF8C
E700FF94E700B4B0B200C8B7C100D3CCD000E6B9D600DED6DE00E7D6E700EFD6
E700FF9CE700FFA5EF00F7ADE700FFADEF00FFBDEF00F7CEEF00FFCEF700DEDE
DE00E7DEE700E7E7E700EFDEE700FFD6F700EFDEEF00EFE7EF00FBDEF300FFE7
FF00EFEFEF00F7EFF700FFEFFF00F7F7F700FFF7FF00FFFFFF00F0FBFF00A4A0
A000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF
FF00FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FDE7B
BD779C739C733967F75EB656734E1042EF3DEF3DAE398B2DAE398B2D8B2D8B2D
E820E82084108410420800000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000002104
420884108614E8204A298B2DAE391042B656B656F75EB656F75E734E744EF75E
3967BD777B6F9C739C73BD77DE7BFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FDE7BBD77BD779C73
9C735B6F9C73F75EB656B6561042AE398B2D4A294208E8204208841084100000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000042088614E8206A29
8B2DEF3D744E734EB656F75E39677B6F9C73BD77BD77DE7BFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FDE7BDE7B9C739C737B6F7B6F
F75EB656744E10428B2DE820E82042088614430C240C440C0000240C25100208
010002080208030845108614E820E820CC280D310D314E355035503550395039
7139503950397139503971395039713950395039713950397139503971397139
5039713950397139713971395039713950397139503971395039713950397139
5039503950395039503971395039503971395039503950397139503971395039
7139503950395039503971395039503950395039713950395039713950397139
5039713950397139503971397139713971397139503971395039713950397139
713950397139503971395039503971395039503971395039503950354E350D31
0D31CC28E820E82086144514240C020400000000000000000000000000000100
02044208430C210484108410E8204A298B2D1042F75EB656F75E39679C73BD77
DE7BDE7BFF7FDE7BFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FDE7BDE7BBD773967F75EB656
734EAE394A298410430C430C02080208030C0208030C481848188C285034EF34
11393445754DB751185A185A185A185A185A185A185A185A185A185A185A185A
185A185A185A185A185A185A185A185AF859185A185A185A185AF755185AF859
185AF755F859185AF755F859F755F859F755F859F855F755F859F755F855F755
F859F755F855F755F855F755F855F755F755F855F755F755F855F755F755F755
F755F755F755F855F755F755F855F755F855F755F855F755F855F755F855F755
F859F755F855F859F755F859F855F859F755F859F859F755185AF859185AF755
185A185AF755185A185A185A185AF859185A185A185A185A185A185A185A185A
185A185A185A185A185A185A185A185A185AF859F859B855764D1445B3405034
2C2448180510010400000000000000000000000000002104430CE8206A291042
734EF75E39677B6FBD77BD77DE7BDE7BFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FDE7BDE7BFF7F7B6FF75EF75EEF3D
6B2DE820430C240C0204030C040805102C245034153C7B54FB587A59B959F859
185A185A185A185A185A185A185A185A185A185A185A185A185A185A185A185A
185A185A185AF859185AF755185AF859F859F755185AF755F859F755F859F755
F855F755F855F755F855F755F755F755F855F755F755F755F755F755D755F755
F755D755F755D755F755D755F755D755D755F755D755D755F755D755D755F755
D755D755F755D755D755F755D755F755D755D755F755D755D755F755D755F755
D755F755D755F755F755D755F755F755F755F755F755F755F755F755F855F755
F855F755F859F755F859F855F859F755F859185AF859185AF755185A185A185A
F755185A185A185A185A185A185A185A185A185A185A185A185A185A185A185A
185A185A185AF8597A59FB587B54354014382C24481801040000000000000000
0000420800008614AE39734EB65639673967BD77BD77DE7BDE7BFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FDE7BFF7F7B6F3967F75E1042E820
4208430C240C020405104818143817441E58BD58FB58B959F859185A185A185A
185A185A185A185A185A185A185A185A185A185AF859185A185A185AF859185A
F755185AF859F755F859185AF755F859F755F855F755F859F755F755F755F855
F755F755D755F755D755F755D755F755D755D755D755D755D755D755D755D751
D755D755D755D755D755D751D755D755D755D751D755D755D755D651D755D755
D751D755D755D751D755D755D751D755D755D755D651D755D755D755D755D755
D755D755D755D755D755D751D755D755D755D755D755D755D755D755D755F755
D755F755D755F755D755F755F755F755F755F755F855F755F855F755F859F755
F859F855F859185AF859185AF755185A185A185AF859185A185A185A185A185A
185A185A185A185A185A185A185A185A185A185AD9597A59BD585E581A50153C
2C24261400000000020400000000210486148B2D1042F75E39677B6FBD77DE7B
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FDE7BDE7BBD779C733967734E4A290000
0000000002042C2414381B501F5C5E58FB587A59185A185A185A185A185A185A
185A185A185A185A185A185A185A185A185A185A185AF859185AF859F859F755
F859F755F859F755F755F855F755F755D755F755D755F755D755D755F755D755
D755D755D755D755D755D755D755D755D755D751D755D755D651D755B651D751
B651B755D755B651B755B751B651B755B651B755B651B755B651B751B651B755
B651B751B651B751B751B651B751B751B651B751B651B751B751B651D751B751
D651B751B751D751B751D651B751D755B651D751D755D751D755D751D755D755
D755D755D755D755D751D755D755D755D755D755D755D755F755D755F755D755
F755F755F755F755F855F755F855F755F859F855F859F755185AF8591856185A
185A185AF859185A185A185A185A185A185A185A185A185A185A185A185A185A
B9591B5D7B541E5C1E58153C2C2405100000000001000000420886148B2DB656
39677B6F9C73DE7BDE7BFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FDE7BBD77BD773967F75EEF3D84100000
000004082C241A4C1E5C1F5C3E5CFB58B959F859185A185A185A185A185A185A
185A185A185A185A185A185AF859185AF755185AF755F859F755F859F755F855
B83A372337233723372337233723372337233723372337233723372337233723
B755D755D755D651D755D751D755B651D751B751D751B651B751B751B751B651
B83A372337233723161737233723161737233723161737233723161737233723
37231617B83A9651B651B651B651B651B651B651B651B751B651B651B651B751
B651B651B651B651B651B651B651B651B751B651B751B651B751B651B751B751
B651B751B751D651B751D751B651D755D751D755D751D755D755D755D755D751
D755D755D755D755D755D755F755D755F755F755F755F755F755F855F755F859
F755F859F859F755185AF8591856185A185AF859185A185A185A185A185A185A
185A185A185A185A185AF8595B5D5E581E5C1F5C1B5414384818000000000104
430886148B2D734EB6563967BD77DE7BFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FDE7BDE7B5B6F744EAE3922040104
02042C241A4C1F5C1F5C1E5CBD587A59185A185A185A185A185A185A185A185A
185A185AF859185A185A185AF755F8591856F859F755F859F755F855F755F755
F755F755D72AD703F703F703F703F703F703F703F703F803F703F703F703F703
F703D707D751B651B751B751B751B651B751B651B751B651B651B651B651B651
B651B6513817F703F703F703F703F703F703F703F703F803F703F703F703F703
F703F703D703F703D72A964D9651965196519651965196519651964D9651964D
96519651964D9651964D9651B65196519651B64D9651B6519651B6519651B651
B651B651B651B651B651B751B651B651B751B651B751B751B651B751B751D651
B751D755D751D755D755D751D755D755D755D755D755D751D755D755F755D755
F755F755F755F755F855F755F859F755F859F755F859185A185A185A185A185A
F859185A185A185A185A185A185A185A185A185AB959FB581E5C1F5C1E581D58
14380510040800000000E8204A291042F75E7B6FBD77DE7BFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FDE7BBD777C737B6FAE3984100104
4818153C1E5C1F5C1F5C5E58FB58D959185A185A185A185A185A185A185A185A
185AF859185AF755185AF859F755F859F755F859F755F755F855F755F755D755
F755D755D755D755384ED72AD72AD72A970BF703F703F703F703F703F703970F
D72A362EB83A362ED751B651B651B651B651B651B651B6519651B6519651964D
96519651964D9651F63D362EB83A362E1617F703F803F703F703F703F703F703
F703D703D7071617D72A362EF63D964D964D954D964D964D954D964D964D954D
9651964D964D954D9651964D9651964D964D9651964D9651964D9651964D9651
965196519651964D96519651964DB6519651B6519651B651B651B651B651B651
B651B751B651B751B651B751B751B651D751B751D755D651D755D755D755D755
D751D755D755D755D755F755D755F755F755F755F855F755F855F755F859F755
F859F755185A185A185AF859185A185A185A185A185A185A185A185AF8597A59
9D541F5C1F5C1E581A4C2C2402040000020842088614734EF75E7B6FBD77FF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FDE7B7C733967734E43080000
2C241A4C1F5C1F583F547C39183E3852185A185A185A185A185A185A185A185A
F859185AF755185AF859F755F859F755F855F755F755F755F755D755D755F755
D755D755D755D751D755D755D751D755D751B755D651183E970FF703F703F703
F703D72A9651B6519651B651B65196519651B64D965196519651964D96519651
964D9651964D964D9651964D964D754D964D964D9541F703F703F703F703F703
F703F703D703D72A7549764D754D764D754D764D754D764D754D764D754D764D
754D764D754D764D754D964D754D764D954D764D764D954D764D964D764D954D
964D964D964D954D964D964D9651964D9651954D96519651964D96519651964D
96519651B64D9651B651B651B651B651B651B651B751B651B751B751B651B751
D751D651D755B755D751D755D755D755D751D755D755D755F755F755F755F755
F855F755F855F859F755F859F755185A185AF859185A185A185A185AF755185A
185A185A185A183E183E7E501F581E5C1D585034040801004308E8208B2D744E
39679C73DE7BDE7BFF7FFF7FFF7FFF7FFF7FFF7FFF7FBD773967B656AE390000
2C241A4C1F5C1F5C7E50392E3723384E185A185A185A185A185A185A185AF859
185AF755185AF859F755F859F755F855F755F755F755D755F755D755D755D755
D755D755D751D755D755D751B755D651B751B751B651B751B651B751B6513723
D703F703F703F703D72A964D9651964D96519651964D9651964D964D954D764D
964D954D764D964D754D964D754D764D754D954D764D9541970BF703F703F703
F803F703F703D707F63D7549754D754D754D754D754D754D754D7549754D754D
754D754D754D754D7549754D754D7549754D754D7549754D754D754D754D754D
754D754D754D754D764D754D764D754D964D764D954D764D964D954D964D964D
964D9651954D96519651964D96519651964D9651B6519651B651B651B651B651
B651B751B651B751B751B651D751B751D755D651D755D755D751D755D755D755
D755F755D755F755F755F755F855F755F859F755F859F755185A185AF859185A
185A185A185A185A185A185A1856D72AB91E7C391F5C1F601E58503405100204
86144A29EF3DB6567B6FDE7BDE7BFF7FFF7FFF7FFF7FFF7FBD775B6F55564A29
051017441F5C1F5CDE48B91ED707B83AF859185A185A185A185A185AF859185A
F755185AF859F755F855F755F855F755F755F755D755F755D755D755D755D755
D755D751D755D751B755D651B751B651B751B651B751B651B651B651B6519651
B6519651D72AD703F703F703F703D72A964D964D954D764D964D954D764D964D
754D964D754D764D754D754D754D754D754D754D754D75499541D707D703F803
F703F703F703F703770B954175495549554D5549554955495549554955495549
554D75495549554955495549554D55495549554D55495549754D5549554D7549
554D7549554D754D7549754D754D754D754D754D7549754D754D754D754D764D
754D764D964D754D964D964D954D964D964D9651964D96519651964D96519651
964DB6519651B651B651B651B651B751B651B751B651B751D751D755D651B755
D751D755D755D755D755D751D755F755F755D755F755F855F755F859F755F859
F755185AF859185A185A185A185A185A185A185A38527817770B7C351F581F60
1B502C240510030CE820AE39B65639679C73DE7BFF7FFF7FFF7FBE7B5B6F5556
124150341F581F5C7E50B91EF80378171856185A185A185A185A185AF859F755
185AF859F755F859F755F859F755F755F755D755F755D755D755D755D755D755
D751D755D751B755D651B751B651B751B651B751B651B651B651B65196519651
B64D9651964D9651964DF63DD703F703F703F7031617964D754D964D754D764D
754D754D754D754D754D7549754D754D5549754D554975495549F63DD707D703
F703F703F703F703F703970F7545554955495549554955495549554955495549
5549554955493549554955495549554955495549554955495549554955495549
5549554955495549554955495549554955495549554D7549554D754D7549754D
7549754D754D754D754D754D754D764D754D764D954D764D964D954D964D964D
9651964D96519651964D96519651B6519651B651B651B651B751B651B751B651
B751B651D755D751B755D751D755D755D755D755D755F755D755F755F755F855
F755F755F859F755F859185AF755185A185AF755185A185A185A185AD72AD703
770B5D391E581F5C153C261404088614AE39744E39679C73BD77FF7FFF7FDE7B
D85E334135401E581E5C392ED703F703D72A185A185A185AF859185A185AF755
F859185AF755F859F755F755F755F755D755F755D755D755D755D755D755D751
D755D751B755D651B751B651B751B651B751B651B651B651B65196519651964D
9651964D9651964D9651954D764D954DF63D970FF703F703F703970F9541754D
754D7549754D7549754D554D5549554D5549554955495549554D5549F63DD703
F703F703F703F703F703D7031617754134453549344535493445354934453445
3445344534453445344534453445344534453445344534453445344535493445
3549344555493445554935495549554955495549554955495549554955495549
5549554D55497549554D754D7549554D754D754D7549754D754D764D754D764D
754D964D954D764D964D954D9651964D9651964D965196519651B651B651B651
B651B651B751B651B751B651D751D755B651D755D751D755D755D755D751D755
F755D755F755F855F755F855F755F859F755185AF859185AF859185A185A185A
185AB83AD707F703B91E7E501E581C5448180408E820AE39744EF75E7B6FFF7F
DE7B3967EF3417445E587E50590FF703F703D72A185A185A185A185A185AF859
F755185AF755F859F755F755F755F855F755D755F755D755D755D755D755D751
D755D751B755D651B751B651B751B651B751B651B651B6519651964D96519651
964D9651964D9651954D764D964D754D964D754D764D95413817F703F703F703
970B954175455549554D5549554955495549554955495549554955493445362E
D703F703F703F703F703F703F703161734453445344534453445344534453445
3445144534453445344534453445144534453445344534451445344534453445
3445344534453445344534453445344534453445344535493445354934455549
5549344555495549554955495549554955497549554D7549554D754D754D7549
754D754D764D754D764D754D964D754D964D954D9651964D9651964D9651964D
9651B651964DB651B651B751B651B751B651B751D651B755D751D755D651D755
D755D755D755D755F755D755F755F755F755F859F755F855F755185A185AF755
185A185A185A185A584ED703F703D7037C351F5C1E5C2C2426148614AE39B656
F75EFF7FDE7B4E351A501E583D41D703F703F703D72A185A185A185AF859185A
F755185AF755F859F755F755F755F855D755F755D755D755D755D755D751D755
D751B755D651B751B651D651B751B651B651B651B6519651964D96519651964D
9651964D9651754D964D964D764D954D764D764D754D764D754D754D75491617
F703F703F703D707F63D55495549554955493445554955493445354934453445
362ED703F703F703F703F703F703F703B91E3341144514453445144514453445
1445334114451445144514451445144514453341144514451445144534451445
1445144514451445144514453445144534451445344534453445344534453445
3445344534453549344535493549554935493445554935495549554955495549
55495549754D7549754D7549754D764D754D764D964D764D964D964D964D964D
9651964D9651965196519651B6519651B6519651B651B751B651B751D651B755
D751B755D751D755D751D755D755D755F755D755F855F755F755F859F755F859
F755185AF859185AF755185A185A584EF703F703F703392E1F581E5C2C242614
E8201042F75EFF7FB6561A4C1E5C3D41D703F703F7037817185A185AF755185A
185AF755F859F755F859F755F755F855F755D755F755D755D755D755D755D751
D755D751B755D651B751B6515341EF340D31EF340D31EF340D310D31EF340D31
0D31EF340D310D310D31EF34CD2C0D310D31CD2C0D31CD2C0D31CD2C0D313445
7549554D362EF703F703F703D703362E55495549344555493445344534453445
3445362EF703F703F703F803F703F703F703362E134114451139CD2C8C288C28
CD2C8C288C28B0341445144514451445D34014451445D1388C288C28CC288C28
8C288C2811391445144514451445144514451445144514451445334114453445
14453445CD2C8C2833413445EF34CD2CEF34CD2CEF34EF34EF34EF34CD2CEF34
EF34EF34EF34EF3455491241EF34EF34EF34EF34EF34EF34EF34EF34EF34EF34
EF34EF34EF347549965153415035EF3450355341B65150397549B651B651B751
B651B751B651D755D6515039503950395241D755F755D755F755F755F855D755
F859F755F855F755185AF859185A185AF755185AB83AF703F703F703B91E1F5C
1C542C24440C6A291042FF7F35491F5CDE48D703F703F703D703584E185AF859
185A185AF755185AF755F859F755F755F755F755D755F755D755D755D755D751
D755D751B755D651B751D751B651B751E8200000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000240C554955495549F63DD703F703F703D703362E34453445354534453445
34451445B91ED703F703F703F703F703F703D703362ED3401445144501040000
000000000000000000008C28D340D340D340D340D340D440D340000000000000
00000000000000008C28D440D3401445D34014451445D3401445144514451445
1445144513414818000000001139D34000000000000000002510461446144614
48188614461446144818E8203549CC2800000000000001044614861446144614
86140308000000000000E820764D86140000000000000D31964DCC2801045039
B651B751B651B751B651D751B7550000000000000000954DD751D755F755D755
F755F755D755F859F755F859F755185AF859F755185A185A18567817F703F703
F703392E1F5C1A4C0408420810427D771E581F5C590FF703F703F7033723185A
185A185AF859F755F859F755F859F755F855F755F855D755F755D755D755D755
D755D751D755B751D755B651B751B651B651B751E82000000000000000000000
00000104754993495549534175495341754953413341EF340000000000000000
0000000000000104554955495549344595419707F703F703F703161734453445
3445144534451617D703F703F703F703F703F703D703F32DD4401445D340D444
00000000000000000000000000004818D444D340D340B340D340B340B3400000
0000000000000000000000008C28D340D340D340D340D340D340D440D340D440
1445D3401445D138240C00000104CD2C14451241000000000000000034453445
344534453445344535495549344555495549CC2800000000000046147549554D
7549754D754D8C28000000000000E820764D4614000000000000CD2C9651B64D
EF340104CC28B651B651B651B751B651B75100000000000000009349D755D755
D755D755D755F855F755F855F859F755F859F755F859185A1856F859185A584E
F703F703F703F703DE481E582C2400006A291F6E1F5C7C35F803F703F703F703
584E1856185AF859F755185AF755F859F755F755F755F755D755F755D755D755
D755D751D755D751B651D755B651B751B651B751B651B751E820000000000000
00000000000022049651754D964D954D764D754D754D754D754D754D48180000
0000000000000000000001045549554934455549344575411617F703F703F703
16175341144533411617F703F703F703F703F703F703D70794311445D340D440
D340D34000000000000000000000000000004818D340B340B340B340B340B340
D13800000000000000000000000000008C28B340B340D340B340D340D340D340
D340D340D340D340CD2C01040000030CD13814451445D1380000000000000000
8C28CC288C288C28CC281341344534455549344555498C280000000000004614
5549754D5549754D7549E8200000000000004818964D86140000000000000D31
964D9651964D53414208240C440C440C86144614861400000000000000009349
D755D751D755F755D755F755D755F755F755F755F855F755185AF859F755185A
185A185A970FF703F703F70338171F5C1A5000008410DF641F5C3817D703F703
F703D707185A185AF755185AF859F755F859F755F855F755F855D755F755D755
D755D755D755D751D755D751B755D651B751B651B651B751B651B651CC28440C
430C240C430C240C240C4614954D964D754D764D764D754D764D754D55491139
4510000000000000000000000000020455495549344555493445344535451617
D703F703F703770B74351617F703F703F703F703F703F70397077435D340D340
D340D340D340D34000000000000000000000000000004818B340B340D138B340
B340B340B03400000000000000000000000000008C28B340B340B340B340B340
D340B340D340D340D3408C28000000004614D3401445D3401445113900000000
0000000025104510251045104510134134453549344555493445CC2800000000
000046145549754D5549754D554D8C28000000000000E820764D461400000000
0000CD2C964D9651964DB651954D861400000000CC28B651B751000000000000
00009349D755D751D755D755D755F755D755F855F755F859F755F859F755185A
F755185AF859185A3723F703F703F803D7037E501F5C040800005F5C1F5CD703
F703F703F7037817185AF859185A185AF755185AF755F859F755F755F755F755
D755D755D755D755D755D751D755B751D651B755B751B651B751B651B651B651
96519651964D9651964D9651964D954D964D754D964D754D5241CD2CE820240C
0000000000000000000002088614CC2811393445554934453549344534453549
34453445362EF703F703F703F703F703F703F703F803F703D703770B5439D340
D340D440D340D340D340B34000000000000000000000000000004818B340B340
B340B340D138B340503400000000000000000000000000008C28B340B340B340
D138B340B340B340D340D1382614000000008C28D340D3401445D3401445D138
000000000000000014451445344514453445144534453445344535493445CC28
000000000000451455495549554955497549E8200000000000004818954D4614
0000000000000D31954D9651964D96519651B651CC28000000008614954D0000
0000000000009349D755D751D755D755F755D755F755D755F855F755F859F755
F859F755185A185AF859185AD72AF703F703F703F7037C391F5C481800003E5C
1F5CF803F703F703F8037817F859185A185AF755F859F755185AF755F859F755
F859D755D755F755D755D755D755D751D755B651D755B751B651B751B651B651
B751B6519651B651964D96519651964D96517549EF34CC284510010400000000
0000000001004514CC28EF343341554955495549554955493445554934453549
344534453445344534459535D703F703F703F803F703F703F703F703770B133D
D340D340D340D340D340D340B340D34000000000000000000000000000004818
B340D138B3405034B3405034D13800000000000000000000000000008C28D138
B340B340B340B340B340B340B034020400000104B034D340D3401445D3401445
D340D3400000000000000000CC28CD2C8C28CD2CCD2CCD2CCD2CCD2CCD2CCD2C
3549CC28000000000000240CCC28CC28CC28CC28CC280000000000000000E820
764D4614000000000000CD2C964D9651964D9651B651964DB651503901040000
020800000000000000009349D755D751D755D755D751F755D755F855F755D755
F855F755F8591856F859F755185A185AB83AF703F703F703F7037C351F5C4818
02085F5C1F5C9707F703F703F703970F185A185A185AF755185AF859F755F755
F855F755F755D755F755D755D755D755D755D751D755B751D755B651B751D651
B751B651B651B751B6519651964D5241CC288614030C00000000000000000000
240CE820CD2C3341754D7549554D55495549554D554955495549344555493445
5549344534453445344534451445F32DB803F703F703F703F703F703F7031617
133DD444D3401445D340D444D340D340D340B340000000000000000000000000
00004818B340B340D138B340D138B3408C280000000000000000000000000000
8C28B340B340D138B340B340B3408C2800000000240CD138D444D340D340D340
1445D3401445D340CD2C8C288C28CC288C288C28CC288C28CC288C28CC28CC28
CD2CCD2C35491139CD2CCC28CD2CCC28CD2CCC28CD2CCD2CCD2CCD2CCD2CCD2C
0D313341954D33410D31CD2C0D3152419651964D9651964D9651B6519651B651
75490D310D310D31EF340D315035B755D651D755D755D755F755D755F755D755
F755F859F755F859F755F859F755185A185AF755D72AF703F803F703F7033D41
1F5C2614E8207F691F5C392EF803F703F703D7031856185AF859185AF755F859
F755F859F755F755F855D755F755D755D755D755D751D755D755D751B651D751
B651B755B651B751B6519651EF34440C0000000000000000000000008614CD2C
5039554D964D754D754D764D7549754912410D31EF34CD2CEF34CD2CEF34EF34
34455549344535493445344534453445362ED703F703F703F703F703F703F703
D70394311445D3401445D340D340D340D340D340D340D3400000000000000000
0000000000004818B340B340B340B340B3404818000000000000000000000000
000000008C28B340B340B340D340B3404818000000004818D340D340D340D440
D3401445D3401445D34014451445334114451445144534451445344534453445
35493445344555493445554934455549554955495549554D7549554D7549754D
754D7549764D954D764D954D764D9651754D964D9651964D96519651B64D9651
B751B651B651B751B651D755B651D751B755D751D755D755D751D755D755D755
F855F755F855F755F755F859F755185AF8591856F859185A3723F703F703F703
D7031F581E5C0204AE39BF761F5CDE48D703F803F703F703B83A185A185AF859
F755185AF755F859F755F859F755F755D755F755D755D755D755D755D751D755
B751D755B651D751B651B651B751B651E8200000000000000000000000000204
9651954D764D964D754D754D764D754D764D754D8C2800000000000000000000
000001045549554934453549554934453445362EF703F703F703F803F703F703
F703F703F703D703362ED34014451341D444D3401445D340D444D34000000000
000000000000000000004818D444D340B340D138261400000000000000000000
00000000000000008C28B340D340B340D138240C000000008C28D340D444D340
1445D3401445D444134114451445144514451445144534451445344534453445
34453445344535495549344555495549554955495549554D5549754D5549754D
7549754D754D764D754D764D954D764D954D964D9651964D9651964D9651B64D
9651B6519651B651B751B651B751B651D755B751D755D651D755D751D755F755
D755F755F755D755F755F755F859F755F859185AF755185AF8593852D707F703
F703F803392E1F58153CE820534EFF7FBE601F5C392EF803F703F7037817185A
F755185A185AF755F8591856F755F755F755F755F855D755F755D755D755D755
D751D755D755B651D751B755B651B751B651B651E82000000000000000000000
000000005241964D954D9651954D764D954D754D754D754DE820000000000000
0000000000000104554955495549554934453549362EF703F703F703F703F703
F703D803362ED707F703F703D703362E1341144513411445D3401445D3401445
00000000000000000000000000004818D340D340B0340208000001048C280000
0000000000000000000000008C28D340D440CD2C020400000208B034D3401445
D3401445D3401445144513411445144514451445144534451445344534453445
3445344534453549554934455549344555495549554955495549754D5549754D
5549754D754D754D764D754D964D754D964D754D9651964D9651964D9651964D
B6519651B751B651B651B751B651B751B651D751B755D651D755D751D755D755
D755D755F855F755D755F755F859F755F859F755185AF755185A185A185AB83A
F703F703F70397073F541F5C8C28F44DB656FF7FFF761F5C1F583817D703F703
F703B83A185A185AF859F755185AF755F859F755F859F755F755F755D755F755
D755D755D755D751D755D751D755B651D751B651B751B651CC28000000000000
00000000000000000000240C4510451045104510451045144510451001040000
000000000000000000000104554955495549554955491617D703F703F703F803
F703F703D703F32D35497541770BF703F703F703161713411445144514451445
134114450000000000000000000000000000240C4818461400000000240CD340
D3400000000000000000000000000000240C48184614000000004510D3401341
1445144513411445144514451445144514451445344534453445344534453445
34453445354955493445554934455549554955495549554D5549754D5549754D
5549754D754D7549764D754D964D754D964D754D964D9651954D9651964D9651
964DB6519651B651B651B651B751B651B751B651D755B651D755D751D755D755
D751D755F755D755F755D755F755F859F755F855F859F755185A185AF755185A
3852D707F703F703D703DE481E5C343C934939677C73FF7FFF7F1F6E1F5C3F54
3817D703F803D707584E185A185AF859185AF755F859185AF755F855F755F859
F755D755F855D755D755D755D751D755D755D751B651D755B751B6519349E820
4510451045144510451045144510451045104514451045104510451045104510
45104510451045104510451045104614754D7549554975491617F703F703F703
F703F703F703D707953555493445344555451617F703F703F703770B53413341
3445144514451445CD2C25102510440C2510240C2510240C2510440C25108C28
1341144513418C282510440C2510440C2510440C2510240C251045108C281445
1445144514451445144514453445144534453445344534453445344534453445
354934455549344555493445554955495549554955495549754D5549754D5549
754D7549754D754D764D754D964D754D964D754D964D9651964D9651964D9651
964DB6519651B651B651B751B651B751B651B751D651B755D751D755D751D755
D751D755D755F755D755F755F755F855F755F859F755F859185AF755185AF859
185A18563723F703F703D7033D411E581A4C7549D85E5B6FDE7BFF7FFF7FFF7F
9F691F5C1F58B91EF703F703970F3856185A185A185AF755185AF755F859F755
F859F755F755F755F755D755F755D755D755D755D755D751D755D751B651D755
B651B751B651B651B751B651B6519651B751964DB651964D9651964D9651964D
954D964D754D964D754D764D754D754D764D754D754D554975493817F703F703
F703F703F703F703D70795355549554934455549344555491617F703F703F703
9707953534453445344534453445144534451445344514451445344514451445
1445144514451445144514451445144514451445144514451445344514453445
1445344534453445144534453445344534453445344534453549344534453549
344555493445554955495549554955495549554D5549754D5549754D5549754D
7549754D764D754D764D754D964D754D964D754D964D9651954D9651964D9651
964DB6519651B651B751B651B751B651B651B751D651B755D751B755D651D755
D755D755D755F755D755F755F755F755F859F755F855185AF755185AF755185A
185A185A185AD72AF703F7039707DE481E5C1A500D31D85E9D77BE7BDE7BFF7F
FF7FFF7FFF7FFF6D1F5C1F5C7C35D703F703970F3852185A185A185A185A185A
F755185AF755F859F755F859F755F755F755D755F755D755D755D755D751D755
D755D751B755D651B751D755B651B751B651B651B651B65196519651B64D9651
964D9651964D964D9651954D764D954D764D754D964D754D954D9541970FD703
F703F803F703F703F703970B954155495549554955495549554955495549362E
F703F703F703D703362E34453445344534453445354934453445344534453445
3445344534453445344534453445344534453445344534453445344534453445
3445344534453445344534453549344534453549344555493445554934455549
554955495549554955495549554D5549554D75495549754D5549754D7549754D
754D754D754D764D954D764D954D764D954D9651964D9651964D9651964D9651
B64D9651B6519651B651B651B751B651B751B651D751B755D651D755D751D755
D751D755D755F755D755F755D755F755F855F755F859F755185AF859F755185A
F859185A185A185AD72AF703F703B91E3F541F5C1A4C0D315B6FBD77DF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7F9F763E5C1F5C7E50B91EF703970B584E185A185A
185AF755185A185AF755185AF755F859F755F859F755F755F755D755D755F755
D755D755D755D751D755D751D755B651B751D651B755B651B751B651B651B751
B6519651B6519651964D9651964D9651964D9651954D964D954D764D9541970B
F703F703F703F703F703F703970F95417549554D75495549554D554955495549
5549554D362ED703F703F703D703B91E34455549554955493445554934455549
3445354934455549344535493445354934453445354934455549344535493445
5549344535493445554934455549554934455549554955495549554955495549
55495549554955495549554D75495549754D5549754D7549754D764D754D754D
764D754D964D754D964D754D964D9651954D964D9651964D9651964D9651964D
B6519651B651B651B751B651B751B651B751D651B751D755B651D755D751D755
D755D755D755F755D755F755F755F755F859F755F859F755185AF755185AF755
185A185A185A185A18563723F80397077C391F5C1F601438AE39BD77FF7FDE7B
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F7E77DF641F5C1F5C3D413817D703
B83A185A185A185A185AF859185AF755185AF755F859F755F755F859F755F855
F755F755D755F755D755D755D755D755D751D755D751D755B651B751D651B755
B651B751B651B651B651B751B65196519651B64D9651964D9651964D9651F63D
D707F703F703F703F703F703D703970F9541754D764D754D754D754D754D7549
754D7549554D75495549F63DD707F703F703F703161775455549554955495549
5549554955495549554955495549554955495549554955495549554955495549
55495549554955495549554955495549554955495549554D554955495549754D
55495549754D5549754D7549754D754D7549754D764D754D754D764D754D754D
964D754D964D764D954D964D9651964D9651964D9651964D9651964DB6519651
B651B751B651B651B751B651B751B651B751D651B755D651D755D751D755D755
D755D755F755D755F755D755F755F855F755F859F755F859F755185AF755185A
F859185A185A185A185A584E970FB803392E1F581F5C1D588C28B656FF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F7F725F5C1F5C
1F5C3D41381738175852185A185A185A185AF859185AF8591856185AF859F755
F859F755F755F859F755F755F755D755D755F755D755D755D755D751D755D751
D755B651D751B651B751B651B751B651B651B751B651B6519651B7519651964D
F63DD703F703F703F803F703F703F70378177549964D954D764D954D764D754D
954D764D754D754D754D754D764D754D9541770BF703F703F703770B95417549
754D5549754D5549754D55495549754D55495549754D55495549754D5549554D
75495549554D75495549754D55497549554D7549754D7549554D7549754D7549
754D754D7549754D764D754D754D754D764D754D754D764D954D764D954D764D
954D964D9651954D9651964D9651964D9651964D9651964DB6519651B651B651
B651B751B651B651B751B651B751D651B755D651D755D751D755D751D755D755
D755D755F755D755F755F855F755F755F859F755F859F755185AF755185AF859
185A185A185A185AF859185AD72A970F392E1F581F5C1F5C1438EF3DBD77FF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
DF7F1F6E3E5C1F5C1F5CDE48392ED72A1856185A185A185A185A185AF859185A
F755185A185AF755F859F755F859F755F755F855F755F755D755F755D755D755
D755D755D755D751D755D751D755B751D651B755B651B751D651B751B651B651
B651B83AD703D703F703F703F703F703F7033817B64D9651964D9651964D9651
954D964D9651764D954D764D954D764D754D964D754D964D970FD703F703F703
D707F63D7549754D764D7549754D764D754D754D764D754D754D754D754D754D
754D7549754D754D754D764D754D754D754D754D754D764D754D754D754D764D
754D754D764D754D754D964D754D964D754D964D754D964D964D9651954D9651
964D9651964D9651964D9651964DB6519651B6519651B651B651B651B651B751
B651B751B651B751B651D751B755D651D755D751D755D751D755D755D755D755
F755D755F755F755F755F755F859F755F859F755185AF755185AF8591856F859
185A185A185A185A185A185AB83AB91E7C391F581F5C1E5C153C71397B6FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FBF7F3F725F5C1F5C1F5C3F543D41DA4D1856185A185A185A
185A185A185AF859185AF755185AF755185AF755185AF755F859F755F855F755
F755F755D755D755F755D755D755D755D755D751D755D751D755D651B755B651
B651B755D72AD703F703F703F703F703F803F7031617B651B651964DB6519651
964D9651964D9651964D9651964D9651964D9651964D9651954D964D964D970F
D703F703F703D703D72A754D9651754D964D754D964D754D764D954D764D754D
964D754D764D954D764D754D964D754D964D754D964D754D964D754D964D954D
764D954D964D9651964D954D9651964D9651964D964D9651964D9651964D9651
964D9651964DB6519651B651B6519651B651B651B651B651B751B651B751B651
B751B651D755B651D755D651D755D751D755D751D755D755D755D755D755F755
D755F755F755F755F855F755F859F755185AF755185AF755185AF859185A185A
185A185A185A185A185A185AF9517C399D541F581F5C1E58343C52417B6FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FBF761F651F5C1F5C1F5C3E5CFB58
F859185A185A185A185A185A185A185AF859185AF859185AF755185AF755F859
F755F859F755F859F755F755F855F755D755F755D755D755D755F755D755D755
D751F74DB83A970FD703F703F803F703F703F703F703F703D72AB651B751B651
9651B651B651B751B651B6519651B651B65196519651B64D96519651964D9651
964D3723D703F703F803F703F703970F362EB64D964D964D954D9651964D964D
9651964D9651964D964D9651964D9651964D964D9651964D964D9651964D9651
964D9651964D9651964D9651964D9651964D9651964D9651B6519651B6519651
B651B651B651B751B651B651B651B751B651B751B651B751B651B751D651B755
D651B751D755D751D755D751D755D751D755D755D755D755F755D755F755F755
F755F755F859F755F859F755F859F755185AF859F755185A185AF859185A185A
185A185A185A185A185AF8597A595E581E5C1F5C1F5C1A50B340334E9C73FF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F9F7F5F72DF64
1F5C1F5C1F5CBD587A59185A185A185A185A185A185A185A185A185AF859185A
F859185AF755185AF755185AF755185AF755F755F859F755F755F755F755F755
183ED707D703F703F703F703F703F703F703F703F803F703F703F703F703D703
D707D7077817B651B751B651B751B651B651B751B651B651B651B651B651970F
D707D707D703F703F703F703F703F703F703F703F703F703D703D707D72A964D
96519651B64D96519651B64D96519651B651964D9651B6519651964DB6519651
B6519651B64D9651B651B651B6519651B651B651B651B751B651B651B651B751
B651B651B751B651B651B751B651B751D651B751D755B651D751D755D751D755
D751D755D751D755D755D755D755D755F755D755F755F755F755F755F755F855
F755F859F755F859F755185AF755185AF859185AF755185A185A185A185A185A
185A185A185A185A185AB959FB583E5C1E5C1F5C1B50343C9349F75EFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7F9F7F5F721F653E5C1F5C3E5CBD589A59F859185A185A185A185A185A
185A185A185A185A185AF859185AF755185AF859F755185AF859F755185AF755
F859F755B83AF703F703F703F703F703F703F703F703F703F703F703F803F703
F703F703F703F703970FD751D755D751D751D651B755D751B651B751D755B651
B751D707F703F703F703F703F703F703F703F703F703F703F703F703F703F703
D72AB651B651B651B751B651B651B651B751B651B651B651B651B751B651B651
B751B651B651B751B651B751B651B751B651B651B751B651B751B651B751D651
B755B651D751D755B651D751D755D751D755D751D755D755D755D755D755D755
D755D755D755D755F755D755F755F755F755F755F859F755F859F755F859F755
F859F755185AF755185AF8591856185AF859185A185A185A185A185A185A185A
185A185A185A185AB9591B5D5E581E5C1F5C1A4C343C9349F75EDE7BFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FDF7FFF76FF6D1F651F5C3E5CBD585B5DF859
185AF859185A185A185A185A185A185A185A185A185A185AF859185AF755185A
F859F755185AF7551856174E3852384E174E3852174E384E174E384E174E174E
174E174E174E174E174E174E174ED755D755D755D755D755D755D751D755D755
D751D755D755F74D174E174EF74D174EF74D174EF74D174EF74DF74D174EF74D
F74DF74DF74DB651D751B751D651B755D651B751D751B651D755B751D751B651
D751B755D751B651D755D751D755B651D751D755D651D751D755D751D755D751
D755D755D751D755D755D751D755D755D755D755D755D755D755F755D755F755
D755F755F755F755F859F755F755F859F755F859F755F855F755185AF755185A
F859F755185A185AF859185AF859185A185A185A185AF755185A185A185A185A
185A185AF8597A5DFB583E5C1E5C1A4C343C3445534E3967FF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FDF7F3F7B5F72
7F69BE605F5CFB585B5DB9591856185A185A185A185A185A185A185A185A185A
185A185A185A185AF859185AF859185AF755185AF755185AF755185AF755F859
F755185AF755F755F859F755F755F855F755F755F755D755F755F755F755D755
F755D755F755D755F755D755D755D755D755D755D755D755D755D755D755D755
D755D751D755D755D755D755D751D755D755D755D751D755D755D755D751D755
D755D755D755D751D755D755D755D751D755D755D755D755D755D755D755D755
D755D755D755F755D755D755F755D755F755F755F755F755F755F755F755F855
F755F755F755F859F755F855F755185AF755185AF755185AF755185AF859185A
F8591856F859185A185A185A185A185A185A185A185A185A185A185A185A185A
F8597A59FB585E581A50153CD444754975523967FF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FDF7F3F7BBE72FF6D7F695D61FB587A599A59F859185A185A
185A185A185A185A185A185A185A185A185A185A185A185A185AF859185AF859
185AF755185AF859F755185AF859F755185AF755F859F755185AF755F859F755
F859F755F755F859F755F755F755F855F755F755F855F755F755F755F755D755
F755D755F755D755F755D755F755D755F755D755F755D755F755D755F755D755
F755D755F755D755F755D755F755D755F755D755F75500000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000}
Stretch = True
IsControl = True
end
end
end
object OKButton: TButton
Left = 81
Top = 158
Width = 75
Height = 25
Caption = 'OK'
Default = True
ModalResult = 1
TabOrder = 1
end
end
/VCL_DELPHIX_D6/SXMedia/SXAbout.pas
0,0 → 1,53
{
SXMedia Components - Beta 1
--------------------------------
Copyright 1999 Dean Ellis
http://www.sillex.freeserve.co.uk
 
This unit is part of the SXMedia Component Set. This code is
supplied as is with no guarantees and must be used at your own
risk.
 
No modifications to this code must be made without the express
permission of the author. Please report any problems to
support@sillex.freeserve.co.uk
 
You may use these components to create any freeware/shareware
applications that you wish. If the components are to be used in
a commercail product then credit for developement of these components
should be given.
 
Credits :
 
Developer : Dean Ellis
}
unit sxabout;
 
interface
 
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ExtCtrls;
 
type
TAboutBox = class(TForm)
InfoContainer: TPanel;
Version: TLabel;
Copyright: TLabel;
OKButton: TButton;
Author: TLabel;
WebSite: TLabel;
Credits: TLabel;
LogoContainer: TPanel;
ProgramIcon: TImage;
private
{ Private declarations }
public
{ Public declarations }
end;
 
implementation
 
{$R *.DFM}
 
end.
 
/VCL_DELPHIX_D6/SXMedia/SXEditor.pas
0,0 → 1,122
{
SXMedia Components - Beta 1
--------------------------------
Copyright 1999 Dean Ellis
http://www.sillex.freeserve.co.uk
 
This unit is part of the SXMedia Component Set. This code is
supplied as is with no guarantees and must be used at your own
risk.
 
No modifications to this code must be made without the express
permission of the author. Please report any problems to
support@sillex.freeserve.co.uk
 
You may use these components to create any freeware/shareware
applications that you wish. If the components are to be used in
a commercail product then credit for developement of these components
should be given.
 
Credits :
 
Developer : Dean Ellis
}
unit SXEditor;
 
{$INCLUDE DelphiXcfg.inc}
 
interface
 
uses Windows, Classes,
{$IfNDef VER6UP} DsgnIntf, {$Else} Designintf, DesignEditors, {$EndIf}
Dialogs, SXMovie, SXModPlayer, SXEngine, SXAbout;
 
const
 
SXMOVIE_FILTER = 'All Media Files|*.avi;*.mpg;*.mov|' +
'AVI (*.avi)|*.avi|MPG (*.mpg)|*.mpg|MOV (*.mov)|*.mov';
SXMODPLAYER_FILTER = 'All Media Files|*.mod;*.it;*.sm3|' +
'Impulse Tracker (*.it)|*.it|Scream Tracker (*.s3m)|*.s3m|Fast Tracker (*.xm)|*.xm';
 
type
 
TFilenameProperty = class(TPropertyEditor)
function GetAttributes : TPropertyAttributes; override;
function GetValue : string; override;
procedure SetValue(const Value : string); override;
procedure Edit; override;
end;
 
TSXComponentEditor = class(TComponentEditor)
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;
 
implementation
 
{--------------------------------------}
{ TFilename Property Editor }
{--------------------------------------}
procedure TFilenameProperty.Edit;
var
Dialog : TOpenDialog;
begin
Dialog := TOpenDialog.Create(nil);
with Dialog do
try
DefaultExt := 'All Media Files';
if GetComponent(0) is TSXMovie then
Filter := SXMOVIE_FILTER
else
if GetComponent(0) is TSXModPlayer then
Filter := SXMODPLAYER_FILTER
else
Exit;
if Dialog.Execute then
begin
SetStrValue(Dialog.FileName);
Designer.Modified;
end;
finally
Free;
end;
end;
 
function TFilenameProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog];
end;
 
function TFilenameProperty.GetValue : string;
begin
Result := GetStrValue;
end;
 
procedure TFilenameProperty.SetValue(const Value : string);
begin
SetStrValue(Value);
Designer.Modified;
end;
 
procedure TSXComponentEditor.ExecuteVerb(Index: Integer);
begin
with TAboutBox.Create(nil) do
begin
try
ShowModal;
finally
Free;
end;
end;
end;
function TSXComponentEditor.GetVerb(Index: Integer): string;
begin
Result := 'A&bout SXMedia';
end;
function TSXComponentEditor.GetVerbCount: Integer;
begin
Result := 1;
end;
 
end.
/VCL_DELPHIX_D6/SXMedia/SXEngine.pas
0,0 → 1,221
{
SXMedia Components - Beta 1
--------------------------------
Copyright 1999 Dean Ellis
http://www.sillex.freeserve.co.uk
 
This unit is part of the SXMedia Component Set. This code is
supplied as is with no guarantees and must be used at your own
risk.
 
No modifications to this code must be made without the express
permission of the author. Please report any problems to
support@sillex.freeserve.co.uk
 
You may use these components to create any freeware/shareware
applications that you wish. If the components are to be used in
a commercail product then credit for developement of these components
should be given.
 
Credits :
 
Developer : Dean Ellis
Testers : Dominique Louis
Ivan Blecic
}
unit SXEngine;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, MMSystem;
 
type
TFramesPerSecond = 1..100;
TFreeCyclesEvent = procedure (Sender: TObject; Count:Integer) of object;
 
TSXEngine = class(TComponent)
private
{ Private Data Members }
FFramesPerSecond:TFramesPerSecond;
FEnabled:Boolean;
FThreadPriority:TThreadPriority;
FFPS:Integer;
FActivate:TNotifyEvent;
FDeActivate:TNotifyEvent;
FRender:TNotifyEvent;
FFreeCycles:TFreeCyclesEvent;
protected
{ Property Accessors }
procedure SetTargetFPS(Value:TFramesPerSecond);
function GetTargetFPS:TFramesPerSecond;
procedure SetEnabled(Value:Boolean);
procedure SetThreadPriority(Value:TThreadPriority);
{ Notification methods }
procedure DoRender;
procedure DoActivate;
procedure DoDeActivate;
procedure DoFreeCycles(Count: Integer);
{ Class Helper methods }
public
{ Public methods }
constructor Create(AOwner:TComponent);override;
destructor Destroy; override;
{Public Properties}
property FramesPerSecond : Integer read FFPS write FFPS;
published
{ Published properties }
property TargetFPS : TFramesPerSecond read GetTargetFPS write SetTargetFPS default 30;
property Enabled : Boolean read FEnabled write SetEnabled default False;
property ThreadPriority : TThreadPriority read FThreadPriority write SetThreadPriority;
{ Published Events}
property OnActivate : TNotifyEvent read FActivate write FActivate;
property OnDeActivate : TNotifyEvent read FDeActivate write FDeActivate;
property OnRender : TNotifyEvent read FRender write FRender;
property OnFreeCycles : TFreeCyclesEvent read FFreeCycles write FFreeCycles;
end;
 
implementation
{$J+}
const
FPS : Single = 33.3;
SECOND : Single = 1000.0;
 
type
TGameThread = class(TThread)
private
{ Private declarations }
FThreadCallback:TThreadMethod;
protected
procedure Execute; override;
property ThreadCallback: TThreadMethod read FThreadCallback write FThreadCallback;
public
constructor Create(CreateSupsended:Boolean;Callback:TThreadMethod);
end;
 
var Thread:TGameThread;
{ Important: Methods and properties of objects in VCL can only be used in a
method called using Synchronize, for example,
 
Synchronize(UpdateCaption);
 
and UpdateCaption could look like,
 
procedure TGameThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
 
{ TGameThread }
 
procedure TGameThread.Execute;
begin
{ Place thread code here }
while not Terminated do
begin
try
if Assigned(ThreadCallback) then Synchronize(ThreadCallback);
except
Terminate;
end;
end;
end;
constructor TGameThread.Create(CreateSupsended:Boolean;Callback:TThreadMethod);
begin
inherited Create(CreateSupsended);
ThreadCallback := Callback;
end;
 
{ TSXEngine }
constructor TSXEngine.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
if not (csDesigning in ComponentState) then
begin
if not Assigned(Thread) then
begin
Thread := TGameThread.Create(True,DoRender);
Thread.FreeOnTerminate := False;
Thread.Priority := ThreadPriority;
Thread.Suspended := not Enabled;
end;
DoActivate;
end;
Enabled := False;
TargetFPS := 30;
end;
destructor TSXEngine.Destroy;
begin
if not (csDesigning in ComponentState) then
begin
if Assigned(Thread) then
begin
Thread.Terminate;
Thread.Free;
end;
DoDeActivate;
end;
inherited Destroy;
end;
procedure TSXEngine.SetTargetFPS(Value:TFramesPerSecond);
begin
FFramesPerSecond := Value;
FPS := SECOND / Value;
end;
function TSXEngine.GetTargetFPS:TFramesPerSecond;
begin
Result := FFramesPerSecond;
end;
procedure TSXEngine.SetEnabled(Value:Boolean);
begin
FEnabled := Value;
if Thread <> nil then
Thread.Suspended := not Value;
end;
procedure TSXEngine.SetThreadPriority(Value:TThreadPriority);
begin
FThreadPriority := Value;
if Thread <> nil then
Thread.Priority := Value;
end;
procedure TSXEngine.DoRender;
const Start:DWord = 0;
OldStart:DWord = 0;
Count:Integer =0;
var FreeCycleCount:integer;
begin
try
Start := TimeGetTime;
FreeCycleCount := 0;
if Assigned(FRender) then FRender(Self);
if (Start - OldStart) < SECOND then
Inc(Count)
else
begin
FramesPerSecond := Count;
OldStart := Start;
Count := 0;
end;
repeat
DoFreeCycles(FreeCycleCount);
inc(FreeCycleCount);
until (TimeGetTime - Start) >= FPS;
except
Enabled := False;
Thread.Terminate;
end;
end;
procedure TSXEngine.DoActivate;
begin
if Assigned(FActivate) then FActivate(Self);
end;
procedure TSXEngine.DoDeActivate;
begin
if Assigned(FDeActivate) then FDeActivate(Self);
end;
procedure TSXEngine.DoFreeCycles(Count: Integer);
begin
if Assigned(FFreeCycles) then FFreeCycles(Self,Count);
end;
 
end.
/VCL_DELPHIX_D6/SXMedia/SXModPlayer.pas
0,0 → 1,542
{
SXMedia Components - Beta 1
--------------------------------
Copyright 1999 Dean Ellis
http://www.sillex.freeserve.co.uk
 
This unit is part of the SXMedia Component Set. This code is
supplied as is with no guarantees and must be used at your own
risk.
 
No modifications to this code must be made without the express
permission of the author. Please report any problems to
support@sillex.freeserve.co.uk
 
You may use these components to create any freeware/shareware
applications that you wish. If the components are to be used in
a commercail product then credit for developement of these components
should be given.
 
Credits :
 
Developer : Dean Ellis
Testers : Dominique Louis
Ivan Blecic
Naoki Haga
 
Version History
--------------------------------------------------------------------------------
25/01/2000 Modified Destroy and Stop methods to check IDSBuffer before
calling IBuffer.Stop. Stops the "Buffer not Created exception"
being thrown.
06/02/2000 Added OnStop and OnStart events
Added Finalize method. This does not have to be called but if you
manually finalize and initialize the DXSound Component you
need to call this method to clear the buffers and the Threads.
22/02/2000 Modified SetLoop code to correct functionality.
Modifed Stop method to make sure the OnStop event is only called
if it wsa playing and that the Value of Playing would be False
when the event is fired.
15/05/2000 Made use of the MppSdkLibLoaded variable to make sure the component
does nothing if the mppsdk.dll is not found.
Removed the raising of an exception in the constructor as it seemed to
be causing more problems than it was solving.
--------------------------------------------------------------------------------
}
unit SXModPlayer;
 
{$INCLUDE DelphiXcfg.inc}
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DXSounds, MMSystem, MpSndSys,
{$IFDEF StandardDX}
DirectDraw, DirectSound,
{$IFDEF DX7}
{$IFDEF D3DRM}
Direct3DRM,
{$ENDIF}
Direct3D;
{$ENDIF}
{$IFDEF DX9}
Direct3D9, Direct3D, D3DX9, {Direct3D8,} DX7toDX8;
{$ENDIF}
{$ELSE}
DirectX;
{$ENDIF}
 
type
 
TModOption = (NoResampling, BassExpansion, Surround, Reverb,
HighQuality, GainControl, NoiseReduction);
 
TModOptions = Set of TModOption;
 
TSXModPlayer = class(TComponent)
private
{ Private declarations }
FFilename: TFilename;
FDXSound : TDXSound;
FSoundBuffer : TDirectSoundBuffer;
FSoundNotify : IDirectSoundNotify;
FBufferDesc : TDSBufferDesc;
FWaveFormat : TWaveFormatEx;
FLoop : Boolean;
FPlaying : Boolean;
FOptions : TModOptions;
FEvents: TList;
FNotify: TList;
FOnStop: TNotifyEvent;
FOnStart: TNotifyEvent;
function GetPosition : Integer;
function GetSilenceData:Integer;
protected
{ Protected declarations }
procedure InitSoundEvents;
procedure ThreadCallback;
procedure SetFilename(const Value : TFilename);
procedure SetLoop(const Value : Boolean);
procedure SetOptions(const Value : TModOptions);
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure DoStop;
procedure DoStart;
 
function CreateEventList : TList;
function CreateNotifyList : TList;
function CreateSoundBuffer : TDirectSoundBuffer;
function CreateSoundNotify : IDirectSoundNotify;
procedure ClearSoundNotify;
procedure CreateEventThread;
procedure ClearSoundBuffer;
 
procedure StartThread;
procedure StopThread;
 
property BufferDesc : TDSBufferDesc read FBufferDesc write FBufferDesc;
property WaveFormat : TWaveFormatEx read FWaveFormat write FWaveFormat;
property SoundBuffer : TDirectSoundBuffer read FSoundBuffer write FSoundBuffer;
property SoundNotify : IDirectSoundNotify read FSoundNotify write FSoundNotify;
property Events : TList read FEvents write FEvents;
property Notify : TList read FNotify write FNotify;
public
{ Public declarations }
constructor Create( AOwner : TComponent); override;
destructor Destroy; override;
procedure Initialize(Stream:TMemoryStream);
procedure Finalize;
procedure Play(Loop : Boolean);
procedure Stop;
procedure Reset;
 
property Position : Integer read GetPosition;
property Playing : Boolean read FPlaying;
published
{ Published declarations }
property Filename : TFilename read FFilename write SetFilename;
property DXSound : TDXSound read FDXSound write FDXSound;
property Looping : Boolean read FLoop write SetLoop default False;
property Options : TModOptions read FOptions write SetOptions;
property OnStart : TNotifyEvent read FOnStart write FOnStart;
property OnStop : TNotifyEvent read FOnStop write FOnStop;
end;
 
implementation
 
// If you are having problems compiling the package edit this file.
// Comment out this include Statement. You should only need to do this
// if you are NOT using the latest version of DelphiX (991024)
// Comment this Define out if you are using DelphiX992404 or earlier
{$DEFINE VERSION991024}
 
const
EVENTCOUNT:Integer = 2;
 
type
{Music Event Callback thread}
TSXEventThread = class(TThread)
private
FEventCallback:TThreadMethod;
public
procedure Execute; override;
property EventCallback : TThreadMethod read FEventCallback write FEventCallback;
 
end;
 
 
var
 
EventThread : TSXEventThread;
CurrentEvent : Integer;
 
{ TSXEventThread }
 
procedure TSXEventThread.Execute;
begin
if not Assigned(EventCallback) then Terminate;
while not Terminated do
begin
EventCallback;
end;
end;
 
{ TSXModPlayer }
 
constructor TSXModPlayer.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
if MppSdkLibLoaded then
ModMixer.SetMixerOptions(0);
Events := CreateEventList;
Notify := CreateNotifyList;
end;
destructor TSXModPlayer.Destroy;
begin
Finalize;
{}
Notify.Free;
Events.Free;
inherited Destroy;
end;
procedure TSXModPlayer.Initialize(Stream:TMemoryStream);
var Data:Pointer;
Size:Integer;
FreeStream:Boolean;
begin
try
if MppSdkLibLoaded then
begin
if SoundBuffer = nil then InitSoundEvents;
FreeStream := False;
if Stream = nil then
begin
Stream := TMemoryStream.Create;
Stream.LoadFromFile(Filename);
FreeStream := True;
end;
Data := Stream.Memory;
Size := Stream.Size;
ModMixer.FreeSong;
ModMixer.LoadSong(Data,Size);
if FreeStream then Stream.Free;
end;
except
end;
end;
procedure TSXModPlayer.Finalize;
begin
Stop;
if Assigned(EventThread) then
begin
EventThread.Terminate;
EventThread.Free;
EventThread := nil;
end;
ClearSoundNotify;
if Assigned(SoundBuffer) then
begin
try
if Playing and (SoundBuffer.IDSBuffer <> nil) then
SoundBuffer.IBuffer.Stop;
finally
SoundBuffer := nil;
end;
end;
end;
 
procedure TSXModPlayer.InitSoundEvents;
// DelphiX Version 991024 Edit Version.inc to change declarations
{$IFDEF VERSION991024}
var SizeWritten: Cardinal;
{$ELSE}
// DelphiX Version 992404 and earlier
var SizeWritten : Integer;
{$ENDIF}
begin
if MppSdkLibLoaded and Assigned(DXSound) then
begin
DXSound.Primary.IBuffer.GetFormat(@FWaveFormat,Sizeof(WaveFormat),@SizeWritten);
ModMixer.SetWaveFormat(WaveFormat.nSamplesPerSec,WaveFormat.nChannels,WaveFormat.wBitsPerSample);
SoundBuffer := CreateSoundBuffer;
SoundNotify := CreateSoundNotify;
if (SoundBuffer <> nil) and (SoundNotify <> nil) then
CreateEventThread;
end;
end;
procedure TSXModPlayer.ThreadCallback;
var Msg : TMsg;
 
procedure ReadData(Event:Integer);
var W1:pointer;
// DelphiX Version 991024 Edit Version.inc to change declarations
{$IFDEF VERSION991024}
S1, S2 : Cardinal;
{$ELSE}
// DelphiX Version 992404 and earlier
S1,S2:Integer;
{$ENDIF}
NumWrite:Longint;
Pos:Integer;
Written1:Integer;
begin
if Event = 0 then
Pos := TDSBPositionNotify(Notify[EVENTCOUNT -1]^).dwOffset
else
Pos := TDSBPositionNotify(Notify[Event-1]^).dwOffset;
NumWrite := TDSBPositionNotify(Notify[Event]^).dwOffset - Pos;
if (NumWrite < 0) then
inc(NumWrite,BufferDesc.dwBufferBytes);
if SoundBuffer.IBuffer.Lock(Pos,NumWrite,w1,{$IFDEF UNICODE}@{$ENDIF}s1,Pointer(nil^),{$IFDEF UNICODE}@{$ENDIF}s2,0) = 0 then
begin
Written1 := ModMixer.Render(W1,S1);
SoundBuffer.IBuffer.Unlock(w1,Written1, nil,0);
if (Written1 = 0) then
Stop;
end;
end;
 
begin
CurrentEvent := MsgWaitForMultipleObjects(EVENTCOUNT,Events.List{$IFNDEF UNICODE}^{$ENDIF}[0], False, INFINITE, QS_ALLINPUT);
dec(CurrentEvent,WAIT_OBJECT_0);
if CurrentEvent >= EVENTCOUNT then
begin
while (PeekMessage(Msg, 0, 0,0, PM_REMOVE)) do
begin
if Msg.Message = WM_QUIT then
Stop
else
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
end
else
begin
ReadData(CurrentEvent);
end;
end;
function TSXModPlayer.CreateEventList : TList;
begin
Result := TList.Create;
Result.Capacity := EVENTCOUNT;
end;
function TSXModPlayer.CreateNotifyList : TList;
begin
Result := TList.Create;
Result.Capacity := EVENTCOUNT;
end;
function TSXModPlayer.CreateSoundBuffer : TDirectSoundBuffer;
{$IFDEF UNICODE}
const DSBCAPS_CTRLDEFAULT = DSBCAPS_CTRLPAN or DSBCAPS_CTRLVOLUME or DSBCAPS_CTRLFREQUENCY;
{$ENDIF}
begin
Result := TDirectSoundBuffer.Create(DXSound.DSound);
ZeroMemory(@BufferDesc,Sizeof(TDSBufferDesc));
FBufferDesc.dwSize := Sizeof(TDSBufferDesc);
FBufferDesc.dwFlags := DSBCAPS_CTRLDEFAULT or DSBCAPS_STATIC or
DSBCAPS_GETCURRENTPOSITION2 or DSBCAPS_CTRLPOSITIONNOTIFY;
FBufferDesc.dwBufferBytes := WaveFormat.nAvgBytesPerSec * 2;
FBufferDesc.lpwfxFormat := @WaveFormat;
Result.CreateBuffer(BufferDesc);
end;
function TSXModPlayer.CreateSoundNotify : IDirectSoundNotify;
type TNotifyArray = Array[0..99] of TDSBPositionNotify;
var PDSNotify : PDSBPositionNotify;
index : Integer; Offset: Integer;
PNotify: ^TNotifyArray;
begin
Result := nil;
if SoundBuffer.IBuffer.QueryInterface(IID_IDirectSoundNotify,Result) = 0 then
begin
{setup notifications here}
Offset := 0;
GetMem(PNotify,EVENTCOUNT * Sizeof(TDSBPositionNotify));
for Index := 1 to EVENTCOUNT do
begin
New(PDSNotify);
PDSNotify^.dwOffset := OffSet;
PDSNotify^.hEventNotify := CreateEvent(nil,False,False,nil);
Notify.Add(PDSNotify);
Events.Add(Pointer(PDSNotify^.hEventNotify));
PNotify[Index-1] := PDSNotify^;
inc(Offset,WaveFormat.nAvgBytesPerSec div EVENTCOUNT);
end;
 
if Result.SetNotificationPositions(EVENTCOUNT,{$IFDEF UNICODE}@{$ENDIF}PNotify[0]) <> 0 then
ShowMessage('Notification Falied');
FreeMem(PNotify,EVENTCOUNT * Sizeof(TDSBPositionNotify));
end;
end;
procedure TSXModPlayer.ClearSoundNotify;
var PDSNotify : PDSBPositionNotify;
Index : Integer;
begin
for Index := Notify.Count -1 downto 0 do
begin
PDSNotify := Notify[Index];
Notify.Delete(Index);
Events.Delete(Index);
CloseHandle(PDSNotify^.hEventNotify);
end;
SoundNotify := nil;
end;
procedure TSXModPlayer.CreateEventThread;
begin
if not Assigned(EventThread) then
begin
EventThread := TSXEventThread.Create(True);
EventThread.Priority := tpNormal;
EventThread.EventCallback := ThreadCallback;
end;
end;
 
procedure TSXModPlayer.ClearSoundBuffer;
var w1,w2:pointer;
// DelphiX Version 991024 Edit Version.inc to change declarations
{$IFDEF VERSION991024}
S1, S2 : Cardinal;
{$ELSE}
// DelphiX Version 992404 and earlier
S1,S2:Integer;
{$ENDIF}
Data:Word;
begin
Data := GetSilenceData;
if SoundBuffer.IBuffer.Lock(0,0,w1,{$IFDEF UNICODE}@{$ENDIF}s1,w2,{$IFDEF UNICODE}@{$ENDIF}s2,DSBLOCK_ENTIREBUFFER) = 0 then
begin
FillMemory(W1,S1,Data);
if W2 <> nil then
FillMemory(W2,S2,Data);
SoundBuffer.IBuffer.Unlock(W1,S1,W2,S2);
end;
end;
procedure TSXModPlayer.StartThread;
begin
if Assigned(EventThread) then EventThread.Resume;
end;
procedure TSXModPlayer.StopThread;
begin
if Assigned(EventThread) then EventThread.Suspend;
end;
{}
procedure TSXModPlayer.Play(Loop : Boolean);
begin
if MppSdkLibLoaded then
begin
if Assigned(SoundBuffer) and Assigned(EventThread) then
begin
SetLoop(Loop);
ClearSoundBuffer;
StartThread;
FPlaying := True;
DoStart;
SoundBuffer.IBuffer.Play(0,0,DSBPLAY_LOOPING);
end;
end;
end;
procedure TSXModPlayer.Stop;
begin
if MppSdkLibLoaded then
begin
if Assigned(SoundBuffer) and Assigned(EventThread) then
begin
try
if Playing and (SoundBuffer.IDSBuffer <> nil) then
begin
FPlaying := False;
SoundBuffer.IBuffer.Stop;
DoStop;
end;
finally
StopThread;
end;
end;
end;
end;
procedure TSXModPlayer.Reset;
begin
if MppSdkLibLoaded then
ModMixer.SetCurrentOrder(0);
end;
{Property Accessors}
function TSXModPlayer.GetPosition : Integer;
begin
Result := 0;
end;
procedure TSXModPlayer.SetFilename(const Value : TFilename);
begin
if FFilename <> Value then
begin
FFilename := Value;
end;
end;
procedure TSXModPlayer.SetLoop( const Value : Boolean);
var Flags : DWord;
begin
if FLoop <> Value then
begin
FLoop := Value;
if MppSdkLibLoaded then
begin
Flags := ModMixer.GetMixerOptions;
case Value of
True:Flags := Flags or MPPMIX_LOOP;
False:Flags := Flags and (not MPPMIX_LOOP);
end;
ModMixer.SetMixerOptions(Flags);
end;
end;
end;
procedure TSXModPlayer.SetOptions( const Value : TModOptions );
const OptionArray: array[Boolean,TModOption] of Integer = (
(0,0,0,0,0,0,0),
(MPPMIX_NORESAMPLING, MPPMIX_BASSEXPANSION, MPPMIX_SURROUND,
MPPMIX_REVERB, MPPMIX_HIGHQUALITY, MPPMIX_GAINCONTROL,
MPPMIX_NOISEREDUCTION)
);
var Flags : DWord;
begin
if FOptions <> Value then
begin
FOptions := Value;
if MppSdkLibLoaded then
begin
Flags := 0;
Flags := Flags or OptionArray[NoResampling in Value,NoResampling];
Flags := Flags or OptionArray[BassExpansion in Value,BassExpansion];
Flags := Flags or OptionArray[Surround in Value,Surround];
Flags := Flags or OptionArray[Reverb in Value,Reverb];
Flags := Flags or OptionArray[HighQuality in Value,HighQuality];
Flags := Flags or OptionArray[GainControl in Value,GainControl];
Flags := Flags or OptionArray[NoiseReduction in Value,NoiseReduction];
ModMixer.SetMixerOptions(Flags);
SetLoop(Looping);
end;
end;
end;
procedure TSXModPlayer.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited Notification( AComponent, Operation);
 
if (Operation = opRemove) and (AComponent = DXSound) then
DXSound := nil;
end;
procedure TSXModPlayer.DoStop;
begin
if Assigned(FOnStop) then
FOnStop(Self);
end;
procedure TSXModPlayer.DoStart;
begin
if Assigned(FOnStart) then
FOnStart(Self);
end;
function TSXModPlayer.GetSilenceData:integer;
const SilenceData:array[1..2] of integer = ($80,$0);
begin
Result := SilenceData[WaveFormat.wBitsPerSample div 8];
end;
 
end.
/VCL_DELPHIX_D6/SXMedia/SXMovie.pas
0,0 → 1,460
{
SXMedia Components - Beta 1
--------------------------------
Copyright 1999 Dean Ellis
http://www.sillex.freeserve.co.uk
 
This unit is part of the SXMedia Component Set. This code is
supplied as is with no guarantees and must be used at your own
risk.
 
No modifications to this code must be made without the express
permission of the author. Please report any problems to
support@sillex.freeserve.co.uk
 
You may use these components to create any freeware/shareware
applications that you wish. If the components are to be used in
a commercail product then credit for developement of these components
should be given.
 
Credits :
 
Developer : Dean Ellis
Testers : Dominique Louis
Ivan Blecic
}
unit SXMovie;
 
{$INCLUDE DelphiXcfg.inc}
 
interface
 
uses
Windows, Classes, SysUtils, ActiveX, Math, Dialogs,
DXSounds, DXDraws,
{$IFDEF StandardDX}
DirectDraw, DirectSound, DirectShow9,
{$IFDEF DX7}
{$IFDEF D3DRM}
Direct3DRM,
{$ENDIF}
Direct3D;
{$ENDIF}
{$IFDEF DX9}
Direct3D9, Direct3D, D3DX9, {Direct3D8,} DX7toDX8;
{$ENDIF}
{$ELSE}
DShow, DirectX;
{$ENDIF}
 
type
TMovieOptions = (VideoAndSound, VideoOnly);
TDisplay = (FullScreen, WideScreen, OriginalSize);
 
TScreenRect = class(TPersistent)
private
FLeft: integer;
FRight: integer;
FTop: integer;
FBottom: integer;
procedure SetLeft(Value: integer);
procedure SetRight(Value: integer);
procedure SetTop(Value: integer);
procedure SetBottom(Value: integer);
protected
public
procedure Assign(Value: TScreenRect);
published
property Left: integer read FLeft write SetLeft;
property Right: integer read FRight write SetRight;
property Top: integer read FTop write SetTop;
property Bottom: integer read FBottom write SetBottom;
end;
 
 
TSXMovie = class;
 
TMovieThread = class(TThread)
private
{ Private declarations }
FSXMovie: TSXMovie;
protected
procedure Execute; override;
public
property SXMovie: TSXMovie read FSXMovie write FSXMovie;
end;
 
TSXMovie = class(TComponent)
private
FMovieThread: TMovieThread;
FDXDraw: TDXDraw;
FDXSound: TDXSound;
FMMStream: IMultiMediaStream;
FPrimaryVidStream: IMediaStream;
FDDStream: IDirectDrawMediaStream;
FSample: IDirectDrawStreamSample;
FSurface: IDirectDrawSurface;
FDXSurface: TDirectDrawSurface;
FRect: TRect;
FDestRect: TRect;
FScreenRect: TScreenRect;
FFilename: TFilename;
FPlaying: Boolean;
FDoFlip: Boolean;
{Event}
FOnMovieEnd: TNotifyEvent;
FOnBeforeRender: TNotifyEvent;
FOnAfterRender: TNotifyEvent;
procedure SetFilename(Value: TFilename);
procedure SetScreenRect(Value: TScreenRect);
procedure DoMovieEnd;
procedure DoBeforeRender;
procedure DoAfterRender;
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure SetMovieStateRun;
procedure SetMovieStateStop;
procedure CreateMediaStream; virtual;
procedure SetupMediaSample; virtual;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure UpDate; virtual;
// function SetDisplay(Value:TDisplay):Boolean;
procedure DisplayRect(Top, Left, Right, Bottom: integer);
procedure Play;
procedure Stop;
{}
published
property DXDraw: TDXDraw read FDXDraw write FDXDraw;
property DXSound: TDXSound read FDXSound write FDXSound;
property Filename: TFilename read FFilename write SetFilename;
property Playing: Boolean read FPlaying;
property DoFlip: Boolean read FDoFlip write FDoFlip;
property DestinationRectangle: TScreenRect read FScreenRect write SetScreenRect;
property OnMovieEnd: TNotifyEvent read FOnMovieEnd write FOnMovieEnd;
property OnBeforeRender: TNotifyEvent read FOnBeforeRender write FOnBeforeRender;
property OnAfterRender: TNotifyEvent read FOnAfterRender write FOnAfterRender;
end;
 
implementation
 
uses Graphics;
 
procedure TScreenRect.SetLeft(Value: integer);
begin
FLeft := Value;
end;
 
procedure TScreenRect.SetRight(Value: integer);
begin
FRight := Value;
end;
 
procedure TScreenRect.SetTop(Value: integer);
begin
FTop := Value;
end;
 
procedure TScreenRect.SetBottom(Value: integer);
begin
FBottom := Value;
end;
 
procedure TScreenRect.Assign(Value: TScreenRect);
begin
Left := Value.Left;
Right := Value.Right;
Top := Value.Top;
Bottom := Value.Bottom;
end;
 
{ Important: Methods and properties of objects in VCL can only be used in a
method called using Synchronize, for example,
 
Synchronize(UpdateCaption);
 
and UpdateCaption could look like,
 
procedure TMovieThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
 
{ TMovieThread }
 
procedure TMovieThread.Execute;
begin
{ Place thread code here }
if Assigned(SXMovie) then
SXMovie.SetMovieStateRun;
while (not Terminated) and Assigned(SXMovie) do
begin
Synchronize(SXMovie.UpDate)
end;
if Assigned(SXMovie) then
SXMovie.SetMovieStateStop;
end;
 
{SXMovie}
 
procedure TSXMovie.SetFilename(Value: TFilename);
begin
if Value <> '' then
FFilename := Value;
end;
 
procedure TSXMovie.SetScreenRect(Value: TScreenRect);
begin
FScreenRect.Assign(Value);
end;
 
procedure TSXMovie.DoMovieEnd;
begin
if Assigned(FOnMovieEnd) then FOnMovieEnd(Self);
end;
 
procedure TSXMovie.DoBeforeRender;
begin
if Assigned(FOnBeforeRender) then FOnBeforeRender(Self);
end;
 
procedure TSXMovie.DoAfterRender;
begin
if Assigned(FOnAfterRender) then FOnAfterRender(Self);
end;
 
procedure TSXMovie.Notification(AComponent: TComponent; Operation: TOperation);
begin
if Operation = opRemove then
begin
if AComponent is TDXDraw then FDXDraw := nil;
if AComponent is TDXSound then FDXSound := nil;
end;
inherited;
end;
 
procedure TSXMovie.SetMovieStateRun;
begin
try
if FMMStream.SetState(STREAMSTATE_RUN) <> S_OK then
Exception.Create('Set Movie State Run Exception');
except
end;
end;
 
procedure TSXMovie.SetMovieStateStop;
begin
try
FMMStream.SetState(STREAMSTATE_STOP);
finally
FPlaying := False;
end;
end;
 
procedure TSXMovie.CreateMediaStream;
var
wPath:{$IFDEF UNICODE}array of Char{$ELSE}array[0..MAX_PATH] of WChar{$ELSE}{$ENDIF};
AMStream:IAMMultiMediaStream;
Media:IMediaStream;
begin
Media := nil;
AMStream := nil;
try
CoCreateinstance(CLSID_AMMULTIMEDIASTREAM,nil,CLSCTX_INPROC_SERVER,IID_IAMMULTIMEDIASTREAM,AMStream);
{$IFDEF UNICODE}
SetLength(wPath, Length(Filename) + 1);
StrPCopy(@wPath, Filename);
{$ELSE}
MultiByteToWideChar(CP_ACP,0,PAnsiChar(Filename),-1,wPath,Sizeof(wPAth) div sizeof(wPath[0]));
{$ENDIF}
AMStream.Initialize(STREAMTYPE_READ,AMMSF_NOGRAPHTHREAD,nil);
if (DXSound <> nil) and (DXSound.DSound <> nil) and (DXSound.DSound.ISound <> nil) then
AMStream.AddMediaStream(DXSound.DSound.ISound,{$IFDEF UNICODE}@{$ENDIF}MSPID_PrimaryAudio,AMMSF_ADDDEFAULTRENDERER,IMediaStream(nil^));
AMStream.AddMediaStream(DXDraw.DDraw.IDraw,{$IFDEF UNICODE}@{$ENDIF}MSPID_PrimaryVideo,0,Media);
AMStream.OpenFile({$IFDEF UNICODE}@{$ENDIF}wPAth,0);
FMMStream := AMStream;
except
FMMStream := nil;
end;
end;
 
procedure TSXMovie.SetupMediaSample;
begin
try
FSample := nil;
FDDStream := nil;
FPrimaryVidStream := nil;
if FMMStream.GetMediaStream(MSPID_PrimaryVideo, FPrimaryVidStream) <> S_OK then Exit;
if FPrimaryVidStream.QueryInterface(IID_IDirectDrawMediaStream, FDDStream) <> S_OK then Exit;
if FDDStream.CreateSample(nil, PRect(nil)^, 0, FSample) <> S_OK then Exit;
FDXSurface := TDirectDrawSurface.Create(FDXDraw.DDraw);
if FSample.GetSurface(FSurface, FRect) <> S_OK then Exit;
FDXSurface.IDDSurface := FSurface;
except
 
end;
end;
 
procedure TSXMovie.UpDate;
function AspectRatio(SourceRect: TRect; var DestRect: TRect): Boolean;
var
SourceWidth, SourceHeight, DestWidth, DestHeight: Integer;
SourceRatio, DestRatio: Double;
begin
Result := False;
SourceWidth := SourceRect.Right - SourceRect.Left;
SourceHeight := SourceRect.Bottom - SourceRect.Top;
SourceRatio := SourceWidth/SourceHeight;
 
DestWidth := DestRect.Right - DestRect.Left;
DestHeight := DestRect.Bottom - DestRect.Top;
DestRatio := DestWidth/DestHeight;
if SourceRatio <> DestRatio then
begin
if DestWidth > DestHeight then
DestRect.Bottom := DestRect.Top + Round(DestWidth / SourceRatio)
else
DestRect.Right := DestRect.Left + Round(SourceRatio * DestHeight);
Result := True;
end;
end;
var
R: TRect;
Q: HResult;
begin
try
Q := FSample.Update(0, 0, nil, 0);
case Q of
HResult(MS_S_PENDING):;
HResult(MS_S_NOUPDATE):;
HResult(MS_S_ENDOFSTREAM):;
end;
if Q <> S_OK then
begin
FMovieThread.Terminate;
SetMovieStateStop;
FPlaying := False;
DoMovieEnd;
Exit;
end;
if (FSurface <> nil) and DXDraw.CanDraw then
begin
DoBeforeRender;
R := FDestRect;
if AspectRatio(FRect, R) then
FDestRect := R;
DXDraw.Surface.StretchDraw(FDestRect, FRect, FDXSurface, False);
with DXDraw.Surface.Canvas do
begin
Brush.Style := bsClear;
Font.Color := clWhite;
Font.Size := 8;
Textout(5, 5, 'SilleX Media - Beta 1');
Release;
end;
DoAfterRender;
if DoFlip then
DXDraw.Flip;
end;
except
on E: Exception do
ShowMessage(E.Message);
end;
end;
 
procedure TSXMovie.DisplayRect(Top, Left, Right, Bottom: integer);
begin
if not (csDesigning in ComponentState) then
begin
FScreenRect.Top := Top;
FSCreenRect.Left := Left;
FScreenRect.Right := Right;
FScreenRect.Bottom := Bottom;
end;
end;
 
procedure TSXMovie.Play;
begin
if not (csDesigning in ComponentState) then
begin
FDestRect.Left := FScreenRect.Left;
FDestRect.Right := FScreenRect.Right;
FDestRect.Top := FScreenRect.Top;
FDestRect.Bottom := FScreenRect.Bottom;
FPlaying := True;
CreateMediaStream;
SetupMediaSample;
if FSample <> nil then
begin
FMovieThread := TMovieThread.Create(True);
if Assigned(FMovieThread) then
begin
FMovieThread.FreeOnTerminate := False;
FMovieThread.SXMovie := Self;
FMovieThread.Resume;
end;
end;
end;
end;
 
procedure TSXMovie.Stop;
begin
if not (csDesigning in ComponentState) then
begin
FPlaying := False;
if Assigned(FMovieThread) then
begin
if not FMovieThread.Terminated then
begin
FMovieThread.Terminate;
DoMovieEnd;
end;
FMovieThread.Free;
FMovieThread := nil;
end;
if FDXSurface <> nil then
begin
FDXSurface.Free;
FSurface := nil;
end;
end;
end;
 
constructor TSXMovie.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FScreenRect := TScreenRect.Create;
CoInitialize(nil);
end;
 
destructor TSXMovie.Destroy;
begin
if not (csDesigning in ComponentState) then
begin
FPlaying := False;
if Assigned(FMovieThread) then
begin
if not FMovieThread.Terminated then
FMovieThread.Terminate;
FMovieThread.Free;
FMovieThread := nil;
end;
if Assigned(FSample) then
FSample := nil;
if Assigned(FDDStream) then
FDDStream := nil;
if Assigned(FPrimaryVidStream) then
FPrimaryVidStream := nil;
if Assigned(FMMStream) then
FMMStream := nil;
if Assigned(FSurface) then
FSurface := nil;
end;
FScreenRect.Free;
CoUnInitialize;
inherited;
end;
 
end.
 
/VCL_DELPHIX_D6/SXMedia/SXReg.dcr
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/SXMedia/SXReg.pas
0,0 → 1,53
{
SXMedia Components - Beta 1
--------------------------------
Copyright 1999 Dean Ellis
http://www.sillex.freeserve.co.uk
 
This unit is part of the SXMedia Component Set. This code is
supplied as is with no guarantees and must be used at your own
risk.
 
No modifications to this code must be made without the express
permission of the author. Please report any problems to
support@sillex.freeserve.co.uk
 
You may use these components to create any freeware/shareware
applications that you wish. If the components are to be used in
a commercail product then credit for developement of these components
should be given.
 
Credits :
 
Developer : Dean Ellis
Testers : Dominique Louis
Ivan Blecic
 
}
unit SXReg;
 
{$INCLUDE DelphiXcfg.inc}
 
interface
 
uses Windows, Classes, SysUtils, SXEditor, SXMovie, SXEngine, SXModPlayer,
{$IfNDef VER6UP} DsgnIntf {$Else} Designintf, DesignEditors {$EndIf};
 
procedure Register;
 
implementation
 
{$R SXReg.dcr}
 
 
procedure Register;
begin
RegisterPropertyEditor(TypeInfo(TFilename), nil, 'Filename', TFilenameProperty);
RegisterComponentEditor(TSXMovie,TSXComponentEditor);
RegisterComponentEditor(TSXEngine,TSXComponentEditor);
RegisterComponentEditor(TSXModPlayer,TSXComponentEditor);
RegisterComponents('SX Media',[TSXMovie, TSXEngine, TSXModPlayer]);
RegisterClass(TScreenRect);
end;
 
end.
/VCL_DELPHIX_D6/SXMedia/SxSample/MPPSDK.DLL
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/SXMedia/SxSample/SXMedia.dpr
0,0 → 1,14
program SXMedia;
 
uses
Forms,
main in 'main.pas' {FrmMain};
 
{$R *.RES}
 
begin
Application.Initialize;
Application.Title := 'SXMedia - Example Project';
Application.CreateForm(TFrmMain, FrmMain);
Application.Run;
end.
/VCL_DELPHIX_D6/SXMedia/SxSample/SXMedia.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/SXMedia/SxSample/main.dfm
0,0 → 1,765
object FrmMain: TFrmMain
Left = 97
Top = 154
BorderStyle = bsToolWindow
Caption = 'SX Media - Example Project'
ClientHeight = 329
ClientWidth = 536
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
Menu = MainMenu1
OldCreateOrder = True
OnKeyDown = DXDraw1KeyDown
PixelsPerInch = 96
TextHeight = 13
object DXDraw1: TDXDraw
Left = 0
Top = 0
Width = 536
Height = 329
AutoInitialize = True
AutoSize = True
Color = clBtnFace
Display.BitCount = 16
Display.FixedBitCount = True
Display.FixedRatio = True
Display.FixedSize = False
Options = [doAllowReboot, doWaitVBlank, doCenter, doDirectX7Mode, doHardware, doSelectDriver]
SurfaceHeight = 329
SurfaceWidth = 536
Align = alClient
TabOrder = 0
end
object MainMenu1: TMainMenu
Left = 398
Top = 9
object FileMnu: TMenuItem
Caption = '&File'
object Exit1: TMenuItem
Caption = 'E&xit'
OnClick = Exit1Click
end
end
object SXShowMnu: TMenuItem
Caption = 'SXShow'
object OpenFileItem: TMenuItem
Caption = '&Open File'
OnClick = OpenFileItemClick
end
object PlayItem: TMenuItem
Caption = '&Play'
OnClick = PlayItemClick
end
object StopItm: TMenuItem
Caption = '&Stop'
OnClick = PlayItemClick
end
end
object SXEngineMnu: TMenuItem
Caption = 'SXEngine'
object StartItem: TMenuItem
Caption = 'St&art'
OnClick = StartItemClick
end
object StopItem: TMenuItem
Caption = 'St&op'
OnClick = StopItemClick
end
end
object SXModPlayerMnu: TMenuItem
Caption = 'SXModPlayer'
object OpenFile1: TMenuItem
Caption = 'O&pen File'
OnClick = OpenFile1Click
end
object Start1: TMenuItem
Caption = '&Start'
OnClick = Start1Click
end
object Stop1: TMenuItem
Caption = '&Stop'
OnClick = Stop1Click
end
end
end
object OpenDlg: TOpenDialog
Options = [ofHideReadOnly, ofPathMustExist, ofFileMustExist, ofNoLongNames]
Title = 'SXMedia Open'
Left = 364
Top = 8
end
object SXModPlayer: TSXModPlayer
DXSound = DXSound1
Options = [BassExpansion, Surround, Reverb, HighQuality, GainControl, NoiseReduction]
Left = 470
Top = 8
end
object SXEngine: TSXEngine
ThreadPriority = tpIdle
OnRender = SXEngineRender
Left = 438
Top = 10
end
object SXMovie: TSXMovie
DXDraw = DXDraw1
DXSound = DXSound1
DoFlip = True
DestinationRectangle.Left = 0
DestinationRectangle.Right = 200
DestinationRectangle.Top = 0
DestinationRectangle.Bottom = 200
Left = 470
Top = 48
end
object DXSound1: TDXSound
AutoInitialize = True
Options = [soExclusive]
Left = 330
Top = 12
end
object DXImageList1: TDXImageList
DXDraw = DXDraw1
Items = <
item
Name = 'logo_n.bmp'
PatternHeight = 0
PatternWidth = 0
Picture.Data = {
07544269746D61700A520000424D0A520000000000003608000028000000D200
00002D0000000100100003000000D44900000000000000000000000100000000
0000007C0000E00300001F000000000000000000800000800000008080008000
00008000800080800000C0C0C000C0DCC000F0CAA60018081000080000000800
0800080808001000080010080800100010001008100010101000180010001808
10001808180025001800210818001810100022091D0025102100181818002118
1800310427003110290039102D00211821002918210031182900262326003118
310039183100352632004A143B006B0B520066255600493A4600653358006E32
61006F4364008B176E00892E71008E3375009C3184007E4171008E4279009C39
840094468400A5007B00A5107E00A5398400A5398C00A0467F00A0468400A04A
8800AD007F00AD108400A5428C00A54A9000C1009000B9229400D6009C00F534
9500565256005A5A5A00635A5E006363630075566D008452730088567B00A563
6B00A55A7300AD637300A5527B008C5A7B0094568400A1568800A0639400AD5A
8400AD4A8C00AD528C00AD5A8C00AD4A9400AD529400AD5A9400AD529C00AD5A
9C00E75A7300E75A7B00EF527B00EF5A7B00EF4A8400EC4F89009E7A6100B591
5C00B8C232007B71790087878700AF688A00B47B7E00CDAF4000C7CE2F00C0CA
4500CE906000CB898000C0B65B00C4AB7600BDF70000C1F30400C6EF0800BDF7
0800C6F70800BDFF0000BDFF0800C6FF0000C0E41000C1DE1800BDF31000CED6
2100C0E91800BDE22100C4E12D00D600A500D608A500DE00A500DE08A500E700
A500DE00AD00EB00AD00EF00B500F700B500F708B500F700BD00FF00B500FF08
B500FF00BD00FF00C600E221B100F721A500F714B900FF10B100FB10BD00FF08
C600FC18C300EC29AF00EF2DB500E241B700F92DC700FF39CE00E246BD00FF46
D200A57B9C00AD639C00AD6B9C00AD739C00B55A9C00B5639C00B56B9C00B563
A500B56BA500B573A500BD7B9C00BD5AA500BD6BA500BD73A500BD6BAD00D673
9C00C66BAD00BD73AD00BD7BAD00C67BAD00D65AB500D663B500CE6BB500CE73
B500D66BB500D65ABD00DE52BD00EF52C600FF5AD600FF67DA009C8C9C009C94
9C00AD8CA900AD94AD009C9C9C00A59C9C00AD9CA500AD9CAD00B594AD00B59C
AD00BD849C00C6849C00C68C9C00C6949C00C68CA500C694A500C684AD00C68C
AD00C67BB500C684B500CE7BA500CE7BB500CE84BD00D68CC600E794CE00FF7B
DE00FF84DE00FF84E700FF8CE700FF94E700B4B0B200C8B7C100D3CCD000E6B9
D600DED6DE00E7D6E700EFD6E700FF9CE700FFA5EF00F7ADE700FFADEF00FFBD
EF00F7CEEF00FFCEF700DEDEDE00E7DEE700E7E7E700EFDEE700FFD6F700EFDE
EF00EFE7EF00FBDEF300FFE7FF00EFEFEF00F7EFF700FFEFFF00F7F7F700FFF7
FF00FFFFFF00F0FBFF00A4A0A000808080000000FF0000FF000000FFFF00FF00
0000FF00FF00FFFF0000FFFFFF00FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FDE7BBD779C739C733967F75EB656734E1042EF3DEF3D
AE398B2DAE398B2D8B2D8B2DE820E82084108410420800000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000002104420884108614E8204A298B2DAE391042B656B656
F75EB656F75E734E744EF75E3967BD777B6F9C739C73BD77DE7BFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FDE7BBD77BD779C739C735B6F9C73F75EB656B6561042AE398B2D4A29
4208E82042088410841000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000042088614E8206A298B2DEF3D744E734EB656F75E39677B6F9C73BD77
BD77DE7BFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
DE7BDE7B9C739C737B6F7B6FF75EB656744E10428B2DE820E82042088614430C
240C440C0000240C25100208010002080208030845108614E820E820CC280D31
0D314E3550355035503950397139503950397139503971395039713950395039
7139503971395039713971395039713950397139713971395039713950397139
5039713950397139503971395039503950395039503971395039503971395039
5039503971395039713950397139503950395039503971395039503950395039
7139503950397139503971395039713950397139503971397139713971397139
5039713950397139503971397139503971395039713950395039713950395039
71395039503950354E350D310D31CC28E820E82086144514240C020400000000
00000000000000000000010002044208430C210484108410E8204A298B2D1042
F75EB656F75E39679C73BD77DE7BDE7BFF7FDE7BFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
DE7BDE7BBD773967F75EB656734EAE394A298410430C430C02080208030C0208
030C481848188C285034EF3411393445754DB751185A185A185A185A185A185A
185A185A185A185A185A185A185A185A185A185A185A185A185A185AF859185A
185A185A185AF755185AF859185AF755F859185AF755F859F755F859F755F859
F855F755F859F755F855F755F859F755F855F755F855F755F855F755F755F855
F755F755F855F755F755F755F755F755F755F855F755F755F855F755F855F755
F855F755F855F755F855F755F859F755F855F859F755F859F855F859F755F859
F859F755185AF859185AF755185A185AF755185A185A185A185AF859185A185A
185A185A185A185A185A185A185A185A185A185A185A185A185A185A185AF859
F859B855764D1445B34050342C24481805100104000000000000000000000000
00002104430CE8206A291042734EF75E39677B6FBD77BD77DE7BDE7BFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FDE7B
DE7BFF7F7B6FF75EF75EEF3D6B2DE820430C240C0204030C040805102C245034
153C7B54FB587A59B959F859185A185A185A185A185A185A185A185A185A185A
185A185A185A185A185A185A185A185A185AF859185AF755185AF859F859F755
185AF755F859F755F859F755F855F755F855F755F855F755F755F755F855F755
F755F755F755F755D755F755F755D755F755D755F755D755F755D755D755F755
D755D755F755D755D755F755D755D755F755D755D755F755D755F755D755D755
F755D755D755F755D755F755D755F755D755F755F755D755F755F755F755F755
F755F755F755F755F855F755F855F755F859F755F859F855F859F755F859185A
F859185AF755185A185A185AF755185A185A185A185A185A185A185A185A185A
185A185A185A185A185A185A185A185A185AF8597A59FB587B54354014382C24
4818010400000000000000000000420800008614AE39734EB65639673967BD77
BD77DE7BDE7BFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FDE7B
FF7F7B6F3967F75E1042E8204208430C240C020405104818143817441E58BD58
FB58B959F859185A185A185A185A185A185A185A185A185A185A185A185A185A
F859185A185A185AF859185AF755185AF859F755F859185AF755F859F755F855
F755F859F755F755F755F855F755F755D755F755D755F755D755F755D755D755
D755D755D755D755D755D751D755D755D755D755D755D751D755D755D755D751
D755D755D755D651D755D755D751D755D755D751D755D755D751D755D755D755
D651D755D755D755D755D755D755D755D755D755D755D751D755D755D755D755
D755D755D755D755D755F755D755F755D755F755D755F755F755F755F755F755
F855F755F855F755F859F755F859F855F859185AF859185AF755185A185A185A
F859185A185A185A185A185A185A185A185A185A185A185A185A185A185A185A
D9597A59BD585E581A50153C2C24261400000000020400000000210486148B2D
1042F75E39677B6FBD77DE7BFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FDE7BDE7B
BD779C733967734E4A2900000000000002042C2414381B501F5C5E58FB587A59
185A185A185A185A185A185A185A185A185A185A185A185A185A185A185A185A
185AF859185AF859F859F755F859F755F859F755F755F855F755F755D755F755
D755F755D755D755F755D755D755D755D755D755D755D755D755D755D755D751
D755D755D651D755B651D751B651B755D755B651B755B751B651B755B651B755
B651B755B651B751B651B755B651B751B651B751B751B651B751B751B651B751
B651B751B751B651D751B751D651B751B751D751B751D651B751D755B651D751
D755D751D755D751D755D755D755D755D755D755D751D755D755D755D755D755
D755D755F755D755F755D755F755F755F755F755F855F755F855F755F859F855
F859F755185AF8591856185A185A185AF859185A185A185A185A185A185A185A
185A185A185A185A185A185AB9591B5D7B541E5C1E58153C2C24051000000000
01000000420886148B2DB65639677B6F9C73DE7BDE7BFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FDE7BBD77
BD773967F75EEF3D84100000000004082C241A4C1E5C1F5C3E5CFB58B959F859
185A185A185A185A185A185A185A185A185A185A185A185AF859185AF755185A
F755F859F755F859F755F855B83A372337233723372337233723372337233723
372337233723372337233723B755D755D755D651D755D751D755B651D751B751
D751B651B751B751B751B651B83A372337233723161737233723161737233723
16173723372316173723372337231617B83A9651B651B651B651B651B651B651
B651B751B651B651B651B751B651B651B651B651B651B651B651B651B751B651
B751B651B751B651B751B751B651B751B751D651B751D751B651D755D751D755
D751D755D755D755D755D751D755D755D755D755D755D755F755D755F755F755
F755F755F755F855F755F859F755F859F859F755185AF8591856185A185AF859
185A185A185A185A185A185A185A185A185A185A185AF8595B5D5E581E5C1F5C
1B5414384818000000000104430886148B2D734EB6563967BD77DE7BFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FDE7B
DE7B5B6F744EAE392204010402042C241A4C1F5C1F5C1E5CBD587A59185A185A
185A185A185A185A185A185A185A185AF859185A185A185AF755F8591856F859
F755F859F755F855F755F755F755F755D72AD703F703F703F703F703F703F703
F703F803F703F703F703F703F703D707D751B651B751B751B751B651B751B651
B751B651B651B651B651B651B651B6513817F703F703F703F703F703F703F703
F703F803F703F703F703F703F703F703D703F703D72A964D9651965196519651
965196519651964D9651964D96519651964D9651964D9651B65196519651B64D
9651B6519651B6519651B651B651B651B651B651B651B751B651B651B751B651
B751B751B651B751B751D651B751D755D751D755D755D751D755D755D755D755
D755D751D755D755F755D755F755F755F755F755F855F755F859F755F859F755
F859185A185A185A185A185AF859185A185A185A185A185A185A185A185A185A
B959FB581E5C1F5C1E581D5814380510040800000000E8204A291042F75E7B6F
BD77DE7BFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FDE7B
BD777C737B6FAE39841001044818153C1E5C1F5C1F5C5E58FB58D959185A185A
185A185A185A185A185A185A185AF859185AF755185AF859F755F859F755F859
F755F755F855F755F755D755F755D755D755D755384ED72AD72AD72A970BF703
F703F703F703F703F703970FD72A362EB83A362ED751B651B651B651B651B651
B651B6519651B6519651964D96519651964D9651F63D362EB83A362E1617F703
F803F703F703F703F703F703F703D703D7071617D72A362EF63D964D964D954D
964D964D954D964D964D954D9651964D964D954D9651964D9651964D964D9651
964D9651964D9651964D9651965196519651964D96519651964DB6519651B651
9651B651B651B651B651B651B651B751B651B751B651B751B751B651D751B751
D755D651D755D755D755D755D751D755D755D755D755F755D755F755F755F755
F855F755F855F755F859F755F859F755185A185A185AF859185A185A185A185A
185A185A185A185AF8597A599D541F5C1F5C1E581A4C2C240204000002084208
8614734EF75E7B6FBD77FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
DE7B7C733967734E430800002C241A4C1F5C1F583F547C39183E3852185A185A
185A185A185A185A185A185AF859185AF755185AF859F755F859F755F855F755
F755F755F755D755D755F755D755D755D755D751D755D755D751D755D751B755
D651183E970FF703F703F703F703D72A9651B6519651B651B65196519651B64D
965196519651964D96519651964D9651964D964D9651964D964D754D964D964D
9541F703F703F703F703F703F703F703D703D72A7549764D754D764D754D764D
754D764D754D764D754D764D754D764D754D764D754D964D754D764D954D764D
764D954D764D964D764D954D964D964D964D954D964D964D9651964D9651954D
96519651964D96519651964D96519651B64D9651B651B651B651B651B651B651
B751B651B751B751B651B751D751D651D755B755D751D755D755D755D751D755
D755D755F755F755F755F755F855F755F855F859F755F859F755185A185AF859
185A185A185A185AF755185A185A185A185A183E183E7E501F581E5C1D585034
040801004308E8208B2D744E39679C73DE7BDE7BFF7FFF7FFF7FFF7FFF7FFF7F
FF7FBD773967B656AE3900002C241A4C1F5C1F5C7E50392E3723384E185A185A
185A185A185A185A185AF859185AF755185AF859F755F859F755F855F755F755
F755D755F755D755D755D755D755D755D751D755D755D751B755D651B751B751
B651B751B651B751B6513723D703F703F703F703D72A964D9651964D96519651
964D9651964D964D954D764D964D954D764D964D754D964D754D764D754D954D
764D9541970BF703F703F703F803F703F703D707F63D7549754D754D754D754D
754D754D754D7549754D754D754D754D754D754D7549754D754D7549754D754D
7549754D754D754D754D754D754D754D754D754D764D754D764D754D964D764D
954D764D964D954D964D964D964D9651954D96519651964D96519651964D9651
B6519651B651B651B651B651B651B751B651B751B751B651D751B751D755D651
D755D755D751D755D755D755D755F755D755F755F755F755F855F755F859F755
F859F755185A185AF859185A185A185A185A185A185A185A1856D72AB91E7C39
1F5C1F601E5850340510020486144A29EF3DB6567B6FDE7BDE7BFF7FFF7FFF7F
FF7FFF7FBD775B6F55564A29051017441F5C1F5CDE48B91ED707B83AF859185A
185A185A185A185AF859185AF755185AF859F755F855F755F855F755F755F755
D755F755D755D755D755D755D755D751D755D751B755D651B751B651B751B651
B751B651B651B651B6519651B6519651D72AD703F703F703F703D72A964D964D
954D764D964D954D764D964D754D964D754D764D754D754D754D754D754D754D
754D75499541D707D703F803F703F703F703F703770B954175495549554D5549
554955495549554955495549554D75495549554955495549554D55495549554D
55495549754D5549554D7549554D7549554D754D7549754D754D754D754D754D
7549754D754D754D754D764D754D764D964D754D964D964D954D964D964D9651
964D96519651964D96519651964DB6519651B651B651B651B651B751B651B751
B651B751D751D755D651B755D751D755D755D755D755D751D755F755F755D755
F755F855F755F859F755F859F755185AF859185A185A185A185A185A185A185A
38527817770B7C351F581F601B502C240510030CE820AE39B65639679C73DE7B
FF7FFF7FFF7FBE7B5B6F5556124150341F581F5C7E50B91EF80378171856185A
185A185A185A185AF859F755185AF859F755F859F755F859F755F755F755D755
F755D755D755D755D755D755D751D755D751B755D651B751B651B751B651B751
B651B651B651B65196519651B64D9651964D9651964DF63DD703F703F703F703
1617964D754D964D754D764D754D754D754D754D754D7549754D754D5549754D
554975495549F63DD707D703F703F703F703F703F703970F7545554955495549
5549554955495549554955495549554955493549554955495549554955495549
5549554955495549554955495549554955495549554955495549554955495549
554D7549554D754D7549754D7549754D754D754D754D754D754D764D754D764D
954D764D964D954D964D964D9651964D96519651964D96519651B6519651B651
B651B651B751B651B751B651B751B651D755D751B755D751D755D755D755D755
D755F755D755F755F755F855F755F755F859F755F859185AF755185A185AF755
185A185A185A185AD72AD703770B5D391E581F5C153C261404088614AE39744E
39679C73BD77FF7FFF7FDE7BD85E334135401E581E5C392ED703F703D72A185A
185A185AF859185A185AF755F859185AF755F859F755F755F755F755D755F755
D755D755D755D755D755D751D755D751B755D651B751B651B751B651B751B651
B651B651B65196519651964D9651964D9651964D9651954D764D954DF63D970F
F703F703F703970F9541754D754D7549754D7549754D554D5549554D55495549
55495549554D5549F63DD703F703F703F703F703F703D7031617754134453549
3445354934453549344534453445344534453445344534453445344534453445
3445344534453445354934453549344555493445554935495549554955495549
5549554955495549554955495549554D55497549554D754D7549554D754D754D
7549754D754D764D754D764D754D964D954D764D964D954D9651964D9651964D
965196519651B651B651B651B651B651B751B651B751B651D751D755B651D755
D751D755D755D755D751D755F755D755F755F855F755F855F755F859F755185A
F859185AF859185A185A185A185AB83AD707F703B91E7E501E581C5448180408
E820AE39744EF75E7B6FFF7FDE7B3967EF3417445E587E50590FF703F703D72A
185A185A185A185A185AF859F755185AF755F859F755F755F755F855F755D755
F755D755D755D755D755D751D755D751B755D651B751B651B751B651B751B651
B651B6519651964D96519651964D9651964D9651954D764D964D754D964D754D
764D95413817F703F703F703970B954175455549554D55495549554955495549
55495549554955493445362ED703F703F703F703F703F703F703161734453445
3445344534453445344534453445144534453445344534453445144534453445
3445344514453445344534453445344534453445344534453445344534453445
3445354934453549344555495549344555495549554955495549554955497549
554D7549554D754D754D7549754D754D764D754D764D754D964D754D964D954D
9651964D9651964D9651964D9651B651964DB651B651B751B651B751B651B751
D651B755D751D755D651D755D755D755D755D755F755D755F755F755F755F859
F755F855F755185A185AF755185A185A185A185A584ED703F703D7037C351F5C
1E5C2C2426148614AE39B656F75EFF7FDE7B4E351A501E583D41D703F703F703
D72A185A185A185AF859185AF755185AF755F859F755F755F755F855D755F755
D755D755D755D755D751D755D751B755D651B751B651D651B751B651B651B651
B6519651964D96519651964D9651964D9651754D964D964D764D954D764D764D
754D764D754D754D75491617F703F703F703D707F63D55495549554955493445
554955493445354934453445362ED703F703F703F703F703F703F703B91E3341
1445144534451445144534451445334114451445144514451445144514453341
1445144514451445344514451445144514451445144514453445144534451445
3445344534453445344534453445344534453549344535493549554935493445
55493549554955495549554955495549754D7549754D7549754D764D754D764D
964D764D964D964D964D964D9651964D9651965196519651B6519651B6519651
B651B751B651B751D651B755D751B755D751D755D751D755D755D755F755D755
F855F755F755F859F755F859F755185AF859185AF755185A185A584EF703F703
F703392E1F581E5C2C242614E8201042F75EFF7FB6561A4C1E5C3D41D703F703
F7037817185A185AF755185A185AF755F859F755F859F755F755F855F755D755
F755D755D755D755D755D751D755D751B755D651B751B6515341EF340D31EF34
0D31EF340D310D31EF340D310D31EF340D310D310D31EF34CD2C0D310D31CD2C
0D31CD2C0D31CD2C0D3134457549554D362EF703F703F703D703362E55495549
3445554934453445344534453445362EF703F703F703F803F703F703F703362E
134114451139CD2C8C288C28CD2C8C288C28B0341445144514451445D3401445
1445D1388C288C28CC288C288C288C2811391445144514451445144514451445
14451445144533411445344514453445CD2C8C2833413445EF34CD2CEF34CD2C
EF34EF34EF34EF34CD2CEF34EF34EF34EF34EF3455491241EF34EF34EF34EF34
EF34EF34EF34EF34EF34EF34EF34EF34EF347549965153415035EF3450355341
B65150397549B651B651B751B651B751B651D755D6515039503950395241D755
F755D755F755F755F855D755F859F755F855F755185AF859185A185AF755185A
B83AF703F703F703B91E1F5C1C542C24440C6A291042FF7F35491F5CDE48D703
F703F703D703584E185AF859185A185AF755185AF755F859F755F755F755F755
D755F755D755D755D755D751D755D751B755D651B751D751B651B751E8200000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000240C554955495549F63DD703F703F703D703
362E3445344535453445344534451445B91ED703F703F703F703F703F703D703
362ED3401445144501040000000000000000000000008C28D340D340D340D340
D340D440D34000000000000000000000000000008C28D440D3401445D3401445
1445D34014451445144514451445144513414818000000001139D34000000000
00000000251046144614461448188614461446144818E8203549CC2800000000
00000104461486144614461486140308000000000000E820764D861400000000
00000D31964DCC2801045039B651B751B651B751B651D751B755000000000000
0000954DD751D755F755D755F755F755D755F859F755F859F755185AF859F755
185A185A18567817F703F703F703392E1F5C1A4C0408420810427D771E581F5C
590FF703F703F7033723185A185A185AF859F755F859F755F859F755F855F755
F855D755F755D755D755D755D755D751D755B751D755B651B751B651B651B751
E820000000000000000000000000010475499349554953417549534175495341
3341EF3400000000000000000000000000000104554955495549344595419707
F703F703F7031617344534453445144534451617D703F703F703F703F703F703
D703F32DD4401445D340D44400000000000000000000000000004818D444D340
D340B340D340B340B34000000000000000000000000000008C28D340D340D340
D340D340D340D440D340D4401445D3401445D138240C00000104CD2C14451241
000000000000000034453445344534453445344535495549344555495549CC28
00000000000046147549554D7549754D754D8C28000000000000E820764D4614
000000000000CD2C9651B64DEF340104CC28B651B651B651B751B651B7510000
0000000000009349D755D755D755D755D755F855F755F855F859F755F859F755
F859185A1856F859185A584EF703F703F703F703DE481E582C2400006A291F6E
1F5C7C35F803F703F703F703584E1856185AF859F755185AF755F859F755F755
F755F755D755F755D755D755D755D751D755D751B651D755B651B751B651B751
B651B751E82000000000000000000000000022049651754D964D954D764D754D
754D754D754D754D481800000000000000000000000001045549554934455549
344575411617F703F703F70316175341144533411617F703F703F703F703F703
F703D70794311445D340D440D340D34000000000000000000000000000004818
D340B340B340B340B340B340D13800000000000000000000000000008C28B340
B340D340B340D340D340D340D340D340D340D340CD2C01040000030CD1381445
1445D13800000000000000008C28CC288C288C28CC2813413445344555493445
55498C2800000000000046145549754D5549754D7549E8200000000000004818
964D86140000000000000D31964D9651964D53414208240C440C440C86144614
861400000000000000009349D755D751D755F755D755F755D755F755F755F755
F855F755185AF859F755185A185A185A970FF703F703F70338171F5C1A500000
8410DF641F5C3817D703F703F703D707185A185AF755185AF859F755F859F755
F855F755F855D755F755D755D755D755D755D751D755D751B755D651B751B651
B651B751B651B651CC28440C430C240C430C240C240C4614954D964D754D764D
764D754D764D754D554911394510000000000000000000000000020455495549
344555493445344535451617D703F703F703770B74351617F703F703F703F703
F703F70397077435D340D340D340D340D340D340000000000000000000000000
00004818B340B340D138B340B340B340B0340000000000000000000000000000
8C28B340B340B340B340B340D340B340D340D340D3408C28000000004614D340
1445D34014451139000000000000000025104510251045104510134134453549
344555493445CC2800000000000046145549754D5549754D554D8C2800000000
0000E820764D4614000000000000CD2C964D9651964DB651954D861400000000
CC28B651B75100000000000000009349D755D751D755D755D755F755D755F855
F755F859F755F859F755185AF755185AF859185A3723F703F703F803D7037E50
1F5C040800005F5C1F5CD703F703F703F7037817185AF859185A185AF755185A
F755F859F755F755F755F755D755D755D755D755D755D751D755B751D651B755
B751B651B751B651B651B65196519651964D9651964D9651964D954D964D754D
964D754D5241CD2CE820240C0000000000000000000002088614CC2811393445
55493445354934453445354934453445362EF703F703F703F703F703F703F703
F803F703D703770B5439D340D340D440D340D340D340B3400000000000000000
0000000000004818B340B340B340B340D138B340503400000000000000000000
000000008C28B340B340B340D138B340B340B340D340D1382614000000008C28
D340D3401445D3401445D1380000000000000000144514453445144534451445
34453445344535493445CC28000000000000451455495549554955497549E820
0000000000004818954D46140000000000000D31954D9651964D96519651B651
CC28000000008614954D00000000000000009349D755D751D755D755F755D755
F755D755F855F755F859F755F859F755185A185AF859185AD72AF703F703F703
F7037C391F5C481800003E5C1F5CF803F703F703F8037817F859185A185AF755
F859F755185AF755F859F755F859D755D755F755D755D755D755D751D755B651
D755B751B651B751B651B651B751B6519651B651964D96519651964D96517549
EF34CC2845100104000000000000000001004514CC28EF343341554955495549
554955493445554934453549344534453445344534459535D703F703F703F803
F703F703F703F703770B133DD340D340D340D340D340D340B340D34000000000
000000000000000000004818B340D138B3405034B3405034D138000000000000
00000000000000008C28D138B340B340B340B340B340B340B034020400000104
B034D340D3401445D3401445D340D3400000000000000000CC28CD2C8C28CD2C
CD2CCD2CCD2CCD2CCD2CCD2C3549CC28000000000000240CCC28CC28CC28CC28
CC280000000000000000E820764D4614000000000000CD2C964D9651964D9651
B651964DB651503901040000020800000000000000009349D755D751D755D755
D751F755D755F855F755D755F855F755F8591856F859F755185A185AB83AF703
F703F703F7037C351F5C481802085F5C1F5C9707F703F703F703970F185A185A
185AF755185AF859F755F755F855F755F755D755F755D755D755D755D755D751
D755B751D755B651B751D651B751B651B651B751B6519651964D5241CC288614
030C00000000000000000000240CE820CD2C3341754D7549554D55495549554D
5549554955493445554934455549344534453445344534451445F32DB803F703
F703F703F703F703F7031617133DD444D3401445D340D444D340D340D340B340
00000000000000000000000000004818B340B340D138B340D138B3408C280000
0000000000000000000000008C28B340B340D138B340B340B3408C2800000000
240CD138D444D340D340D3401445D3401445D340CD2C8C288C28CC288C288C28
CC288C28CC288C28CC28CC28CD2CCD2C35491139CD2CCC28CD2CCC28CD2CCC28
CD2CCD2CCD2CCD2CCD2CCD2C0D313341954D33410D31CD2C0D3152419651964D
9651964D9651B6519651B65175490D310D310D31EF340D315035B755D651D755
D755D755F755D755F755D755F755F859F755F859F755F859F755185A185AF755
D72AF703F803F703F7033D411F5C2614E8207F691F5C392EF803F703F703D703
1856185AF859185AF755F859F755F859F755F755F855D755F755D755D755D755
D751D755D755D751B651D751B651B755B651B751B6519651EF34440C00000000
00000000000000008614CD2C5039554D964D754D754D764D7549754912410D31
EF34CD2CEF34CD2CEF34EF3434455549344535493445344534453445362ED703
F703F703F703F703F703F703D70394311445D3401445D340D340D340D340D340
D340D34000000000000000000000000000004818B340B340B340B340B3404818
000000000000000000000000000000008C28B340B340B340D340B34048180000
00004818D340D340D340D440D3401445D3401445D34014451445334114451445
1445344514453445344534453549344534455549344555493445554955495549
5549554D7549554D7549754D754D7549764D954D764D954D764D9651754D964D
9651964D96519651B64D9651B751B651B651B751B651D755B651D751B755D751
D755D755D751D755D755D755F855F755F855F755F755F859F755185AF8591856
F859185A3723F703F703F703D7031F581E5C0204AE39BF761F5CDE48D703F803
F703F703B83A185A185AF859F755185AF755F859F755F859F755F755D755F755
D755D755D755D755D751D755B751D755B651D751B651B651B751B651E8200000
0000000000000000000002049651954D764D964D754D754D764D754D764D754D
8C2800000000000000000000000001045549554934453549554934453445362E
F703F703F703F803F703F703F703F703F703D703362ED34014451341D444D340
1445D340D444D34000000000000000000000000000004818D444D340B340D138
26140000000000000000000000000000000000008C28B340D340B340D138240C
000000008C28D340D444D3401445D3401445D444134114451445144514451445
1445344514453445344534453445344534453549554934455549554955495549
5549554D5549754D5549754D7549754D754D764D754D764D954D764D954D964D
9651964D9651964D9651B64D9651B6519651B651B751B651B751B651D755B751
D755D651D755D751D755F755D755F755F755D755F755F755F859F755F859185A
F755185AF8593852D707F703F703F803392E1F58153CE820534EFF7FBE601F5C
392EF803F703F7037817185AF755185A185AF755F8591856F755F755F755F755
F855D755F755D755D755D755D751D755D755B651D751B755B651B751B651B651
E82000000000000000000000000000005241964D954D9651954D764D954D754D
754D754DE8200000000000000000000000000104554955495549554934453549
362EF703F703F703F703F703F703D803362ED707F703F703D703362E13411445
13411445D3401445D340144500000000000000000000000000004818D340D340
B0340208000001048C2800000000000000000000000000008C28D340D440CD2C
020400000208B034D3401445D3401445D3401445144513411445144514451445
1445344514453445344534453445344534453549554934455549344555495549
554955495549754D5549754D5549754D754D754D764D754D964D754D964D754D
9651964D9651964D9651964DB6519651B751B651B651B751B651B751B651D751
B755D651D755D751D755D755D755D755F855F755D755F755F859F755F859F755
185AF755185A185A185AB83AF703F703F70397073F541F5C8C28F44DB656FF7F
FF761F5C1F583817D703F703F703B83A185A185AF859F755185AF755F859F755
F859F755F755F755D755F755D755D755D755D751D755D751D755B651D751B651
B751B651CC2800000000000000000000000000000000240C4510451045104510
4510451445104510010400000000000000000000000001045549554955495549
55491617D703F703F703F803F703F703D703F32D35497541770BF703F703F703
161713411445144514451445134114450000000000000000000000000000240C
4818461400000000240CD340D3400000000000000000000000000000240C4818
4614000000004510D34013411445144513411445144514451445144514451445
3445344534453445344534453445344535495549344555493445554955495549
5549554D5549754D5549754D5549754D754D7549764D754D964D754D964D754D
964D9651954D9651964D9651964DB6519651B651B651B651B751B651B751B651
D755B651D755D751D755D755D751D755F755D755F755D755F755F859F755F855
F859F755185A185AF755185A3852D707F703F703D703DE481E5C343C93493967
7C73FF7FFF7F1F6E1F5C3F543817D703F803D707584E185A185AF859185AF755
F859185AF755F855F755F859F755D755F855D755D755D755D751D755D755D751
B651D755B751B6519349E8204510451045144510451045144510451045104514
45104510451045104510451045104510451045104510451045104614754D7549
554975491617F703F703F703F703F703F703D707953555493445344555451617
F703F703F703770B534133413445144514451445CD2C25102510440C2510240C
2510240C2510440C25108C281341144513418C282510440C2510440C2510440C
2510240C251045108C2814451445144514451445144514453445144534453445
3445344534453445344534453549344555493445554934455549554955495549
55495549754D5549754D5549754D7549754D754D764D754D964D754D964D754D
964D9651964D9651964D9651964DB6519651B651B651B751B651B751B651B751
D651B755D751D755D751D755D751D755D755F755D755F755F755F855F755F859
F755F859185AF755185AF859185A18563723F703F703D7033D411E581A4C7549
D85E5B6FDE7BFF7FFF7FFF7F9F691F5C1F58B91EF703F703970F3856185A185A
185AF755185AF755F859F755F859F755F755F755F755D755F755D755D755D755
D755D751D755D751B651D755B651B751B651B651B751B651B6519651B751964D
B651964D9651964D9651964D954D964D754D964D754D764D754D754D764D754D
754D554975493817F703F703F703F703F703F703D70795355549554934455549
344555491617F703F703F7039707953534453445344534453445144534451445
3445144514453445144514451445144514451445144514451445144514451445
1445144514453445144534451445344534453445144534453445344534453445
344534453549344534453549344555493445554955495549554955495549554D
5549754D5549754D5549754D7549754D764D754D764D754D964D754D964D754D
964D9651954D9651964D9651964DB6519651B651B751B651B751B651B651B751
D651B755D751B755D651D755D755D755D755F755D755F755F755F755F859F755
F855185AF755185AF755185A185A185A185AD72AF703F7039707DE481E5C1A50
0D31D85E9D77BE7BDE7BFF7FFF7FFF7FFF7FFF6D1F5C1F5C7C35D703F703970F
3852185A185A185A185A185AF755185AF755F859F755F859F755F755F755D755
F755D755D755D755D751D755D755D751B755D651B751D755B651B751B651B651
B651B65196519651B64D9651964D9651964D964D9651954D764D954D764D754D
964D754D954D9541970FD703F703F803F703F703F703970B9541554955495549
55495549554955495549362EF703F703F703D703362E34453445344534453445
3549344534453445344534453445344534453445344534453445344534453445
3445344534453445344534453445344534453445344534453549344534453549
344555493445554934455549554955495549554955495549554D5549554D7549
5549754D5549754D7549754D754D754D754D764D954D764D954D764D954D9651
964D9651964D9651964D9651B64D9651B6519651B651B651B751B651B751B651
D751B755D651D755D751D755D751D755D755F755D755F755D755F755F855F755
F859F755185AF859F755185AF859185A185A185AD72AF703F703B91E3F541F5C
1A4C0D315B6FBD77DF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F9F763E5C1F5C7E50
B91EF703970B584E185A185A185AF755185A185AF755185AF755F859F755F859
F755F755F755D755D755F755D755D755D755D751D755D751D755B651B751D651
B755B651B751B651B651B751B6519651B6519651964D9651964D9651964D9651
954D964D954D764D9541970BF703F703F703F703F703F703970F95417549554D
75495549554D5549554955495549554D362ED703F703F703D703B91E34455549
5549554934455549344555493445354934455549344535493445354934453445
3549344555493445354934455549344535493445554934455549554934455549
55495549554955495549554955495549554955495549554D75495549754D5549
754D7549754D764D754D754D764D754D964D754D964D754D964D9651954D964D
9651964D9651964D9651964DB6519651B651B651B751B651B751B651B751D651
B751D755B651D755D751D755D755D755D755F755D755F755F755F755F859F755
F859F755185AF755185AF755185A185A185A185A18563723F80397077C391F5C
1F601438AE39BD77FF7FDE7BFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F7E77
DF641F5C1F5C3D413817D703B83A185A185A185A185AF859185AF755185AF755
F859F755F755F859F755F855F755F755D755F755D755D755D755D755D751D755
D751D755B651B751D651B755B651B751B651B651B651B751B65196519651B64D
9651964D9651964D9651F63DD707F703F703F703F703F703D703970F9541754D
764D754D754D754D754D7549754D7549554D75495549F63DD707F703F703F703
1617754555495549554955495549554955495549554955495549554955495549
5549554955495549554955495549554955495549554955495549554955495549
5549554D554955495549754D55495549754D5549754D7549754D754D7549754D
764D754D754D764D754D754D964D754D964D764D954D964D9651964D9651964D
9651964D9651964DB6519651B651B751B651B651B751B651B751B651B751D651
B755D651D755D751D755D755D755D755F755D755F755D755F755F855F755F859
F755F859F755185AF755185AF859185A185A185A185A584E970FB803392E1F58
1F5C1D588C28B656FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7F7F725F5C1F5C1F5C3D41381738175852185A185A185A185AF859
185AF8591856185AF859F755F859F755F755F859F755F755F755D755D755F755
D755D755D755D751D755D751D755B651D751B651B751B651B751B651B651B751
B651B6519651B7519651964DF63DD703F703F703F803F703F703F70378177549
964D954D764D954D764D754D954D764D754D754D754D754D764D754D9541770B
F703F703F703770B95417549754D5549754D5549754D55495549754D55495549
754D55495549754D5549554D75495549554D75495549754D55497549554D7549
754D7549554D7549754D7549754D754D7549754D764D754D754D754D764D754D
754D764D954D764D954D764D954D964D9651954D9651964D9651964D9651964D
9651964DB6519651B651B651B651B751B651B651B751B651B751D651B755D651
D755D751D755D751D755D755D755D755F755D755F755F855F755F755F859F755
F859F755185AF755185AF859185A185A185A185AF859185AD72A970F392E1F58
1F5C1F5C1438EF3DBD77FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FDF7F1F6E3E5C1F5C1F5CDE48392ED72A1856185A
185A185A185A185AF859185AF755185A185AF755F859F755F859F755F755F855
F755F755D755F755D755D755D755D755D755D751D755D751D755B751D651B755
B651B751D651B751B651B651B651B83AD703D703F703F703F703F703F7033817
B64D9651964D9651964D9651954D964D9651764D954D764D954D764D754D964D
754D964D970FD703F703F703D707F63D7549754D764D7549754D764D754D754D
764D754D754D754D754D754D754D7549754D754D754D764D754D754D754D754D
754D764D754D754D754D764D754D754D764D754D754D964D754D964D754D964D
754D964D964D9651954D9651964D9651964D9651964D9651964DB6519651B651
9651B651B651B651B651B751B651B751B651B751B651D751B755D651D755D751
D755D751D755D755D755D755F755D755F755F755F755F755F859F755F859F755
185AF755185AF8591856F859185A185A185A185A185A185AB83AB91E7C391F58
1F5C1E5C153C71397B6FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FBF7F3F725F5C1F5C1F5C3F54
3D41DA4D1856185A185A185A185A185A185AF859185AF755185AF755185AF755
185AF755F859F755F855F755F755F755D755D755F755D755D755D755D755D751
D755D751D755D651B755B651B651B755D72AD703F703F703F703F703F803F703
1617B651B651964DB6519651964D9651964D9651964D9651964D9651964D9651
964D9651954D964D964D970FD703F703F703D703D72A754D9651754D964D754D
964D754D764D954D764D754D964D754D764D954D764D754D964D754D964D754D
964D754D964D754D964D954D764D954D964D9651964D954D9651964D9651964D
964D9651964D9651964D9651964D9651964DB6519651B651B6519651B651B651
B651B651B751B651B751B651B751B651D755B651D755D651D755D751D755D751
D755D755D755D755D755F755D755F755F755F755F855F755F859F755185AF755
185AF755185AF859185A185A185A185A185A185A185A185AF9517C399D541F58
1F5C1E58343C52417B6FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FBF76
1F651F5C1F5C1F5C3E5CFB58F859185A185A185A185A185A185A185AF859185A
F859185AF755185AF755F859F755F859F755F859F755F755F855F755D755F755
D755D755D755F755D755D755D751F74DB83A970FD703F703F803F703F703F703
F703F703D72AB651B751B6519651B651B651B751B651B6519651B651B6519651
9651B64D96519651964D9651964D3723D703F703F803F703F703970F362EB64D
964D964D954D9651964D964D9651964D9651964D964D9651964D9651964D964D
9651964D964D9651964D9651964D9651964D9651964D9651964D9651964D9651
964D9651B6519651B6519651B651B651B651B751B651B651B651B751B651B751
B651B751B651B751D651B755D651B751D755D751D755D751D755D751D755D755
D755D755F755D755F755F755F755F755F859F755F859F755F859F755185AF859
F755185A185AF859185A185A185A185A185A185A185AF8597A595E581E5C1F5C
1F5C1A50B340334E9C73FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7F9F7F5F72DF641F5C1F5C1F5CBD587A59185A185A185A185A185A
185A185A185A185AF859185AF859185AF755185AF755185AF755185AF755F755
F859F755F755F755F755F755183ED707D703F703F703F703F703F703F703F703
F803F703F703F703F703D703D707D7077817B651B751B651B751B651B651B751
B651B651B651B651B651970FD707D707D703F703F703F703F703F703F703F703
F703F703D703D707D72A964D96519651B64D96519651B64D96519651B651964D
9651B6519651964DB6519651B6519651B64D9651B651B651B6519651B651B651
B651B751B651B651B651B751B651B651B751B651B651B751B651B751D651B751
D755B651D751D755D751D755D751D755D751D755D755D755D755D755F755D755
F755F755F755F755F755F855F755F859F755F859F755185AF755185AF859185A
F755185A185A185A185A185A185A185A185A185A185AB959FB583E5C1E5C1F5C
1B50343C9349F75EFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F9F7F5F721F653E5C1F5C3E5CBD589A59
F859185A185A185A185A185A185A185A185A185A185AF859185AF755185AF859
F755185AF859F755185AF755F859F755B83AF703F703F703F703F703F703F703
F703F703F703F703F803F703F703F703F703F703970FD751D755D751D751D651
B755D751B651B751D755B651B751D707F703F703F703F703F703F703F703F703
F703F703F703F703F703F703D72AB651B651B651B751B651B651B651B751B651
B651B651B651B751B651B651B751B651B651B751B651B751B651B751B651B651
B751B651B751B651B751D651B755B651D751D755B651D751D755D751D755D751
D755D755D755D755D755D755D755D755D755D755F755D755F755F755F755F755
F859F755F859F755F859F755F859F755185AF755185AF8591856185AF859185A
185A185A185A185A185A185A185A185A185A185AB9591B5D5E581E5C1F5C1A4C
343C9349F75EDE7BFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FDF7FFF76FF6D
1F651F5C3E5CBD585B5DF859185AF859185A185A185A185A185A185A185A185A
185A185AF859185AF755185AF859F755185AF7551856174E3852384E174E3852
174E384E174E384E174E174E174E174E174E174E174E174E174ED755D755D755
D755D755D755D751D755D755D751D755D755F74D174E174EF74D174EF74D174E
F74D174EF74DF74D174EF74DF74DF74DF74DB651D751B751D651B755D651B751
D751B651D755B751D751B651D751B755D751B651D755D751D755B651D751D755
D651D751D755D751D755D751D755D755D751D755D755D751D755D755D755D755
D755D755D755F755D755F755D755F755F755F755F859F755F755F859F755F859
F755F855F755185AF755185AF859F755185A185AF859185AF859185A185A185A
185AF755185A185A185A185A185A185AF8597A5DFB583E5C1E5C1A4C343C3445
534E3967FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FDF7F3F7B5F727F69BE605F5CFB585B5DB9591856185A185A185A
185A185A185A185A185A185A185A185A185A185AF859185AF859185AF755185A
F755185AF755185AF755F859F755185AF755F755F859F755F755F855F755F755
F755D755F755F755F755D755F755D755F755D755F755D755D755D755D755D755
D755D755D755D755D755D755D755D751D755D755D755D755D751D755D755D755
D751D755D755D755D751D755D755D755D755D751D755D755D755D751D755D755
D755D755D755D755D755D755D755D755D755F755D755D755F755D755F755F755
F755F755F755F755F755F855F755F755F755F859F755F855F755185AF755185A
F755185AF755185AF859185AF8591856F859185A185A185A185A185A185A185A
185A185A185A185A185A185AF8597A59FB585E581A50153CD444754975523967
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F
FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FDF7F3F7BBE72FF6D7F695D61
FB587A599A59F859185A185A185A185A185A185A185A185A185A185A185A185A
185A185A185AF859185AF859185AF755185AF859F755185AF859F755185AF755
F859F755185AF755F859F755F859F755F755F859F755F755F755F855F755F755
F855F755F755F755F755D755F755D755F755D755F755D755F755D755F755D755
F755D755F755D755F755D755F755D755F755D755F755D755F755D755F755D755
F755000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000}
SystemMemory = False
Transparent = True
TransparentColor = clBlack
end>
Left = 424
Top = 42
end
end
/VCL_DELPHIX_D6/SXMedia/SxSample/main.pas
0,0 → 1,211
{
SXMedia Components - Beta 1
--------------------------------
Copyright 1999 Dean Ellis
http://www.sillex.freeserve.co.uk
 
This unit is part of the SXMedia Component Set. This code is
supplied as is with no guarantees and must be used at your own
risk.
 
No modifications to this code must be made without the express
permission of the author. Please report any problems to
support@sillex.freeserve.co.uk
 
You may use these components to create any freeware/shareware
applications that you wish. If the components are to be used in
a commercail product then credit for developement of these components
should be given.
 
Credits :
 
Developer : Dean Ellis
}
unit main;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
SXMovie, SXModPlayer, SXEngine, Menus, DXSounds, DXDraws, MMSystem, DIB;
 
type
TFrmMain = class(TForm)
MainMenu1: TMainMenu;
FileMnu: TMenuItem;
SXShowMnu: TMenuItem;
SXEngineMnu: TMenuItem;
SXModPlayerMnu: TMenuItem;
Exit1: TMenuItem;
OpenFileItem: TMenuItem;
PlayItem: TMenuItem;
StopItm: TMenuItem;
StartItem: TMenuItem;
StopItem: TMenuItem;
OpenFile1: TMenuItem;
Start1: TMenuItem;
Stop1: TMenuItem;
OpenDlg: TOpenDialog;
SXModPlayer: TSXModPlayer;
SXEngine: TSXEngine;
SXMovie: TSXMovie;
DXSound1: TDXSound;
DXDraw1: TDXDraw;
DXImageList1: TDXImageList;
procedure Exit1Click(Sender: TObject);
procedure DXDraw1Finalize(Sender: TObject);
procedure OpenFileItemClick(Sender: TObject);
procedure OpenFile1Click(Sender: TObject);
procedure PlayItemClick(Sender: TObject);
procedure Start1Click(Sender: TObject);
procedure Stop1Click(Sender: TObject);
procedure DXSound1Initialize(Sender: TObject);
procedure SXEngineRender(Sender: TObject);
procedure StartItemClick(Sender: TObject);
procedure StopItemClick(Sender: TObject);
procedure DXDraw1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;
 
var
FrmMain: TFrmMain;
 
implementation
 
{$R *.DFM}
procedure FreeObj(var Obj);
begin
if TObject(Obj) <> nil then
begin
TObject(Obj).Free;
TObject(Obj) := nil;
end;
end;
 
procedure ClearSurfaces;
begin
FrmMain.DXDraw1.Surface.Fill(clBlack);
FrmMain.DXDraw1.Primary.Fill(clBlack);
end;
 
procedure TFrmMain.Exit1Click(Sender: TObject);
begin
if SXMovie.Playing then SXMovie.Stop;
Close;
end;
 
procedure TFrmMain.DXDraw1Finalize(Sender: TObject);
begin
if SXEngine.Enabled then SXEngine.Enabled := False;
end;
 
procedure TFrmMain.OpenFileItemClick(Sender: TObject);
begin
OpenDlg.Filter := 'All Media Files|*.avi;*.mpg;*.mov|' +
'AVI (*.avi)|*.avi|MPG (*.mpg)|*.mpg|MOV (*.mov)|*.mov';
if OpenDlg.Execute then
begin
SXMovie.Filename := OpenDlg.FileName;
end;
end;
 
procedure TFrmMain.OpenFile1Click(Sender: TObject);
begin
OpenDlg.Filter := 'All Media Files|*.mod;*.it;*.s3m;*.xm|' +
'Mod (*.mod)|*.mod|Impulse Tracker (*.it)|*.it|Scream Tracker (*.s3m)|*.s3m|Fast Tracker (*.xm)|*.xm';
if OpenDlg.Execute then
begin
SXModPlayer.Filename := OpenDlg.FileName;
DXSound1Initialize(Sender);
SXModPlayer.Initialize(nil);
end;
end;
 
procedure TFrmMain.PlayItemClick(Sender: TObject);
begin
if not SXMovie.Playing then
begin
if DXDraw1.CanDraw then
ClearSurfaces;
SXMovie.DisplayRect(80,60, 400, 300);
SXMovie.Play
end
else
SXMovie.Stop;
end;
 
 
procedure TFrmMain.Start1Click(Sender: TObject);
begin
SXModPlayer.Play(True);
end;
 
procedure TFrmMain.Stop1Click(Sender: TObject);
begin
SXModPlayer.Stop;
end;
 
procedure TFrmMain.DXSound1Initialize(Sender: TObject);
var fmt:TWaveFormatEx;
begin
with Fmt do
begin
wFormatTag := WAVE_FORMAT_PCM;
nSamplesPerSec := 44100;
nChannels := 2;
wBitsPerSample := 16;
nBlockAlign := wBitsPerSample div 8 * nChannels;
nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
end;
// must be in exclusive to set the format
DXSound1.Options := DXSound1.Options + [soExclusive];
DXSound1.Primary.SetFormat(Fmt);
end;
 
procedure TFrmMain.SXEngineRender(Sender: TObject);
var Angle: Integer;
begin
Angle := 0;
if DXDraw1.CanDraw then
begin
DXDraw1.Surface.Fill(clBlack);
with DXImageList1.Items[0] do
DrawWaveX(DXDraw1.Surface,160,50,Width,Height, 0, 5, 80, Angle*4);
with DXDraw1.Surface.Canvas do
begin
try
Brush.Style := bsClear;
Font.Color := clWhite;
Font.Size := 8;
Textout(5, 5, 'Frames Per Sec : ' + IntToStr(SXEngine.FramesPerSecond));
finally
Release;
end;
end;
DXDraw1.Flip;
Inc(Angle);
end;
end;
 
procedure TFrmMain.StartItemClick(Sender: TObject);
begin
if DXDraw1.CanDraw then ClearSurfaces;
SXEngine.Enabled := True;
end;
 
procedure TFrmMain.StopItemClick(Sender: TObject);
begin
SXEngine.Enabled := False;
end;
 
procedure TFrmMain.DXDraw1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_ESCAPE then Close;
end;
 
end.