Seite 1 von 2
FMOD GetDriverName
Verfasst: 18.06.2008 18:56
von Kai
Hallo Leutz, hab grad nen prob, was bestimmt nur ne kleinigkeit ist.
Will mit der neuen FMOD Version die Funktion FMOD_System_GetDriverName() aufrufen, nur hat die Funktion nun einen neuen Parameter.
Aber irgendwie weiß ich damit nix anzufangen.
Kann mir wer helfen?
Laut Hilfe soll die Funktion so declariert werden:
Code: Alles auswählen
FMOD_RESULT System::getDriverInfo(
int id,
char * name,
int namelen,
FMOD_GUID * guid
);
Parameters
id
Index of the sound driver device. The total number of devices can be found with System::getNumDrivers.
name
Address of a variable that receives the name of the device. Optional. Specify 0 or NULL to ignore.
namelen
Length in bytes of the target buffer to receieve the string. Required if name parameter is not NULL.
guid
Address of a variable that receives the GUID that uniquely identifies the device. Optional. Specify 0 or NULL to ignore.
GUID ist ne Structur, hab schon versucht diese zu übergeben, aber egal was ich mache, immer der selbe Fehler.
---------------------------
PureBasic - Linker error
---------------------------
POLINK: error: Unresolved external symbol '_FMOD_System_GetDriverName'.
POLINK: fatal error: 1 unresolved external(s).
---------------------------
OK
---------------------------
So hab ich es versucht:
Code: Alles auswählen
FMOD_System_GetDriverName( system.l, id.l, *name.b, Namelen.l, *guid.FMOD_GUID )
FMOD_System_GetDriverName(lFMOD_System, lNext, 0, 0, 0)
Verfasst: 19.06.2008 09:17
von Froggerprogger
Nutzt Du das Include-File ?
Das ist noch für fmod ex 4.06. Dort steht drin:
Code: Alles auswählen
Procedure.l FMOD_System_GetDriverName (system.l, id.l, *name.b, Namelen.l)
ProcedureReturn CallFunction(fmodLib, "FMOD_System_GetDriverName", system.l, id.l, *name.b, Namelen.l)
EndProcedure
api-Änderungen sind zwar selten, aber hier anscheinend eingetreten. Du müsstest also in deinem include-file das dann ändern zu (so in etwa, nicht getestet):
Code: Alles auswählen
Procedure.l FMOD_System_GetDriverName (system.l, id.l, *name.b, Namelen.l, *guid.FMOD_GUID)
ProcedureReturn CallFunction(fmodLib, "FMOD_System_GetDriverName", system.l, id.l, *name.b, Namelen.l, *guid.FMOD_GUID)
EndProcedure
damit der linker später die Funktion findet.
Verfasst: 19.06.2008 09:37
von ts-soft
Da er die GUID nicht braucht, reicht doch die Übergabe von #Nul
PS: GUID Structure ist in PB vordefiniert
Verfasst: 19.06.2008 09:49
von Kai
@Froggerprogger
Danke für denn Tipp, aber das hab ich ja bereits gemacht^^
Soweit wusste ich das natürlich, nur ist es egal ob ich es per *guid.FMOD_GUID oder einfach nur 0 übergebe, immer derselbe Fehler.
PS. ich nutze die Include von Flype per import:
Hier erhältlich
Sowie die neuste FMOD Version Stable 4.16 von
http://www.fmod.org/
@ts-soft
thx for tip^^
Verfasst: 19.06.2008 10:04
von Kai
Habe mal, damit ihr es leicht nachtesten überprüfen what ever könnt, dll, lib, include und nen beispiel
hier hochgeladen.
Verfasst: 19.06.2008 13:21
von Froggerprogger
Hab hier kein Windows zum Testen. Kannst du denn direkt die dll mittels CallFunction nutzen? Dann sollte es an der lib liegen. Also klappt sowas wie:
Code: Alles auswählen
fmodLib = LoadLibrary(...)
...
CallFunction(fmodLib, "FMOD_System_Create", @system.l)
CallFunction(fmodLib, "FMOD_System_GetDriverName", system.l, id.l, *name.b, Namelen.l, *guid.FMOD_GUID)
?
Verfasst: 19.06.2008 13:48
von Kai
Froggerprogger hat geschrieben:Hab hier kein Windows zum Testen. Kannst du denn direkt die dll mittels CallFunction nutzen? Dann sollte es an der lib liegen. Also klappt sowas wie:
Code: Alles auswählen
fmodLib = LoadLibrary(...)
...
CallFunction(fmodLib, "FMOD_System_Create", @system.l)
CallFunction(fmodLib, "FMOD_System_GetDriverName", system.l, id.l, *name.b, Namelen.l, *guid.FMOD_GUID)
?
Code: Alles auswählen
EnableExplicit
Global fmodLib.l = OpenLibrary(#PB_Any, "fmodex.dll")
If fmodLib <> 0
Global lNext.l
Global lFMOD_System.l
Global lFmod_DriversNum.l
Global lFMOD_Name.s = Space(255)
Global lFMOD_Len.l = 255
Debug CallFunction(fmodLib, "FMOD_System_Create", @lFMOD_System)
Debug CallFunction(fmodLib, "FMOD_System_GetNumDrivers", lFMOD_System, @lFmod_DriversNum)
Debug "------"
For lNext = 0 To lFmod_DriversNum - 1
If CallFunction(fmodLib, "FMOD_System_GetDriverInfo", lFMOD_System, lNext, @lFMOD_Name, @lFMOD_Len, 0) = 0
;auslesen des Parameters lFMOD_Name?
Debug lFMOD_Name
EndIf
Next
CloseLibrary(fmodLib)
EndIf
EDIT: Es geht, der Byte Parameter muß eine Adresse auf ein String sein..

Verfasst: 19.06.2008 14:49
von Froggerprogger
OK, des Rätsels Lösung! (wobei mir nicht ganz klar ist, wo genau das Problem lag und liegt. Ob das ein PB-Compiler-, Linker- oder WasAuchImmer-Problem ist.)
Deklaration also als *str.b, aber Übergabeparameter ein vorallokierter @str.s
Allerdings gibt das so sicherlich Probleme, wenn man im Unicode-Modus kompiliert.
Verfasst: 19.06.2008 15:38
von Kai
Froggerprogger hat geschrieben:OK, des Rätsels Lösung! (wobei mir nicht ganz klar ist, wo genau das Problem lag und liegt. Ob das ein PB-Compiler-, Linker- oder WasAuchImmer-Problem ist.)
Deklaration also als *str.b, aber Übergabeparameter ein vorallokierter @str.s
Allerdings gibt das so sicherlich Probleme, wenn man im Unicode-Modus kompiliert.
Nur das keine Missverständnisse aufkommen, per CallFunction läuft es, nur mit Import immer noch nicht.
Ich benutz jetzt einfach direkt die dll ohne import.
Verfasst: 19.06.2008 15:55
von Froggerprogger
Vielleicht klappts auch mit dem reinen wrapper-include (nicht dem import).
Also:
1. Direkt per CallFunction: OK
2. Import: Klappt nicht
3. Include-File, welches lediglich die CallFunction-Aufrufe wrappt: Klappt sicherlich auch?
Ich bevorzuge bei sowas die 3. Variante. Bei der 2. hat man immer irgendwann nach dll-updates Probleme mit der Library, bei 1. macht man schnell mal einen Fehler bei der Parameterübergabe an CallFunction und hat auch keinen Syntaxcheck, Autovervollständigen, etc. wie bei 3.
Aber ist natürlich Geschmackssache, wobei 3. durchaus ein bißchen mehr Natriumglutamat hat.