You've already forked lazarus-ccr
fpsound: More improvements and still not working
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2266 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@@ -18,8 +18,8 @@ object Form1: TForm1
|
|||||||
TabOrder = 0
|
TabOrder = 0
|
||||||
end
|
end
|
||||||
object pathEdit: TFileNameEdit
|
object pathEdit: TFileNameEdit
|
||||||
Left = 12
|
Left = 8
|
||||||
Height = 22
|
Height = 25
|
||||||
Top = 13
|
Top = 13
|
||||||
Width = 268
|
Width = 268
|
||||||
FileName = '/home/felipe/Programas/lazarus-ccr/components/fpsound/testsounds/test.wav'
|
FileName = '/home/felipe/Programas/lazarus-ccr/components/fpsound/testsounds/test.wav'
|
||||||
|
@@ -28,7 +28,7 @@ var
|
|||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses fpsound, fpsound_wav;
|
uses fpsound, fpsound_wav, fpsound_openal;
|
||||||
|
|
||||||
{$R *.lfm}
|
{$R *.lfm}
|
||||||
|
|
||||||
|
@@ -25,15 +25,6 @@ type
|
|||||||
|
|
||||||
TOpenALPlayer = class(TSoundPlayer)
|
TOpenALPlayer = class(TSoundPlayer)
|
||||||
private
|
private
|
||||||
{ buffer : Cardinal;
|
|
||||||
sourcepos: array [0..2] of Single=(0.0, 0.0, 0.0);
|
|
||||||
sourcevel: array [0..2] of Single=(0.0, 0.0, 0.0);
|
|
||||||
listenerpos: array [0..2] of Single=(0.0, 0.0, 0.0);
|
|
||||||
listenervel: array [0..2] of Single=(0.0, 0.0, 0.0);
|
|
||||||
listenerori: array [0..5] of Single=(0.0, 0.0, -1.0, 0.0, 1.0, 0.0);
|
|
||||||
Context: PALCcontext;
|
|
||||||
Device: PALCdevice;}
|
|
||||||
//
|
|
||||||
source : TStream;
|
source : TStream;
|
||||||
codec_bs : Longword;
|
codec_bs : Longword;
|
||||||
OPCSoundWasInitialized: Boolean;
|
OPCSoundWasInitialized: Boolean;
|
||||||
@@ -50,7 +41,6 @@ type
|
|||||||
procedure Finalize; override;
|
procedure Finalize; override;
|
||||||
procedure Play(ASound: TSoundDocument); override;
|
procedure Play(ASound: TSoundDocument); override;
|
||||||
procedure AdjustToKeyElement(ASound: TSoundDocument; AKeyElement: TSoundKeyElement);
|
procedure AdjustToKeyElement(ASound: TSoundDocument; AKeyElement: TSoundKeyElement);
|
||||||
//procedure OPCSoundPlayStreamEx(AStream: TStream);
|
|
||||||
procedure alStop;
|
procedure alStop;
|
||||||
function alProcess(ASound: TSoundDocument; AKeyElement: TSoundKeyElement): Boolean;
|
function alProcess(ASound: TSoundDocument; AKeyElement: TSoundKeyElement): Boolean;
|
||||||
function alFillBuffer(ASound: TSoundDocument; AKeyElement: TSoundKeyElement): Integer;
|
function alFillBuffer(ASound: TSoundDocument; AKeyElement: TSoundKeyElement): Integer;
|
||||||
@@ -60,141 +50,6 @@ type
|
|||||||
implementation
|
implementation
|
||||||
|
|
||||||
(*type
|
(*type
|
||||||
TWAVHeader = record
|
|
||||||
RIFFHeader: array [1..4] of AnsiChar;
|
|
||||||
FileSize: longint;
|
|
||||||
WAVEHeader: array [1..4] of AnsiChar;
|
|
||||||
FormatHeader: array [1..4] of AnsiChar;
|
|
||||||
FormatHeaderSize: longint;
|
|
||||||
FormatCode: Word;
|
|
||||||
ChannelNumber: Word;
|
|
||||||
SampleRate: longint;
|
|
||||||
BytesPerSecond: longint;
|
|
||||||
BytesPerSample: Word;
|
|
||||||
BitsPerSample: Word;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function LoadWavStream(Stream: TStream; var format: integer; var data: Pointer;
|
|
||||||
var size: LongInt; var freq: LongInt; var loop: LongInt): Boolean;
|
|
||||||
var
|
|
||||||
WavHeader: TWavHeader;
|
|
||||||
readname: pansichar;
|
|
||||||
name: ansistring;
|
|
||||||
readint: longint;
|
|
||||||
begin
|
|
||||||
Result:=False;
|
|
||||||
|
|
||||||
size:=0;
|
|
||||||
data:=nil;
|
|
||||||
|
|
||||||
//Read wav header
|
|
||||||
stream.Read(WavHeader, sizeof(TWavHeader));
|
|
||||||
|
|
||||||
//Determine SampleRate
|
|
||||||
freq:=WavHeader.SampleRate;
|
|
||||||
|
|
||||||
//Detemine waveformat
|
|
||||||
if WavHeader.ChannelNumber = 1 then
|
|
||||||
case WavHeader.BitsPerSample of
|
|
||||||
8: format := AL_FORMAT_MONO8;
|
|
||||||
16: format := AL_FORMAT_MONO16;
|
|
||||||
end;
|
|
||||||
|
|
||||||
if WavHeader.ChannelNumber = 2 then
|
|
||||||
case WavHeader.BitsPerSample of
|
|
||||||
8: format := AL_FORMAT_STEREO8;
|
|
||||||
16: format := AL_FORMAT_STEREO16;
|
|
||||||
end;
|
|
||||||
|
|
||||||
//go to end of wavheader
|
|
||||||
stream.seek((8-44)+12+4+WavHeader.FormatHeaderSize+4,soFromCurrent); //hmm crappy...
|
|
||||||
|
|
||||||
getmem(readname,4); //only alloc memory once, thanks to zy.
|
|
||||||
//loop to rest of wave file data chunks
|
|
||||||
repeat
|
|
||||||
//read chunk name
|
|
||||||
stream.Read(readname^, 4);
|
|
||||||
name := readname[0]+readname[1]+readname[2]+readname[3];
|
|
||||||
if name='data' then
|
|
||||||
begin
|
|
||||||
//Get the size of the wave data
|
|
||||||
stream.Read(readint,4);
|
|
||||||
size:=readint;
|
|
||||||
//if WavHeader.BitsPerSample = 8 then size:=size+8; //fix for 8bit???
|
|
||||||
//Read the actual wave data
|
|
||||||
getmem(data,size);
|
|
||||||
stream.Read(Data^, size);
|
|
||||||
|
|
||||||
//Decode wave data if needed
|
|
||||||
if WavHeader.FormatCode=$0011 then
|
|
||||||
begin
|
|
||||||
//TODO: add code to decompress IMA ADPCM data
|
|
||||||
end;
|
|
||||||
if WavHeader.FormatCode=$0055 then
|
|
||||||
begin
|
|
||||||
//TODO: add code to decompress MP3 data
|
|
||||||
end;
|
|
||||||
Result:=True;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
//Skip unknown chunk(s)
|
|
||||||
stream.Read(readint,4);
|
|
||||||
stream.Position:=stream.Position+readint;
|
|
||||||
end;
|
|
||||||
until stream.Position>=stream.size;
|
|
||||||
freemem(readname);
|
|
||||||
|
|
||||||
loop:= 0;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure alutLoadWAVFile(fname: string; var format: Integer; var data: Pointer;
|
|
||||||
var size: LongInt; var freq: LongInt; var loop: LongInt);
|
|
||||||
var
|
|
||||||
Stream : TFileStream;
|
|
||||||
begin
|
|
||||||
Stream:=TFileStream.Create(fname,$0000);
|
|
||||||
LoadWavStream(Stream, format, data, size, freq, loop);
|
|
||||||
Stream.Free;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure OPCSoundPlayStreamEx(AStream: TStream);
|
|
||||||
var
|
|
||||||
format: Integer;
|
|
||||||
size: LongInt;
|
|
||||||
freq: LongInt;
|
|
||||||
loop: LongInt;
|
|
||||||
data: Pointer;
|
|
||||||
begin
|
|
||||||
AlSourceStop(source);
|
|
||||||
|
|
||||||
AlGenBuffers(1, @buffer);
|
|
||||||
loop:=0;
|
|
||||||
LoadWavStream(AStream, format, data, size, freq, loop);
|
|
||||||
AlBufferData(buffer, format, data, size, freq);
|
|
||||||
|
|
||||||
if data<>nil then freemem(data);
|
|
||||||
|
|
||||||
AlGenSources(1, @source);
|
|
||||||
AlSourcei(source, AL_BUFFER, buffer);
|
|
||||||
AlSourcef(source, AL_PITCH, 1.0);
|
|
||||||
AlSourcef(source, AL_GAIN, 1.0);
|
|
||||||
AlSourcefv(source, AL_POSITION, @sourcepos);
|
|
||||||
AlSourcefv(source, AL_VELOCITY, @sourcevel);
|
|
||||||
// Under windows, AL_LOOPING = AL_TRUE breaks queueing, no idea why
|
|
||||||
// AlSourcei(source, AL_LOOPING, AL_TRUE);
|
|
||||||
|
|
||||||
AlListenerfv(AL_POSITION, @listenerpos);
|
|
||||||
AlListenerfv(AL_VELOCITY, @listenervel);
|
|
||||||
AlListenerfv(AL_ORIENTATION, @listenerori);
|
|
||||||
AlSourcePlay(source);
|
|
||||||
end;
|
|
||||||
|
|
||||||
{$DEFINE OPC_SOUND_OPENAL_THREAD}
|
|
||||||
|
|
||||||
{$ifdef WINDOWS}uses Windows; {$endif}
|
|
||||||
|
|
||||||
type
|
|
||||||
TOpenALThread = class(TThread)
|
TOpenALThread = class(TThread)
|
||||||
private
|
private
|
||||||
|
|
||||||
@@ -209,61 +64,6 @@ type
|
|||||||
var
|
var
|
||||||
TheLastThread: TOpenALThread;
|
TheLastThread: TOpenALThread;
|
||||||
|
|
||||||
procedure OPCSoundInitialize();
|
|
||||||
begin
|
|
||||||
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure ResetOpenALThread;
|
|
||||||
begin
|
|
||||||
if (TheLastThread <> nil) and (not TheLastThread.Terminated) then
|
|
||||||
begin
|
|
||||||
try
|
|
||||||
{$IFDEF MSWINDOWS}
|
|
||||||
TerminateThread(TheLastThread.Handle, 0);
|
|
||||||
{$ELSE}
|
|
||||||
TheLastThread.Terminate;
|
|
||||||
{$ENDIF}
|
|
||||||
except
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure OPCSoundLoadWavFromStream(AStream: TStream);
|
|
||||||
begin
|
|
||||||
{$IFDEF OPC_SOUND_OPENAL_THREAD}
|
|
||||||
ResetOpenALThread;
|
|
||||||
TheLastThread := TOpenALThread.Create(AStream);
|
|
||||||
{$ELSE}
|
|
||||||
OPCSoundPlayStreamEx(AStream);
|
|
||||||
{$ENDIF}
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure OPCSoundPlay();
|
|
||||||
begin
|
|
||||||
{$IFDEF OPC_SOUND_OPENAL_THREAD}
|
|
||||||
|
|
||||||
{$ELSE}
|
|
||||||
OPCAudioPlayer.OPCSoundOpenALInitialize();
|
|
||||||
OPCAudioPlayer.OPCSoundOpenALPlay();
|
|
||||||
OPCAudioPlayer.OPCSoundOpenALFinalize();
|
|
||||||
{$ENDIF}
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure OPCSoundFinalize();
|
|
||||||
begin
|
|
||||||
{$IFDEF OPC_SOUND_OPENAL_THREAD}
|
|
||||||
ResetOpenALThread;
|
|
||||||
{$ELSE}
|
|
||||||
OPCAudioPlayer.OPCSoundOpenALFinalize();
|
|
||||||
{$ENDIF}
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure OPCSoundPlayStream(AStream: TStream);
|
|
||||||
begin
|
|
||||||
OPCSoundLoadWavFromStream(AStream);
|
|
||||||
end;
|
|
||||||
|
|
||||||
constructor TOpenALThread.Create(aOwner: TStream);
|
constructor TOpenALThread.Create(aOwner: TStream);
|
||||||
begin
|
begin
|
||||||
inherited Create(False);
|
inherited Create(False);
|
||||||
@@ -287,8 +87,6 @@ begin
|
|||||||
OPCSoundPlayStreamEx(FAOwner);
|
OPCSoundPlayStreamEx(FAOwner);
|
||||||
end;*)
|
end;*)
|
||||||
|
|
||||||
///
|
|
||||||
|
|
||||||
procedure TOpenALPlayer.alStop;
|
procedure TOpenALPlayer.alStop;
|
||||||
begin
|
begin
|
||||||
alSourceStop(al_source);
|
alSourceStop(al_source);
|
||||||
@@ -341,11 +139,15 @@ end;
|
|||||||
|
|
||||||
procedure TOpenALPlayer.Initialize;
|
procedure TOpenALPlayer.Initialize;
|
||||||
begin
|
begin
|
||||||
|
// alutInit(0, NULL);
|
||||||
|
|
||||||
|
{ alListenerfv(AL_POSITION,listenerPos);
|
||||||
|
alListenerfv(AL_VELOCITY,listenerVel);
|
||||||
|
alListenerfv(AL_ORIENTATION,listenerOri);}
|
||||||
|
|
||||||
alDistanceModel(AL_INVERSE_DISTANCE_CLAMPED);
|
alDistanceModel(AL_INVERSE_DISTANCE_CLAMPED);
|
||||||
alGenSources(1, @al_source);
|
alGenSources(1, @al_source);
|
||||||
alGenBuffers(al_bufcount, @al_buffers);
|
alGenBuffers(al_bufcount, @al_buffers);
|
||||||
|
|
||||||
GetMem(al_readbuf, al_bufsize);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TOpenALPlayer.Finalize;
|
procedure TOpenALPlayer.Finalize;
|
||||||
@@ -353,13 +155,13 @@ begin
|
|||||||
// finalize openal
|
// finalize openal
|
||||||
alDeleteSources(1, @al_source);
|
alDeleteSources(1, @al_source);
|
||||||
alDeleteBuffers(al_bufcount, @al_buffers);
|
alDeleteBuffers(al_bufcount, @al_buffers);
|
||||||
FreeMem(al_readbuf);
|
if al_readbuf <> nil then FreeMem(al_readbuf);
|
||||||
|
|
||||||
// wave.fStream := nil;
|
// wave.fStream := nil;
|
||||||
// source := nil;
|
// source := nil;
|
||||||
|
|
||||||
// finalize codec
|
// finalize codec
|
||||||
wave.Free;
|
// wave.Free;
|
||||||
|
|
||||||
// close file
|
// close file
|
||||||
// source.Free;
|
// source.Free;
|
||||||
@@ -371,7 +173,18 @@ var
|
|||||||
queued : Integer;
|
queued : Integer;
|
||||||
done : Boolean;
|
done : Boolean;
|
||||||
lKeyElement: TSoundKeyElement;
|
lKeyElement: TSoundKeyElement;
|
||||||
|
//
|
||||||
|
{ buffer : Cardinal;
|
||||||
|
sourcepos: array [0..2] of Single=(0.0, 0.0, 0.0);
|
||||||
|
sourcevel: array [0..2] of Single=(0.0, 0.0, 0.0);
|
||||||
|
listenerpos: array [0..2] of Single=(0.0, 0.0, 0.0);
|
||||||
|
listenervel: array [0..2] of Single=(0.0, 0.0, 0.0);
|
||||||
|
listenerori: array [0..5] of Single=(0.0, 0.0, -1.0, 0.0, 1.0, 0.0);
|
||||||
|
Context: PALCcontext;
|
||||||
|
Device: PALCdevice; }
|
||||||
begin
|
begin
|
||||||
|
Initialize();
|
||||||
|
|
||||||
// First adjust to the first key element
|
// First adjust to the first key element
|
||||||
lKeyElement := ASound.GetFirstSoundElement();
|
lKeyElement := ASound.GetFirstSoundElement();
|
||||||
AdjustToKeyElement(ASound, lKeyElement);
|
AdjustToKeyElement(ASound, lKeyElement);
|
||||||
@@ -404,6 +217,29 @@ begin
|
|||||||
end;
|
end;
|
||||||
Sleep(al_polltime);
|
Sleep(al_polltime);
|
||||||
until done;
|
until done;
|
||||||
|
|
||||||
|
{
|
||||||
|
AlSourceStop(source);
|
||||||
|
AlGenBuffers(1, @buffer);
|
||||||
|
loop:=0;
|
||||||
|
LoadWavStream(AStream, format, data, size, freq, loop);
|
||||||
|
AlBufferData(buffer, format, data, size, freq);
|
||||||
|
|
||||||
|
if data<>nil then freemem(data);
|
||||||
|
|
||||||
|
AlGenSources(1, @source);
|
||||||
|
AlSourcei(source, AL_BUFFER, buffer);
|
||||||
|
AlSourcef(source, AL_PITCH, 1.0);
|
||||||
|
AlSourcef(source, AL_GAIN, 1.0);
|
||||||
|
AlSourcefv(source, AL_POSITION, @sourcepos);
|
||||||
|
AlSourcefv(source, AL_VELOCITY, @sourcevel);
|
||||||
|
// Under windows, AL_LOOPING = AL_TRUE breaks queueing, no idea why
|
||||||
|
// AlSourcei(source, AL_LOOPING, AL_TRUE);
|
||||||
|
|
||||||
|
AlListenerfv(AL_POSITION, @listenerpos);
|
||||||
|
AlListenerfv(AL_VELOCITY, @listenervel);
|
||||||
|
AlListenerfv(AL_ORIENTATION, @listenerori);
|
||||||
|
AlSourcePlay(source);}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TOpenALPlayer.AdjustToKeyElement(ASound: TSoundDocument; AKeyElement: TSoundKeyElement);
|
procedure TOpenALPlayer.AdjustToKeyElement(ASound: TSoundDocument; AKeyElement: TSoundKeyElement);
|
||||||
@@ -432,8 +268,13 @@ begin
|
|||||||
// WriteLn('OpenAL Buffers : ', al_bufcount);
|
// WriteLn('OpenAL Buffers : ', al_bufcount);
|
||||||
// WriteLn('OpenAL Buffer Size : ', al_bufsize);
|
// WriteLn('OpenAL Buffer Size : ', al_bufsize);
|
||||||
|
|
||||||
|
if al_readbuf <> nil then FreeMem(al_readbuf);
|
||||||
|
GetMem(al_readbuf, al_bufsize);
|
||||||
|
|
||||||
alProcess(ASound, AKeyElement);
|
alProcess(ASound, AKeyElement);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
initialization
|
||||||
|
RegisterSoundPlayer(TOpenALPlayer.Create, spOpenAL);
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@@ -7,11 +7,6 @@
|
|||||||
<SearchPaths>
|
<SearchPaths>
|
||||||
<UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
|
<UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
|
||||||
</SearchPaths>
|
</SearchPaths>
|
||||||
<Linking>
|
|
||||||
<Debugging>
|
|
||||||
<DebugInfoType Value="dsDwarf2"/>
|
|
||||||
</Debugging>
|
|
||||||
</Linking>
|
|
||||||
<Other>
|
<Other>
|
||||||
<CompilerPath Value="$(CompPath)"/>
|
<CompilerPath Value="$(CompPath)"/>
|
||||||
</Other>
|
</Other>
|
||||||
|
Reference in New Issue
Block a user