PARA_ERROR(OPUS_SET_GAIN, "opus: could not set gain"), \
PARA_ERROR(PATH_FOUND, ""), /* not really an error */ \
PARA_ERROR(PLAYLIST_EMPTY, "attempted to load empty playlist"), \
- PARA_ERROR(PLAYLIST_LOADED, ""), /* not really an error */ \
PARA_ERROR(PREBUFFER_SUCCESS, "prebuffering complete"), \
PARA_ERROR(PRIVATE_KEY, "can not read private key"), \
PARA_ERROR(QUEUE, "packet queue overrun"), \
return 1;
}
-/* returns -E_PLAYLIST_LOADED on _success_ to terminate the loop */
-static int load_playlist(struct osl_row *row, void *data)
-{
- struct playlist_info *playlist = data;
- struct osl_object playlist_def;
- char *playlist_name;
- int ret;
-
- ret = pl_get_name_and_def_by_row(row, &playlist_name, &playlist_def);
- if (ret < 0)
- goto err;
- playlist->length = 0;
- ret = for_each_line(FELF_READ_ONLY, playlist_def.data,
- playlist_def.size, add_playlist_entry, playlist);
- osl_close_disk_object(&playlist_def);
- if (ret < 0)
- goto err;
- ret = -E_PLAYLIST_EMPTY;
- if (!playlist->length)
- goto err;
- playlist->name = para_strdup(playlist_name);
- PARA_NOTICE_LOG("loaded playlist %s (%u files)\n", playlist->name,
- playlist->length);
- return -E_PLAYLIST_LOADED;
-err:
- if (ret != -E_DUMMY_ROW)
- PARA_NOTICE_LOG("unable to load playlist (%s)\n",
- para_strerror(-ret));
- return 1;
-}
-
static int check_playlist_path(char *path, void *data)
{
struct para_buffer *pb = data;
return;
free(current_playlist.name);
current_playlist.name = NULL;
+ current_playlist.length = 0;
}
/**
- * Open and load the given playlist.
+ * Populate the score table from the paths of a playlist database object.
+ *
+ * This loads the blob object which corresponds to the given name from the
+ * playlist table. Each line of the blob is regarded as a path which is looked
+ * 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).
*
- * Files which are listed in the playlist, but not contained in the database
- * are ignored. This is not considered an error.
- *
* \return The length of the loaded playlist on success, negative error code
- * else.
+ * 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)
{
- struct osl_object obj;
int ret;
- struct osl_row *row;
+ struct playlist_info *playlist = ¤t_playlist;
+ struct osl_object playlist_def;
- obj.data = (char *)name;
- obj.size = strlen(obj.data);
- ret = osl(osl_get_row(playlists_table, BLOBCOL_NAME, &obj, &row));
+ ret = pl_get_def_by_name(name, &playlist_def);
if (ret < 0) {
if (errmsg)
- *errmsg = make_message("could not open playlist %s",
+ *errmsg = make_message("could not read playlist %s",
name);
return ret;
}
playlist_close();
- ret = load_playlist(row, ¤t_playlist);
- return (ret == -E_PLAYLIST_LOADED)? current_playlist.length : ret;
+ ret = for_each_line(FELF_READ_ONLY, playlist_def.data,
+ playlist_def.size, add_playlist_entry, playlist);
+ osl_close_disk_object(&playlist_def);
+ if (ret < 0)
+ goto err;
+ ret = -E_PLAYLIST_EMPTY;
+ if (!playlist->length)
+ goto err;
+ playlist->name = para_strdup(name);
+ PARA_NOTICE_LOG("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));
+ return ret;
}
static int search_path(char *path, void *data)