summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2014-11-12 04:03:46 +0100
committerRobin Gareus <robin@gareus.org>2014-11-12 13:34:46 +0100
commit5624301a312804d09f65997ff92fd13037e4ac39 (patch)
treecd0876c5a8c06c8650426bf78fd1868a243603c3 /libs/ardour
parentd5ec118a1eb3e60c8eab5a3f1345e4c8fff50198 (diff)
Prepare AU-discovery crashlog.
stopgap solution to allow a user to detect which plugin caused a crash during discovery.
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/audio_unit.h6
-rw-r--r--libs/ardour/audio_unit.cc71
2 files changed, 77 insertions, 0 deletions
diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h
index d840c258e7..48ea614f8e 100644
--- a/libs/ardour/ardour/audio_unit.h
+++ b/libs/ardour/ardour/audio_unit.h
@@ -243,6 +243,7 @@ class LIBARDOUR_API AUPluginInfo : public PluginInfo {
bool reconfigurable_io() const { return true; }
static PluginInfoList* discover ();
+ static bool au_get_crashlog (std::string &msg);
static void get_names (CAComponentDescription&, std::string& name, std::string& maker);
static std::string stringify_descriptor (const CAComponentDescription&);
@@ -251,6 +252,11 @@ class LIBARDOUR_API AUPluginInfo : public PluginInfo {
private:
boost::shared_ptr<CAComponentDescription> descriptor;
UInt32 version;
+ static FILE * _crashlog_fd;
+
+ static void au_start_crashlog (void);
+ static void au_remove_crashlog (void);
+ static void au_crashlog (std::string);
static void discover_music (PluginInfoList&);
static void discover_fx (PluginInfoList&);
diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc
index add2407f84..aa98ebb4c8 100644
--- a/libs/ardour/audio_unit.cc
+++ b/libs/ardour/audio_unit.cc
@@ -19,6 +19,7 @@
*/
#include <sstream>
+#include <fstream>
#include <errno.h>
#include <string.h>
#include <math.h>
@@ -71,6 +72,7 @@ AUPluginInfo::CachedInfoMap AUPluginInfo::cached_info;
static string preset_search_path = "/Library/Audio/Presets:/Network/Library/Audio/Presets";
static string preset_suffix = ".aupreset";
static bool preset_search_path_initialized = false;
+FILE * AUPluginInfo::_crashlog_fd = NULL;
static OSStatus
_render_callback(void *userData,
@@ -2156,6 +2158,8 @@ AUPluginInfo::discover ()
if (!Glib::file_test (au_cache_path(), Glib::FILE_TEST_EXISTS)) {
ARDOUR::BootMessage (_("Discovering AudioUnit plugins (could take some time ...)"));
}
+ // create crash log file
+ au_start_crashlog ();
PluginInfoList* plugs = new PluginInfoList;
@@ -2164,6 +2168,9 @@ AUPluginInfo::discover ()
discover_generators (*plugs);
discover_instruments (*plugs);
+ // all fine if we get here
+ au_remove_crashlog ();
+
DEBUG_TRACE (DEBUG::PluginManager, string_compose ("AU: discovered %1 plugins\n", plugs->size()));
return plugs;
@@ -2221,10 +2228,56 @@ AUPluginInfo::discover_instruments (PluginInfoList& plugs)
discover_by_description (plugs, desc);
}
+
+bool
+AUPluginInfo::au_get_crashlog (std::string &msg)
+{
+ string fn = Glib::build_filename (ARDOUR::user_cache_directory(), "au_crashlog.txt");
+ if (!Glib::file_test (fn, Glib::FILE_TEST_EXISTS)) {
+ return false;
+ }
+ std::ifstream ifs(fn.c_str());
+ msg.assign ((std::istreambuf_iterator<char>(ifs)), (std::istreambuf_iterator<char>()));
+ return true;
+}
+
+void
+AUPluginInfo::au_start_crashlog ()
+{
+ string fn = Glib::build_filename (ARDOUR::user_cache_directory(), "au_crashlog.txt");
+ assert(!_crashlog_fd);
+ DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("Creating AU Log: %1\n", fn));
+ if (!(_crashlog_fd = fopen(fn.c_str(), "w"))) {
+ PBD::error << "Cannot create AU error-log\n";
+ }
+}
+
+void
+AUPluginInfo::au_remove_crashlog ()
+{
+ if (_crashlog_fd) {
+ ::fclose(_crashlog_fd);
+ _crashlog_fd = NULL;
+ }
+ string fn = Glib::build_filename (ARDOUR::user_cache_directory(), "au_crashlog.txt");
+ ::g_unlink(fn.c_str());
+ DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("Remove AU Log: %1\n", fn));
+}
+
+
+void
+AUPluginInfo::au_crashlog (std::string msg)
+{
+ assert(_crashlog_fd);
+ fprintf(_crashlog_fd, "AU: %s\n", msg.c_str());
+ ::fflush(_crashlog_fd);
+}
+
void
AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescription& desc)
{
Component comp = 0;
+ au_crashlog(string_compose("Start AU discovery for Type: %1", (int)desc.componentType));
comp = FindNextComponent (NULL, &desc);
@@ -2232,6 +2285,21 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip
CAComponentDescription temp;
GetComponentInfo (comp, &temp, NULL, NULL, NULL);
+ {
+ CFStringRef compTypeString = UTCreateStringForOSType(temp.componentType);
+ CFStringRef compSubTypeString = UTCreateStringForOSType(temp.componentSubType);
+ CFStringRef compManufacturerString = UTCreateStringForOSType(temp.componentManufacturer);
+ CFStringRef itemName = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%@ - %@ - %@"),
+ compTypeString, compManufacturerString, compSubTypeString);
+ au_crashlog(string_compose("Scanning ID: %1", CFStringRefToStdString(itemName)));
+ if (compTypeString != NULL)
+ CFRelease(compTypeString);
+ if (compSubTypeString != NULL)
+ CFRelease(compSubTypeString);
+ if (compManufacturerString != NULL)
+ CFRelease(compManufacturerString);
+ }
+
AUPluginInfoPtr info (new AUPluginInfo
(boost::shared_ptr<CAComponentDescription> (new CAComponentDescription(temp))));
@@ -2275,6 +2343,7 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip
AUPluginInfo::get_names (temp, info->name, info->creator);
ARDOUR::PluginScanMessage(_("AU"), info->name, false);
+ au_crashlog(string_compose("Plugin: %1", info->name));
info->type = ARDOUR::AudioUnit;
info->unique_id = stringify_descriptor (*info->descriptor);
@@ -2327,8 +2396,10 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip
error << string_compose (_("Cannot get I/O configuration info for AU %1"), info->name) << endmsg;
}
+ au_crashlog("Success.");
comp = FindNextComponent (comp, &desc);
}
+ au_crashlog(string_compose("End AU discovery for Type: %1", (int)desc.componentType));
}
bool