AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bass und Mic Problem

Ein Thema von Bernd29bln · begonnen am 24. Nov 2005 · letzter Beitrag vom 25. Nov 2005
Antwort Antwort
Bernd29bln

Registriert seit: 28. Feb 2005
Ort: Berlin
281 Beiträge
 
Delphi 7 Professional
 
#1

Bass und Mic Problem

  Alt 24. Nov 2005, 23:16
Hallo,

Wenn ich ins Microfon spreche soll gleich eine soundausgabe erfolgen und nicht speichern.

Hiermal der Demo Code von der Bass.DLL.
Delphi-Quellcode:

function RecordingCallback(Handle: HRECORD; buffer: Pointer; length, user: DWord): boolean; stdcall;
begin
    // Copy new buffer contents to the memory buffer
   Form1.WaveStream.Write(buffer^, length);
    // Allow recording to continue
   Result := True;
end;


(* Initialize BASS, form controls, memory stream *)
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  dName: PChar;
begin
   if BASS_GetVersion <> DWord(MAKELONG(2,2)) then
   begin
      MessageDlg('BASS version 2.2 was not loaded!', mtError, [mbOk], 0);
      Halt;
   end;
   if (not BASS_RecordInit(-1)) or (not BASS_Init(-1, 44100, 0, Handle, nil)) then
   begin
      BASS_RecordFree;
      BASS_Free();
      MessageDlg('Cannot start default recording device!', mtError, [mbOk], 0);
      Halt;
   end;
   WaveStream := TMemoryStream.Create;
   i := 0;
   dName := BASS_RecordGetInputName(i);
   while dName <> nil do
   begin
      ComboBox1.Items.Add(StrPas(dName));
      // is this one currently "on"?
      if (BASS_RecordGetInput(i) and BASS_INPUT_OFF) = 0 then
           ComboBox1.ItemIndex := i;
      Inc(i);
      dName := BASS_RecordGetInputName(i);
   end;
    ComboBox1Change(Self);   // display info
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   Action := caFree;
end;


(* Application closing, release stuff *)
procedure TForm1.FormDestroy(Sender: TObject);
begin
   WaveStream.Free;
   BASS_RecordFree;
   BASS_Free;
   BASS_Stop;
end;


(* Start recording to memory *)
procedure TForm1.StartRecording;
var
  i: Integer;
begin
   if ComboBox1.ItemIndex < 0 then Exit;
   if WaveStream.Size > 0 then
    begin   // free old recording
      BASS_StreamFree(chan);
      WaveStream.Clear;
   end;
   // generate header for WAV file
   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;
   WaveStream.Write(WaveHdr, SizeOf(WAVHDR));
   i := 0;
   while BASS_RecordSetInput(i, BASS_INPUT_OFF) do i := i + 1;
   BASS_RecordSetInput(ComboBox1.ItemIndex, BASS_INPUT_ON);
   // start recording @ 44100hz 16-bit stereo
   rchan := BASS_RecordStart(44100, 2, 0, @RecordingCallback, 0);
   if rchan = 0 then
   begin
      MessageDlg('Couldn''t start recording!', mtError, [mbOk], 0);
      WaveStream.Clear;
   end
    else
    begin
      bRecord.Caption := 'Stop';
      bPlay.Enabled := False;
      bSave.Enabled := False;
    end;
end;


(* Stop recording *)
procedure TForm1.StopRecording;
var
   i: integer;
begin
   BASS_ChannelStop(rchan);
   bRecord.Caption := 'Record';
   // complete the WAV header
   WaveStream.Position := 4;
   i := WaveStream.Size - 8;
   WaveStream.Write(i, 4);
   i := i - $24;
   WaveStream.Position := 40;
   WaveStream.Write(i, 4);
   WaveStream.Position := 0;
   // create a stream from the recorded data
   chan := BASS_StreamCreateFile(True, WaveStream.Memory, 0, WaveStream.Size, 0);
   if chan <> 0 then
    begin
      // enable "Play" & "Save" buttons
        bPlay.Enabled := True;
        bSave.Enabled := True;
   end
    else
      MessageDlg('Error creating stream from recorded data!', mtError, [mbOk], 0);
end;


(* Start/stop recording *)
procedure TForm1.bRecordClick(Sender: TObject);
begin
   if BASS_ChannelIsActive(rchan) <> 0
      then StopRecording
      else StartRecording;
end;


