DEADSOFTWARE

Sound: OpenAL: libxmp support
[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;
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 end;
53 TSoundLoaderFactory = class
54 function MatchHeader(Data: Pointer; Len: LongWord): Boolean; virtual; abstract;
55 function MatchExtension(FName: string): Boolean; virtual; abstract;
56 function GetLoader(): TSoundLoader; virtual; abstract;
57 end;
59 function e_GetSoundLoader(Data: Pointer; Len: LongWord): TSoundLoader; overload;
60 function e_GetSoundLoader(FName: string): TSoundLoader; overload;
62 procedure e_AddSoundLoader(Loader: TSoundLoaderFactory);
64 implementation
66 var
67 e_SoundLoaders: array of TSoundLoaderFactory;
69 function e_GetSoundLoader(FName: string): TSoundLoader; overload;
70 var
71 I: Integer;
72 begin
73 Result := nil;
74 for I := Low(e_SoundLoaders) to High(e_SoundLoaders) do
75 if e_SoundLoaders[I].MatchExtension(FName) then
76 begin
77 Result := e_SoundLoaders[I].GetLoader();
78 break;
79 end;
80 end;
82 function e_GetSoundLoader(Data: Pointer; Len: LongWord): TSoundLoader; overload;
83 var
84 I: Integer;
85 begin
86 Result := nil;
87 for I := Low(e_SoundLoaders) to High(e_SoundLoaders) do
88 if e_SoundLoaders[I].MatchHeader(Data, Len) then
89 begin
90 Result := e_SoundLoaders[I].GetLoader();
91 break;
92 end;
93 end;
95 procedure e_AddSoundLoader(Loader: TSoundLoaderFactory);
96 begin
97 SetLength(e_SoundLoaders, Length(e_SoundLoaders) + 1);
98 e_SoundLoaders[High(e_SoundLoaders)] := Loader;
99 end;
101 end.