224 lines
4.8 KiB
ObjectPascal
224 lines
4.8 KiB
ObjectPascal
(*
|
|
this file is a part of audio components suite v 2.3.
|
|
copyright (c) 2002-2005 andrei borovsky. all rights reserved.
|
|
see the license file for more details.
|
|
you can contact me at mail@z0m3ie.de
|
|
*)
|
|
|
|
{
|
|
$Log: acs_streams.pas,v $
|
|
Revision 1.5 2006/08/31 20:10:54 z0m3ie
|
|
*** empty log message ***
|
|
|
|
Revision 1.4 2006/07/04 17:12:45 z0m3ie
|
|
ACS 2.4 alt wiederhergestellt (unterschiedliche Sampleformate ...)
|
|
|
|
Revision 1.1 2005/12/19 18:34:35 z0m3ie
|
|
*** empty log message ***
|
|
|
|
Revision 1.4 2005/12/04 16:54:34 z0m3ie
|
|
All classes are renamed, Style TACS... than T... to avoid conflicts with other components (eg TMixer is TACSMixer now)
|
|
|
|
Revision 1.3 2005/11/27 16:50:33 z0m3ie
|
|
add ACS VolumeQuerry
|
|
make ACS_VolumeQuerry localizeable
|
|
some little errorfixes (buffersize for linuxdrivers was initially 0)
|
|
make TAudioIn workable
|
|
|
|
Revision 1.2 2005/09/13 21:54:11 z0m3ie
|
|
acs is localizeable now (ACS_Strings)
|
|
|
|
Revision 1.1 2005/09/12 22:04:52 z0m3ie
|
|
modified structure again, fileformats are now in an sperat folder.
|
|
all File In/Out classes are capsulated from TFileIn and TFileOut
|
|
|
|
Revision 1.2 2005/08/22 20:17:01 z0m3ie
|
|
changed Headers to log
|
|
changed mail adress
|
|
|
|
}
|
|
|
|
|
|
unit acs_streams;
|
|
|
|
{$ifdef fpc}
|
|
{$mode delphi}
|
|
{$endif}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, ACS_Classes, ACS_Strings;
|
|
|
|
const
|
|
|
|
OUTBUF_SIZE = $4000;
|
|
|
|
|
|
type
|
|
|
|
TACSStreamOut = class(TACSStreamedOutput)
|
|
private
|
|
function GetSR : Integer;
|
|
function GetBPS : Integer;
|
|
function GetCh : Integer;
|
|
protected
|
|
procedure Done; override;
|
|
function DoOutput(Abort : Boolean):Boolean; override;
|
|
procedure Prepare; override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
property OutSampleRate : Integer read GetSR;
|
|
property OutBitsPerSample : Integer read GetBPS;
|
|
property OutChannles : Integer read GetCh;
|
|
end;
|
|
|
|
TACSStreamIn = class(TACSStreamedInput)
|
|
private
|
|
FBPS, FChan, FFreq : Integer;
|
|
protected
|
|
function GetBPS : Integer; override;
|
|
function GetCh : Integer; override;
|
|
function GetSR : Integer; override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
function GetData(Buffer : Pointer; BufferSize : Integer): Integer; override;
|
|
procedure Init; override;
|
|
procedure Flush; override;
|
|
published
|
|
property InBitsPerSample : Integer read FBPS write FBPS;
|
|
property InChannels : Integer read FChan write FChan;
|
|
property InSampleRate : Integer read FFreq write FFreq;
|
|
end;
|
|
|
|
|
|
implementation
|
|
|
|
procedure TACSStreamOut.Prepare;
|
|
begin
|
|
if not FStreamAssigned then
|
|
raise EACSException.Create(strStreamObjectnotassigned);
|
|
FInput.Init;
|
|
end;
|
|
|
|
procedure TACSStreamOut.Done;
|
|
begin
|
|
FInput.Flush;
|
|
end;
|
|
|
|
function TACSStreamOut.DoOutput(Abort : Boolean):Boolean;
|
|
var
|
|
Len : Integer;
|
|
P : Pointer;
|
|
begin
|
|
// No exceptions Here
|
|
Result := True;
|
|
if not Busy then Exit;
|
|
if Abort or (not CanOutput) then
|
|
begin
|
|
Result := False;
|
|
Exit;
|
|
end;
|
|
GetMem(P, OUTBUF_SIZE);
|
|
while InputLock do;
|
|
InputLock := True;
|
|
Len := Finput.GetData(P, OUTBUF_SIZE);
|
|
InputLock := False;
|
|
if Len > 0 then
|
|
begin
|
|
Result := True;
|
|
FStream.WriteBuffer(P^, Len);
|
|
end
|
|
else Result := False;
|
|
FreeMem(P);
|
|
end;
|
|
|
|
constructor TACSStreamOut.Create;
|
|
begin
|
|
inherited Create(AOwner);
|
|
end;
|
|
|
|
destructor TACSStreamOut.Destroy;
|
|
begin
|
|
inherited Destroy;
|
|
end;
|
|
|
|
constructor TACSStreamIn.Create;
|
|
begin
|
|
inherited Create(AOwner);
|
|
FBPS := 8;
|
|
FChan := 1;
|
|
FFreq := 8000;
|
|
FSize := -1;
|
|
end;
|
|
|
|
destructor TACSStreamIn.Destroy;
|
|
begin
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TACSStreamIn.Init;
|
|
begin
|
|
if Busy then raise EACSException.Create(strBusy);
|
|
if not Assigned(FStream) then raise EACSException.Create(strStreamObjectnotassigned);
|
|
FPosition := FStream.Position;
|
|
FBusy := True;
|
|
FSize := FStream.Size;
|
|
end;
|
|
|
|
procedure TACSStreamIn.Flush;
|
|
begin
|
|
// FStream.Position := 0;
|
|
FBusy := False;
|
|
end;
|
|
|
|
function TACSStreamIn.GetData(Buffer : Pointer; BufferSize : Integer): Integer;
|
|
begin
|
|
Result := FStream.Read(Buffer^, BufferSize);
|
|
FPosition := FStream.Position;
|
|
// Inc(FPosition, Result);
|
|
if FPosition >= FSize then
|
|
Result := 0;
|
|
end;
|
|
|
|
function TACSStreamOut.GetSR : Integer;
|
|
begin
|
|
if not Assigned(Input) then
|
|
raise EACSException.Create(strInputnotassigned);
|
|
Result := FInput.SampleRate;
|
|
end;
|
|
|
|
function TACSStreamOut.GetBPS : Integer;
|
|
begin
|
|
if not Assigned(Input) then
|
|
raise EACSException.Create(strInputnotassigned);
|
|
Result := FInput.BitsPerSample;
|
|
end;
|
|
|
|
function TACSStreamOut.GetCh : Integer;
|
|
begin
|
|
if not Assigned(Input) then
|
|
raise EACSException.Create(strInputnotassigned);
|
|
Result := FInput.Channels;
|
|
end;
|
|
|
|
function TACSStreamIn.GetBPS : Integer;
|
|
begin
|
|
Result := FBPS
|
|
end;
|
|
|
|
function TACSStreamIn.GetCh : Integer;
|
|
begin
|
|
Result := FChan;
|
|
end;
|
|
|
|
function TACSStreamIn.GetSR : Integer;
|
|
begin
|
|
Result := Self.FFreq;
|
|
end;
|
|
|
|
|
|
end.
|