So sieht die abgeänderte Version aus. Jetzt wird der Header nicht jedes mal neu geschrieben. Das war mir heute morgen schon aufgefallen, aber das abzuändern hatte leider nichts gebracht.
Das Problem mit dem Rauschen besteht aber leider immernoch, komischerweise nicht immer, sondern nur manchmal.
Kann es sein, dass aus mir unbekannten Gründen der Stream manchmal vorhandene Daten überschreibt und daher das Rauschen entsteht? Da ich keine Ahnung habe woran das Verhalten überhaupt liegen kann, weiß ich nichmal wie ich das Problem angehen kann
Delphi-Quellcode:
(* Aufnahme Start *)
procedure TFormular.StartRecording;
var
vol: Float;
i, RecPos: Integer;
Flag: DWord;
begin
if WaveStream.Size = 0 then
begin
// 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;
end
else
begin
if Rec_Overwrite.Checked = True then
begin
// hier ab aktueller Position Aufnahme fortsetzen
(*WaveStream.Seek(GetPos, soFromBeginning);
if WaveStream.Position < SizeOf(WaveHDR) then
WaveStream.Seek(SizeOf(WaveHDR)+1, soFromBeginning);
WaveStream.SetSize(WaveStream.Position);
WaveStream.Seek(0, soFromEnd);
Edit1.Text := IntToStr(WaveStream.Size); *)
RecPos := GetPos;
// Zwischenspeicher anlegen
BufStream := TMemoryStream.Create;
BufStream.SetSize(RecPos);
// Wavedaten in Zwischenspeicher kopieren
Move(WaveStream.Memory^,BufStream.Memory^,RecPos);
// WaveStream abschneiden
WaveStream.SetSize(RecPos);
// Wavedaten rückkopieren
Move(BufStream.Memory^,WaveStream.Memory^,RecPos);
BufStream.Free;
// Position setzen
WaveStream.Position := RecPos;
end; // if
if Rec_Passage.Checked = True then
begin
// hier an aktueller Position Passage einfügend
end; // if
end; // if
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
Danke trotzdem,
Duck