Change soundfont file search path for fluiddec

Use glib to get a list of system "share" directories, then go through that
list, appending 'sounds/sf2/' to each directory to get a soundfont directory,
and looking for .sf2 files there.

This way fluiddec is able to load sf2 files on W32, because otherwise the
path '/usr/share/sounds/sf2' makes no sense there.

Fixes #724013
This commit is contained in:
Руслан Ижбулатов 2014-02-10 08:19:52 +00:00 committed by Wim Taymans
parent 008c15c910
commit 270b57fc33

View file

@ -63,7 +63,7 @@ enum
LAST_SIGNAL LAST_SIGNAL
}; };
#define SOUNDFONT_PATH "/usr/share/sounds/sf2/" #define SOUNDFONT_PATH "sounds/sf2/"
#define DEFAULT_SOUNDFONT NULL #define DEFAULT_SOUNDFONT NULL
#define DEFAULT_SYNTH_CHORUS TRUE #define DEFAULT_SYNTH_CHORUS TRUE
@ -507,6 +507,9 @@ gst_fluid_dec_open (GstFluidDec * fluiddec)
{ {
GDir *dir; GDir *dir;
GError *error = NULL; GError *error = NULL;
gint shared_dirs_count;
gint shared_dirs_failed;
const gchar *const *sharedirs;
if (fluiddec->sf != -1) if (fluiddec->sf != -1)
return TRUE; return TRUE;
@ -522,32 +525,52 @@ gst_fluid_dec_open (GstFluidDec * fluiddec)
GST_DEBUG_OBJECT (fluiddec, "loaded soundfont file %s", GST_DEBUG_OBJECT (fluiddec, "loaded soundfont file %s",
fluiddec->soundfont); fluiddec->soundfont);
} else { } else {
gint i;
dir = g_dir_open (SOUNDFONT_PATH, 0, &error); shared_dirs_count = 0;
if (dir == NULL) shared_dirs_failed = 0;
goto open_dir_failed; sharedirs = g_get_system_data_dirs ();
for (i = 0; sharedirs[i]; i++) {
while (TRUE) { gchar *soundfont_path = g_build_path ("/", sharedirs[i], SOUNDFONT_PATH,
const gchar *name; NULL);
gchar *filename; shared_dirs_count += 1;
GST_DEBUG_OBJECT (fluiddec, "Trying to list contents of a %s directory",
if ((name = g_dir_read_name (dir)) == NULL) soundfont_path);
break; error = NULL;
dir = g_dir_open (soundfont_path, 0, &error);
filename = g_build_filename (SOUNDFONT_PATH, name, NULL); if (dir == NULL) {
GST_DEBUG_OBJECT (fluiddec, "Can't open a potential soundfont directory %s: %s",
GST_DEBUG_OBJECT (fluiddec, "loading soundfont file %s", filename); soundfont_path, error->message);
fluiddec->sf = fluid_synth_sfload (fluiddec->synth, filename, 1); g_free (soundfont_path);
if (fluiddec->sf != -1) { g_error_free (error);
GST_DEBUG_OBJECT (fluiddec, "loaded soundfont file %s", filename); shared_dirs_failed += 1;
break; continue;
} }
GST_DEBUG_OBJECT (fluiddec, "could not load soundfont file %s", filename);
}
g_dir_close (dir);
if (fluiddec->sf == -1) while (TRUE) {
const gchar *name;
gchar *filename;
if ((name = g_dir_read_name (dir)) == NULL)
break;
filename = g_build_filename (soundfont_path, name, NULL);
GST_DEBUG_OBJECT (fluiddec, "loading soundfont file %s", filename);
fluiddec->sf = fluid_synth_sfload (fluiddec->synth, filename, 1);
if (fluiddec->sf != -1) {
GST_DEBUG_OBJECT (fluiddec, "loaded soundfont file %s", filename);
break;
}
GST_DEBUG_OBJECT (fluiddec, "could not load soundfont file %s", filename);
}
g_dir_close (dir);
g_free (soundfont_path);
}
if (fluiddec->sf == -1) {
if (shared_dirs_count == shared_dirs_failed)
goto open_dir_failed;
goto no_soundfont; goto no_soundfont;
}
} }
return TRUE; return TRUE;
@ -562,17 +585,17 @@ load_failed:
open_dir_failed: open_dir_failed:
{ {
GST_ELEMENT_ERROR (fluiddec, RESOURCE, OPEN_READ, GST_ELEMENT_ERROR (fluiddec, RESOURCE, OPEN_READ,
("Can't open directory %s", SOUNDFONT_PATH), ("No path in the XDG_DATA_DIRS pathlist has a %s subdirectory that can be opened",
("failed to open directory %s for reading: %s", SOUNDFONT_PATH, SOUNDFONT_PATH),
error->message)); ("failed to open subdirectory %s in each of the directories in XDG_DATA_DIRS pathlist",
g_error_free (error); SOUNDFONT_PATH));
return FALSE; return FALSE;
} }
no_soundfont: no_soundfont:
{ {
GST_ELEMENT_ERROR (fluiddec, RESOURCE, OPEN_READ, GST_ELEMENT_ERROR (fluiddec, RESOURCE, OPEN_READ,
("Can't find soundfont file in directory %s", SOUNDFONT_PATH), ("Can't find a soundfont file in subdirectory %s of XDG_DATA_DIRS paths", SOUNDFONT_PATH),
("No usable soundfont files found in %s", SOUNDFONT_PATH)); ("no usable soundfont files found in %s subdirectories of XDG_DATA_DIRS", SOUNDFONT_PATH));
return FALSE; return FALSE;
} }
} }