X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=afs.c;h=a8c504f460d4f10a67422fcca2adc2ba25478a80;hp=75b82c21317a718fbf42ee4c5abaaed61192fbf7;hb=767a4a54c967bc4b80bd14d02e89fe91acd848dd;hpb=8d106ca317a2c42f35a86ba244f843688f6939e6 diff --git a/afs.c b/afs.c index 75b82c21..a8c504f4 100644 --- a/afs.c +++ b/afs.c @@ -1,8 +1,4 @@ -/* - * Copyright (C) 2007 Andre Noll - * - * Licensed under the GPL v2. For licencing details see COPYING. - */ +/* Copyright (C) 2007 Andre Noll , see file COPYING. */ /** \file afs.c Paraslash's audio file selector. */ @@ -37,22 +33,22 @@ #include "sideband.h" #include "command.h" -/** The osl tables used by afs. \sa blob.c. */ +/** The osl tables used by afs. \sa \ref blob.c. */ enum afs_table_num { - /** Contains audio file information. See aft.c. */ + /** Contains audio file information. See \ref aft.c. */ TBLNUM_AUDIO_FILES, - /** The table for the paraslash attributes. See attribute.c. */ + /** The table for the paraslash attributes. See \ref attribute.c. */ TBLNUM_ATTRIBUTES, /** * Paraslash's scoring system is based on Gaussian normal * distributions, and the relevant data is stored in the rbtrees of an - * osl table containing only volatile columns. See score.c for + * osl table containing only volatile columns. See \ref score.c for * details. */ TBLNUM_SCORES, /** * A standard blob table containing the mood definitions. For details - * see mood.c. + * see \ref mood.c. */ TBLNUM_MOODS, /** A blob table containing lyrics on a per-song basis. */ @@ -130,7 +126,7 @@ extern uint32_t afs_socket_cookie; * command socket, so that the handler process can read the id, attach the * shared memory area and use the result. * - * \sa struct callback_result. + * \sa \ref struct callback_result. */ struct callback_query { /** The function to be called. */ @@ -146,7 +142,7 @@ struct callback_query { * into the shared memory area holding the result, mainly to let the command * handler know the size of the result. * - * \sa struct callback_query. + * \sa \ref struct callback_query. */ struct callback_result { /** The number of bytes of the result. */ @@ -201,9 +197,8 @@ static int dispatch_result(int result_shmid, callback_result_handler *handler, * shmid are passed to that function as an osl object. The private_result_data * pointer is passed as the second argument to \a result_handler. * - * \return Number of shared memory areas dispatched on success, negative on errors. - * - * \sa send_option_arg_callback_request(), send_standard_callback_request(). + * \return Number of shared memory areas dispatched on success, negative on + * errors. */ int send_callback_request(afs_callback *f, struct osl_object *query, callback_result_handler *result_handler, @@ -381,7 +376,7 @@ int for_each_matching_row(struct pattern_match_data *pmd) * \a obj1 is found, respectively, to be less than, to match, or be greater than * obj2. * - * \sa strcmp(3), strncmp(3), osl_compare_func. + * \sa strcmp(3), strncmp(3). */ int string_compare(const struct osl_object *obj1, const struct osl_object *obj2) { @@ -433,7 +428,7 @@ static int pass_afd(int fd, char *buf, size_t size) * * \return Standard. * - * \sa open_and_update_audio_file(). + * \sa \ref open_and_update_audio_file(). */ static int open_next_audio_file(void) { @@ -467,23 +462,30 @@ no_admissible_files: } /* Never fails if arg == NULL */ -static int activate_mood_or_playlist(const char *arg, int *num_admissible) +static int activate_mood_or_playlist(const char *arg, int *num_admissible, + char **errmsg) { enum play_mode mode; int ret; if (!arg) { - ret = change_current_mood(NULL); /* always successful */ + ret = change_current_mood(NULL, NULL); /* always successful */ mode = PLAY_MODE_MOOD; } else { if (!strncmp(arg, "p/", 2)) { ret = playlist_open(arg + 2); + if (ret < 0 && errmsg) + *errmsg = make_message( "could not open %s", + arg); mode = PLAY_MODE_PLAYLIST; } else if (!strncmp(arg, "m/", 2)) { - ret = change_current_mood(arg + 2); + ret = change_current_mood(arg + 2, errmsg); mode = PLAY_MODE_MOOD; - } else - return -E_AFS_SYNTAX; + } else { + if (errmsg) + *errmsg = make_message("%s: parse error", arg); + return -ERRNO_TO_PARA_ERROR(EINVAL); + } if (ret < 0) return ret; } @@ -498,10 +500,12 @@ static int activate_mood_or_playlist(const char *arg, int *num_admissible) strncpy(mmd->afs_mode_string, arg, sizeof(mmd->afs_mode_string)); mmd->afs_mode_string[sizeof(mmd->afs_mode_string) - 1] = '\0'; + mmd->events++; mutex_unlock(mmd_mutex); } else { mutex_lock(mmd_mutex); strcpy(mmd->afs_mode_string, "dummy"); + mmd->events++; mutex_unlock(mmd_mutex); current_mop = NULL; } @@ -563,6 +567,7 @@ static int com_select_callback(struct afs_callback_arg *aca) const struct lls_command *cmd = SERVER_CMD_CMD_PTR(SELECT); const char *arg; int num_admissible, ret; + char *errmsg; ret = lls_deserialize_parse_result(aca->query.data, cmd, &aca->lpr); assert(ret >= 0); @@ -576,22 +581,27 @@ static int com_select_callback(struct afs_callback_arg *aca) close_current_mood(); else playlist_close(); - ret = activate_mood_or_playlist(arg, &num_admissible); + ret = activate_mood_or_playlist(arg, &num_admissible, &errmsg); if (ret >= 0) goto out; /* ignore subsequent errors (but log them) */ + para_printf(&aca->pbout, "%s\n", errmsg); + free(errmsg); para_printf(&aca->pbout, "could not activate %s\n", arg); - if (current_mop) { + if (current_mop && strcmp(current_mop, arg) != 0) { int ret2; para_printf(&aca->pbout, "switching back to %s\n", current_mop); - ret2 = activate_mood_or_playlist(current_mop, &num_admissible); + ret2 = activate_mood_or_playlist(current_mop, &num_admissible, + &errmsg); if (ret2 >= 0) goto out; + para_printf(&aca->pbout, "%s\n", errmsg); + free(errmsg); para_printf(&aca->pbout, "could not reactivate %s: %s\n", current_mop, para_strerror(-ret2)); } para_printf(&aca->pbout, "activating dummy mood\n"); - activate_mood_or_playlist(NULL, &num_admissible); + activate_mood_or_playlist(NULL, &num_admissible, NULL); out: para_printf(&aca->pbout, "activated %s (%d admissible files)\n", current_mop? current_mop : "dummy mood", num_admissible); @@ -616,8 +626,13 @@ EXPORT_SERVER_CMD_HANDLER(select); static void init_admissible_files(const char *arg) { - if (activate_mood_or_playlist(arg, NULL) < 0) - activate_mood_or_playlist(NULL, NULL); /* always successful */ + int ret = activate_mood_or_playlist(arg, NULL, NULL); + if (ret < 0) { + assert(arg); + PARA_WARNING_LOG("could not activate %s: %s\n", arg, + para_strerror(-ret)); + activate_mood_or_playlist(NULL, NULL, NULL); + } } static int setup_command_socket_or_die(void)