Registriert seit: 19. Apr 2006
Ort: Ilmenau
87 Beiträge
RAD-Studio 2009 Pro
|
Re: "bass.dll" Aufnahme an beliebiger Stelle im St
7. Sep 2008, 15:05
Hm ne, das hat mir ausnahmsweise mal nicht geholfen..
Also momentan sieht es bei mir folgendermaßen aus:
Callback-Routine:
Delphi-Quellcode:
(* Callback *)
function RecordingCallback( Handle: HRECORD; buffer: Pointer; length, user: DWord): boolean; stdcall;
begin
// Kopiere neuen Bufferinhalt in den Memory Buffer
Formular.WaveStream. Write(buffer^, length);
// Weiteres Aufnehmen erlauben
Result := True;
end; // function Callback
Start der Aufnahme:
Delphi-Quellcode:
(* Aufnahme Start *)
procedure TFormular.StartRecording;
var
vol: Float;
i: Integer;
Flag: DWord;
begin
// Aufnahme je nach Aufnahmemodus
if WaveStream.Size = 0 then
begin
end
else
begin
if Rec_Passage.Checked = True then
begin
try
// ín aufgenommenen Stream eine Passage nach aktueller
// Position einfügen
except
end;
end
else
begin
(*WaveStream.Position := GetPos;
Edit1.Text := IntToStr(WaveStream.Position);
BufStream := TMemoryStream.Create;
BufStream.CopyFrom(WaveStream, WaveStream.Position);
BASS_ChannelStop(chan);
BASS_ChannelStop(rchan);
BASS_StreamFree(chan);
BASS_StreamFree(rchan);
WaveStream := nil;
WaveStream := TMemoryStream.Create;
WaveStream.CopyFrom(BufStream, 0);
FreeAndNil(BufStream);*)
// alles nach aktueller Position löschen und dort Aufnahme
// fortführen
try
except
end;
end; // if
end;
// Header für WAV-File generieren
with WaveHdr do
begin
riff := 'RIFF';
len := 36;
cWavFmt := 'WAVEfmt ';
dwHdrLen := 16;
wFormat := 1;
wNumChannels := 2;
dwSampleRate := 44100;
wBlockAlign := 4;
dwBytesPerSec := 176400;
wBitsPerSample := 16;
cData := 'data';
dwDataLen := 0;
end; // with
WaveStream.Write(WaveHdr, SizeOf(WAVHDR));
i := 0;
vol := RecordPegelBar.Position/100;
while BASS_RecordSetInput(i, BASS_INPUT_OFF, vol)
do i := i + 1;
// ---LoWord-- ----HiWord----
Flag := MakeLong(c16BitAudio, cRecordingTime);
// Aufnahmebeginn @ 44100hz 16-bit stereo
rchan := BASS_RecordStart(cSamplerate,
cNumChannels,
Flag,
@RecordingCallback,
nil);
if rchan = 0
then begin
MessageDlg('Aufnahme konnte nicht gestartet werden!',
mtError, [mbOk], 0);
WaveStream.Clear;
end;
end; // procedure StartRecording
Beenden der Aufnahme:
Delphi-Quellcode:
(* Stop recording *)
procedure TFormular.StopRecording;
var
i: integer;
begin
BASS_ChannelStop(rchan);
// 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;
if Rec_Passage.Checked = True then
begin
try
finally
end;
end; // if
// Stream für aufgenomme Daten kreieren
chan := BASS_StreamCreateFile(True, WaveStream.Memory, 0, WaveStream.Size, 0);
if chan <> 0
then begin
//???
end
else begin
MessageDlg('Fehler beim Erstellen eines Streams aus der Aufnahme!',
mtError, [mbOk], 0);
end; // if
end; // procedure StopRecording
(* RecordButtonClick || Start Aufnahme *)
procedure TFormular.RecExecute(Sender: TObject);
begin
if BASS_ChannelIsActive(rchan) = BASS_Active_Stopped then // Aufnahme starten
begin
if BASS_ChannelIsActive(chan) <> BASS_Active_Stopped then
begin
BASS_ChannelStop(chan);
//ProgressBar.Position := ProgressBar.Max;
StartRecording;
end
else
begin
//ProgressBar.Position := ProgressBar.Max;
StartRecording;
end; // if
RecToggleStatus(8);
end
else if BASS_ChannelIsActive(rchan) = BASS_Active_Playing then // Aufnahme beenden
begin
StopRecording;
RecToggleStatus(3);
end;
end; //procedure RecExecute
Es kann doch eigentlich nich so schwer sein beim Start der Aufnahme vom vorhandenen Stream alles aber der aktuellen Position des Streams zu löschen und dort die Aufnahme fortzuseten, oder doch?
MfG Ducksoul
Franz
|
|
Zitat
|