FMOD GetDriverName

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

FMOD GetDriverName

Beitrag 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. :freak:

---------------------------
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)
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag 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.
!UD2
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Da er die GUID nicht braucht, reicht doch die Übergabe von #Nul :wink:
PS: GUID Structure ist in PB vordefiniert
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

Beitrag 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^^
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

Beitrag von Kai »

Habe mal, damit ihr es leicht nachtesten überprüfen what ever könnt, dll, lib, include und nen beispiel hier hochgeladen.
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag 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)
?
!UD2
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

Beitrag 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.. :freak:
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag 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.
!UD2
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

Beitrag 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.
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag 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.
!UD2
Antworten