(* Callback RecStream *)
function RecordingCallback(
Handle: HRECORD; buffer: Pointer; length, user: DWord): boolean;
stdcall;
begin
// Kopiere neuen Bufferinhalt in den Memory Buffer
Formular.RecStream.
Write(buffer^, length);
// Weiteres Aufnehmen erlauben
Result := True;
end;
// function Callback WaveStream
(******************************************************************************)
(* Aufnahme Beginnen *)
procedure TFormular.StartRecording;
var
i: Integer;
Flag: DWord;
begin
InsertPos := Round((ProgressBar.Position
* BASS_ChannelGetLength(chan, BASS_POS_BYTE)) / 100);;
RecStream := TMemoryStream.Create;
// ---LoWord-- ----HiWord----
Flag := MakeLong(c16BitAudio, cRecordingTime);
// Aufnahmebeginn @ 44100hz 16-bit stereo
rchan := BASS_RecordStart(cSamplerate,
cNumChannels,
Flag,
@RecordingCallback,
nil);
// Prüfen, ob Aufnahme erfolgreich gestartet
if rchan = 0
then begin
MessageDlg('
Aufnahme konnte nicht gestartet werden!',
mtError, [mbOk], 0);
RecStream.Clear;
end;
// if rchan = 0
end;
// procedure StartRecording
(******************************************************************************)
(* Aufnahme Beenden *)
procedure TFormular.StopRecording;
var
i: integer;
HeaderStream, InsertBufStream: TMemoryStream;
begin
// Aufnahmekanal stoppen
BASS_ChannelStop(rchan);
try
// Header für WAV-File generieren
with WaveHdr
do
begin
wNumChannels := 1;
wBitsPerSample := 16;
wBlockAlign := wNumChannels * (wBitsPerSample
div 8);
dwSampleRate := 44100;
dwBytesPerSec := dwSampleRate * wBlockAlign;
riff := '
RIFF';
len := 36;
cWavFmt := '
WAVEfmt ';
dwHdrLen := 16;
wFormat := 1;
cData := '
data';
dwDataLen := 0;
end;
// with
// Header in Aufnahmestream schreiben
HeaderStream := TMemoryStream.Create;
HeaderStream.
Write(WaveHdr, SizeOf(WAVHDR));
i := 0;
if WaveStream.Size = 0
then
begin
// Aufnahme ohne Header zwischenspeichern
BufStream := TMemoryStream.Create;
RecStream.Seek(0, soFromBeginning);
BufStream.
Write(RecStream.Memory^, RecStream.Size);
WaveStream.
Write(HeaderStream.Memory^, HeaderStream.Size);
WaveStream.
Write(RecStream.Memory^, RecStream.Size);
end
else
begin
InsertBufStream := TMemoryStream.Create;
BufStream.Seek(0, soFromBeginning);
InsertBufStream.
Write(HeaderStream.Memory^, HeaderStream.Size);
InsertBufStream.
Write(BufStream.Memory^, InsertPos-HeaderStream.Size);
InsertBufStream.
Write(RecStream.Memory^, RecStream.Size);
WaveStream.SetSize(InsertBufStream.Size);
Move(InsertBufStream.Memory^, WaveStream.Memory^
, InsertBufStream.Size);
Edit1.Text := IntToStr(InsertPos);
BufStream.SetSize(InsertBufStream.Size - HeaderStream.Size);
InsertBufStream.Seek(HeaderStream.Size, soFromBeginning);
BufStream.
Write(InsertBufStream.Memory^, InsertBufStream.Size - HeaderStream.Size);
InsertBufStream.Free;
end;
(* if Rec_Overwrite.Checked = True then
begin
// hier Streams zusammenfügen /nach aktueller Posi fortfahren
try
BufStream := TMemoryStream.Create;
BufStream.CopyFrom(WaveStream, InsertPos);
BufStream.CopyFrom(RecStream,0);
WaveStream.Position := 0;
WaveStream.CopyFrom(BufStream, 0);
finally
FreeAndNil(BufStream);
end; // try
end; // if Rec_Overwrite.Checked *)
finally
RecStream.Free;
HeaderStream.Free;
end;
(*if Rec_Passage.Checked = True then
begin
// hier BufStream nach neuer Passage anfügen
try
BufStream := TMemoryStream.Create;
BufStream.Write(WaveStream.Memory^, InsertPos);
BufStream.Write(InsertStream.Memory^, InsertStream.Size);
BufStream.Write(PByteArray(WaveStream.Memory)^[InsertPos],WaveStream.Size-InsertPos);
WaveStream.SetSize(BufStream.Size);
Move(BufStream.Memory^, WaveStream.Memory^, BufStream.Size);
finally
FreeAndNil(BufStream);
FreeAndNil(InsertStream);
end; // try
end; // if Rec_Passage.Checked
end; // if InsertRec *)
// WAV-Header komplettieren
WaveStream.Position := 4;
i := WaveStream.Size - 8;
WaveStream.
Write(i, 4);
i := i - $24;
WaveStream.Position := 40;
WaveStream.
Write(i, 4);
WaveStream.Position := 0;
// Wiedergabestream kreieren
chan := BASS_StreamCreateFile(True, WaveStream.Memory, 0, WaveStream.Size, 0);
// Prüfen, ob Wiedergabestream erfolgreich erstellt
if chan = 0
then
MessageDlg('
Fehler beim Erstellen eines Streams aus der Aufnahme!',
mtError, [mbOk], 0);
end;
// procedure StopRecording