Calling the Port Audio C API via Panama FFI APIs
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Tue Jan 4 14:19:55 UTC 2022
On 04/01/2022 14:14, Carl Dea wrote:
> Maurizio,
> I was able to get things working by building the latest code.
>
> https://github.com/carldea/portaudio4j
> <https://urldefense.com/v3/__https://github.com/carldea/portaudio4j__;!!ACWV5N9M2RV99hQ!dP6Z09f66Ar3OXesxA401OocZvhvGFBpvvE0xdFn_pfNKW3MPezs_1fNnSYaiF1duCSr0ho$>
I noted the latest commit and the fact that some of the issues are now
marked as "fixed".
The changes you made to the code seems 1-1 with what was there before,
so I believe the newer JDK is the reason why the code behaves correctly now.
I suspect you hit another incarnation of this:
https://bugs.openjdk.java.net/browse/JDK-8277602
>
> Not totally sure why it just works after changing things slightly
> (MemorySegment APIs).
> I will be getting more examples working such as recording voice.
>
> I will keep you posted if I run into any more issues. But so far so good.
Cool, thanks for the update!
Maurizio
>
> Thank you,
> Carl
>
> Sent from my iPhone
>
>> On Jan 4, 2022, at 6:16 AM, Maurizio Cimadamore
>> <maurizio.cimadamore at oracle.com> wrote:
>>
>>
>>
>> Hi Carl,
>>
>>> My build is from the public download https://jdk.java.net/panama/
>>> <https://urldefense.com/v3/__https://jdk.java.net/panama/__;!!ACWV5N9M2RV99hQ!c43izMm_BeKdqh1M1wZ5FiIRhphPcIqZHa_elCGMN9aAHFJp0953QCbVC2PlX1RkOfx30vk$>
>>> shown as Build 17-panama+3-167 (2021/5/18)
>>> I chose the shared scope because when using newConfinedScope() it
>>> crashes. try (var scope = ResourceScope.newConfinedScope())
>>> :-)
>>>
>>> Not sure if upcalls/callbacks handle scope differently.
>>
>> I suspect the crash is in reality a Java exception not reported
>> correctly in that early access version because of:
>>
>> https://git.openjdk.java.net/panama-foreign/pull/597
>>
>> That is, I suspect the library you are using is creating threads
>> behind the curtains, and then using such threads to call some of the
>> upcalls in your code. Then, if the upcall accesses any segment
>> created with a confined scope, access fails (as expected, since
>> access comes from another thread), and the upcall terminates (which
>> means the VM exits, as there's no other way to recover meanigfully).
>>
>> After the above PR, such exceptions are reported in a much more
>> friendly way (e.g. with a stack trace and all). If that's not the
>> issue, then I'd like to know more because it sounds odd.
>>
>>>
>>>
>>> 2. You are not using a recent Panama build (I see the MemoryAccess
>>> static methods are used). I think few issues with upcalls have been
>>> fixed - might be worth to give latest Panama a try.
>>>
>>> I'm assuming the latest build of the main branch
>>> 'origin/foreign-jextract'
>>> I'm still in the process, for some reason the configure is
>>> complaining about the following:
>>>
>>> checking if libclang should be enabled... no, not found
>>>
>>> configure: error: Cannot locate libclang! You can download pre-built
>>> llvm
>>>
>>> binary from http://llvm.org/releases/download.html
>>> <https://urldefense.com/v3/__http://llvm.org/releases/download.html__;!!ACWV5N9M2RV99hQ!c43izMm_BeKdqh1M1wZ5FiIRhphPcIqZHa_elCGMN9aAHFJp0953QCbVC2PlX1RkJJQrzKw$>,
>>> then specify the
>>>
>>> location using --with-libclang
>>>
>>> /Users/cdea/projects/panama/panama-foreign/build/.configure-support/generated-configure.sh:
>>> line 84: 5: Bad file descriptor
>>>
>>> configure exiting with result code 1
>>>
>> You need to pass the flag --with-libclang=<LLVM_HOME> flag to `sh
>> configure` where LLVM_HOME should point to a full LLVM install (e.g.
>> one you downloaded from the LLVM website).
>>>
>>>
>>>
>>> 3. I see a call to PaSleep. Now, while that _shouldn't_ cause
>>> issue, I
>>> wonder if putting your thread to sleep in native-land instead of
>>> Java
>>> land might cause issues.
>>>
>>> Hmm.. Did you mean a C lang sleep?
>>>
>>> I changed it to Java land (sleep) and no change.
>>> PortAudio library has a function called Pa_Sleep()...
>> Ok, that was a wild suggestion :-)
>>>
>>> 4. On a very quick look, the pointer arithmetic in the upcall
>>> seems fine
>>>
>>>
>>> Is there a more elegant way to express this?
>>
>> Let's try to make it work first, and then worry about the "looks" :-)
>>
>> Maurizio
>>
>>>
>>>
>>> Thank you!,
>>> Carl
>>>
>>> That's all I have for now, sorry!
>>>
>>> Cheers
>>> Maurizio
>>>
>>> On 22/12/2021 04:06, carl dea wrote:
>>> > Hello friends of JEP 412,
>>> >
>>> >
>>> > I hope I'm not being too forward, but I would love it if I
>>> could get a
>>> > second opinion of my *port* of an example from the folks from
>>> the PortAudio
>>> > C API project using Project Panama's FFI APIs.
>>> >
>>> >
>>> > I created the project called *portaudio4j* to simply port
>>> their first
>>> > example called *examples/paex_saw.c*.
>>> >
>>> > https://github.com/carldea/portaudio4j
>>> <https://urldefense.com/v3/__https://github.com/carldea/portaudio4j__;!!ACWV5N9M2RV99hQ!c43izMm_BeKdqh1M1wZ5FiIRhphPcIqZHa_elCGMN9aAHFJp0953QCbVC2PlX1RkICKUj2E$>
>>> >
>>> >
>>> > *My version:*
>>> >
>>> https://github.com/carldea/portaudio4j/blob/main/src/PaexSaw.java
>>> <https://urldefense.com/v3/__https://github.com/carldea/portaudio4j/blob/main/src/PaexSaw.java__;!!ACWV5N9M2RV99hQ!c43izMm_BeKdqh1M1wZ5FiIRhphPcIqZHa_elCGMN9aAHFJp0953QCbVC2PlX1RkcvIa1mY$>
>>> >
>>> >
>>> > *(Their version) Port Audio C API 's beginner example
>>> paex_saw.c is here:*
>>> >
>>> https://github.com/PortAudio/portaudio/blob/master/examples/paex_saw.c
>>> <https://urldefense.com/v3/__https://github.com/PortAudio/portaudio/blob/master/examples/paex_saw.c__;!!ACWV5N9M2RV99hQ!c43izMm_BeKdqh1M1wZ5FiIRhphPcIqZHa_elCGMN9aAHFJp0953QCbVC2PlX1RkpfeaeCk$>
>>> >
>>> >
>>> >
>>> > *The Problem (Issue)*
>>> >
>>> > For some reason the C version (*paex_saw.c*) of the example
>>> compared to the
>>> > Panama example (*PaexSaw.java*) doesn't sound the same.
>>> Sometimes it's too
>>> > loud as if something isn't cleaning up from the prior run.
>>> The only thing
>>> > I've changed afaik is the SAMPLE_RATE, because it's so
>>> frighteningly loud.
>>> > Maybe I'm not properly doing pointer arithmetic. Or something
>>> I'm doing
>>> > that is overly expensive (operation wise) when accessing a
>>> > MemoryAddress/MemorySegment.
>>> >
>>> >
>>> > So, I thought I'd reach out to those who might be able to shed
>>> some light
>>> > on the issues I'm running into.
>>> >
>>> >
>>> > *Why did I choose this C library?*
>>> >
>>> > --------------------------------
>>> >
>>> > It is a relatively simple and small example that can exercise
>>> most aspects
>>> > of Panama (downcall, upcall, typedef void variables, handles,
>>> pointers,
>>> > structs, etc.) Everyone has a speaker and mic, so it would be
>>> a nice way to
>>> > use the library for all OSes.
>>> >
>>> >
>>> > Of course if there's a way I can pinpoint the cause, I'd be
>>> happy to report
>>> > the bug so we can keep an eye on it. Also, it might be a good
>>> example to
>>> > add to Sundar's examples here:
>>> > https://github.com/sundararajana/panama-jextract-samples
>>> <https://urldefense.com/v3/__https://github.com/sundararajana/panama-jextract-samples__;!!ACWV5N9M2RV99hQ!c43izMm_BeKdqh1M1wZ5FiIRhphPcIqZHa_elCGMN9aAHFJp0953QCbVC2PlX1RkoIXgYGs$>.
>>> >
>>> > Thank you, Happy holidays!
>>> >
>>> >
>>> > Carl
>>> >
>>>
>>>
>>>
>>> --
>>> *Carl Dea*
>>> Principal Software Engineer
>>> Email: carldea at gmail.com <mailto:carldea at gmail.com>
>>> Website: https://carlfx.wordpress.com
>>> <https://urldefense.com/v3/__https://carlfx.wordpress.com__;!!ACWV5N9M2RV99hQ!c43izMm_BeKdqh1M1wZ5FiIRhphPcIqZHa_elCGMN9aAHFJp0953QCbVC2PlX1RkWdH4ptY$>
>>> Twitter: @carldea
>>> <https://urldefense.com/v3/__https://twitter.com/carldea__;!!ACWV5N9M2RV99hQ!c43izMm_BeKdqh1M1wZ5FiIRhphPcIqZHa_elCGMN9aAHFJp0953QCbVC2PlX1Rkm1qEovo$>
More information about the panama-dev
mailing list