Autor |
Beitrag |
glotzer
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: Di 17.05.11 19:38
BassLib
Die Klasse kapselt die "bass.dll" und ihre Erweiterungen in mehreren Klassen. Sie ist der direkte Nachfahre von TBassSound allerdings in keinsterweise kompatible.
(veraltet)TBassSound
Die Klasse kapselt die "bass.dll" und ihre Erweiterungen in einer einfach zu nutzenden Klasse.
Ein größer Dank geht an Daniel Gaußmann für sein Tutorial hier.
Unterstützung
getested wurde nur mit Delphi XE 2, es sollte aber ohne Probleme bis Delphi 7(ab version 0.4) oder Delphi 2009(ab 1.0, wegen Generics, das könnte man jedoch ändern, dann sollte es bis Delphi 7 laufen) funktionieren.
Mit Lazarus geht es (noch) nicht, eventuell fällt mir noch was kluges ein.
Bekannte Bugs:
*BassOptions.OutputBufferLength funktioniert nicht. Da weiß ich nochnicht woher der Bug kommt. Wenn wer ne Idee hat, immer her damit.
ToDo:
*Bugfixes
*unterstützung für *.mod musik
*kleine bugs verschwinden lassen die entstehen wenn man z.b. bei BassURLSound versucht vor/zurück zu springen
Zusätzlich benötigt:
bass.dll und Header-Unit (erhältlich hier)
Downloads:
Leider gibt es aufgrund einer Größenbeschränkung der Anhänge hier nur den Quelltext als Anhang, Binarys nur external gehostet.
- V1.2 (BassLib)
- V1.1 (BassLib)
- Hoster 1
- Beispielprogramm (aufgrund von Einschränkungen nicht möglich)
- Units
- Hoster 2
- V1.0 (BassLib)
- V0.6 (TBassSound)
Zitat: |
Changelog
----17.05.2011 0.1
*Erste Version
----18.05.2011 0.2
*Dynamisches Laden der bass.dll ist jetzt möglich
*Bessere Funktion unter älteren Delphis
----20.08.2011 0.3
*Kleine Bugfixe
*Fehler in den Datumsangaben der Versionsgeschichte behoben
*Rückgabewert der funktion "InitBassPlugins" war fehlerhaft, jetzt gefixt
*Verbessete Lazaruskompatibilität
*CPU-Belastung durch Soundausgabe kann jetzt abgefragt werden
----26.08.2011 0.4
*Events "OnLoad", "OnPlay", "OnStop", "OnPause", "OnVolumeChange" hinzugefügt
*Kleine Fehlerbehebungen und Optimierungen
*Die Events "OnProgressChange", "OnEnd", "OnStatusChange" hinzugefügt, allerdings nur verfügbar wenn der Unit das Application.OnIdle event abfragen darf.
----18.09.2011 0.5
*Bug gefixt: "LoadFromStream" funktioniert jetzt
*Neue property: Loop (gibt an ob die datei wiederholt werden soll)
*Auslösen der Change events verbessert
*Fehler im Beispielprogramm behoben
*Fehler in LoadFromStream behoben
----20.09.2011 0.6
*OnEnd verbessert, es verwendet jetzt die BASS syncs dafür
*LoadFromResource hinzugefügt
*LoadFromMemory hinzugefügt
*LoadFromStream in LoadFromBufferdStream umbenannt
*LoadFromStream neu eingeführt, die procedure lädt jett nichtmehr die ganze Datei in den Speicher
*Fehler im Speichermanagment behoben der einen Bluescreen verursachen konnte
*Mehrere Fehler mit AnsiString/String behoben
----09.12.2011 1.0
*Komplette überarbeitung der Klasse
*Aufteilung auf mehrere Klassen
*Events benötigen kein Application.OnIdle mehr
*Events müssen jetzt Thread-save sein
*Beispielprogramm erweitert
*Die GUI des Beispielprogramm verbessert
*Manche Sachen, besonders das Device handeling ist noch buggy.
*Recording geht noch nicht
----05.3.2011 1.1
*Output devices funktionieren jetzt, channeln können jetzt zur Laufzeit andere Ausgänge verwenden.
*Beispielprojekt verbessert um alle neuen Features zu verwenden.
*Viele Compiler Warnungen behoben
----31.8.2011 1.2
*Sehr viele Fehler behoben
*Mit Recordingunterstützung angefangen
*DeviceManager überarbeited und jetzt voll funktionsfähig
*BassCallbackSound hinzugefügt
|
Einloggen, um Attachments anzusehen!
_________________ ja, ich schreibe grundsätzlich alles klein und meine rechtschreibfehler sind absicht
Zuletzt bearbeitet von glotzer am Mi 01.08.12 18:11, insgesamt 45-mal bearbeitet
|
|
jaenicke
Beiträge: 19288
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 18.05.11 05:04
glotzer hat folgendes geschrieben : | Die Klasse kapselt die "bass.dll" und ihre erweiterungen in einer einfach zu nutzenden Klasse. |
Ja, sie ist sehr klein und dadurch für Einsteiger leichter zu verstehen als die großen Wrapperklassen, die teilweise auch nicht mehr für neuere Delphiversionen funktionieren.
Delphi habe ich gerade nicht zur Hand, deshalb kann ich es gerade nicht ausprobieren, aber der Aufbau der Klasse sieht gut aus.
glotzer hat folgendes geschrieben : | getested wurde nur mit Delphi XE, es sollte aber ohne Probleme bis Delphi 3 funktionieren, |
Nein, dort wird es nicht gehen. Bei Delphi 5 fallen mir zwei Sachen auf:
Delphi-Quelltext 1: 2:
| TBassSoundStatus = (BSS_STOPPED = 0, BSS_PLAYING = 1, BSS_STALLED = 2, BSS_PAUSED = 3); IncludeTrailingPathDelimiter | Werte für die Enumerationskonstanten vorzugeben, ging erst ab Delphi 6 oder 7.
Bei Delphi 5 gab es auch nur IncludeTrailingBackslash, da hat man noch nicht an andere Plattformen gedacht.
Mehr fällt mir da nicht auf, wenn man das ändert, sollte es kompilieren.
Bei Delphi 3 fehlen Int64, LongWord (ersetzbar durch DWORD, das gab es schon) sowie dynamische Arrays (CodingHistory) bereits in der bass.pas selbst. Zusätzlich gehen bei deinem Quelltext auch keine Standardwerte für Methodenparameter. Und IncludeTrailingBackslash gab es da noch gar nicht.
glotzer hat folgendes geschrieben : | prinzipiel sollte es auch mit Lazarus gehen. |
Nein, denn implizite Pointer funktionieren so nicht und Rückgabewerte müssen auch bei der Implementierung der Methode angegeben werden. Wobei ich die fehlenden Rückgabewerte auch unter Delphi für extrem unsauber halte... glotzer hat folgendes geschrieben : | Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| function TBassSound.GetStatus; begin
for a := 0 to Info.formatc - 1 do begin Filter := Filter + Info.Formats[a].exts; end; | |
Die Pointer müssen bei Lazarus explizit geschrieben werden. Das mache ich im Übrigen auch bei Delphi so, damit man auch sieht, dass es welche sind: Delphi-Quelltext 1: 2: 3: 4: 5:
| for a := 0 to Info^.formatc - 1 do begin Filter := Filter + Info^.Formats^[a].exts; end; | Dennoch lässt sich beides nachahmen, wenn man in den Delphimode schaltet, denn sollte es ohne Änderungen gehen. Aber ich würde es lieber richtig schreiben.
Die bass.pas geht aber schon aufgrund dieses Konstrukts nicht: Delphi-Quelltext 1: 2: 3: 4:
| const STREAMPROC_DUMMY : STREAMPROC = STREAMPROC(0); STREAMPROC_PUSH : STREAMPROC = STREAMPROC(-1); | Eine Funktionskonstante, die als Wert einen gecasteten Integerwert bekommt...
Das geht so gar nicht, auch nicht im Delphimodus. Da ich es gerade nicht testen kann, weiß ich nicht, ob es an der Stelle eine Alternative gibt.
Fazit:
Lazarus geht nur mit Änderungen an der bass.pas selbst, Delphi ab Version 5 mit kleinen Änderungen und ab Delphi 6 oder 7 ohne Änderungen.
Wie wäre es eigentlich, wenn du die dynamische Version der Bass-Unit unterstützt? Die liegt im Bass-Paket unter dynamic oder so und erlaubt die dynamische Einbindung der DLL, so dass man im Programm darauf reagieren kann, wenn diese nicht da ist, statt dass das Programm nicht startet.
Dafür fehlt im Grunde nur das Laden der DLL mit Load_BASSDLL und das Entladen mit Unload_BASSDLL, sowie die entsprechende Fehlerbehandlung. Und ich denke, dass das schon viele interessieren wird.
|
|
glotzer
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: Mi 18.05.11 15:38
Danke für das Feedback,
klingt alles sehr gut, werd mich später mal drann setzen und es alles einbauen
_________________ ja, ich schreibe grundsätzlich alles klein und meine rechtschreibfehler sind absicht
|
|
glotzer
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: Mi 18.05.11 18:07
Neue Version online, ich glaub ich hab alle Ideen von dir drinnen,
morgen bau ich dann noch die Tags ein, allerdings in einer abgeleiteten Klasse,
da ich die "Basisklasse" so klein wie möglich und aud fas wirklich nötigste reduzierrt lassen will.
Edit: fast, die pointer sind mir entgangen, das kommt in der nächsten Version.
_________________ ja, ich schreibe grundsätzlich alles klein und meine rechtschreibfehler sind absicht
|
|
ALF
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Sa 21.05.11 23:40
Find ich auch sehr gut!
Nur ne Frage, oder Vorschlag.
In Deiner
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| class procedure TBassSound.InitBass{$IFDEF DYNAMIC_BASS_LOAD}(const DLLName:String = 'bass.dll'){$ENDIF}; begin .... .... .... if not BASS_Init(-1, 44100, 0, 0, nil) then ..... .... .... end; |
Gibt es keine Auswahlmöglichkeit, falls man 2 Soundkarten hat oder wenn man mehrere LP, also 7.1 ansteuern will.
Gut kann man auch selber noch machen, währe doch aber ein Futures wert
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
glotzer
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: So 22.05.11 00:10
danke für das feedback, die idee klingt gut,
bei zeiten werd ich mich drumm kümmern
_________________ ja, ich schreibe grundsätzlich alles klein und meine rechtschreibfehler sind absicht
|
|
herr-master
Beiträge: 34
|
Verfasst: Di 31.05.11 17:19
Schau dir den anhang mal an das ist eine dynamische bass.pas wo die bass.dll nicht benötigt wird.
Leider nicht für delphi xe angepasst sollte aber schnell gemacht sein.
Einloggen, um Attachments anzusehen!
|
|
glotzer
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: Di 31.05.11 17:39
hmmmmm das sieht toll aus, hat nur leider ein paar Probleme:
das laden von Plugins ist damit nicht möglich,
bin mir nicht sicher ob es Probleme mit dem Copyright gibt.
aber ich werd mal schauen obs was wird.
Sorry das es mit den Updates so lange dauert, aber das real-life macht zurzeit viel Arbeit...
_________________ ja, ich schreibe grundsätzlich alles klein und meine rechtschreibfehler sind absicht
|
|
herr-master
Beiträge: 34
|
Verfasst: Di 31.05.11 17:45
Das laden ist möglich nur muss man dan für fast jedes plugin eine dynamische pas erstellen was bei den ersten 5 - 8 plugins noch geht
bei bass_enc geht es leider nicht.
Da man erst die bass.dll vor allem anderen laden muss was die dllloader.pas leider nicht unterstützt.
Was ist mit bass_musicload willst du das noch einbauen?
Sonst sieht es sehr gut aus was du da erstellt hast.
|
|
glotzer
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: Di 31.05.11 18:11
Mir ist noch nicht ganz klar wofür man bass_musicload eigentlich braucht.
Falls ich das noch rausfinde werd ichs entscheiden :p
_________________ ja, ich schreibe grundsätzlich alles klein und meine rechtschreibfehler sind absicht
|
|
ALF
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 31.05.11 18:19
glotzer hat folgendes geschrieben : | Mir ist noch nicht ganz klar wofür man bass_musicload eigentlich braucht.
Falls ich das noch rausfinde werd ichs entscheiden :p |
Look en.wikipedia.org/wiki/MOD_(file_format)
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
herr-master
Beiträge: 34
|
Verfasst: Di 31.05.11 18:23
Hier BASS_MusicLoad Loads a MOD music file; MO3 / IT / XM / S3M / MTM / MOD / UMX formats.
Diese formate werden oft in keyg..... oder pat.... benutzt , ich schreibe die zweich sachen nicht aus da ich glaube das verstößt hier gegen die forum regeln.Man kann diese sachen auch z.b benutzen wenn man beim start der mainform einen sound hören will oder im about da diese tracker nicht sehr groß sind und nur max 2 min lang sind.
Hm leider scheint mich deine unit nicht zu mögen ich bekomme bei diesem code hier immer eine zugriffsverletzungs msg zu sehen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| procedure TForm1.btnLoadClick(Sender: TObject); begin if dlgOpensong.Execute then sound.LoadFromFile(dlgOpensong.FileName);
end;
procedure TForm1.btnPlayClick(Sender: TObject); begin sound.Play(False); end;
procedure TForm1.FormCreate(Sender: TObject); begin sound.Create; sound.InitBass(); end;
procedure TForm1.FormDestroy(Sender: TObject); begin sound.Free; sound.DeInitBass; end; |
hier die meldung:
Erste Gelegenheit für Exception bei $7C812AFB. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 004B7865 in Modul 'test.exe'. Schreiben von Adresse 0000000C'. Prozess test.exe (3824)
Zuletzt bearbeitet von herr-master am Di 31.05.11 18:59, insgesamt 2-mal bearbeitet
|
|
glotzer
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: Di 31.05.11 18:26
Das klingt nicht so als ob es jemals irgendjemand brauchen würde :p
ich schau mal wieviel arbeit es wäre
_________________ ja, ich schreibe grundsätzlich alles klein und meine rechtschreibfehler sind absicht
|
|
herr-master
Beiträge: 34
|
Verfasst: Do 23.06.11 17:44
Da musst du doch nicht viel anpassen wenn ich mir den source so anschaue.
Hier mal wie man es machen könnte:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TbassSound.MusicLoad(Path:Ansistring); var f:Pansichar; begin freeSound; FFreeMemAfter := false; f:=Pansichar(path); handle:=BASS_MusicLoad(False,f,0,0,0{$IFDEF UNICODE} or BASS_UNICODE{$ENDIF},Nil); if Handle = 0 then BassError(BASS_ErrorGetCode); FSource:=BSSo_File; end; |
|
|
glotzer
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: Do 23.06.11 18:04
yep das sieht gut aus irgendwann hat ich mal vor das ganze weiter zu entwickeln, aber zurzeit bin ich mit was anderen beschäftigt, wrd wohl noch ein bischen dauern
_________________ ja, ich schreibe grundsätzlich alles klein und meine rechtschreibfehler sind absicht
|
|
glotzer
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: Do 23.06.11 18:40
_________________ ja, ich schreibe grundsätzlich alles klein und meine rechtschreibfehler sind absicht
|
|
herr-master
Beiträge: 34
|
Verfasst: Do 23.06.11 20:53
Werde es gleich mal testen und das was ich hinzugefügt habe auch.Ich schaue mal ob ich sie für mich auch weiter entwickeln kann deine
klassenkapselung.
Weil wie gesagt ist recht gut aufgebaut und sehr leicht zu benutzen weitere sachen einzubauen sollte allso nicht so schwer sein.
Es geht allso so spielt die unit von glotzer(fastracker module ab)
Delphi-Quelltext 1:
| sound.musicload(opendialog.filename); |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TbassSound.MusicLoad(Path:string); var f:Pchar; begin freeSound; FFreeMemAfter := false; f:=Pchar(path); handle:=BASS_MusicLoad(False,f,0,0,0{$IFDEF UNICODE} or BASS_UNICODE{$ENDIF},0); if Handle = 0 then BassError(BASS_ErrorGetCode); FSource:=BSSo_File; end; |
Und hier noch eine veränderung.
Delphi-Quelltext 1:
| 357 Filter := 'mp3;*.mp2;*.mp1;*.ogg;*.wav*;*.aif;*.it;*.xm;*.mod,*.s3m'; |
Und hier ein weiteres future von mir für diese unit:
Delphi-Quelltext 1: 2: 3: 4: 5:
| function TbassSound.cpu:string; begin result:=FloatToStrF(BASS_GetCPU,ffFixed, 4, 2) + '%'; end; |
|
|
glotzer
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: Sa 27.08.11 00:32
sooo, nach langer Zeit gibt es mal ein Update:
Zitat: |
----20.08.2011 0.3
*Kleine Bugfixe
*Fehler in den Datumsangaben der Versionsgeschichte behoben
*Rückgabewert der funktion "InitBassPlugins" war fehlerhaft, jetzt gefixt
*Verbessete Lazaruskompatibilität
*CPU-Belastung durch Soundausgabe kann jetzt abgefragt werden
----26.08.2011 0.4
*Events "OnLoad", "OnPlay", "OnStop", "OnPause", "OnVolumeChange" hinzugefügt
*Kleine Fehlerbehebungen und Optimierungen
*Die Events "OnProgressChange", "OnEnd", "OnStatusChange" hinzugefügt, allerdings nur verfügbar wenn der Unit das Application.OnIdle event abfragen darf.
|
Zusätzlich gibt es jetzt auch ein Beispielprogramm.
Hat noch wer Ideen/wünsche was in die Klasse nach reinsollte? Wäre üver Feedback dankbar.
_________________ ja, ich schreibe grundsätzlich alles klein und meine rechtschreibfehler sind absicht
|
|
herr-master
Beiträge: 34
|
Verfasst: Sa 17.09.11 18:46
Hm deine änderungen haben die basssound.pas er ruiniert da sie jetzt nicht mal mehr die sounds lädt.
Das ligt an dem raiseplay <-- raise ist ein fehler in delphi allso raise excption da hin kommt man doch erst wenn irgend wo im code raise exception auftritt.
Oder muss ich erst {$define HookAppIdleEvent} in meine form schreiben das er was abspielt.
Selbst deine sound test demo spielt kein sound ab.
Ich benutze die neuste bass.pas(2.4.8.1).
|
|
glotzer
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: Sa 17.09.11 19:02
Das klingt irgendwie komisch. ich schau mir das in so einer stunde mal genau an. Hab grad keine Zeit.
_________________ ja, ich schreibe grundsätzlich alles klein und meine rechtschreibfehler sind absicht
|
|
|