![]() |
AW: Mehrere WAV aus Resource gleichzeitig abspielen
Zitat:
Ich weiß aber nicht, was das falsch ist. |
AW: Mehrere WAV aus Resource gleichzeitig abspielen
Welchen Wert hat denn strs?
Das ist ja erst einmal wichtig um zu schauen, ob das Laden erfolgreich war. Denn ich sehe kein BASS_Init, so dass dort ggf. als Fehler auftritt, dass das nicht aufgerufen wurde. |
AW: Mehrere WAV aus Resource gleichzeitig abspielen
Ja die BASS_Init hat noch gefehlt. Jetzt spielt es.
Delphi-Quellcode:
Noch eine letzte Frage: Sieht das soweit in Ordnung aus? Programmiertechnisch betrachtet :D Die Rückgabewerte brauch ich für den Fall ja eigentlich nicht wirklich oder? Wie würde das sonst eleganterweise aussehen? Und wenn ich bei ChannelPlay den zweiten Parameter Restart auf true setze, spielt es trotzdem nur einmal. Bestimmt hab ich da was übersehen?
procedure TForm1.FormCreate(Sender: TObject);
var rs: TResourceStream; begin rs:=TResourceStream.Create(hInstance,'intro','WAV'); Bass_Init(-1,44100,0,Application.Handle,nil); rs.Position:=0; strs:=BASS_StreamCreateFile(true,rs.Memory,0,rs.Size,0); BASS_ChannelPlay(strs,false); rs.Free; end; Auf jeden Fall ein großes Danke! |
AW: Mehrere WAV aus Resource gleichzeitig abspielen
Rückgabewerte von Funktionen die einem einen Fehlercode liefern sollte man immer auswerten um im Programmablauf entsprechend darauf reagieren zu können.
Irgendwann versucht du bspw. mal eine Datei abzuspielen die defekt ist. Wenn du die Rückgabewerte jetzt nicht auswertest und entsprechende Fehlermeldungen anzeigst/protokollierst, dann wunderst du dich warum kein Sound kommt. Wenn du dann irgendwann darauf kommst das die Datei defekt ist, dann sagst du dir: "Wieso habe ich damals in mein Programm keine Fehlerbehandlung eingebaut?! Dann wäre mir die halbe Stunde Suche erspart geblieben!" Und ein Hinweis: Fasse SourceCode doch bitte in Delphi-Tags ein (das Delphi Helm Symbol über dem Editor). Dein SourceCode sieht dann gleich viel besser aus und lässt sich auch viel leichter lesen.
Code:
Beispiel wie dein SourceCode dann aussehen würde:
[DELPHI]
SourceCode hier [/DELPHI]
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var rs: TResourceStream; begin rs:=TResourceStream.Create(hInstance,'intro','WAV' ); Bass_Init(-1,44100,0,Application.Handle,nil); rs.Position:=0; strs:=BASS_StreamCreateFile(true,rs.Memory,0,rs.Si ze,0); BASS_ChannelPlay(strs,false); rs.Free; end; |
AW: Mehrere WAV aus Resource gleichzeitig abspielen
Ok das hab ich soweit verstanden.
Nun noch das letzte Problem: Die bass.dll wird ja noch verwendet. Die muss ich in die Resource als RCDATA mit einbinden zum kompilieren, was ich schon mal getan habe. Wie kann ich nun zur Laufzeit auf diese zugreifen? Ich hab schon einiges mit PBTMemoryModule ausprobiert, wo mir Delphi aber nicht wirklich weiterhilft.
Delphi-Quellcode:
Sowas hab ich schon gefunden, Delphi kann mit PBTMemoryModule nix anfangen.
procedure TForm1.FormCreate(Sender: TObject);
var i: byte; ms: TMemoryStream; rs: TResourceStream; m_DLLDataSize: int64; mp_DllData: Pointer; btMM: PBTMemoryModule; begin if 0 <> FindResource(hInstance, 'DllDatei', RT_RCDATA) then begin rs := TResourceStream.Create(hInstance, 'DllDatei', RT_RCDATA); ms := TMemoryStream.Create; try ms.LoadFromStream(rs); ms.Position := 0; m_DllDataSize := ms.Size; mp_DllData := GetMemory(m_DllDataSize); ms.Read(mp_DllData^, m_DllDataSize); finally ms.Free; rs.Free; end; end; **btMM := BTMemoryLoadLibary(mp_DllData, m_DllDataSize); **try ****if btMM = nil then Abort; ****@m_TestCallstd := BTMemoryGetProcAddress(btMM, 'TestCallstd'); ****if @m_TestCallstd = nil then Abort; ****m_TestCallstd('Das ist ein DLL-Speicher Aufruf!'); **except ****Showmessage(Ein Fehler ist enstanden bei Aufruf der DLL : ' + BTMemoryGetLastError); end; if Assigned(btMM) then BTMemoryFreeLibrary(btMM); end; Kann mir da noch jemand helfen bitte? |
AW: Mehrere WAV aus Resource gleichzeitig abspielen
Google hilft:
![]() Aber gerade bei einem Spiel sehe ich die Notwendigkeit nicht. Da ist es doch eher komisch, wenn nicht noch DLLs und andere Dateien neben der Exe liegen. |
AW: Mehrere WAV aus Resource gleichzeitig abspielen
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn ich die BTMemoryModule einbinde, kommt ne Fehlermeldung "ungültige Compileranweisung" in Zeile 50 der Datei (siehe Anhang)
Hää? Was is das denn für ne Scheiße...:o |
AW: Mehrere WAV aus Resource gleichzeitig abspielen
Du benutzt noch eine sehr alte Delphiversion. Da wirst du Anpassungen machen müssen, in den letzten knapp 20 Jahren seit dem Erscheinen von Delphi 6 hat sich nun einmal einiges getan. Mit neueren Delphiversionen funktioniert es direkt.
Wie wäre es mit der kostenlosen Starter Edition der aktuellen Delphiversion? ![]() Damit sollte der Quelltext kompilieren. |
AW: Mehrere WAV aus Resource gleichzeitig abspielen
Liste der Anhänge anzeigen (Anzahl: 1)
Ja danke das sieht schon viel besser aus! Jetzt kompiliert es auch.
Allerdings muss bei Ausführung der exe immer noch die Bass.dll im Verzeichnis vorhanden sein, und ich weiß nicht warum. Wo im Code (Anhang) benutze ich die denn? Ich wäre echt dankbar, wenn mir jemand sagen könnte, wie ich die Bass.dll, die ich in der Resource schon hab und brauche, jetzt verwenden kann. |
AW: Mehrere WAV aus Resource gleichzeitig abspielen
Naja, du lädst zwar die DLL aus dem Stream, benutzt sie aber danach gar nicht. Stattdessen benutzt du die statische Bindung via external:
Delphi-Quellcode:
Wenn du das so benutzt, sucht Windows beim Start der Anwendung nach der DLL bevor dein Code überhaupt ausgeführt wird. Stattdessen musst du die Funktionen dynamisch laden:
const
{$IFDEF MSWINDOWS} bassdll = 'bass.dll'; {$ENDIF} {$IFDEF LINUX} bassdll = 'libbass.so'; {$ENDIF} {$IFDEF MACOS} bassdll = 'libbass.dylib'; {$ENDIF} function BASS_SetConfig(option, value: DWORD): BOOL; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; external bassdll; ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:13 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