(* Play the recorded data *)
procedure TForm1.bPlayClick(Sender: TObject);
begin
   BASS_ChannelPlay(chan, True);
end;


(* Change recording input *)
procedure TForm1.ComboBox1Change(Sender: TObject);
var
   i: Integer;
    r: Boolean;
begin
   // enable the selected input
    r := True;
    i := 0;
    // first disable all inputs, then...
   while r do
    begin
      r := BASS_RecordSetInput(i, BASS_INPUT_OFF);
        Inc(i);
   end;
    // ...enable the selected.
   BASS_RecordSetInput(ComboBox1.ItemIndex, BASS_INPUT_ON);
   UpdateInputInfo;    // update info
end;


procedure TForm1.UpdateInputInfo;
var
   i: DWord;
begin
   i := BASS_RecordGetInput(ComboBox1.ItemIndex);
   TrackBar1.Position := LoWord(i);   // set the level slider
   case (i and BASS_INPUT_TYPE_MASK) of
      BASS_INPUT_TYPE_DIGITAL: Label1.Caption := 'digital';
      BASS_INPUT_TYPE_LINE: Label1.Caption := 'line-in';
      BASS_INPUT_TYPE_MIC: Label1.Caption := 'microphone';
      BASS_INPUT_TYPE_SYNTH: Label1.Caption := 'midi synth';
      BASS_INPUT_TYPE_CD: Label1.Caption := 'analog cd';
      BASS_INPUT_TYPE_PHONE: Label1.Caption := 'telephone';
      BASS_INPUT_TYPE_SPEAKER: Label1.Caption := 'pc speaker';
      BASS_INPUT_TYPE_WAVE: Label1.Caption := 'wave/pcm';
      BASS_INPUT_TYPE_AUX: Label1.Caption := 'aux';
      BASS_INPUT_TYPE_ANALOG: Label1.Caption := 'analog';
   else
      Label1.Caption := 'undefined';
   end;
end;


(* Update rec/playback position display *)
procedure TForm1.PosTimerTimer(Sender: TObject);
begin
   if WaveStream.Size < 1 then Exit;
    if BASS_ChannelIsActive(chan) = BASS_ACTIVE_STOPPED then
       lPos.Caption := IntToStr(WaveStream.Size) else
        lPos.Caption := IntToStr(BASS_ChannelGetPosition(chan)) + ' / ' + IntToStr(WaveStream.Size);
end;


(* Set recording volume *)
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
   BASS_RecordSetInput(ComboBox1.ItemIndex, BASS_INPUT_LEVEL or TrackBar1.Position);
end;


(* Save recorded audio to WAV file *)
procedure TForm1.bSaveClick(Sender: TObject);
begin
   if SaveDialog.Execute then
      WaveStream.SaveToFile(SaveDialog.FileName);
end;
Wie bekomme ich nur eine direkte ausgabe?


Gruss Bernd
Bernd
Es ist keine Schande, nichts zu wissen, wohl aber, nichts lernen zu wollen.
Sokrates
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Bass und Mic Problem

  Alt 24. Nov 2005, 23:36
ich hab zwar keine lösung, aber ich würde gerne einen hinweis machen:
wenn du aufnimmst und dieses in echtzeit wieder abspielst dann wirst du mit "boardmitteln" eine mehr oder weniger große latenz haben. das kann von 3 ms (ASIO treiber) über 40-100ms (schätzwert) (directx) bis hin zu 700ms und mehr (standard windows treiber) gehen!

je nach soundkarte und eingestellten buffer (ganz wichtig) mehr oder weniger.

das heist du hast nacher eine verzögerung drin.
wenn du das nun auch noch selbst durch einen filter jagen willst in delphi, dann hast du dort eventuell auch noch einen buffer der dir auch noch eine latenz addiert.
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Bernd29bln

Registriert seit: 28. Feb 2005
Ort: Berlin
281 Beiträge
 
Delphi 7 Professional
 
#3

Re: Bass und Mic Problem

  Alt 24. Nov 2005, 23:56
Hallo,

Danke Für den Hinweis supermuckl,

Gruss Bernd
Bernd
Es ist keine Schande, nichts zu wissen, wohl aber, nichts lernen zu wollen.
Sokrates
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Bass und Mic Problem

  Alt 25. Nov 2005, 00:47
Moin,

schau dir doch mal hier mein Beispiel an.

MfG
Thorsten
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz