On 22 November 2013 05:09, Sean P. DeNigris <s...@clipperadams.com> wrote:
> Igor Stasenko wrote > >> The better way is to subclass from NBExternalObject then > > which made exactly for such purposes, by holding an opaque handle to > > something (you don't care what is inside), and simplifies a lot of > things. > > I made "NBExternalObject subclass: #FMOD_SYSTEM". > I then tried to use it via: > system := FMOD_SYSTEM new. > err := self System_CreateNBExternalObject: system. > With callout: > ^ self nbCall: #(FMOD_RESULT FMOD_System_Create(NBExternalObject > system)). > > For the argument type in the signature, for good measure I tried: > 1. NBExternalObject > 2. FMOD_SYSTEM > 3. NBExternalAddress > All three with zero, one, and two *'s after. The only one that didn't > report > some variety of "An instance of Xyz expected" was > "FMOD_System_Create(FMOD_SYSTEM system)" for which the library returns an > invalid argument error code. > > yet again, you miss the right solution: you must pass a pointer to where value will be stored (since function doing exactly that). so you should do it like: 1. "NBExternalObject subclass: #FMOD_SYSTEM". 2. method to call the function will look like following: create: system ^ self nbCall: #(FMOD_RESULT FMOD_System_Create(FMOD_SYSTEM * system)). 3. and call it like following: system := FMOD_SYSTEM new. self handleError: (self create: system) ifOk: [ ^ system ] 3a. optionally, you want want to initialize it just after you know that you obtained correct handle, to do that, you could do following: FMOD_SYSTEM class>>new | system | system := super new. self handleError: (self create: system) ifOk: [ ^ self newWithHandle: system handle ] and newWithHandle: could look something like following: newWithHandle: aHandle system := super basicNew. system handle: aHandle. ^ system initialize (because it is important to set the handle first, like that you can actually initialize something more by using it, which you logically do, just after creating a new handle. and note you must not call 'super initialize' then, because it will reset handle.) and i'm sure you can find more elegant solution :) btw if anyone wants to play with it: > 1. > Gofer it > smalltalkhubUser: 'SeanDeNigris' project: 'FMOD'; > package: 'FMOD'; > load. > > 2. Download the FMOD library for your platform: > - windows - > > http://www.fmod.org/download/fmodstudio/api/Win/fmodstudioapi10208win-installer.exe > - Mac - > > http://www.fmod.org/download/fmodstudio/api/Mac/fmodstudioapi10208mac-installer.dmg > > 3. Copy the library to "FileLocator imageDirectory / 'FMOD Programmers > API/api/lowlevel/lib/libfmod.dylib'" > > The working example is: > | sound | > sound := FmodSound fromFile: '/path/to/file.mp3' asFileReference. > [ sound play ] fork. > > The broken one described above is: "FMOD exampleNBExternalObject." > > > > ----- > Cheers, > Sean > -- > View this message in context: > http://forum.world.st/NativeBoost-Questions-while-wrapping-FMOD-tp4724116p4724192.html > Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com. > > -- Best regards, Igor Stasenko.