On Nov 23, 2013, at 9:07 AM, St�phane Ducasse <stephane.ducasse@inria.fr> wrote:

I really think that NativeBoost MUST HAVE a decent documentation.
It is a central part of Pharo and Igor you should do something about it.
If I would know I would have written a chapter on it but I cannot because I DO NOT KNOW.

And igor do not tell me that only C programmer should use NativeBoost.
We should focus on our clients and our clients are smart Pharoers that can learn fast.


Stef




On 21 November 2013 22:40, Sean P. DeNigris <sean@clipperadams.com> wrote:
I'm wrapping the FMOD cross-platform audio library. The code is MIT and lives
at http://smalltalkhub.com/#!/~SeanDeNigris/FMOD

========
Problem #1:
========

I'm calling into the FMOD library with:
primStoreIsPlaying: channelHandle in: isPlayingHandle
        <primitive: #primitiveNativeCall module: #NativeBoostPlugin>

        "FMOD_RESULT FMOD_Channel_IsPlaying(
                FMOD_CHANNEL *channel,
                bool *isplaying);"

        ^ self nbCall: #(FMOD_RESULT FMOD_Channel_IsPlaying(NBExternalAddress
channel, NBExternalAddress isPlayingHandle)).

I call the above with:
    isPlaying
        | isPlaying |
        isPlaying := NBExternalAddress new.
        self primStoreIsPlaying: channel in: isPlaying.
        ^ isPlaying value > 0.

isPlaying is always 0. The method works directly from C with:
int isPlaying = 1;
    while (isPlaying) {
        FMOD_Channel_IsPlaying(channel, &isPlaying);
    }

I also tried changing the callout signature to "... bool* isPlayingHandle)"
and passing "isPlaying := true." instead of using the NBExternalAddress
stuff.

err.. again, you must pass an address where value will be stored,

^ self nbCall: #(FMOD_RESULT FMOD_Channel_IsPlaying(
NBExternalAddress channel, NBExternalAddress * isPlayingHandle)).
otherwise you passing NULL pointer, and i quite surprised it not segfaults when you call it like that (looks like they have a check in the library )
 
 you can also use NBExternalTypeValue for that:

boolValueClass := NBExternalTypeValue ofType: 'bool'. "sure thing, creating anonymous class for each call is overkill, this should be done once, somewhere else"

boolValue := boolValueClass new.

self callTheThingWith: boolValue.

boolValue value ifTrue: [... blah]

(and this will work, assuming you have bool* in signature for this argument).

I have a few more questions, but this is the most pressing as it's holding
up any further development.

Thanks!



-----
Cheers,
Sean
--
View this message in context: http://forum.world.st/NativeBoost-Questions-while-wrapping-FMOD-tp4724116.html
Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.




--
Best regards,
Igor Stasenko.