X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fengine%2Fe_soundfile.pas;h=c508593235bc070b10a2d348efcc7942131e4885;hb=0e1b2d3c6f2a8b1b73be0f630d99f1a4ab9083c7;hp=df4aa45dfa2c04a01b4e8b4af2c601b7a032c748;hpb=b6261de6b40b4b79207cc01889b94e3237e1bba6;p=d2df-sdl.git diff --git a/src/engine/e_soundfile.pas b/src/engine/e_soundfile.pas index df4aa45..c508593 100644 --- a/src/engine/e_soundfile.pas +++ b/src/engine/e_soundfile.pas @@ -2,8 +2,7 @@ * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * the Free Software Foundation, version 3 of the License ONLY. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -22,38 +21,49 @@ type TSoundLoader = class; TSoundFormat = record - Loader: TSoundLoader; SampleBits: Integer; SampleRate: Integer; Channels: Integer; end; - // each sound file format has its own loader - // TODO: maybe make TBasicSound contain an instance of its loader - // and add a FetchSamples method or something, for streaming shit + // each sound file format has its own loader factory and loader class, + // each sound has its own loader instance for streaming purposes + TSoundLoader = class + protected + FFormat: TSoundFormat; + FStreaming: Boolean; + + public + function Load(Data: Pointer; Len: LongWord; Loop: Boolean): Boolean; virtual; abstract; overload; + function Load(FName: string; Loop: Boolean): Boolean; virtual; abstract; overload; + + function Finished(): Boolean; virtual; abstract; + function Restart(): Boolean; virtual; abstract; + function FillBuffer(Buf: Pointer; Len: LongWord): LongWord; virtual; abstract; + + procedure Free(); virtual; abstract; + + property Format: TSoundFormat read FFormat; + property Streaming: Boolean read FStreaming; + end; + + TSoundLoaderFactory = class public - // can this loader load the sound file in Data? - function CanLoad(Data: Pointer; Len: Integer): Boolean; virtual; abstract; overload; - // can this loader load the sound file at FName? - function CanLoad(FName: string): Boolean; virtual; abstract; overload; - // load from memory - function Load(Data: Pointer; Len: Integer; var OutLen: Integer; var OutFmt: TSoundFormat): Pointer; virtual; abstract; overload; - // load from file - function Load(FName: string; var OutLen: Integer; var OutFmt: TSoundFormat): Pointer; virtual; abstract; overload; - // needed in case memory is allocated in a lib or something - procedure Free(Data: Pointer); virtual; abstract; + function MatchHeader(Data: Pointer; Len: LongWord): Boolean; virtual; abstract; + function MatchExtension(FName: string): Boolean; virtual; abstract; + function GetLoader(): TSoundLoader; virtual; abstract; end; -function e_GetSoundLoader(Data: Pointer; Len: Integer): TSoundLoader; overload; +function e_GetSoundLoader(Data: Pointer; Len: LongWord): TSoundLoader; overload; function e_GetSoundLoader(FName: string): TSoundLoader; overload; -procedure e_AddSoundLoader(Loader: TSoundLoader); +procedure e_AddSoundLoader(Loader: TSoundLoaderFactory); implementation var - e_SoundLoaders: array of TSoundLoader; + e_SoundLoaders: array of TSoundLoaderFactory; function e_GetSoundLoader(FName: string): TSoundLoader; overload; var @@ -61,27 +71,27 @@ var begin Result := nil; for I := Low(e_SoundLoaders) to High(e_SoundLoaders) do - if e_SoundLoaders[I].CanLoad(FName) then + if e_SoundLoaders[I].MatchExtension(FName) then begin - Result := e_SoundLoaders[I]; + Result := e_SoundLoaders[I].GetLoader(); break; end; end; -function e_GetSoundLoader(Data: Pointer; Len: Integer): TSoundLoader; overload; +function e_GetSoundLoader(Data: Pointer; Len: LongWord): TSoundLoader; overload; var I: Integer; begin Result := nil; for I := Low(e_SoundLoaders) to High(e_SoundLoaders) do - if e_SoundLoaders[I].CanLoad(Data, Len) then + if e_SoundLoaders[I].MatchHeader(Data, Len) then begin - Result := e_SoundLoaders[I]; + Result := e_SoundLoaders[I].GetLoader(); break; end; end; -procedure e_AddSoundLoader(Loader: TSoundLoader); +procedure e_AddSoundLoader(Loader: TSoundLoaderFactory); begin SetLength(e_SoundLoaders, Length(e_SoundLoaders) + 1); e_SoundLoaders[High(e_SoundLoaders)] := Loader;