From 81143a4d2956bc6444fe6dee037155914ffc6a29 Mon Sep 17 00:00:00 2001 From: Marc-André Lureau Date: Wed, 27 Aug 2008 22:35:56 +0300 Subject: theme: use a sound_file_open callback during the lookup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marc-André Lureau Signed-off-by: Lennart Poettering --- src/read-sound-file.h | 1 + src/sound-theme-spec.c | 74 +++++++++++++++++++++++++++++++++++--------------- src/sound-theme-spec.h | 1 + 3 files changed, 54 insertions(+), 22 deletions(-) diff --git a/src/read-sound-file.h b/src/read-sound-file.h index 2107c56..cc0a783 100644 --- a/src/read-sound-file.h +++ b/src/read-sound-file.h @@ -31,6 +31,7 @@ typedef enum ca_sample_type { } ca_sample_type_t; typedef struct ca_sound_file ca_sound_file; +typedef int (*ca_sound_file_open_callback_t)(ca_sound_file **f, const char *fn); int ca_sound_file_open(ca_sound_file **f, const char *fn); void ca_sound_file_close(ca_sound_file *f); diff --git a/src/sound-theme-spec.c b/src/sound-theme-spec.c index f375622..ffa5b5b 100644 --- a/src/sound-theme-spec.c +++ b/src/sound-theme-spec.c @@ -410,6 +410,7 @@ fail: static int find_sound_for_suffix( ca_sound_file **f, + ca_sound_file_open_callback_t sfopen, const char *theme_name, const char *name, const char *path, @@ -421,6 +422,7 @@ static int find_sound_for_suffix( int ret; ca_return_val_if_fail(f, CA_ERROR_INVALID); + ca_return_val_if_fail(sfopen, CA_ERROR_INVALID); ca_return_val_if_fail(name, CA_ERROR_INVALID); ca_return_val_if_fail(path, CA_ERROR_INVALID); ca_return_val_if_fail(path[0] == '/', CA_ERROR_INVALID); @@ -444,7 +446,7 @@ static int find_sound_for_suffix( ret = errno == ENOENT ? CA_ERROR_NOTFOUND : CA_ERROR_SYSTEM; } else - ret = ca_sound_file_open(f, fn); + ret = sfopen(f, fn); ca_free(fn); @@ -453,6 +455,7 @@ static int find_sound_for_suffix( static int find_sound_in_locale( ca_sound_file **f, + ca_sound_file_open_callback_t sfopen, const char *theme_name, const char *name, const char *path, @@ -463,6 +466,7 @@ static int find_sound_in_locale( char *p; ca_return_val_if_fail(f, CA_ERROR_INVALID); + ca_return_val_if_fail(sfopen, CA_ERROR_INVALID); ca_return_val_if_fail(name && *name, CA_ERROR_INVALID); ca_return_val_if_fail(path, CA_ERROR_INVALID); ca_return_val_if_fail(path[0] == '/', CA_ERROR_INVALID); @@ -472,9 +476,9 @@ static int find_sound_in_locale( sprintf(p, "%s/sounds", path); - if ((ret = find_sound_for_suffix(f, theme_name, name, p, ".disabled", locale, subdir)) == CA_ERROR_NOTFOUND) - if ((ret = find_sound_for_suffix(f, theme_name, name, p, ".ogg", locale, subdir)) == CA_ERROR_NOTFOUND) - ret = find_sound_for_suffix(f, theme_name, name, p, ".wav", locale, subdir); + if ((ret = find_sound_for_suffix(f, sfopen, theme_name, name, p, ".disabled", locale, subdir)) == CA_ERROR_NOTFOUND) + if ((ret = find_sound_for_suffix(f, sfopen, theme_name, name, p, ".ogg", locale, subdir)) == CA_ERROR_NOTFOUND) + ret = find_sound_for_suffix(f, sfopen, theme_name, name, p, ".wav", locale, subdir); ca_free(p); @@ -483,6 +487,7 @@ static int find_sound_in_locale( static int find_sound_for_locale( ca_sound_file **f, + ca_sound_file_open_callback_t sfopen, const char *theme_name, const char *name, const char *path, @@ -493,12 +498,13 @@ static int find_sound_for_locale( int ret; ca_return_val_if_fail(f, CA_ERROR_INVALID); + ca_return_val_if_fail(sfopen, CA_ERROR_INVALID); ca_return_val_if_fail(name && *name, CA_ERROR_INVALID); ca_return_val_if_fail(path, CA_ERROR_INVALID); ca_return_val_if_fail(locale, CA_ERROR_INVALID); /* First, try the locale def itself */ - if ((ret = find_sound_in_locale(f, theme_name, name, path, locale, subdir)) != CA_ERROR_NOTFOUND) + if ((ret = find_sound_in_locale(f, sfopen, theme_name, name, path, locale, subdir)) != CA_ERROR_NOTFOUND) return ret; /* Then, try to truncate at the @ */ @@ -508,7 +514,7 @@ static int find_sound_for_locale( if (!(t = ca_strndup(locale, (size_t) (e - locale)))) return CA_ERROR_OOM; - ret = find_sound_in_locale(f, theme_name, name, path, t, subdir); + ret = find_sound_in_locale(f, sfopen, theme_name, name, path, t, subdir); ca_free(t); if (ret != CA_ERROR_NOTFOUND) @@ -522,7 +528,7 @@ static int find_sound_for_locale( if (!(t = ca_strndup(locale, (size_t) (e - locale)))) return CA_ERROR_OOM; - ret = find_sound_in_locale(f, theme_name, name, path, t, subdir); + ret = find_sound_in_locale(f, sfopen, theme_name, name, path, t, subdir); ca_free(t); if (ret != CA_ERROR_NOTFOUND) @@ -531,15 +537,16 @@ static int find_sound_for_locale( /* Then, try "C" as fallback locale */ if (strcmp(locale, "C")) - if ((ret = find_sound_in_locale(f, theme_name, name, path, "C", subdir)) != CA_ERROR_NOTFOUND) + if ((ret = find_sound_in_locale(f, sfopen, theme_name, name, path, "C", subdir)) != CA_ERROR_NOTFOUND) return ret; /* Try without locale */ - return find_sound_in_locale(f, theme_name, name, path, NULL, subdir); + return find_sound_in_locale(f, sfopen, theme_name, name, path, NULL, subdir); } static int find_sound_for_name( ca_sound_file **f, + ca_sound_file_open_callback_t sfopen, const char *theme_name, const char *name, const char *path, @@ -550,9 +557,10 @@ static int find_sound_for_name( const char *k; ca_return_val_if_fail(f, CA_ERROR_INVALID); + ca_return_val_if_fail(sfopen, CA_ERROR_INVALID); ca_return_val_if_fail(name && *name, CA_ERROR_INVALID); - if ((ret = find_sound_for_locale(f, theme_name, name, path, locale, subdir)) != CA_ERROR_NOTFOUND) + if ((ret = find_sound_for_locale(f, sfopen, theme_name, name, path, locale, subdir)) != CA_ERROR_NOTFOUND) return ret; k = strchr(name, 0); @@ -570,7 +578,7 @@ static int find_sound_for_name( if (!(n = ca_strndup(name, (size_t) (k-name)))) return CA_ERROR_OOM; - if ((ret = find_sound_for_locale(f, theme_name, n, path, locale, subdir)) != CA_ERROR_NOTFOUND) { + if ((ret = find_sound_for_locale(f, sfopen, theme_name, n, path, locale, subdir)) != CA_ERROR_NOTFOUND) { ca_free(n); return ret; } @@ -581,6 +589,7 @@ static int find_sound_for_name( static int find_sound_in_subdir( ca_sound_file **f, + ca_sound_file_open_callback_t sfopen, const char *theme_name, const char *name, const char *locale, @@ -591,13 +600,14 @@ static int find_sound_in_subdir( const char *g; ca_return_val_if_fail(f, CA_ERROR_INVALID); + ca_return_val_if_fail(sfopen, CA_ERROR_INVALID); ca_return_val_if_fail(name, CA_ERROR_INVALID); if ((ret = get_data_home(&e)) < 0) return ret; if (e) { - ret = find_sound_for_name(f, theme_name, name, e, locale, subdir); + ret = find_sound_for_name(f, sfopen, theme_name, name, e, locale, subdir); ca_free(e); if (ret != CA_ERROR_NOTFOUND) @@ -618,7 +628,7 @@ static int find_sound_in_subdir( if (!(p = ca_strndup(g, k))) return CA_ERROR_OOM; - ret = find_sound_for_name(f, theme_name, name, p, locale, subdir); + ret = find_sound_for_name(f, sfopen, theme_name, name, p, locale, subdir); ca_free(p); if (ret != CA_ERROR_NOTFOUND) @@ -636,6 +646,7 @@ static int find_sound_in_subdir( static int find_sound_in_profile( ca_sound_file **f, + ca_sound_file_open_callback_t sfopen, ca_theme_data *t, const char *name, const char *locale, @@ -645,13 +656,14 @@ static int find_sound_in_profile( ca_return_val_if_fail(f, CA_ERROR_INVALID); ca_return_val_if_fail(t, CA_ERROR_INVALID); + ca_return_val_if_fail(sfopen, CA_ERROR_INVALID); ca_return_val_if_fail(name, CA_ERROR_INVALID); for (d = t->data_dirs; d; d = d->next) if (data_dir_matches(d, profile)) { int ret; - if ((ret = find_sound_in_subdir(f, d->theme_name, name, locale, d->dir_name)) != CA_ERROR_NOTFOUND) + if ((ret = find_sound_in_subdir(f, sfopen, d->theme_name, name, locale, d->dir_name)) != CA_ERROR_NOTFOUND) return ret; } @@ -660,6 +672,7 @@ static int find_sound_in_profile( static int find_sound_in_theme( ca_sound_file **f, + ca_sound_file_open_callback_t sfopen, ca_theme_data *t, const char *name, const char *locale, @@ -669,25 +682,27 @@ static int find_sound_in_theme( ca_return_val_if_fail(f, CA_ERROR_INVALID); ca_return_val_if_fail(name, CA_ERROR_INVALID); + ca_return_val_if_fail(sfopen, CA_ERROR_INVALID); ca_return_val_if_fail(profile, CA_ERROR_INVALID); if (t) { /* First, try the profile def itself */ - if ((ret = find_sound_in_profile(f, t, name, locale, profile)) != CA_ERROR_NOTFOUND) + if ((ret = find_sound_in_profile(f, sfopen, t, name, locale, profile)) != CA_ERROR_NOTFOUND) return ret; /* Then, fall back to stereo */ if (!ca_streq(profile, DEFAULT_OUTPUT_PROFILE)) - if ((ret = find_sound_in_profile(f, t, name, locale, DEFAULT_OUTPUT_PROFILE)) != CA_ERROR_NOTFOUND) + if ((ret = find_sound_in_profile(f, sfopen, t, name, locale, DEFAULT_OUTPUT_PROFILE)) != CA_ERROR_NOTFOUND) return ret; } /* And fall back to no profile */ - return find_sound_in_subdir(f, t ? t->name : NULL, name, locale, NULL); + return find_sound_in_subdir(f, sfopen, t ? t->name : NULL, name, locale, NULL); } static int find_sound_for_theme( ca_sound_file **f, + ca_sound_file_open_callback_t sfopen, ca_theme_data **t, const char *theme, const char *name, @@ -698,6 +713,7 @@ static int find_sound_for_theme( ca_return_val_if_fail(f, CA_ERROR_INVALID); ca_return_val_if_fail(t, CA_ERROR_INVALID); + ca_return_val_if_fail(sfopen, CA_ERROR_INVALID); ca_return_val_if_fail(theme, CA_ERROR_INVALID); ca_return_val_if_fail(name && *name, CA_ERROR_INVALID); ca_return_val_if_fail(locale, CA_ERROR_INVALID); @@ -709,14 +725,19 @@ static int find_sound_for_theme( ret = load_theme_data(t, FALLBACK_THEME); if (ret == CA_SUCCESS) - if ((ret = find_sound_in_theme(f, *t, name, locale, profile)) != CA_ERROR_NOTFOUND) + if ((ret = find_sound_in_theme(f, sfopen, *t, name, locale, profile)) != CA_ERROR_NOTFOUND) return ret; /* Then, fall back to "unthemed" files */ - return find_sound_in_theme(f, NULL, name, locale, profile); + return find_sound_in_theme(f, sfopen, NULL, name, locale, profile); } -int ca_lookup_sound(ca_sound_file **f, ca_theme_data **t, ca_proplist *cp, ca_proplist *sp) { +int ca_lookup_sound_with_callback( + ca_sound_file **f, + ca_sound_file_open_callback_t sfopen, + ca_theme_data **t, + ca_proplist *cp, + ca_proplist *sp) { int ret = CA_ERROR_INVALID; const char *name, *fname; @@ -724,6 +745,7 @@ int ca_lookup_sound(ca_sound_file **f, ca_theme_data **t, ca_proplist *cp, ca_pr ca_return_val_if_fail(t, CA_ERROR_INVALID); ca_return_val_if_fail(cp, CA_ERROR_INVALID); ca_return_val_if_fail(sp, CA_ERROR_INVALID); + ca_return_val_if_fail(sfopen, CA_ERROR_INVALID); ca_mutex_lock(cp->mutex); ca_mutex_lock(sp->mutex); @@ -746,12 +768,12 @@ int ca_lookup_sound(ca_sound_file **f, ca_theme_data **t, ca_proplist *cp, ca_pr if (!(profile = ca_proplist_gets_unlocked(cp, CA_PROP_CANBERRA_XDG_THEME_OUTPUT_PROFILE))) profile = DEFAULT_OUTPUT_PROFILE; - ret = find_sound_for_theme(f, t, theme, name, locale, profile); + ret = find_sound_for_theme(f, sfopen, t, theme, name, locale, profile); } if (ret == CA_ERROR_NOTFOUND || !name) { if ((fname = ca_proplist_gets_unlocked(sp, CA_PROP_MEDIA_FILENAME))) - ret = ca_sound_file_open(f, fname); + ret = sfopen(f, fname); } ca_mutex_unlock(cp->mutex); @@ -760,6 +782,14 @@ int ca_lookup_sound(ca_sound_file **f, ca_theme_data **t, ca_proplist *cp, ca_pr return ret; } +int ca_lookup_sound( + ca_sound_file **f, + ca_theme_data **t, + ca_proplist *cp, + ca_proplist *sp) { + return ca_lookup_sound_with_callback(f, ca_sound_file_open, t, cp, sp); +} + void ca_theme_data_free(ca_theme_data *t) { ca_assert(t); diff --git a/src/sound-theme-spec.h b/src/sound-theme-spec.h index 2986605..57278b9 100644 --- a/src/sound-theme-spec.h +++ b/src/sound-theme-spec.h @@ -27,6 +27,7 @@ typedef struct ca_theme_data ca_theme_data; int ca_lookup_sound(ca_sound_file **f, ca_theme_data **t, ca_proplist *cp, ca_proplist *sp); +int ca_lookup_sound_with_callback(ca_sound_file **f, ca_sound_file_open_callback_t sfopen, ca_theme_data **t, ca_proplist *cp, ca_proplist *sp); void ca_theme_data_free(ca_theme_data *t); #endif -- cgit