AGB  ·  Datenschutz  ·  Impressum  







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

BASS.dll Probleme

Ein Thema von juelin · begonnen am 20. Mai 2024 · letzter Beitrag vom 25. Mai 2024
Antwort Antwort
juelin

Registriert seit: 9. Mai 2006
Ort: Mannheim
142 Beiträge
 
Delphi XE5 Professional
 
#1

BASS.dll Probleme

  Alt 20. Mai 2024, 15:52
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:
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;
Danke für Eure Hilfe.

Gruß
Jürgen
Jürgen Linder
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
948 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: BASS.dll Probleme

  Alt 20. Mai 2024, 19:14
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;
...
  Mit Zitat antworten Zitat
juelin

Registriert seit: 9. Mai 2006
Ort: Mannheim
142 Beiträge
 
Delphi XE5 Professional
 
#3

AW: BASS.dll Probleme

  Alt 20. Mai 2024, 19:49
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
Jürgen Linder
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
948 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: BASS.dll Probleme

  Alt 20. Mai 2024, 20:30
Wie schon soooo Alt? Alle Achtung
Schau in den Anhang
Angehängte Dateien
Dateityp: zip Bass2.4.13.8.zip (3,72 MB, 20x aufgerufen)
  Mit Zitat antworten Zitat
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
265 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: BASS.dll Probleme

  Alt 20. Mai 2024, 21:15
Geht das nicht mit der Mediaplayercomponente ganz ohne Bass?
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de
  Mit Zitat antworten Zitat
juelin

Registriert seit: 9. Mai 2006
Ort: Mannheim
142 Beiträge
 
Delphi XE5 Professional
 
#6

AW: BASS.dll Probleme

  Alt 21. Mai 2024, 19:51
Leider nicht TommyN.
ich muss mehrmals pro Secunde die Frequenz wissen.
Das können die Programme nicht.
Gruß
Jürgen
Jürgen Linder
  Mit Zitat antworten Zitat
juelin

Registriert seit: 9. Mai 2006
Ort: Mannheim
142 Beiträge
 
Delphi XE5 Professional
 
#7

BASS.dll bin verzweifelt

  Alt 25. Mai 2024, 13:00
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 www.un4seen,com die Beispiuelprogramme runter geladen.
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 www.un4seen,com gemacht (siehe Anhang).
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:
//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;
Vielleicht hat jemand eine Idee.
Gruß
Jürgen
Angehängte Dateien
Dateityp: pas Unit1.pas (9,8 KB, 1x aufgerufen)
Jürgen Linder
  Mit Zitat antworten Zitat
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
265 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: BASS.dll Probleme

  Alt 25. Mai 2024, 20:14
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.ä.
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de
  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 09:35 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