Einzelnen Beitrag anzeigen

Ducksoul

Registriert seit: 19. Apr 2006
Ort: Ilmenau
87 Beiträge
 
RAD-Studio 2009 Pro
 
#18

Re: "bass.dll" Aufnahme an beliebiger Stelle im St

  Alt 7. Okt 2008, 18:20
Nabend,
ich muss mich leider nochmal melden. Ich weiß einfach nicht woran der Fehler liegen kann. Falls interesse besteht würde ich auch mal den kompletten Source an jemanden schicken, falls das einer mal testen möchte... Das Programm muss diese Woche fertig werden und ich bekomm einfach den Fehler nicht in den Griff....

Hier der aktuelle Code:

Delphi-Quellcode:
  (* 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

Viele Grüße
Franz
  Mit Zitat antworten Zitat