Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 03, 2025 03:53

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Di Sep 11, 2012 18:06 
Offline
DGL Member

Registriert: Di Jun 12, 2012 21:26
Beiträge: 112
Programmiersprache: Delphi
Hallo,

in meiner Delphi-Anwendung spiele ich die Soundeffekte mit Hilfe der bass.dll ab. Das Problem ist, dass (nur) das erste Abspielen anscheinend enorm viel Rechenzeit benötigt, was sich beim ersten Start des Spiels negativ aufs Timing auswirkt (das Spiel "hängt" kurz). Das Problem umgehe ich im Moment, in dem ich beim Start der Anwendung einen Soundeffekt abspiele und sofort stoppe (dadurch ist der Effekt nicht hörbar). Keine elegante Lösung, aber es funktioniert. Das Problem ist eindeutig reproduzierbar. Kennt jemand vielleicht eine bessere Lösung?

Viele Grüße


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Sep 11, 2012 19:47 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
ich habe bereits mit der bass.dll gearbeitet und kenne dieses Problem nicht.
ein bisschen Code wäre ganz sinnvoll, wie initialisierst du den Sound und bass.dll


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 12, 2012 01:35 
Offline
DGL Member

Registriert: Di Jun 12, 2012 21:26
Beiträge: 112
Programmiersprache: Delphi
Code:
  1.  
  2. implementation
  3. Uses Windows, Dynamic_Bass,SysUtils;
  4. Var   strs: array[0..128] of HSTREAM;
  5.        LoadFlag:Boolean;
  6. ...
  7. //Initialisieren
  8. Function StartBass:Boolean;
  9. Var filepath:String;
  10. Begin
  11. Result:=False;
  12. filepath:=ExtractFilePath(ParamStr(0));
  13. IF filepath[Length(FilePath)]<>'' then filepath:=filepath+'';
  14. filepath:=filepath+'bass.dll';
  15. IF FileExists(filepath) then
  16.    BEGIN
  17.    IF (Load_Bassdll(filepath)) then
  18.       BEGIN
  19.       Result:=True;
  20.       IF (HIWORD(BASS_GetVersion) <> BASSVERSION) then
  21.          Result:=False else
  22.       IF not(BASS_Init(-1, 44100, 0, 0, nil))then
  23.          Result:=False;
  24.       IF not(Result) then Unload_Bassdll;
  25.       END;
  26.    END;
  27. LoadFlag:=Result;
  28. End;
  29. //Stream erzeugen
  30. //Playloop => Spielt Sound in Endlosschleife
  31. Procedure LoadMusicData(Dateiname:String; Index:Byte; Playloop:Boolean);
  32. Begin
  33.   IF Playloop then
  34.      strs[Index] := BASS_StreamCreateFile(False, Pchar(Dateiname), 0, 0, BASS_SAMPLE_LOOP) else
  35.      strs[Index] := BASS_StreamCreateFile(False, Pchar(Dateiname), 0, 0, 0);
  36. End;
  37.  
  38. //Soundeffekt abspielen
  39. Function PlayMusic(Index:Byte):Boolean;
  40. Begin
  41. IF LoadFlag then
  42.    Result:= BASS_ChannelPlay(strs[Index], True) else
  43.    Result:=False;
  44. End;
  45.  

Wie schon geschrieben, tritt das Problem auf, sobald ich den "ersten" Soundeffekt im OnIdle-Event abspiele (reproduzierbar). Bei Bedarf kann ich auch mal mein Spiel hochladen.

Viele Grüße


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 12, 2012 11:44 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
Du spielst den ersten Sound in der OnIdle ab?

Das würde ich auch gern mal sehen. Ich werde bei Gelegenheit mal meine Umsetzung hochladen und verlinken, vielleicht siehst du da was.

lg


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 12, 2012 15:03 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Hast du es mal mit einem "normalen" Hauptloop probiert? Mit OnIdle hab ich auch so meine Erfahrungen gemacht und verzichte da schon seit langem drauf. Ich meine sowas :

Code:
  1. procedure TGame.StartMainLoop;
  2. begin
  3.   repeat
  4.     Game.MainLogic;
  5.     Game.SoundManager.Update;
  6.     Application.ProcessMessages;  
  7.   until Quit;
  8. end;
  9.  

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 12, 2012 16:49 
Offline
DGL Member

Registriert: Di Jun 12, 2012 21:26
Beiträge: 112
Programmiersprache: Delphi
Danke für Eure Antworten!
Sascha Willems hat geschrieben:
Hast du es mal mit einem "normalen" Hauptloop probiert?

