1 /* -*- Mode: C ; c-basic-offset: 3 -*- */
3 * Control JACK transport using MMC (MIDI)
5 * Copyright (c) 2006,2007,2008 Nedko Arnaudov <nedko@arnaudov.name>
6 * Copyright (c) 2008 Alex Montgomery <apmontgomery@gmail.com>
8 * This program is free software; you can redistribute it and/or modify it under
9 * the terms of the GNU General Public License as published by the Free Software
10 * Foundation; version 2 of the License.
12 * This program is distributed in the hope that it will be useful, but WITHOUT ANY
13 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
28 void printMMCMessage(const char* message
, ...)
31 va_start(args
, message
);
33 vprintf(message
, args
);
38 /* the signal handler */
39 void signalled(int signal
)
45 void process_command_line(int argc
, char *argv
[], uint32_t* device_frame_rate
, uint32_t* jitter_tolerance
, int* verbose
, uint8_t* device_id
);
48 int main(int argc
, char *argv
[])
52 // frame rate (frames per second) of the MMC controlling device
53 uint32_t device_frame_rate
= 30; // command line equivalent: -f 30
55 // jitter tolerance in milliseconds
56 uint32_t jitter_tolerance
= 50; //command line: -t 50
58 uint8_t device_id
= 0x7f; // command line -d 7f
60 int verbose
= 0; // pass -v on the command line to turn this on
62 // read the jitter tolerance, verbose setting, and device frame rate from command line
63 process_command_line(argc
, argv
, &device_frame_rate
, &jitter_tolerance
, &verbose
, &device_id
);
65 printf("%s starting with a jitter tolerance of %d milliseconds and a device frame rate of %d per second listening for device %x.\n\n",
66 argv
[0], jitter_tolerance
, device_frame_rate
, device_id
);
68 // setup our signal handler signalled() above, so we can exit cleanly
69 signal(SIGINT
, signalled
);
71 ret
= init_alsa_sequencer("jackctlmmc");
78 if (init_jack("jackctlmmc") < 0)
80 printf("couldn't connect to jack server. Either it's not running or the client name is already taken\n");
86 init_lash(argc
, argv
);
87 #endif // LASH_SUPPORT
91 // start listening for and handling MMC events, stops when g_quit is true (SIGINT)
92 listen_loop(device_frame_rate
, jitter_tolerance
, verbose
, device_id
);
94 // so we shall quit, eh? ok, cleanup time. otherwise jack would probably produce an xrun on shutdown
98 printf("exited normally\n");
104 void process_command_line(int argc
, char *argv
[], // IN parameters
105 uint32_t* device_frame_rate
, uint32_t* jitter_tolerance
, int* verbose
, uint8_t* device_id
) // OUT parameters
109 while ((parameter
= getopt(argc
, argv
, "f:t:d:v")) != -1)
117 value
= strtol(optarg
, 0, 10);
118 *device_frame_rate
= (uint32_t)value
;
121 value
= strtol(optarg
, 0, 10);
122 *jitter_tolerance
= (uint32_t)value
;
125 value
= strtol(optarg
, 0, 16);
126 if (value
>= 0 && value
<= 255)
127 *device_id
= (uint8_t)value
;
130 fprintf(stderr
, "usage: %s -f <device_frames_per_second> -t <jitter_tolerance_in_ms> -d <device_id_in_hexadecimal>\n", argv
[0]);
139 printf("cleaning up...\n");