![]() |
BASS.dll Probleme
Hallo,
ich habe Probleme mit BASS.dll. Ich möchte ien Programm schreiben, welches 1. von einer Soundkarte Input holt und in ein WAV-File schreibt. 2. Das WAV-File abspilen und die Frequenzen auswerten. Gibt es da keine gute Beschreibung (am libsten aud deutsch) der Funktionen von BASS.dll? Oder kann jemand Beispielroutinen (Source) zur Verfügung stellen? Habe schon tagelang im Forum und Internet gesucht, aber nix gefunden. Wie teile ich dem Record oder Stream mit welches Device er nehmen soll? Die Routinen BASS_SetDevide oder BASS_RecordSetDevice bringen immer FALSE als Returncode. Wie sage ich dem BASS_RecordStart was für ein Datenformat er ausgeben soll? (WAV oder MP3) Hier noch mein Code. Das erzeugt zwar schon ein WAV-File. Aber man kann es nicht abspielen (falsches Format).
Delphi-Quellcode:
Danke für Eure Hilfe.
function StreamProc_Push(channel: HRECORD; buffer: pointer; length: DWord; user: pointer): Boolean; stdcall;
begin Result := true; end; function RecordingCallback(channel: HRECORD; buffer: pointer; length: DWord; user: pointer): Boolean; stdcall; begin Bass_StreamPutData(ChannelOR, buffer, length); Result := true; end; function DuffRecording(handle : HRECORD; const Buffer : Pointer; Length : DWORD; user : Pointer) : Boolean; stdcall; var rueck: Boolean; begin rueck:=False; if Length > 0 then begin fRec.Write(Buffer^, Length); rueck:=True; end; Result:=rueck; end; procedure TForm1.StartAufnahmeClick(Sender: TObject); begin bassret:=BASS_RecordGetDeviceInfo(audioein2, bassinfo); if bassret then begin if BASS_Init(-1, 44100, 0, Handle, nil) then begin if (BASS_RecordInit(-1)) then begin ChannelIR:=BASS_RecordStart(44100, 1, 0, @DuffRecording, nil); if ChannelIR > 0 then begin BASS_ChannelPlay(ChannelIR, FALSE); ChannelOR:=Bass_StreamCreate (44100,1,Bass_Sample_Float,@StreamProc_Push,nil); if ChannelOR > 0 then begin BASS_ChannelPlay(ChannelOR, TRUE); basslauf:=True; StartAufnahme.Visible:=False; StopAufnahme.Visible:=True; if FileExists('E:\DARC\RTTY\Win32\Debug\WAV\Test.mp3') then begin DeleteFile('E:\DARC\RTTY\Win32\Debug\WAV\Test.mp3'); end; fRec:=TFileStream.Create('E:\DARC\RTTY\Win32\Debug\WAV\Test.mp3', fmCreate); // create the file while basslauf do begin sleep(10000); basslauf:=False; end; BASS_ChannelPlay(ChannelIR, FALSE); BASS_ChannelPlay(ChannelOR, FALSE); bassret:=BASS_StreamFree(ChannelOR); bassret:=BASS_RecordFree(); fRec.Free; BASS_Free; StartAufnahme.Visible:=True; StopAufnahme.Visible:=False; end else begin Label2.Caption:='Output Audiostream konnten nicht kreiert werden'; end; end else begin Label2.Caption:='Input Audiorecord konnten nicht kreiert werden'; end; end else begin Label2.Caption:='Input Audiorecord konnten nicht initialisiert werden'; end; end else begin Label2.Caption:='Input Audiodaten konnten nicht initialisiert werden'; end; end else begin Label2.Caption:='Input Audiodevice konnten nicht abgerufen werden'; end; Gruß Jürgen |
AW: BASS.dll Probleme
So wird das nix. Hast Du die Hilfe- und Beispiel-Dateien? Da ist auch etwas zu WMA dabei.
Was Du auf jedenfall benötigst ist ein Encoder.
Delphi-Quellcode:
...
// start recording & encoding procedure TForm1.Start; begin // initialize encoder - let system choose port, max 5 clients ehandle := BASS_WMA_EncodeOpenNetwork(SAMPLERATE, CHANNELS, BASS_WMA_ENCODE_SCRIPT, strtoint(combobox1.Text), 0, 5); { If you want mutible Bitrates then you must do it on this way little Example var Bitrates : array [0..3] of DWORD = (64000,128000,160000,0); ehandle := BASS_WMA_EncodeOpenNetworkMulti(SAMPLERATE, CHANNELS, BASS_WMA_ENCODE_SCRIPT, @Bitrates, 0, 5); } if (ehandle = 0) then begin MessageBox(0, 'Can''t initialize encoding', 'Error', 0); Exit; end; BASS_WMA_EncodeSetTag(ehandle, 'Title', PChar(Edit1.Text), BASS_WMA_TAG_ANSI); // set WMA title tag BASS_WMA_EncodeSetNotify(ehandle, @ClientConnect, 0); // setup client notification time := 0; displaycount := 0; // start recording rchan := BASS_RecordStart(SAMPLERATE, CHANNELS, 0, @RecordingCallback, 0); if (rchan = 0) then begin MessageBox(0, 'Can''t start recording', 'Error', 0); BASS_WMA_EncodeClose(ehandle); Exit; end; Button1.Caption := 'Stop'; Edit1.Enabled := False; Edit1.Color := clBtnFace; ComboBox1.Enabled := False; ComboBox1.Color := clBtnFace; Edit2.Enabled := True; Edit2.Color := clWindow; Timer1.Enabled := True; end; ... |
AW: BASS.dll Probleme
Danke alter Mann,
bin ja auch ein alter Mann (75). Aber Deine Routinen BASS_WMA_Encode ...... sinf bei mir gar nicht in der BASS.pas enthalten. Gruß Jürgen |
AW: BASS.dll Probleme
Liste der Anhänge anzeigen (Anzahl: 1)
Wie schon soooo Alt? Alle Achtung8-)
Schau in den Anhang:-D |
AW: BASS.dll Probleme
Geht das nicht mit der Mediaplayercomponente ganz ohne Bass?
|
AW: BASS.dll Probleme
Leider nicht TommyN.
ich muss mehrmals pro Secunde die Frequenz wissen. Das können die Programme nicht. Gruß Jürgen |
AW: BASS.dll Probleme
Liste der Anhänge anzeigen (Anzahl: 1)
I am sorry, as it seem either i am missing something or no one want to explain or correct me, but for the last time i will engage in this subject
Here a video of FFT from VCP drawing the spectrum for frequencies from Pulse-code modulation (PCM) format, i changed my input device to MixerOut (what you hear) instead of the microphone and used an online tone generator. The file is mp4, the forum is not accepting it without compressing into zip. [ATTACH]VCP_WithToneGenerator[/ATTACH] |
AW: BASS.dll Probleme
Willst Du die Audiodaten in 'realtime' analysieren oder in eine Datei speichern (so hatte ich Deine Frage gelesen)?
Ansonsten WaveInGetDevice WaveInOpen WaveInPrepareHeader WaveInAddBuffer waveInStart Im Callback die Daten einlesen, im Hauptprogramm eine FFT (oder digitale Filter). |
AW: BASS.dll Probleme
Hallo TommyN,
Danke für Deine Nachricht. So hätte ich mir vorgestellt, das die anderen (BASS) es auch gemacht hätten. Die Funktioen aufgelistet. Aber ich hatte schon geschriebe, das die Funktionen von Deinem Vorschlag leider nicht genügen. Ich brache die Werte von Audiofrequenz und Audiolautstärke mehrmals in der Sekunde. Danke und Gruß Jürgen |
AW: BASS.dll Probleme
Hallo TommyN,
wo gibt es diese Routinen? WaveInGetDevice WaveInOpen WaveInPrepareHeader WaveInAddBuffer waveInStart Im BASS.pas sind die ja nicht drin. Gruß Jürgen |
AW: BASS.dll Probleme
Das ist ganz klasisches Windowsdesktop I/O (da wo auch waveInGetDevCaps etc. vorkommt). In Delphi findest Du sie in mmystem.pas, die Doku dazu im Netz.
Das ganze funktioniert erstaunlich gut (und das seit win3.11), halt mit 'unprofessionel hoher' Latenz. |
BASS.dll bin verzweifelt
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Delphi-Gemeinde,
ich bin verzweifelt. Seit 2 Wochen versuche ich meine Soundkarten mit BASS.dll zum laufen zu bringen. Habe mir von der Webseite ![]() Ich habe 3 Soundkarten an meinem Computer. Möchte von Soundkarte 8-USB (Mikroeingang) den Sound in ein WAV-File speichern und gleichzeitig auf einer anderen Soundkarte 6_USB (Lautsprecher) ausgeben. Dazu habe ich nach dem Vorbild von rectest.pas von ![]() Es wird zwar das WAV-File ordentlich erstellt, aber ich höhre kein Sound über den Lautsprecher und das WAV-File bring auch keinen Sound. Hier jetzt mein Code (nur die wichtigen Stellen).
Delphi-Quellcode:
Vielleicht hat jemand eine Idee.
//audioein2:=4;
// 0=intern 1=6-USB 2=intewrn 3=8-USB //audioaus2:=3; // 0=noSound 1=Default 2=intern 3=8-USB 4=6-USB if BASS_Init(audioaus2,44100,0,BASS_DEVICE_SPEAKERS,nil) then begin ChannelOR:=Bass_StreamCreate(44100,2,0,@StreamProc_Out,nil); if ChannelOR > 0 then begin BASS_ChannelPlay(ChannelOR, True); BASS_ChannelSetAttribute(ChannelOR,BASS_ATTRIB_VOL,1); if BASS_RecordInit(audioein2) then begin Def:=audioein2; WaveStream:=TMemoryStream.Create; if (rchan > 0) then rchan := 1; InitDevice(audioein2); if WaveStream.Size > 0 then begin BASS_StreamFree(rchan); WaveStream.Clear; end; 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)); rchan:=BASS_RecordStart(44100, 2, BASS_INPUT_TYPE_MIC and BASS_INPUT_ON, @RecordingCallback, nil); if (rchan > 0) then begin BASS_ChannelPlay(rchan, True); BASS_ChannelSetAttribute(rchan,BASS_ATTRIB_VOL,1); BASS_ChannelStop(ChannelOR); Bass_StreamFree(ChannelOR); BASS_ChannelStop(rchan); if (rchan > 0) then begin if (rchan <> 1) then begin if (BASS_ChannelIsActive(rchan) = 0) then begin rchan := 0; WaveStream.Position := 4; i:=WaveStream.Size - 8; WaveStream.Write(i, 4); i:=i - $24; WaveStream.Position:=40; WaveStream.Write(i, 4); WaveStream.Position:=0; chan:=BASS_StreamCreateFile(True,WaveStream.Memory,0,WaveStream.Size,0); if chan = 0 then begin Label2.Caption:='Fehler erzeugen Filedaten von Audiodaten'; basslauf:=False; end else begin WaveStream.SaveToFile(wavfile); end; end; end; end; bassret:=BASS_RecordFree(); BASS_Free; WaveStream.Free; function StreamProc_Out(channel: HRECORD; buffer: pointer; length: DWord; user: pointer): Boolean; stdcall; begin Result:=True; end; function RecordingCallback(Handle: HRecord; buffer: Pointer; length: DWord; user: Pointer): boolean; stdcall; var rueck: Boolean; begin rueck:=False; if Length > 0 then begin WaveStream.Write(buffer^, length); Bass_StreamPutData(ChannelOR, buffer, length); rueck:=True; end; Result:=rueck; end; Gruß Jürgen |
AW: BASS.dll Probleme
Steht doch oben.
- Daten mit waveInXX samplen - In Zwischenspeicher - Aus Zwischenspeicher über WaveOutXX wiedergeben - Zwischenspeicher als *.wav speichern, je nach länge am Ende oder halt zwischendurch. Da braucht's keine DLL o.ä. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:16 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-2025 by Thomas Breitkreuz