X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=afs.c;h=24e737b67e3995c8723cd1d7ae7f72899554c322;hb=050003ccbd8b314038352f55d9fae53245670e78;hp=e73c668fb6d93b3a200eb841e4d4c34ce4b48e59;hpb=684067afcc372644a7d000e7093549d6aa7597e9;p=paraslash.git diff --git a/afs.c b/afs.c index e73c668f..24e737b6 100644 --- a/afs.c +++ b/afs.c @@ -365,8 +365,11 @@ static int action_if_pattern_matches(struct osl_row *row, void *data) name = (char *)name_obj.data; if ((!name || !*name) && (pmd->pm_flags & PM_SKIP_EMPTY_NAME)) return 1; - if (!pmd->patterns.size && (pmd->pm_flags & PM_NO_PATTERN_MATCHES_EVERYTHING)) + if (pmd->patterns.size == 0 && + (pmd->pm_flags & PM_NO_PATTERN_MATCHES_EVERYTHING)) { + pmd->num_matches++; return pmd->action(pmd->table, row, name, pmd->data); + } for (p = pattern_txt; p < pattern_txt + pmd->patterns.size; p += strlen(p) + 1) { ret = fnmatch(p, name, pmd->fnmatch_flags); @@ -455,7 +458,7 @@ static int pass_afd(int fd, char *buf, size_t size) } /** - * Open the audio file with highest score. + * Pass the fd of the next audio file to the server process. * * This stores all information for streaming the "best" audio file in a shared * memory area. The id of that area and an open file descriptor for the next @@ -467,27 +470,15 @@ static int pass_afd(int fd, char *buf, size_t size) */ static int open_next_audio_file(void) { - struct osl_row *aft_row; struct audio_file_data afd; int ret, shmid; char buf[8]; - long score; -again: - PARA_NOTICE_LOG("getting next audio file\n"); - ret = score_get_best(&aft_row, &score); + + ret = open_and_update_audio_file(&afd); if (ret < 0) { PARA_ERROR_LOG("%s\n", para_strerror(-ret)); goto no_admissible_files; } - ret = open_and_update_audio_file(aft_row, score, &afd); - if (ret < 0) { - ret = score_delete(aft_row); - if (ret < 0) { - PARA_ERROR_LOG("%s\n", para_strerror(-ret)); - goto no_admissible_files; - } - goto again; - } shmid = ret; if (!write_ok(server_socket)) { ret = -E_AFS_SOCKET; @@ -573,7 +564,21 @@ int afs_cb_result_handler(struct osl_object *result, uint8_t band, return send_sb(&cc->scc, result->data, result->size, band, true); } -static void com_select_callback(int fd, const struct osl_object *query) +void flush_and_free_pb(struct para_buffer *pb) +{ + int ret; + struct afs_max_size_handler_data *amshd = pb->private_data; + + if (pb->buf && pb->size > 0) { + ret = pass_buffer_as_shm(amshd->fd, amshd->band, pb->buf, + pb->offset); + if (ret < 0) + PARA_ERROR_LOG("%s\n", para_strerror(-ret)); + } + free(pb->buf); +} + +static int com_select_callback(int fd, const struct osl_object *query) { struct para_buffer pb = { .max_size = shm_get_shmmax(), @@ -584,11 +589,11 @@ static void com_select_callback(int fd, const struct osl_object *query) .max_size_handler = afs_max_size_handler, }; char *arg = query->data; - int num_admissible, ret, ret2; + int num_admissible, ret; ret = clear_score_table(); if (ret < 0) { - ret2 = para_printf(&pb, "%s\n", para_strerror(-ret)); + para_printf(&pb, "%s\n", para_strerror(-ret)); goto out; } if (current_play_mode == PLAY_MODE_MOOD) @@ -597,23 +602,22 @@ static void com_select_callback(int fd, const struct osl_object *query) playlist_close(); ret = activate_mood_or_playlist(arg, &num_admissible); if (ret < 0) { - ret2 = para_printf(&pb, "%s\nswitching back to %s\n", + para_printf(&pb, "%s\nswitching back to %s\n", para_strerror(-ret), current_mop? current_mop : "dummy"); ret = activate_mood_or_playlist(current_mop, &num_admissible); if (ret < 0) { - if (ret2 >= 0) - ret2 = para_printf(&pb, "failed, switching to dummy\n"); + para_printf(&pb, "failed (%s), switching to dummy\n", + para_strerror(-ret)); activate_mood_or_playlist(NULL, &num_admissible); } } else - ret2 = para_printf(&pb, "activated %s (%d admissible files)\n", + para_printf(&pb, "activated %s (%d admissible files)\n", current_mop? current_mop : "dummy mood", num_admissible); out: - if (ret2 >= 0 && pb.offset) - pass_buffer_as_shm(fd, SBD_OUTPUT, pb.buf, pb.offset); - free(pb.buf); + flush_and_free_pb(&pb); + return 0; } int com_select(struct command_context *cc) @@ -829,11 +833,6 @@ err: return ret; } -/* - * On errors, negative value is written to fd. - * On success: If query produced a result, the result_shmid is written to fd. - * Otherwise, zero is written. - */ static int call_callback(int fd, int query_shmid) { void *query_shm; @@ -1007,11 +1006,17 @@ out: exit(EXIT_FAILURE); } -static void create_tables_callback(int fd, const struct osl_object *query) +static int create_tables_callback(int fd, const struct osl_object *query) { uint32_t table_mask = *(uint32_t *)query->data; int i, ret; - struct para_buffer pb = {.buf = NULL}; + struct para_buffer pb = { + .max_size = shm_get_shmmax(), + .private_data = &(struct afs_max_size_handler_data) { + .fd = fd, + .band = SBD_OUTPUT + } + }; close_afs_tables(); for (i = 0; i < NUM_AFS_TABLES; i++) { @@ -1030,9 +1035,8 @@ static void create_tables_callback(int fd, const struct osl_object *query) out: if (ret < 0) para_printf(&pb, "%s\n", para_strerror(-ret)); - if (pb.buf) - pass_buffer_as_shm(fd, SBD_OUTPUT, pb.buf, pb.offset); - free(pb.buf); + flush_and_free_pb(&pb); + return 0; } int com_init(struct command_context *cc) @@ -1060,9 +1064,8 @@ int com_init(struct command_context *cc) return -E_BAD_TABLE_NAME; } } - ret = send_callback_request(create_tables_callback, &query, + return send_callback_request(create_tables_callback, &query, afs_cb_result_handler, cc); - return ret; } /**