X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=afs.c;h=c410854c1129a91a811d21101886276aae731a2e;hp=0c7526c74110fb59da4cc20b815972421090cc12;hb=618026d765eaeb3ca26ad81f05770959a45970bd;hpb=d894e0cc7ce94d09847a8a35f47127968d4268f1 diff --git a/afs.c b/afs.c index 0c7526c7..c410854c 100644 --- a/afs.c +++ b/afs.c @@ -75,11 +75,15 @@ struct command_task { struct task task; }; +extern struct misc_meta_data *mmd; + static int server_socket; static struct command_task command_task_struct; static struct signal_task signal_task_struct; static enum play_mode current_play_mode; +static char *current_mop; /* mode or playlist specifier. NULL means dummy mooe */ + /** * A random number used to "authenticate" the connection. @@ -431,7 +435,7 @@ int stdin_command(int fd, struct osl_object *arg_obj, callback_function *f, return ret; } -int pass_afd(int fd, char *buf, size_t size) +static int pass_afd(int fd, char *buf, size_t size) { struct msghdr msg = {.msg_iov = NULL}; struct cmsghdr *cmsg; @@ -468,14 +472,13 @@ int pass_afd(int fd, char *buf, size_t size) /** * Open the audio file with highest score. * - * \param afd Audio file data is returned here. - * - * This stores all information for streaming the "best" audio file - * in the \a afd structure. + * 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 + * audio file are passed to the server process. * - * \return Positive on success, negative on errors. + * \return Standard. * - * \sa close_audio_file(), open_and_update_audio_file(). + * \sa open_and_update_audio_file(). */ int open_next_audio_file(void) { @@ -500,6 +503,7 @@ int open_next_audio_file(void) *(uint32_t *)buf = NEXT_AUDIO_FILE; *(uint32_t *)(buf + 4) = (uint32_t)shmid; ret = pass_afd(afd.fd, buf, 8); + close(afd.fd); if (ret >= 0) return ret; PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret)); @@ -508,8 +512,6 @@ destroy: return ret; } -static char *current_mop; /* mode or playlist specifier. NULL means dummy mooe */ - /* Never fails if arg == NULL */ static int activate_mood_or_playlist(char *arg, int *num_admissible) { @@ -536,10 +538,17 @@ static int activate_mood_or_playlist(char *arg, int *num_admissible) current_play_mode = mode; if (arg != current_mop) { free(current_mop); - if (arg) + if (arg) { current_mop = para_strdup(arg); - else + mmd_lock(); + strcpy(mmd->afs_mode_string, arg); /* FIXME: check length */ + mmd_unlock(); + } else { + mmd_lock(); + strcpy(mmd->afs_mode_string, "dummy"); + mmd_unlock(); current_mop = NULL; + } } return 1; } @@ -566,7 +575,7 @@ static int com_select_callback(const struct osl_object *query, ret = activate_mood_or_playlist(current_mop, &num_admissible); if (ret < 0) { para_printf(&pb, "failed, switching to dummy\n"); - change_current_mood(NULL); /* always successful */ + activate_mood_or_playlist(NULL, &num_admissible); } } para_printf(&pb, "activated %s (%d admissible files)\n", current_mop?