On 22 November 2013 05:09, Sean P. DeNigris <sean@clipperadams.com> wrote:
Igor Stasenko wrote
>> The better way is to subclass from NBExternalObject thenI made "NBExternalObject subclass: #FMOD_SYSTEM".
> 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 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 moreby 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.