问题描述
我是 Koltin 本机的新手(但之前在 JVM 上使用过它)并且很难弄清楚如何通过转换 this example 来正确实现来自 jackaudio 的回调。
这是我尝试过的:
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
}
一旦我尝试打印一些接收到的数据,就会出现段错误或
/mnt/agent/work/f01984a9f5203417/runtime/src/main/cpp/Memory.cpp:1581: runtime assert: add ref for reclaimed object
我无法确定我在什么情况下会得到什么。我试图在这里和那里猛击 .freeze() 无济于事。我首先尝试在 process() 函数中使用 memScoped,但即使在调用 jack_transport_query 时也会立即出现段错误。
所以我一定是做错了什么,但我很难找到有关此类问题的信息......
提前感谢您的指点!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)