DEADSOFTWARE

6cae52c6a5739335df7329212bfed65d266f09cf
[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, either version 3 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *)
16 {$INCLUDE ../shared/a_modes.inc}
17 unit e_soundfile;
19 interface
21 type
22 TSoundLoader = class;
24 TSoundFormat = record
25 SampleBits: Integer;
26 SampleRate: Integer;
27 Channels: Integer;
28 end;
30 // each sound file format has its own loader factory and loader class,
31 // each sound has its own loader instance for streaming purposes
33 TSoundLoader = class
34 protected
35 FFormat: TSoundFormat;
36 FStreaming: Boolean;
37 FLooping: Boolean;
39 public
40 function Load(Data: Pointer; Len: LongWord; SStreaming: Boolean): Boolean; virtual; abstract; overload;
41 function Load(FName: string; SStreaming: Boolean): Boolean; virtual; abstract; overload;
43 function SetPosition(Pos: LongWord): Boolean; virtual; abstract;
44 function FillBuffer(Buf: Pointer; Len: LongWord): LongWord; virtual; abstract;
46 function GetAll(var OutPtr: Pointer): LongWord; virtual; abstract;
48 procedure Free(); virtual; abstract;
50 property Format: TSoundFormat read FFormat;
51 property Streaming: Boolean read FStreaming;
52 property Looping: Boolean read FLooping write FLooping;
53 end;
55 TSoundLoaderFactory = class
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.