Habe ich gerade ausprobiert. Löst das Problem leider nicht :(

Das Interessante ist, das sich das Problem wie oben beschrieben umgehen lässt (Ich schätze mal, dass es mit dem Speicher zusammenhängt und ein erneutes Abspielen einfach schneller ist!?). Ohne Bass.dll tritt das Problem nicht auf, also muss/sollte es an der Bass.dll liegen!?

Dropye hat geschrieben:
Du spielst den ersten Sound in der OnIdle ab?

Naja, im Grunde findet das meiste meiner Anwendung im OnIdle-Event statt. Ich wollte nur darauf hinweisen, dass ich das OnIdle-Event nutze (Ich nutze übrigens die ApplicationEvents-Komponente). In den Menüs spielt das Timing jedoch keine besondere Rolle. Soundeffekte gibt es im Moment nur im Spiel selbst, nicht in den Menüs. Ein Soundeffekt kann pro "Frame" einmal abgespielt werden (ein Frame ist bei meinem Spiel die Bewegung eines Elements von einem Feld zum nächsten, wie bei einem Schachbrett. Beim Original gabs noch keine flüssige Grafik).

Ich hab mal die aktuelle Version meines Projekts auf meine Homepage hochgeladen (565 KB):
- Downloadlink entfernt -

Vorgehensweise:
Anwendung starten, auf Select Game gehen, Sounddemo auswählen und anschließend das Spiel starten. Zum Vergleich vor dem Start "Select Cave" wählen (hierbei wird ein Soundeffekt abgespielt) und das Spiel danach starten.

Wie schon geschrieben, gelöst habe ich im Moment das Problem so, dass ich einfach beim Start der Anwendung einen Soundeffekt abspiele und in sofort wieder stoppe (dadurch ist der Effekt nicht hörbar).


Zuletzt geändert von subotai am Do Sep 13, 2012 15:47, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 12, 2012 17:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Bei mir läuft das hier ohne jegliche Verzögerung, evtl. liegts also an deiner Hardware. Ich nutze eine Soundblaster X-Fi, also 100% hardwarebeschleunigt.

Aber warum willst du eigentlich BASS benutzen? Wie wärs denn mit OpenAL als Alternative?

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 12, 2012 18:55 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
hehe das spiel gefällt mir irgendwie :D

ich kann den Fehler leider nicht reproduzieren ich habe ein ASUS Laptop mit Realtek Audio

lg


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 12, 2012 19:42 
Offline
DGL Member

Registriert: Di Jun 12, 2012 21:26
Beiträge: 112
Programmiersprache: Delphi
Vielen Dank Euch beiden fürs Testen :D Dann scheint es wohl wirklich ein Hardware-Problem zu sein. :?

Dropye hat geschrieben:
hehe das spiel gefällt mir irgendwie

Freut mich. :) Mir gefällt die OpenGL-Version wesentlich besser als meine "reine" SDL-Version (ohne OpenGL). Für mich hat sich die Arbeit (jetzt) schon gelohnt, ... und ich bleib am Ball.

Sascha Willems hat geschrieben:
Aber warum willst du eigentlich BASS benutzen? Wie wärs denn mit OpenAL als Alternative?

Ich bin nicht auf die bass.dll fixiert. Ich nutze sie nur schon seit vielen Jahren und bin damit sehr zufrieden. Da war es naheliegend, die bass.dll für mein Projekt zu verwenden. Danke für den Tipp mit OpenAL, werde ich ausprobieren.

Viele Grüße


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Nov 06, 2012 11:51 
Offline
DGL Member

Registriert: Di Jun 12, 2012 21:26
Beiträge: 112
Programmiersprache: Delphi
Ich habe die dumpfe Vermutung, dass das Problem daran liegen könnte, dass ich Streams verwende und keine Samples. Ab und zu tritt auch der Effekt auf, dass manche Sounds etwas leiser und andere wesentlich lauter abgespielt werden. Ich denke, dass das auch damit zusammenhängt. Naja, die Soundeffekte stehen auf meiner Prioritätenliste ganz unten, aber ich werde wohl doch auf die Nutzung von Samples umsteigen.

Ich benutzte die bass.dll übrigens auch deshalb, weil sie direkt Ogg-Vorbis-Dateien unterstützt. Würde ich Wav-Dateien für die Soundeffekte nutzen, hätte ich wesentlich größere Dateien. Für OpenAL oder SDL_Mixer brauche ich wieder zusätzliche Dateien zum Decodieren.

Viele Grüße


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Nov 06, 2012 18:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Dez 03, 2008 12:01
Beiträge: 167
Wohnort: /country/germany
Programmiersprache: C++ / FreeBASIC
subotai hat geschrieben:
Ich benutzte die bass.dll übrigens auch deshalb, weil sie direkt Ogg-Vorbis-Dateien unterstützt. Würde ich Wav-Dateien für die Soundeffekte nutzen, hätte ich wesentlich größere Dateien. Für OpenAL oder SDL_Mixer brauche ich wieder zusätzliche Dateien zum Decodieren.

Die Ogg/Vorbis Bibliotheken direkt zu benutzen ist gar nicht so schlimm wie es scheint. Zumal du durch den Verzicht auf unnötige Features auch dein Programm schön schlank hältst, und vergiss nicht die die Hardwarebeschleunigung und die schöne API von OpenAL ;)

_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Nov 06, 2012 21:42 
Offline
DGL Member

Registriert: Di Jun 12, 2012 21:26
Beiträge: 112
Programmiersprache: Delphi
Ist OpenAL wirklich so gut?
Zitat:
Unless the BASS_SAMPLE_SOFTWARE flag is used, the sample will use hardware mixing if hardware resources are available.

