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
 
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
 


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 08:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz