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. > > > >