jack1 codebase
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.

158 lines
3.0KB

  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <getopt.h>
  4. #include <jack/engine.h>
  5. #include <jack/internal.h>
  6. #include <jack/driver.h>
  7. static sigset_t signals;
  8. static jack_engine_t *engine;
  9. static void *
  10. signal_thread (void *arg)
  11. {
  12. int sig;
  13. int err;
  14. pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
  15. err = sigwait (&signals, &sig);
  16. fprintf (stderr, "exiting due to signal %d\n", sig);
  17. jack_engine_delete (engine);
  18. exit (err);
  19. /*NOTREACHED*/
  20. return 0;
  21. }
  22. int
  23. catch_signals (void)
  24. {
  25. pthread_t thread_id;
  26. sigemptyset (&signals);
  27. sigaddset(&signals, SIGHUP);
  28. sigaddset(&signals, SIGINT);
  29. sigaddset(&signals, SIGQUIT);
  30. sigaddset(&signals, SIGILL);
  31. sigaddset(&signals, SIGTRAP);
  32. sigaddset(&signals, SIGABRT);
  33. sigaddset(&signals, SIGIOT);
  34. sigaddset(&signals, SIGFPE);
  35. sigaddset(&signals, SIGKILL);
  36. sigaddset(&signals, SIGPIPE);
  37. sigaddset(&signals, SIGTERM);
  38. sigaddset(&signals, SIGCHLD);
  39. sigaddset(&signals, SIGCONT);
  40. sigaddset(&signals, SIGSTOP);
  41. sigaddset(&signals, SIGTSTP);
  42. sigaddset(&signals, SIGTTIN);
  43. sigaddset(&signals, SIGTTOU);
  44. /* all child threads will inherit this mask */
  45. pthread_sigmask (SIG_BLOCK, &signals, 0);
  46. /* start a thread to wait for signals */
  47. if (pthread_create (&thread_id, 0, signal_thread, 0)) {
  48. fprintf (stderr, "cannot create signal catching thread");
  49. return -1;
  50. }
  51. pthread_detach (thread_id);
  52. return 0;
  53. }
  54. static char *alsa_pcm_name = "default";
  55. static nframes_t frames_per_interrupt = 64;
  56. static nframes_t srate = 48000;
  57. static int realtime = 0;
  58. static int realtime_priority = 10;
  59. static void usage ()
  60. {
  61. fprintf (stderr, "usage: engine [ -d ALSA PCM device ] [ -r sample-rate ] [ -p frames_per_interrupt ] [ -R [ -P priority ] ]\n");
  62. }
  63. int
  64. main (int argc, char *argv[])
  65. {
  66. jack_driver_t *driver;
  67. const char *options = "hd:r:p:RP:";
  68. struct option long_options[] =
  69. {
  70. { "device", 1, 0, 'd' },
  71. { "srate", 1, 0, 'r' },
  72. { "frames-per-interrupt", 1, 0, 'p' },
  73. { "help", 0, 0, 'h' },
  74. { "realtime", 0, 0, 'R' },
  75. { "realtime-priority", 1, 0, 'P' },
  76. { 0, 0, 0, 0 }
  77. };
  78. int option_index;
  79. int opt;
  80. catch_signals ();
  81. opterr = 0;
  82. while ((opt = getopt_long (argc, argv, options, long_options, &option_index)) != EOF) {
  83. switch (opt) {
  84. case 'd':
  85. alsa_pcm_name = optarg;
  86. break;
  87. case 'r':
  88. srate = atoi (optarg);
  89. break;
  90. case 'p':
  91. frames_per_interrupt = atoi (optarg);
  92. break;
  93. case 'R':
  94. realtime = 1;
  95. break;
  96. case 'P':
  97. realtime_priority = atoi (optarg);
  98. break;
  99. case 'h':
  100. default:
  101. fprintf (stderr, "unknown option character %c\n", opt);
  102. usage();
  103. return -1;
  104. }
  105. }
  106. if ((engine = jack_engine_new (realtime, realtime_priority)) == 0) {
  107. fprintf (stderr, "cannot create engine\n");
  108. return 1;
  109. }
  110. if ((driver = jack_driver_load (ADDON_DIR "/jack_alsa.so", alsa_pcm_name, frames_per_interrupt, srate)) == 0) {
  111. fprintf (stderr, "cannot load ALSA driver module\n");
  112. return 1;
  113. }
  114. jack_use_driver (engine, driver);
  115. printf ("start engine ...\n");
  116. jack_run (engine);
  117. jack_wait (engine);
  118. return 0;
  119. }