So, here the changes which should work (but i didn't tested).

And being on your place, i would get rid of
FMOD_SYSTEM class,
because you can just subclass�� FmodSystem from NBExternalObject directly (and use it in signatures)
and so it will be holding the handle, and naturally work as a representation of external entity.
Also note that in this case
FmodSystem is alias to C�� FMOD_SYSTEM*

so, for every function which expects FMOD_SYSTEM*, you should just use FmodSystem,
and if it expects FMOD_SYSTEM**, you using FmodSystem*

basically, same as if you would have:

typedef FmodSystem FMOD_SYSTEM*;

in C.


On 22 November 2013 15:10, Igor Stasenko <siguctua@gmail.com> wrote:



On 22 November 2013 05:09, Sean P. DeNigris <sean@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.



--
Best regards,
Igor Stasenko.