| View previous topic :: View next topic |
| Author |
Message |
Cluq Member
Joined: 04 Nov 2004 Posts: 6
|
Posted: 14/11/04 13:00 Post subject: Perfect looping possible? |
|
|
Hi
I'm using the AudioPlayer to play a looping wave file. The looping works, but not perfectly. There is a very small silence before the wave starts over again and I would like it to loop without that silence. I have checked the wave file - it loops perfectly in SoundForge.
This is the simple code I've been using:
-----------------
type
TForm1 = class(TForm)
CheckBox1: TCheckBox;
AudioPlayer1: TAudioPlayer;
procedure AudioPlayer1Deactivate(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.AudioPlayer1Deactivate(Sender: TObject);
begin
AudioPlayer1.Active := checkbox1.Checked;
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
AudioPlayer1.Active := checkbox1.Checked;
end;
------------
Have any of you a better idea to get perfect looping?
Best regards,
Cluq. |
|
| Back to top |
|
 |
Kambiz Administrator

Joined: 07 Mar 2003 Posts: 422 Location: Tehran, Iran
|
Posted: 14/11/04 16:27 Post subject: |
|
|
Hi,
You can use LiveAudioPlayer. In the event hanlder for supplying the wave data, you can specify the number of loops.
Cheers,
Kambiz |
|
| Back to top |
|
 |
Cluq Member
Joined: 04 Nov 2004 Posts: 6
|
Posted: 15/11/04 08:32 Post subject: |
|
|
Ok, thank you very much.
I've been looking at the LiveAudioPlayer Demo (the receiver part). I get the part that the variable WaveFormat is where the actual wave data is loaded into, right? But how would you go about loading wave data from a local wave-file on your harddrive?
/Cluq |
|
| Back to top |
|
 |
Kambiz Administrator

Joined: 07 Mar 2003 Posts: 422 Location: Tehran, Iran
|
Posted: 15/11/04 09:12 Post subject: |
|
|
Use a TWaveStorage instance.
| Code: | procedure TForm1.LiveAudioPlayer1Format(Sender: TObject;
out pWaveFormat: PWaveFormatEx; var FreeIt: Boolean);
begin
FreeIt := False;
pWaveFormat := WaveStorage1.Wave.WaveFormat;
end;
function TForm1.LiveAudioPlayer1DataPtr(Sender: TObject;
out Buffer: Pointer; var NumLoops: Cardinal;
var FreeIt: Boolean): Cardinal;
begin
FreeIt := False;
NumLoops := $FFFFFFFF; // infinite
Buffer := WaveStorage1.Wave.Data;
Result := WaveStorage1.Wave.DataSize;
end; |
By the way, set LiveAudioPlayer.BufferCount to 1 and LiveAudioPlayer.BufferInternally to False. |
|
| Back to top |
|
 |
Cluq Member
Joined: 04 Nov 2004 Posts: 6
|
Posted: 15/11/04 12:14 Post subject: |
|
|
Ahh...of course...I'll be trying that out...
Btw, if I get positive results from this, I will most likely use this in my freeware game I'm writing... It is almost done, except for the sound. I have been using another unit for playing sound, but it had memory leaks and other crappy things wrong with it, so I'm looking for a better unit.
But this is looking quite nice so far...
/Cluq |
|
| Back to top |
|
 |
Cluq Member
Joined: 04 Nov 2004 Posts: 6
|
Posted: 16/11/04 09:24 Post subject: |
|
|
I have now done exactly as you said, but the sound doesn't loop. It only play once... LiveAudioPlayer.Active remains true - there is just silence...
The audio file is PCM 44,100 kHz, 16bit, Stereo... |
|
| Back to top |
|
 |
Cluq Member
Joined: 04 Nov 2004 Posts: 6
|
Posted: 17/11/04 11:38 Post subject: |
|
|
| Have I found a bug? |
|
| Back to top |
|
 |
Kambiz Administrator

Joined: 07 Mar 2003 Posts: 422 Location: Tehran, Iran
|
Posted: 24/11/04 12:02 Post subject: |
|
|
Yes, there's a bug. Open the WaveOut.pas file and look for
| Code: | | WHDR_BEGINLOOP or WHDR_BEGINLOOP |
then replace it with
| Code: | | WHDR_BEGINLOOP or WHDR_ENDLOOP |
By the way, you can leave the NumLoops as zero. Because when a buffer finished, the OnDataPtr event will be raised once more, until your return zero as result. If you set the NumLoops parameter, in the next call of the event you should return zero. So, my prevoius code is wrong.
Solution 1:
| Code: | LiveAudioPlayer1.BufferInternally := False;
procedure TForm1.LiveAudioPlayer1Format(Sender: TObject;
out pWaveFormat: PWaveFormatEx; var FreeIt: Boolean);
begin
FreeIt := False;
pWaveFormat := WaveStorage1.Wave.WaveFormat;
end;
function TForm1.LiveAudioPlayer1DataPtr(Sender: TObject;
out Buffer: Pointer; var NumLoops: Cardinal;
var FreeIt: Boolean): Cardinal;
begin
FreeIt := False;
Buffer := WaveStorage1.Wave.Data;
Result := WaveStorage1.Wave.DataSize;
end; |
Solution 2:
| Code: | var
AlreadyFed: Boolean = False;
LiveAudioPlayer1.BufferInternally := False;
procedure TForm1.LiveAudioPlayer1Format(Sender: TObject;
out pWaveFormat: PWaveFormatEx; var FreeIt: Boolean);
begin
FreeIt := False;
pWaveFormat := WaveStorage1.Wave.WaveFormat;
end;
function TForm1.LiveAudioPlayer1DataPtr(Sender: TObject;
out Buffer: Pointer; var NumLoops: Cardinal;
var FreeIt: Boolean): Cardinal;
begin
if not AlreadyFed then
begin
FreeIt := False;
NumLoops := $FFFFFFF; // Infinite
Buffer := WaveStorage1.Wave.Data;
Result := WaveStorage1.Wave.DataSize;
AlreadyFed := True;
end
else
Result := 0;
end; |
I'm sorry for being so late. |
|
| Back to top |
|
 |
|