Thema: Delphi Bass und Mic Problem

Einzelnen Beitrag anzeigen

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