However we should acknowledge here that using a FFI, any FFI , in any
programming language has the mandatory requirement of knowing C. I
certainly do believe that documenting Nativeboost is extremely important
for helping people to port C libraries to pharo and making Pharo far more
useful but we should not kid ourselves. Coding with Nativeboost even though
its inside Pharo , even though its smalltalk syntax, even though it has the
tools to make your life easier, its still C coding or even Assembly coding
if you are brave enough to use the inline assembler.

I want to help with documentation the problem is that I dont know a lot of
stuff about Nativeboost besides the basic pointer things I did with
NBOpenGL.


On Sat, Nov 23, 2013 at 10:10 AM, Stéphane Ducasse <
stephane.duca...@inria.fr> wrote:

>
> On Nov 23, 2013, at 9:07 AM, Stéphane Ducasse <stephane.duca...@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 <s...@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<http://nabble.com/>
>> .
>>
>>
>
>
> --
> Best regards,
> Igor Stasenko.
>
>
>
>

Reply via email to