Einzelnen Beitrag anzeigen

Ducksoul

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

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

  Alt 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
  Mit Zitat antworten Zitat