X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=playlist.c;h=d02ade3ba911a186f0f7e5a57f419ce9074092d0;hb=53789fd79c330ca1dc1d84b5bc4ecee73cbe983f;hp=171a6d26e3f77f6377c70d3ce560d35964ac2ca8;hpb=11f6b66a8eb345185c4a4bc8dc8d6059835d37f0;p=paraslash.git diff --git a/playlist.c b/playlist.c index 171a6d26..d02ade3b 100644 --- a/playlist.c +++ b/playlist.c @@ -15,13 +15,13 @@ /** \file playlist.c Functions for loading and saving playlists. */ /** Structure used for adding entries to a playlist. */ -struct playlist_info { +struct playlist_instance { /** The name of the playlist. */ char *name; /** The number of entries currently in the playlist. */ unsigned length; }; -static struct playlist_info current_playlist; +static struct playlist_instance current_playlist; /** * Re-insert an audio file into the tree of admissible files. @@ -38,7 +38,7 @@ static int playlist_update_audio_file(const struct osl_row *aft_row) static int add_playlist_entry(char *path, void *data) { - struct playlist_info *playlist = data; + struct playlist_instance *playlist = data; struct osl_row *aft_row; int ret = aft_get_row_of_path(path, &aft_row); @@ -57,31 +57,32 @@ static int add_playlist_entry(char *path, void *data) static int check_playlist_path(char *path, void *data) { - struct para_buffer *pb = data; + struct afs_callback_arg *aca = data; struct osl_row *aft_row; int ret = aft_get_row_of_path(path, &aft_row); if (ret < 0) - para_printf(pb, "%s: %s\n", path, para_strerror(-ret)); + afs_error(aca, "%s: %s\n", path, para_strerror(-ret)); return 1; /* do not fail the loop on bad paths */ } static int check_playlist(struct osl_row *row, void *data) { - struct para_buffer *pb = data; + struct afs_callback_arg *aca = data; + struct para_buffer *pb = &aca->pbout; struct osl_object playlist_def; char *playlist_name; int ret = pl_get_name_and_def_by_row(row, &playlist_name, &playlist_def); if (ret < 0) { /* log error, but continue */ - para_printf(pb, "failed to get playlist data: %s\n", + afs_error(aca, "failed to get playlist data: %s\n", para_strerror(-ret)); return 1; } if (*playlist_name) { /* skip dummy row */ para_printf(pb, "checking playlist %s...\n", playlist_name); for_each_line(FELF_READ_ONLY, playlist_def.data, - playlist_def.size, check_playlist_path, pb); + playlist_def.size, check_playlist_path, aca); } osl_close_disk_object(&playlist_def); return 1; @@ -98,16 +99,12 @@ static int check_playlist(struct osl_row *row, void *data) int playlist_check_callback(struct afs_callback_arg *aca) { para_printf(&aca->pbout, "checking playlists...\n"); - return osl(osl_rbtree_loop(playlists_table, BLOBCOL_ID, &aca->pbout, + return osl(osl_rbtree_loop(playlists_table, BLOBCOL_ID, aca, check_playlist)); } -/** - * Close the current playlist. - * - * \sa \ref playlist_open(). - */ -void playlist_close(void) +/** Free all resources of the current playlist, if any. */ +void playlist_unload(void) { if (!current_playlist.name) return; @@ -124,27 +121,25 @@ void playlist_close(void) * up in the audio file table. If the path lookup succeeds, a reference to the * corresponding row of the audio file table is added to the score table. * - * \param name The name of the playlist to open. - * \param errmsg To be sent to the client (if called via select command). + * \param name The name of the playlist to load. + * \param msg Error message or playlist info is returned here. * * \return The length of the loaded playlist on success, negative error code * else. Files which are listed in the playlist, but are not contained in the * database are ignored. This is not considered an error. */ -int playlist_open(const char *name, char **errmsg) +int playlist_load(const char *name, char **msg) { int ret; - struct playlist_info *playlist = ¤t_playlist; + struct playlist_instance *playlist = ¤t_playlist; struct osl_object playlist_def; ret = pl_get_def_by_name(name, &playlist_def); if (ret < 0) { - if (errmsg) - *errmsg = make_message("could not read playlist %s", - name); + *msg = make_message("could not read playlist %s\n", name); return ret; } - playlist_close(); + playlist_unload(); ret = for_each_line(FELF_READ_ONLY, playlist_def.data, playlist_def.size, add_playlist_entry, playlist); osl_close_disk_object(&playlist_def); @@ -154,15 +149,13 @@ int playlist_open(const char *name, char **errmsg) if (!playlist->length) goto err; playlist->name = para_strdup(name); - PARA_NOTICE_LOG("loaded playlist %s (%u files)\n", playlist->name, + *msg = make_message("loaded playlist %s (%u files)\n", playlist->name, playlist->length); /* success */ return current_playlist.length; err: PARA_NOTICE_LOG("unable to load playlist %s\n", name); - if (errmsg) - *errmsg = make_message("unable to load playlist %s: %s\n", - name, para_strerror(-ret)); + *msg = make_message("unable to load playlist %s\n", name); return ret; }