Also direktes Hardware-Mixing über DirectSound wird auch von der bass.dll unterstützt. Wenn es um die Plattformunabhängigkeit geht, so gibt es bass.dll auch für Linux. Von der Dateigröße her ist die bass.dll eher kleiner als OpenAL. Ich habe immer das Gefühl, dass es letztendlich Geschmacksache/Glaubenssache ist, welche Lib man verwendet. Im Endeffekt werden die sich qualitativ nicht viel geben. Einige benutzen hier in ihren Programmen auch Fmod. Bei SDL scheiden sich schließlich auch die Geister. Von den einen wird es hochgelobt (ich übertreib jetzt mal etwas ;-) ), von den anderen wird eher davon abgeraten. Da fällt die Entscheidung wirklich schwer :shock:

Ich werds erstmal mit der Bass.dll ausprobieren, und dann sehen, ob's funktioniert.

Viele Grüße und danke


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Nov 07, 2012 12:11 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Dez 03, 2008 12:01
Beiträge: 167
Wohnort: /country/germany
Programmiersprache: C++ / FreeBASIC
subotai hat geschrieben:
Also direktes Hardware-Mixing über DirectSound wird auch von der bass.dll unterstützt.

Vorsicht, diese Aussage kann man so nicht stehenlassen. DirectSound unterstützt nämlich gar kein Hardware-Mixing mehr! Ab Vista läuft da alles im Software-Mode.
Daher hat Creative damals eine Software namens ALchemy veröffentlicht, die im Prinzip einen DirectSound-zu-OpenAL-Wrapper bereitstellt. Damit war es dann möglich wieder Hardwarebeschleunigung und EAX zu verwenden.
Wenn du OpenAL direkt nutzt, hast du bei allen unterstüzten Soundchips Hardwarebeschleunigung, ansonsten benutzt OpenAL einen Software-Renderer.

subotai hat geschrieben:
Von der Dateigröße her ist die bass.dll eher kleiner als OpenAL.

Wenn ich OpenAL verwende, muss ich keine Dll mitliefern. Ist die bass.dll also auch kleiner als 0 Byte? OpenAL wird einmal installiert, von dem Programm mitgeliefert werden muss nichts mehr (und soll auch gar nicht!).

subotai hat geschrieben:
Ich werds erstmal mit der Bass.dll ausprobieren, und dann sehen, ob's funktioniert.

Klar, das ist natürlich deine Entscheidung. Wenn du bereits Erfahrung mit Bass hast (bzw es dir einfach gefällt) ist dieses Vorgehen durchaus sinnvoll. Ich persönlich würde dir eben zu OpenAL raten, da ich damit durchweg positive Erfahrungen gemacht habe, vor allem wegen der API, die eben sehr OpenGL-ähnlich ist (und damit extrem einfach zu benutzen und nachzuvollziehen). Gerade wenn du sich bewegende, Sound emittierende Objekte im dreidimensionalen Raum hast finde ich OpenAL extrem gut geeignet.
Ich habe auch gesehen, dass Bass MP3 unterstützt. Da wäre ich übrigens vorsichtig damit, wegen der Verwendung von MP3-Decodern in kommerzieller Software gab es früher schon viel Ärger (ich weiß aber nicht inwieweit das nicht-kommerzielle Software betrifft).

_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Nov 07, 2012 21:24 
Offline
DGL Member

Registriert: Di Jun 12, 2012 21:26
Beiträge: 112
Programmiersprache: Delphi
Danke für deine Rückmeldung :)

darkinsanity hat geschrieben:
Da wäre ich übrigens vorsichtig damit, wegen der Verwendung von MP3-Decodern in kommerzieller Software gab es früher schon viel Ärger
Davon habe ich schon gelesen. Ich ziehe Ogg-Vorbis sowieso vor, da es im Gegensatz zum mp3-Format verlustfrei komprimiert. Wobei ich nicht glaube, dass es bei Freeware bzgl. mp3's Probleme gibt, kenne diverse Freeware-Programme, die mp3's abspielen können. Das Problem an den Wav-Dateien ist eben, dass die teilweise extrem groß ausfallen, was heutzutage zum Glück keine große Rolle mehr spielt, mich aber dennoch stört.

darkinsanity hat geschrieben:
Wenn ich OpenAL verwende, muss ich keine Dll mitliefern. Ist die bass.dll also auch kleiner als 0 Byte?
Das ist ein Argument ;-) Soweit ich weiss, ist in der Regel OpenAL meist bereits sowieso vorinstalliert!?

Die Bass.dll war für mich zuersteinmal naheliegend, da ich sie schon seit Jahren für diverse Projekte benutze. Aber ich muss gestehen, dass Du mich neugierig gemacht hast. Werde mich doch nochmal an OpenAL versuchen.

Viele Grüße


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Nov 08, 2012 12:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ogg-Vorbis ist nicht verlustfrei. FLAC ist verlustfrei. Opus ist awesome, aber auch nicht verlustfrei, Vorbis ist nicht verlustfrei. Wo ich gerade von Opus rede, das wäre auch ein sehr sinniger Audiocodec.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]