Collection of tools useful for audio production
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
3.4KB

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. # Imports (Global)
  4. import os
  5. from signal import signal, SIGINT, SIGTERM
  6. from time import sleep
  7. from PyQt4.QtCore import QProcess
  8. # Imports (Custom Stuff)
  9. import jacklib
  10. # --------------------------------------------------
  11. # Global loop check
  12. global doLoop, doRunNow, procIn, procOut
  13. doLoop = True
  14. doRunNow = True
  15. procIn = QProcess()
  16. procOut = QProcess()
  17. checkFile = "/tmp/.cadence-aloop-daemon.x"
  18. # --------------------------------------------------
  19. # Global JACK variables
  20. global bufferSize, sampleRate
  21. bufferSize = 1024
  22. sampleRate = 44100
  23. # --------------------------------------------------
  24. # quit on SIGINT or SIGTERM
  25. def signal_handler(sig, frame=0):
  26. global doLoop
  27. doLoop = False
  28. # --------------------------------------------------
  29. # listen to jack buffer size changes
  30. def buffer_size_callback(newBufferSize, arg):
  31. global doRunNow, bufferSize
  32. bufferSize = newBufferSize
  33. doRunNow = True
  34. return 0
  35. # --------------------------------------------------
  36. # listen to jack shutdown
  37. def shutdown_callback(arg):
  38. global doLoop
  39. doLoop = False
  40. # --------------------------------------------------
  41. # run alsa_in and alsa_out
  42. def run_alsa_bridge():
  43. global bufferSize, sampleRate
  44. global procIn, procOut
  45. if procIn.state() != QProcess.NotRunning:
  46. procIn.terminate()
  47. procIn.waitForFinished(1000)
  48. if procOut.state() != QProcess.NotRunning:
  49. procOut.terminate()
  50. procOut.waitForFinished(1000)
  51. procIn.start("env", ["JACK_SAMPLE_RATE=%i" % sampleRate, "JACK_PERIOD_SIZE=%i" % bufferSize, "alsa_in", "-j", "alsa2jack", "-d", "cloop", "-q", "1"])
  52. procOut.start("env", ["JACK_SAMPLE_RATE=%i" % sampleRate, "JACK_PERIOD_SIZE=%i" % bufferSize, "alsa_out", "-j", "jack2alsa", "-d", "ploop", "-q", "1"])
  53. procIn.waitForStarted()
  54. procOut.waitForStarted()
  55. # Pause it for a bit, and connect to the system ports
  56. sleep(1)
  57. jacklib.connect(client, "alsa2jack:capture_1", "system:playback_1")
  58. jacklib.connect(client, "alsa2jack:capture_2", "system:playback_2")
  59. jacklib.connect(client, "system:capture_1", "jack2alsa:playback_1")
  60. jacklib.connect(client, "system:capture_2", "jack2alsa:playback_2")
  61. #--------------- main ------------------
  62. if __name__ == '__main__':
  63. # Init JACK client
  64. client = jacklib.client_open("cadence-aloop-daemon", jacklib.JackUseExactName, None)
  65. if not client:
  66. quit()
  67. jacklib.set_buffer_size_callback(client, buffer_size_callback, None)
  68. jacklib.on_shutdown(client, shutdown_callback, None)
  69. jacklib.activate(client)
  70. # Quit when requested
  71. signal(SIGINT, signal_handler)
  72. signal(SIGTERM, signal_handler)
  73. # Get initial values
  74. sampleRate = jacklib.get_sample_rate(client)
  75. bufferSize = jacklib.get_buffer_size(client)
  76. # Create check file
  77. if not os.path.exists(checkFile):
  78. os.mknod(checkFile)
  79. # Keep running until told otherwise
  80. while doLoop and os.path.exists(checkFile):
  81. if doRunNow:
  82. doRunNow = False
  83. run_alsa_bridge()
  84. sleep(1)
  85. # Close JACK client
  86. jacklib.deactivate(client)
  87. jacklib.client_close(client)
  88. if os.path.exists(checkFile):
  89. os.remove(checkFile)
  90. if procIn.state() != QProcess.NotRunning:
  91. procIn.terminate()
  92. procIn.waitForFinished(1000)
  93. if procOut.state() != QProcess.NotRunning:
  94. procOut.terminate()
  95. procOut.waitForFinished(1000)