2 Copyright (C) 2010 Paul Davis
3 Copyright (C) 2011 Tim Mayberry
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #include "libardour-config.h"
26 #include <alsa/asoundlib.h>
30 #include <CoreAudio/CoreAudio.h>
31 #include <CoreFoundation/CFString.h>
32 #include <sys/param.h>
33 #include <mach-o/dyld.h>
37 #include <portaudio.h>
40 #include <jack/jack.h>
44 #include <boost/scoped_ptr.hpp>
46 #include <glibmm/miscutils.h>
49 #include "pbd/error.h"
50 #include "pbd/convert.h"
51 #include "pbd/file_utils.h"
52 #include "pbd/search_path.h"
54 #include "ardour/jack_utils.h"
66 // The pretty driver names
67 const char * const portaudio_driver_name = X_("Portaudio");
68 const char * const coreaudio_driver_name = X_("CoreAudio");
69 const char * const alsa_driver_name = X_("ALSA");
70 const char * const oss_driver_name = X_("OSS");
71 const char * const freebob_driver_name = X_("FreeBoB");
72 const char * const ffado_driver_name = X_("FFADO");
73 const char * const netjack_driver_name = X_("NetJACK");
74 const char * const dummy_driver_name = X_("Dummy");
79 // The real driver names
80 const char * const portaudio_driver_command_line_name = X_("portaudio");
81 const char * const coreaudio_driver_command_line_name = X_("coreaudio");
82 const char * const alsa_driver_command_line_name = X_("alsa");
83 const char * const oss_driver_command_line_name = X_("oss");
84 const char * const freebob_driver_command_line_name = X_("freebob");
85 const char * const ffado_driver_command_line_name = X_("firewire");
86 const char * const netjack_driver_command_line_name = X_("netjack");
87 const char * const dummy_driver_command_line_name = X_("dummy");
89 // should we provide more "pretty" names like above?
90 const char * const alsaseq_midi_driver_name = X_("seq");
91 const char * const alsaraw_midi_driver_name = X_("raw");
92 const char * const winmme_midi_driver_name = X_("winmme");
93 const char * const coremidi_midi_driver_name = X_("coremidi");
95 // this should probably be translated
96 const char * const default_device_name = X_("Default");
106 ARDOUR::get_jack_audio_driver_names (vector<string>& audio_driver_names)
108 #ifdef PLATFORM_WINDOWS
109 audio_driver_names.push_back (portaudio_driver_name);
111 audio_driver_names.push_back (coreaudio_driver_name);
114 audio_driver_names.push_back (alsa_driver_name);
116 audio_driver_names.push_back (oss_driver_name);
117 audio_driver_names.push_back (freebob_driver_name);
118 audio_driver_names.push_back (ffado_driver_name);
120 audio_driver_names.push_back (netjack_driver_name);
121 audio_driver_names.push_back (dummy_driver_name);
125 ARDOUR::get_jack_default_audio_driver_name (string& audio_driver_name)
127 vector<string> drivers;
128 get_jack_audio_driver_names (drivers);
129 audio_driver_name = drivers.front ();
133 ARDOUR::get_jack_midi_system_names (const string& driver, vector<string>& midi_system_names)
135 midi_system_names.push_back (get_none_string ());
136 #ifdef PLATFORM_WINDOWS
137 midi_system_names.push_back (winmme_midi_driver_name);
139 midi_system_names.push_back (coreaudio_midi_driver_name);
142 if (driver == alsa_driver_name) {
143 midi_system_names.push_back (alsaseq_midi_driver_name);
144 midi_system_names.push_back (alsaraw_midi_driver_name);
151 ARDOUR::get_jack_default_midi_system_name (const string& driver, string& midi_system_name)
153 vector<string> drivers;
154 get_jack_midi_system_names (driver, drivers);
155 midi_system_name = drivers.front ();
159 ARDOUR::get_jack_sample_rate_strings (vector<string>& samplerates)
161 // do these really need to be translated?
162 samplerates.push_back (_("8000Hz"));
163 samplerates.push_back (_("22050Hz"));
164 samplerates.push_back (_("44100Hz"));
165 samplerates.push_back (_("48000Hz"));
166 samplerates.push_back (_("88200Hz"));
167 samplerates.push_back (_("96000Hz"));
168 samplerates.push_back (_("192000Hz"));
172 ARDOUR::get_jack_default_sample_rate ()
178 ARDOUR::get_jack_period_size_strings (std::vector<std::string>& period_sizes)
180 period_sizes.push_back ("32");
181 period_sizes.push_back ("64");
182 period_sizes.push_back ("128");
183 period_sizes.push_back ("256");
184 period_sizes.push_back ("512");
185 period_sizes.push_back ("1024");
186 period_sizes.push_back ("2048");
187 period_sizes.push_back ("4096");
188 period_sizes.push_back ("8192");
192 ARDOUR::get_jack_default_period_size ()
198 ARDOUR::get_jack_dither_mode_strings (const string& driver, vector<string>& dither_modes)
200 dither_modes.push_back (get_none_string ());
202 if (driver == alsa_driver_name ) {
203 dither_modes.push_back (_("Triangular"));
204 dither_modes.push_back (_("Rectangular"));
205 dither_modes.push_back (_("Shaped"));
210 ARDOUR::get_jack_default_dither_mode (const string& driver)
212 return get_none_string ();
216 ARDOUR::get_jack_latency_string (string samplerate, float periods, string period_size)
218 uint32_t rate = atoi (samplerate);
219 float psize = atof (period_size);
222 snprintf (buf, sizeof(buf), "%.1fmsec", (periods * psize) / (rate/1000.0));
228 get_jack_command_line_audio_driver_name (const string& driver_name, string& command_line_name)
230 using namespace ARDOUR;
231 if (driver_name == portaudio_driver_name) {
232 command_line_name = portaudio_driver_command_line_name;
234 } else if (driver_name == coreaudio_driver_name) {
235 command_line_name = coreaudio_driver_command_line_name;
237 } else if (driver_name == alsa_driver_name) {
238 command_line_name = alsa_driver_command_line_name;
240 } else if (driver_name == oss_driver_name) {
241 command_line_name = oss_driver_command_line_name;
243 } else if (driver_name == freebob_driver_name) {
244 command_line_name = freebob_driver_command_line_name;
246 } else if (driver_name == ffado_driver_name) {
247 command_line_name = ffado_driver_command_line_name;
249 } else if (driver_name == netjack_driver_name) {
250 command_line_name = netjack_driver_command_line_name;
252 } else if (driver_name == dummy_driver_name) {
253 command_line_name = dummy_driver_command_line_name;
260 get_jack_command_line_audio_device_name (const string& driver_name,
261 const string& device_name, string& command_line_device_name)
263 using namespace ARDOUR;
264 device_map_t devices;
266 get_jack_device_names_for_audio_driver (driver_name, devices);
268 for (device_map_t::const_iterator i = devices.begin (); i != devices.end(); ++i) {
269 if (i->first == device_name) {
270 command_line_device_name = i->second;
278 get_jack_command_line_dither_mode (const string& dither_mode, string& command_line_dither_mode)
280 using namespace ARDOUR;
282 if (dither_mode == _("Triangular")) {
283 command_line_dither_mode = "triangular";
285 } else if (dither_mode == _("Rectangular")) {
286 command_line_dither_mode = "rectangular";
288 } else if (dither_mode == _("Shaped")) {
289 command_line_dither_mode = "shaped";
297 ARDOUR::jack_server_running ()
299 EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa ();
300 boost::scoped_ptr<EnvironmentalProtectionAgency> current_epa;
302 /* revert all environment settings back to whatever they were when ardour started
306 current_epa.reset (new EnvironmentalProtectionAgency(true)); /* will restore settings when we leave scope */
307 global_epa->restore ();
310 jack_status_t status;
311 jack_client_t* c = jack_client_open ("ardourprobe", JackNoStartServer, &status);
314 jack_client_close (c);
322 ARDOUR::get_jack_alsa_device_names (device_map_t& devices)
326 snd_ctl_card_info_t *info;
327 snd_pcm_info_t *pcminfo;
328 snd_ctl_card_info_alloca(&info);
329 snd_pcm_info_alloca(&pcminfo);
334 while (snd_card_next (&cardnum) >= 0 && cardnum >= 0) {
337 devname += PBD::to_string (cardnum, std::dec);
339 if (snd_ctl_open (&handle, devname.c_str(), 0) >= 0 && snd_ctl_card_info (handle, info) >= 0) {
341 while (snd_ctl_pcm_next_device (handle, &device) >= 0 && device >= 0) {
343 snd_pcm_info_set_device (pcminfo, device);
344 snd_pcm_info_set_subdevice (pcminfo, 0);
345 snd_pcm_info_set_stream (pcminfo, SND_PCM_STREAM_PLAYBACK);
347 if (snd_ctl_pcm_info (handle, pcminfo) >= 0) {
349 devname += PBD::to_string (device, std::dec);
350 devices.insert (std::make_pair (snd_pcm_info_get_name (pcminfo), devname));
354 snd_ctl_close(handle);
362 getDeviceUIDFromID( AudioDeviceID id, char *name, size_t nsize)
364 UInt32 size = sizeof(CFStringRef);
366 OSStatus res = AudioDeviceGetProperty(id, 0, false,
367 kAudioDevicePropertyDeviceUID, &size, &UI);
369 CFStringGetCString(UI,name,nsize,CFStringGetSystemEncoding());
376 ARDOUR::get_jack_coreaudio_device_names (device_map_t& devices)
379 // Find out how many Core Audio devices are there, if any...
380 // (code snippet gently "borrowed" from St?hane Letz jackdmp;)
383 UInt32 outSize = sizeof(isWritable);
385 err = AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDevices,
386 &outSize, &isWritable);
388 // Calculate the number of device available...
389 int numCoreDevices = outSize / sizeof(AudioDeviceID);
390 // Make space for the devices we are about to get...
391 AudioDeviceID *coreDeviceIDs = new AudioDeviceID [numCoreDevices];
392 err = AudioHardwareGetProperty(kAudioHardwarePropertyDevices,
393 &outSize, (void *) coreDeviceIDs);
395 // Look for the CoreAudio device name...
396 char coreDeviceName[256];
399 for (int i = 0; i < numCoreDevices; i++) {
401 nameSize = sizeof (coreDeviceName);
403 /* enforce duplex devices only */
405 err = AudioDeviceGetPropertyInfo(coreDeviceIDs[i],
406 0, true, kAudioDevicePropertyStreams,
407 &outSize, &isWritable);
409 if (err != noErr || outSize == 0) {
413 err = AudioDeviceGetPropertyInfo(coreDeviceIDs[i],
414 0, false, kAudioDevicePropertyStreams,
415 &outSize, &isWritable);
417 if (err != noErr || outSize == 0) {
421 err = AudioDeviceGetPropertyInfo(coreDeviceIDs[i],
422 0, true, kAudioDevicePropertyDeviceName,
423 &outSize, &isWritable);
425 err = AudioDeviceGetProperty(coreDeviceIDs[i],
426 0, true, kAudioDevicePropertyDeviceName,
427 &nameSize, (void *) coreDeviceName);
429 char drivername[128];
431 // this returns the unique id for the device
432 // that must be used on the commandline for jack
434 if (getDeviceUIDFromID(coreDeviceIDs[i], drivername, sizeof (drivername)) == noErr) {
435 devices.insert (make_pair (coreDeviceName, drivername));
441 delete [] coreDeviceIDs;
447 ARDOUR::get_jack_portaudio_device_names (device_map_t& devices)
449 #ifdef HAVE_PORTAUDIO
450 if (Pa_Initialize() != paNoError) {
454 for (PaDeviceIndex i = 0; i < Pa_GetDeviceCount (); ++i) {
456 string readable_name;
457 string jack_device_name;
458 const PaDeviceInfo* device_info = Pa_GetDeviceInfo(i);
460 if (device_info != NULL) { // it should never be ?
461 api_name = Pa_GetHostApiInfo (device_info->hostApi)->name;
462 readable_name = api_name + " " + device_info->name;
463 jack_device_name = api_name + "::" + device_info->name;
464 devices.insert (make_pair (readable_name, jack_device_name));
472 ARDOUR::get_jack_oss_device_names (device_map_t& devices)
474 devices.insert (make_pair (default_device_name, default_device_name));
478 ARDOUR::get_jack_freebob_device_names (device_map_t& devices)
480 devices.insert (make_pair (default_device_name, default_device_name));
484 ARDOUR::get_jack_ffado_device_names (device_map_t& devices)
486 devices.insert (make_pair (default_device_name, default_device_name));
490 ARDOUR::get_jack_netjack_device_names (device_map_t& devices)
492 devices.insert (make_pair (default_device_name, default_device_name));
496 ARDOUR::get_jack_dummy_device_names (device_map_t& devices)
498 devices.insert (make_pair (default_device_name, default_device_name));
502 ARDOUR::get_jack_device_names_for_audio_driver (const string& driver_name, device_map_t& devices)
506 if (driver_name == portaudio_driver_name) {
507 get_jack_portaudio_device_names (devices);
508 } else if (driver_name == coreaudio_driver_name) {
509 get_jack_coreaudio_device_names (devices);
510 } else if (driver_name == alsa_driver_name) {
511 get_jack_alsa_device_names (devices);
512 } else if (driver_name == oss_driver_name) {
513 get_jack_oss_device_names (devices);
514 } else if (driver_name == freebob_driver_name) {
515 get_jack_freebob_device_names (devices);
516 } else if (driver_name == ffado_driver_name) {
517 get_jack_ffado_device_names (devices);
518 } else if (driver_name == netjack_driver_name) {
519 get_jack_netjack_device_names (devices);
520 } else if (driver_name == dummy_driver_name) {
521 get_jack_dummy_device_names (devices);
524 return !devices.empty();
528 std::vector<std::string>
529 ARDOUR::get_jack_device_names_for_audio_driver (const string& driver_name)
531 std::vector<std::string> readable_names;
532 device_map_t devices;
534 get_jack_device_names_for_audio_driver (driver_name, devices);
536 for (device_map_t::const_iterator i = devices.begin (); i != devices.end(); ++i) {
537 readable_names.push_back (i->first);
540 return readable_names;
544 ARDOUR::get_jack_audio_driver_supports_two_devices (const string& driver)
546 return (driver == alsa_driver_name || driver == oss_driver_name);
550 ARDOUR::get_jack_audio_driver_supports_latency_adjustment (const string& driver)
552 return (driver == alsa_driver_name || driver == coreaudio_driver_name ||
553 driver == ffado_driver_name || driver == portaudio_driver_name);
557 ARDOUR::get_jack_audio_driver_supports_setting_period_count (const string& driver)
559 return !(driver == dummy_driver_name || driver == coreaudio_driver_name ||
560 driver == portaudio_driver_name);
564 ARDOUR::get_jack_server_application_names (std::vector<std::string>& server_names)
566 #ifdef PLATFORM_WINDOWS
567 server_names.push_back ("jackd.exe");
569 server_names.push_back ("jackd");
570 server_names.push_back ("jackdmp");
572 return !server_names.empty();
576 ARDOUR::set_path_env_for_jack_autostart (const vector<std::string>& dirs)
579 // push it back into the environment so that auto-started JACK can find it.
580 // XXX why can't we just expect OS X users to have PATH set correctly? we can't ...
581 setenv ("PATH", SearchPath(dirs).to_string(), 1);
586 ARDOUR::get_jack_server_dir_paths (vector<std::string>& server_dir_paths)
589 /* this magic lets us finds the path to the OSX bundle, and then
590 we infer JACK's location from there
593 char execpath[MAXPATHLEN+1];
594 uint32_t pathsz = sizeof (execpath);
596 _NSGetExecutablePath (execpath, &pathsz);
598 server_dir_paths.push_back (Glib::path_get_dirname (execpath));
601 SearchPath sp(string(g_getenv("PATH")));
603 #ifdef PLATFORM_WINDOWS
604 gchar *install_dir = g_win32_get_package_installation_directory_of_module (NULL);
606 sp.push_back (install_dir);
607 g_free (install_dir);
609 // don't try and use a system wide JACK install yet.
612 sp.push_back ("/usr/bin");
613 sp.push_back ("/bin");
614 sp.push_back ("/usr/local/bin");
615 sp.push_back ("/opt/local/bin");
619 std::copy (sp.begin(), sp.end(), std::back_inserter(server_dir_paths));
621 return !server_dir_paths.empty();
625 ARDOUR::get_jack_server_paths (const vector<std::string>& server_dir_paths,
626 const vector<string>& server_names,
627 vector<std::string>& server_paths)
629 for (vector<string>::const_iterator i = server_names.begin(); i != server_names.end(); ++i) {
630 find_matching_files_in_directories (server_dir_paths, Glib::PatternSpec(*i), server_paths);
632 return !server_paths.empty();
636 ARDOUR::get_jack_server_paths (vector<std::string>& server_paths)
638 vector<std::string> server_dirs;
640 if (!get_jack_server_dir_paths (server_dirs)) {
644 vector<string> server_names;
646 if (!get_jack_server_application_names (server_names)) {
650 if (!get_jack_server_paths (server_dirs, server_names, server_paths)) {
654 return !server_paths.empty();
658 ARDOUR::get_jack_default_server_path (std::string& server_path)
660 vector<std::string> server_paths;
662 if (!get_jack_server_paths (server_paths)) {
666 server_path = server_paths.front ();
671 quote_string (const string& str)
673 return "\"" + str + "\"";
676 ARDOUR::JackCommandLineOptions::JackCommandLineOptions ()
683 , unlock_gui_libs(false)
694 , hardware_metering(false)
695 , hardware_monitoring(false)
705 ARDOUR::get_jack_command_line_string (const JackCommandLineOptions& options, string& command_line)
709 args.push_back (options.server_path);
711 #ifdef PLATFORM_WINDOWS
712 // must use sync mode on windows
713 args.push_back ("-S");
715 // this needs to be added now on windows
716 if (!options.midi_driver.empty () && options.midi_driver != get_none_string ()) {
717 args.push_back ("-X");
718 args.push_back (options.midi_driver);
722 if (options.timeout) {
723 args.push_back ("-t");
724 args.push_back (to_string (options.timeout, std::dec));
727 if (options.no_mlock) {
728 args.push_back ("-m");
731 args.push_back ("-p");
732 args.push_back (to_string(options.ports_max, std::dec));
734 if (options.realtime) {
735 args.push_back ("-R");
736 if (options.priority != 0) {
737 args.push_back ("-P");
738 args.push_back (to_string(options.priority, std::dec));
741 args.push_back ("-r");
744 if (options.unlock_gui_libs) {
745 args.push_back ("-u");
748 if (options.verbose) {
749 args.push_back ("-v");
752 #ifndef PLATFORM_WINDOWS
753 if (options.temporary) {
754 args.push_back ("-T");
758 string command_line_driver_name;
760 if (!get_jack_command_line_audio_driver_name (options.driver, command_line_driver_name)) {
764 args.push_back ("-d");
765 args.push_back (command_line_driver_name);
767 if (options.output_device.empty() && options.input_device.empty()) {
771 string command_line_input_device_name;
772 string command_line_output_device_name;
774 if (!get_jack_command_line_audio_device_name (options.driver,
775 options.input_device, command_line_input_device_name))
780 if (!get_jack_command_line_audio_device_name (options.driver,
781 options.output_device, command_line_output_device_name))
786 if (options.input_device.empty()) {
788 if (options.output_device.empty()) {
791 args.push_back ("-P");
792 } else if (options.output_device.empty()) {
794 if (options.input_device.empty()) {
797 args.push_back ("-C");
798 } else if (options.input_device != options.output_device) {
799 // capture and playback on two devices if supported
800 if (get_jack_audio_driver_supports_two_devices (options.driver)) {
801 args.push_back ("-C");
802 args.push_back (command_line_input_device_name);
803 args.push_back ("-P");
804 args.push_back (command_line_output_device_name);
810 if (get_jack_audio_driver_supports_setting_period_count (options.driver)) {
811 args.push_back ("-n");
812 args.push_back (to_string (options.num_periods, std::dec));
815 args.push_back ("-r");
816 args.push_back (to_string (options.samplerate, std::dec));
818 args.push_back ("-p");
819 args.push_back (to_string (options.period_size, std::dec));
821 if (get_jack_audio_driver_supports_latency_adjustment (options.driver)) {
822 if (options.input_latency) {
823 args.push_back ("-I");
824 args.push_back (to_string (options.input_latency, std::dec));
826 if (options.output_latency) {
827 args.push_back ("-0");
828 args.push_back (to_string (options.output_latency, std::dec));
832 if (options.input_device == options.output_device && options.input_device != default_device_name) {
833 args.push_back ("-d");
834 args.push_back (command_line_input_device_name);
837 if (options.driver == alsa_driver_name) {
838 if (options.hardware_metering) {
839 args.push_back ("-M");
841 if (options.hardware_monitoring) {
842 args.push_back ("-H");
845 string command_line_dither_mode;
846 if (get_jack_command_line_dither_mode (options.dither_mode, command_line_dither_mode)) {
847 args.push_back ("-z");
848 args.push_back (command_line_dither_mode);
850 if (options.force16_bit) {
851 args.push_back ("-S");
853 if (options.soft_mode) {
854 args.push_back ("-s");
857 if (!options.midi_driver.empty() && options.midi_driver != get_none_string ()) {
858 args.push_back ("-X");
859 args.push_back (options.midi_driver);
865 for (vector<string>::const_iterator i = args.begin(); i != args.end();) {
866 #ifdef PLATFORM_WINDOWS
867 oss << quote_string (*i);
871 if (++i != args.end()) oss << ' ';
874 command_line = oss.str();
879 ARDOUR::get_jack_server_config_file_name ()
885 ARDOUR::get_jack_server_user_config_dir_path ()
887 return Glib::get_home_dir ();
891 ARDOUR::get_jack_server_user_config_file_path ()
893 return Glib::build_filename (get_jack_server_user_config_dir_path (), get_jack_server_config_file_name ());
897 ARDOUR::write_jack_config_file (const std::string& config_file_path, const string& command_line)
899 ofstream jackdrc (config_file_path.c_str());
902 error << string_compose (_("cannot open JACK rc file %1 to store parameters"), config_file_path) << endmsg;
906 jackdrc << command_line << endl;
912 ARDOUR::start_jack_server (const string& command_line)
914 #ifdef PLATFORM_WINDOWS
916 PROCESS_INFORMATION pi;
917 char * cmdline = g_strdup (command_line.c_str());
919 memset (&si, 0, sizeof (si));
920 si.cb = sizeof (&si);
921 memset (&pi, 0, sizeof (pi));
924 NULL, // No module name, use command line
926 NULL, // Process handle not inheritable
927 NULL, // Thread handle not inheritable
928 FALSE, // set handle inheritance to false
929 0, // No creation flags
930 NULL, // Use parents environment block
931 NULL, // Use parents starting directory
935 error << string_compose ("cannot start JACK server: %s", g_win32_error_message (GetLastError ())) << endmsg;
940 // wait for 2 seconds for server to start
941 for (int i = 0; i < 8; ++i) {
942 Sleep (250); // 1/4 second
943 if (jack_server_running ()) return true;