DEADSOFTWARE

4ba5cd6ac0b40eeaaa6cd2948655a03df2373b89
[d2df-sdl.git] / src / engine / e_soundfile.pas
1 (* Copyright (C) Doom 2D: Forever Developers
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, version 3 of the License ONLY.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 *)
15 {$INCLUDE ../shared/a_modes.inc}
16 unit e_soundfile;
18 interface
20 type
21 TSoundLoader = class;
23 TSoundFormat = record
24 SampleBits: Integer;
25 SampleRate: Integer;
26 Channels: Integer;
27 end;
29 // each sound file format has its own loader factory and loader class,
30 // each sound has its own loader instance for streaming purposes
32 TSoundLoader = class
33 protected
34 FFormat: TSoundFormat;
35 FStreaming: Boolean;
36 FLooping: Boolean;
38 public
39 function Load(Data: Pointer; Len: LongWord; SStreaming: Boolean): Boolean; virtual; abstract; overload;
40 function Load(FName: string; SStreaming: Boolean): Boolean; virtual; abstract; overload;
42 function SetPosition(Pos: LongWord): Boolean; virtual; abstract;
43 function FillBuffer(Buf: Pointer; Len: LongWord): LongWord; virtual; abstract;
45 function GetAll(var OutPtr: Pointer): LongWord; virtual; abstract;
47 procedure Free(); virtual; abstract;
49 property Format: TSoundFormat read FFormat;
50 property Streaming: Boolean read FStreaming;
51 property Looping: Boolean read FLooping write FLooping;
52 end;
54 TSoundLoaderFactory = class
55 public
56 function MatchHeader(Data: Pointer; Len: LongWord): Boolean; virtual; abstract;
57 function MatchExtension(FName: string): Boolean; virtual; abstract;
58 function GetLoader(): TSoundLoader; virtual; abstract;
59 end;
61 function e_GetSoundLoader(Data: Pointer; Len: LongWord): TSoundLoader; overload;
62 function e_GetSoundLoader(FName: string): TSoundLoader; overload;
64 procedure e_AddSoundLoader(Loader: TSoundLoaderFactory);
66 implementation
68 var
69 e_SoundLoaders: array of TSoundLoaderFactory;
71 function e_GetSoundLoader(FName: string): TSoundLoader; overload;
72 var
73 I: Integer;
74 begin
75 Result := nil;
76 for I := Low(e_SoundLoaders) to High(e_SoundLoaders) do
77 if e_SoundLoaders[I].MatchExtension(FName) then
78 begin
79 Result := e_SoundLoaders[I].GetLoader();
80 break;
81 end;
82 end;
84 function e_GetSoundLoader(Data: Pointer; Len: LongWord): TSoundLoader; overload;
85 var
86 I: Integer;
87 begin
88 Result := nil;
89 for I := Low(e_SoundLoaders) to High(e_SoundLoaders) do
90 if e_SoundLoaders[I].MatchHeader(Data, Len) then
91 begin
92 Result := e_SoundLoaders[I].GetLoader();
93 break;
94 end;
95 end;
97 procedure e_AddSoundLoader(Loader: TSoundLoaderFactory);
98 begin
99 SetLength(e_SoundLoaders, Length(e_SoundLoaders) + 1);
100 e_SoundLoaders[High(e_SoundLoaders)] := Loader;
101 end;
103 end.