diff --git a/examples/test_jacket.nim b/examples/jacket_info.nim similarity index 89% rename from examples/test_jacket.nim rename to examples/jacket_info.nim index e14e695..b05cc5e 100644 --- a/examples/test_jacket.nim +++ b/examples/jacket_info.nim @@ -12,8 +12,8 @@ proc errorCb(msg: cstring) {.cdecl.} = addHandler(log) setErrorFunction(errorCb) -jclient = clientOpen("test_jacket", NullOption.ord, status.addr) -debug "Server status: " & $status +jclient = clientOpen("jacket_info", NullOption.ord, status.addr) +debug "JACK server status: " & $status if jclient == nil: error getJackStatusErrorString(status) diff --git a/examples/test_port_connect_cb.nim b/examples/jacket_port_connect_cb.nim similarity index 68% rename from examples/test_port_connect_cb.nim rename to examples/jacket_port_connect_cb.nim index 9ef455d..51e9ffc 100644 --- a/examples/test_port_connect_cb.nim +++ b/examples/jacket_port_connect_cb.nim @@ -4,22 +4,28 @@ import signal var jclient: ClientTPtr var status: cint +var exitSignalled: bool = false var log = newConsoleLogger(when defined(release): lvlInfo else: lvlDebug) +proc cleanup(sig: cint = 0) = + debug "Cleaning up..." + if jclient != nil: + discard jclient.deactivate() + discard jclient.clientClose() + jclient = nil + proc errorCb(msg: cstring) {.cdecl.} = # Suppress verbose JACK error messages when server is not available by # default. Pass ``lvlAll`` when creating the logger to enable them. debug "JACK error: " & $msg -proc cleanup(sig: cint = 0) {.noconv.} = - debug "Cleaning up..." +proc signalCb(sig: cint) {.noconv.} = + info "Received signal: " & $sig + exitSignalled = true - if jclient != nil: - discard jclient.deactivate() - discard jclient.clientClose() - jclient = nil - - quit QuitSuccess +proc shutdownCb(arg: pointer = nil) {.cdecl.} = + info "JACK server has shut down." + exitSignalled = true proc portConnected(portA: PortIdT; portB: PortIdT; connect: cint; arg: pointer) {.cdecl.} = let portAPtr = jclient.portById(portA) @@ -40,26 +46,28 @@ proc portConnected(portA: PortIdT; portB: PortIdT; connect: cint; arg: pointer) addHandler(log) setErrorFunction(errorCb) -jclient = clientOpen("jacket_port_register", NoStartServer.ord, status.addr) -debug "Server status: " & $status +jclient = clientOpen("jacket_port_connect_cb", NoStartServer.ord, status.addr) +debug "JACK server status: " & $status if jclient == nil: error getJackStatusErrorString(status) - quit 1 + quit QuitFailure when defined(windows): - setSignalProc(cleanup, SIGABRT, SIGINT, SIGTERM) + setSignalProc(signalCb, SIGABRT, SIGINT, SIGTERM) else: - setSignalProc(cleanup, SIGABRT, SIGHUP, SIGINT, SIGQUIT, SIGTERM) + setSignalProc(signalCb, SIGABRT, SIGHUP, SIGINT, SIGQUIT, SIGTERM) discard jclient.portRegister("in_1", JACK_DEFAULT_AUDIO_TYPE, PortIsInput.ord, 0) discard jclient.portRegister("out_1", JACK_DEFAULT_AUDIO_TYPE, PortIsOutput.ord, 0) if jclient.setPortConnectCallback(portConnected, nil) != 0: - error "Error: could not set port connection callback." + error "Error: could not set JACK port connection callback." + +jclient.onShutdown(shutdownCb, nil) if jclient.activate() == 0: - while true: + while not exitSignalled: sleep(50) -cleanup() # normally not reached +cleanup() diff --git a/examples/test_port_register.nim b/examples/jacket_port_register.nim similarity index 61% rename from examples/test_port_register.nim rename to examples/jacket_port_register.nim index 874b761..7b6d991 100644 --- a/examples/test_port_register.nim +++ b/examples/jacket_port_register.nim @@ -4,40 +4,48 @@ import jacket var jclient: ClientTPtr var status: cint +var exitSignalled: bool = false var log = newConsoleLogger(when defined(release): lvlInfo else: lvlDebug) +proc cleanup(sig: cint = 0) = + debug "Cleaning up..." + if jclient != nil: + discard jclient.clientClose() + jclient = nil + proc errorCb(msg: cstring) {.cdecl.} = # Suppress verbose JACK error messages when server is not available by # default. Pass ``lvlAll`` when creating the logger to enable them. debug "JACK error: " & $msg -proc cleanup(sig: cint = 0) {.noconv.} = - debug "Cleaning up..." - - if jclient != nil: - discard jclient.clientClose - jclient = nil +proc signalCb(sig: cint) {.noconv.} = + info "Received signal: " & $sig + exitSignalled = true - quit QuitSuccess +proc shutdownCb(arg: pointer = nil) {.cdecl.} = + info "JACK server has shut down." + exitSignalled = true addHandler(log) setErrorFunction(errorCb) jclient = clientOpen("jacket_port_register", NoStartServer.ord or UseExactName.ord, status.addr) -debug "Server status: " & $status +debug "JACK server status: " & $status if jclient == nil: error getJackStatusErrorString(status) quit 1 when defined(windows): - setSignalProc(cleanup, SIGABRT, SIGINT, SIGTERM) + setSignalProc(signalCb, SIGABRT, SIGINT, SIGTERM) else: - setSignalProc(cleanup, SIGABRT, SIGHUP, SIGINT, SIGQUIT, SIGTERM) + setSignalProc(signalCb, SIGABRT, SIGHUP, SIGINT, SIGQUIT, SIGTERM) discard jclient.portRegister("in_1", JACK_DEFAULT_AUDIO_TYPE, PortIsInput.ord, 0) discard jclient.portRegister("out_1", JACK_DEFAULT_AUDIO_TYPE, PortIsOutput.ord, 0) -while true: +jclient.onShutdown(shutdownCb, nil) + +while not exitSignalled: sleep(50) -cleanup() # normally not reached +cleanup() \ No newline at end of file diff --git a/examples/jacket_sine.nim b/examples/jacket_sine.nim index acbd2a6..eb2a318 100644 --- a/examples/jacket_sine.nim +++ b/examples/jacket_sine.nim @@ -5,6 +5,7 @@ import jacket var jclient: ClientTPtr var outPort: PortTPtr var status: cint +var exitSignalled: bool = false var log = newConsoleLogger(when defined(release): lvlInfo else: lvlDebug) type @@ -40,24 +41,25 @@ proc tick(osc: SineOscPtr): float = if osc.phase >= tableSize: osc.phase -= tableSize -proc errorCb(msg: cstring) {.cdecl.} = - # Suppress verbose JACK error messages when server is not available by - # default. Pass ``lvlAll`` when creating the logger to enable them. - debug "JACK error: " & $msg - -proc cleanup(sig: cint = 0) {.noconv.} = +proc cleanup() = debug "Cleaning up..." - if jclient != nil: discard jclient.deactivate() discard jclient.clientClose() jclient = nil - quit QuitSuccess +proc errorCb(msg: cstring) {.cdecl.} = + # Suppress verbose JACK error messages when server is not available by + # default. Pass ``lvlAll`` when creating the logger to enable them. + debug "JACK error: " & $msg + +proc signalCb(sig: cint) {.noconv.} = + info "Received signal: " & $sig + exitSignalled = true proc shutdownCb(arg: pointer = nil) {.cdecl.} = - debug "JACK server has shut down" - cleanup() + info "JACK server has shut down." + exitSignalled = true proc processCb(nFrames: NFramesT, arg: pointer): cint {.cdecl.} = var outbuf = cast[JackBufferPtr](portGetBuffer(outPort, nFrames)) @@ -86,9 +88,9 @@ var osc = initSineOsc(sampleRate, sineFreq) # Set up signal handlers to clean up on exit when defined(windows): - setSignalProc(cleanup, SIGABRT, SIGINT, SIGTERM) + setSignalProc(signalCb, SIGABRT, SIGINT, SIGTERM) else: - setSignalProc(cleanup, SIGABRT, SIGHUP, SIGINT, SIGQUIT, SIGTERM) + setSignalProc(signalCb, SIGABRT, SIGHUP, SIGINT, SIGQUIT, SIGTERM) # Register JACK callbacks if jclient.setProcessCallback(processCb, osc.addr) != 0: @@ -103,7 +105,7 @@ outPort = jclient.portRegister("out_1", JACK_DEFAULT_AUDIO_TYPE, PortIsOutput.or # Activate JACK client ... if jclient.activate() == 0: # ... and keep running until a signal is received - while true: + while not exitSignalled: sleep(50) -cleanup() # normally not reached +cleanup()