Hi there, I am new to Koltin native (but used it on the JVM before) and have a hard time figuring out, how to correctly implement a callback from jackaudio.
Here is what I tried:
private lateinit var client: CPointer<jack_client_t>
private lateinit var inputPort: CPointer<jack_port_t>
private var position = nativeHeap.alloc<jack_position_t>()
private var event = nativeHeap.alloc<jack_midi_event_t>()
fun main() {
println(
"""
Print JACK MIDI
This program creates a JACK MIDI port and will
print in the console all input it recieves
Press Enter to abort
"""
)
try {
startJackMidiCallback()
val readLine = readLine()
}
catch(e: Exception) {
println(e.message)
}
finally {
nativeHeap.free(position.rawPtr)
nativeHeap.free(event.rawPtr)
}
}
fun startJackMidiCallback() {
client = requireNotNull(jack_client_open("cykuit-pro", JackNullOption, null)) { "Jack server not running?" }
inputPort = requireNotNull(jack_port_register(client, "midi_in", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput.toULong(), 0))
val callback = staticCFunction(
fun(nframes: jack_nframes_t, _: COpaquePointer?): Int {
return process(nframes)
}
)
jack_set_process_callback(client, callback, null)
if (jack_activate(client) != 0) {
throw IllegalStateException("Cannot activate client")
}
}
fun process(nframes: jack_nframes_t): Int {
val portBuf = jack_port_get_buffer(inputPort, nframes)
val transport = jack_transport_query(client, position.ptr)
for (i in 0 until jack_midi_get_event_count(portBuf).toInt()) {
jack_midi_event_get(event.ptr, portBuf, i.toUInt())
val frame = position.frame
val subFrame = event.time
val size = event.size
val data0 = event.buffer?.get(0) ?: 0
val data1 = event.buffer?.get(1) ?: 0
val data2 = event.buffer?.get(2) ?: 0
println("Event: $i")
println(
"Frame $frame SubFrame#: $subFrame \tMessage ($size):\t" +
"${data0}\t${data1}\t${data2}"
)
}
return 0
}
As soon as I try to print some of the received data, I get either a segfault or
/mnt/agent/work/f01984a9f5203417/runtime/src/main/cpp/Memory.cpp:1581: runtime assert: add ref for reclaimed object
I can’t really pinpoint under what circumstances, I get which. I tried to slam .freeze() here and there to no avail. I first tried to use memScoped in the process() function, but this segfaults even immediately when calling jack_transport_query.
So I must be doing something wrong, but I have a hard time finding information regarding this kind of problems…
Thanks in advance for any pointers!