![]() |
Bass und Mic Problem
Hallo,
Wenn ich ins Microfon spreche soll gleich eine soundausgabe erfolgen und nicht speichern. Hiermal der Demo Code von der Bass.DLL.
Delphi-Quellcode:
Wie bekomme ich nur eine direkte ausgabe? 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; Gruss Bernd |
Re: Bass und Mic Problem
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. |
Re: Bass und Mic Problem
Hallo,
Danke Für den Hinweis supermuckl, Gruss Bernd |
Re: Bass und Mic Problem
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:08 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