aboutsummaryrefslogtreecommitdiffstats
path: root/src/playlist
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/PlaylistMapper.cxx (renamed from src/playlist_mapper.c)9
-rw-r--r--src/PlaylistMapper.h (renamed from src/playlist_mapper.h)6
-rw-r--r--src/PlaylistPrint.cxx (renamed from src/playlist_print.c)44
-rw-r--r--src/PlaylistPrint.hxx (renamed from src/playlist_print.h)17
-rw-r--r--src/PlaylistSave.cxx (renamed from src/playlist_save.c)39
-rw-r--r--src/PlaylistSave.hxx (renamed from src/playlist_save.h)2
-rw-r--r--src/playlist.c21
-rw-r--r--src/playlist_any.c2
-rw-r--r--src/playlist_control.c5
-rw-r--r--src/playlist_edit.c20
-rw-r--r--src/playlist_global.c2
-rw-r--r--src/playlist_queue.c6
-rw-r--r--src/playlist_song.c11
13 files changed, 87 insertions, 97 deletions
diff --git a/src/playlist_mapper.c b/src/PlaylistMapper.cxx
index 13adb80d0..39ac043e4 100644
--- a/src/playlist_mapper.c
+++ b/src/PlaylistMapper.cxx
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2003-2011 The Music Player Daemon Project
+ * Copyright (C) 2003-2012 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -18,11 +18,14 @@
*/
#include "config.h"
-#include "playlist_mapper.h"
+#include "PlaylistMapper.h"
+#include "PlaylistFile.hxx"
+
+extern "C" {
#include "playlist_list.h"
-#include "stored_playlist.h"
#include "mapper.h"
#include "uri.h"
+}
#include <assert.h>
diff --git a/src/playlist_mapper.h b/src/PlaylistMapper.h
index 9a7187d93..829aac988 100644
--- a/src/playlist_mapper.h
+++ b/src/PlaylistMapper.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2003-2011 The Music Player Daemon Project
+ * Copyright (C) 2003-2012 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -24,6 +24,8 @@
struct input_stream;
+G_BEGIN_DECLS
+
/**
* Opens a playlist from an URI relative to the playlist or music
* directory.
@@ -36,4 +38,6 @@ struct playlist_provider *
playlist_mapper_open(const char *uri, GMutex *mutex, GCond *cond,
struct input_stream **is_r);
+G_END_DECLS
+
#endif
diff --git a/src/playlist_print.c b/src/PlaylistPrint.cxx
index 59c42f969..40b895f80 100644
--- a/src/playlist_print.c
+++ b/src/PlaylistPrint.cxx
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2003-2011 The Music Player Daemon Project
+ * Copyright (C) 2003-2012 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -18,19 +18,22 @@
*/
#include "config.h"
-#include "playlist_print.h"
+#include "PlaylistPrint.hxx"
+#include "PlaylistFile.hxx"
+#include "QueuePrint.hxx"
+
+extern "C" {
#include "playlist_list.h"
#include "playlist_plugin.h"
#include "playlist_any.h"
#include "playlist_song.h"
#include "playlist.h"
-#include "queue_print.h"
-#include "stored_playlist.h"
#include "song_print.h"
#include "song.h"
#include "database.h"
#include "client.h"
#include "input_stream.h"
+}
void
playlist_print_uris(struct client *client, const struct playlist *playlist)
@@ -88,16 +91,9 @@ playlist_print_current(struct client *client, const struct playlist *playlist)
void
playlist_print_find(struct client *client, const struct playlist *playlist,
- const struct locate_item_list *list)
-{
- queue_find(client, &playlist->queue, list);
-}
-
-void
-playlist_print_search(struct client *client, const struct playlist *playlist,
- const struct locate_item_list *list)
+ const SongFilter &filter)
{
- queue_search(client, &playlist->queue, list);
+ queue_find(client, &playlist->queue, filter);
}
void
@@ -120,30 +116,31 @@ bool
spl_print(struct client *client, const char *name_utf8, bool detail,
GError **error_r)
{
- GPtrArray *list;
-
- list = spl_load(name_utf8, error_r);
- if (list == NULL)
+ GError *error = NULL;
+ PlaylistFileContents contents = LoadPlaylistFile(name_utf8, &error);
+ if (contents.empty() && error != nullptr) {
+ g_propagate_error(error_r, error);
return false;
+ }
- for (unsigned i = 0; i < list->len; ++i) {
- const char *temp = g_ptr_array_index(list, i);
+ for (const auto &uri_utf8 : contents) {
bool wrote = false;
if (detail) {
- struct song *song = db_get_song(temp);
+ struct song *song = db_get_song(uri_utf8.c_str());
if (song) {
song_print_info(client, song);
+ db_return_song(song);
wrote = true;
}
}
if (!wrote) {
- client_printf(client, SONG_FILE "%s\n", temp);
+ client_printf(client, SONG_FILE "%s\n",
+ uri_utf8.c_str());
}
}
- spl_free(list);
return true;
}
@@ -164,8 +161,7 @@ playlist_provider_print(struct client *client, const char *uri,
else
song_print_uri(client, song);
- if (!song_in_database(song))
- song_free(song);
+ song_free(song);
}
g_free(base_uri);
diff --git a/src/playlist_print.h b/src/PlaylistPrint.hxx
index d4f1911d2..ac0712f01 100644
--- a/src/playlist_print.h
+++ b/src/PlaylistPrint.hxx
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2003-2011 The Music Player Daemon Project
+ * Copyright (C) 2003-2012 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -17,8 +17,8 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#ifndef PLAYLIST_PRINT_H
-#define PLAYLIST_PRINT_H
+#ifndef MPD_PLAYLIST_PRINT_HXX
+#define MPD_PLAYLIST_PRINT_HXX
#include <glib.h>
#include <stdbool.h>
@@ -26,7 +26,7 @@
struct client;
struct playlist;
-struct locate_item_list;
+class SongFilter;
/**
* Sends the whole playlist to the client, song URIs only.
@@ -66,14 +66,7 @@ playlist_print_current(struct client *client, const struct playlist *playlist);
*/
void
playlist_print_find(struct client *client, const struct playlist *playlist,
- const struct locate_item_list *list);
-
-/**
- * Search for songs in the playlist.
- */
-void
-playlist_print_search(struct client *client, const struct playlist *playlist,
- const struct locate_item_list *list);
+ const SongFilter &filter);
/**
* Print detailed changes since the specified playlist version.
diff --git a/src/playlist_save.c b/src/PlaylistSave.cxx
index 334159e0d..8d1908aac 100644
--- a/src/playlist_save.c
+++ b/src/PlaylistSave.cxx
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2003-2011 The Music Player Daemon Project
+ * Copyright (C) 2003-2012 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -18,16 +18,18 @@
*/
#include "config.h"
-#include "playlist_save.h"
-#include "playlist.h"
-#include "stored_playlist.h"
-#include "queue.h"
+#include "PlaylistSave.hxx"
+#include "PlaylistFile.hxx"
#include "song.h"
+
+extern "C" {
+#include "playlist.h"
#include "mapper.h"
#include "path.h"
#include "uri.h"
-#include "database.h"
#include "idle.h"
+}
+
#include "glib_compat.h"
#include <glib.h>
@@ -117,34 +119,35 @@ playlist_load_spl(struct playlist *playlist, struct player_control *pc,
unsigned start_index, unsigned end_index,
GError **error_r)
{
- GPtrArray *list;
-
- list = spl_load(name_utf8, error_r);
- if (list == NULL)
+ GError *error = NULL;
+ PlaylistFileContents contents = LoadPlaylistFile(name_utf8, &error);
+ if (contents.empty() && error != nullptr) {
+ g_propagate_error(error_r, error);
return false;
+ }
- if (list->len < end_index)
- end_index = list->len;
+ if (end_index > contents.size())
+ end_index = contents.size();
for (unsigned i = start_index; i < end_index; ++i) {
- const char *temp = g_ptr_array_index(list, i);
- if ((playlist_append_uri(playlist, pc, temp, NULL)) != PLAYLIST_RESULT_SUCCESS) {
+ const auto &uri_utf8 = contents[i];
+
+ if ((playlist_append_uri(playlist, pc, uri_utf8.c_str(),
+ nullptr)) != PLAYLIST_RESULT_SUCCESS) {
/* for windows compatibility, convert slashes */
- char *temp2 = g_strdup(temp);
+ char *temp2 = g_strdup(uri_utf8.c_str());
char *p = temp2;
while (*p) {
if (*p == '\\')
*p = '/';
p++;
}
- if ((playlist_append_uri(playlist, pc, temp2,
- NULL)) != PLAYLIST_RESULT_SUCCESS) {
+ if ((playlist_append_uri(playlist, pc, temp2, NULL)) != PLAYLIST_RESULT_SUCCESS) {
g_warning("can't add file \"%s\"", temp2);
}
g_free(temp2);
}
}
- spl_free(list);
return true;
}
diff --git a/src/playlist_save.h b/src/PlaylistSave.hxx
index a6c31a9a6..20b2ca425 100644
--- a/src/playlist_save.h
+++ b/src/PlaylistSave.hxx
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2003-2011 The Music Player Daemon Project
+ * Copyright (C) 2003-2012 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
diff --git a/src/playlist.c b/src/playlist.c
index dc6d8c340..2532d9d46 100644
--- a/src/playlist.c
+++ b/src/playlist.c
@@ -19,13 +19,9 @@
#include "config.h"
#include "playlist_internal.h"
-#include "playlist_save.h"
#include "player_control.h"
-#include "command.h"
-#include "tag.h"
#include "song.h"
#include "conf.h"
-#include "stored_playlist.h"
#include "idle.h"
#include <glib.h>
@@ -78,14 +74,15 @@ static void
playlist_queue_song_order(struct playlist *playlist, struct player_control *pc,
unsigned order)
{
- struct song *song;
char *uri;
assert(queue_valid_order(&playlist->queue, order));
playlist->queued = order;
- song = queue_get_order(&playlist->queue, order);
+ struct song *song =
+ song_dup_detached(queue_get_order(&playlist->queue, order));
+
uri = song_get_uri(song);
g_debug("queue song %i:\"%s\"", playlist->queued, uri);
g_free(uri);
@@ -186,13 +183,13 @@ void
playlist_play_order(struct playlist *playlist, struct player_control *pc,
int orderNum)
{
- struct song *song;
char *uri;
playlist->playing = true;
playlist->queued = -1;
- song = queue_get_order(&playlist->queue, orderNum);
+ struct song *song =
+ song_dup_detached(queue_get_order(&playlist->queue, orderNum));
uri = song_get_uri(song);
g_debug("play %i:\"%s\"", orderNum, uri);
@@ -257,14 +254,14 @@ playlist_resume_playback(struct playlist *playlist, struct player_control *pc)
assert(playlist->playing);
assert(pc_get_state(pc) == PLAYER_STATE_STOP);
- error = pc_get_error(pc);
- if (error == PLAYER_ERROR_NOERROR)
+ error = pc_get_error_type(pc);
+ if (error == PLAYER_ERROR_NONE)
playlist->error_count = 0;
else
++playlist->error_count;
- if ((playlist->stop_on_error && error != PLAYER_ERROR_NOERROR) ||
- error == PLAYER_ERROR_AUDIO || error == PLAYER_ERROR_SYSTEM ||
+ if ((playlist->stop_on_error && error != PLAYER_ERROR_NONE) ||
+ error == PLAYER_ERROR_OUTPUT ||
playlist->error_count >= queue_length(&playlist->queue))
/* too many errors, or critical error: stop
playback */
diff --git a/src/playlist_any.c b/src/playlist_any.c
index 450ca5932..e4017ac0d 100644
--- a/src/playlist_any.c
+++ b/src/playlist_any.c
@@ -20,7 +20,7 @@
#include "config.h"
#include "playlist_any.h"
#include "playlist_list.h"
-#include "playlist_mapper.h"
+#include "PlaylistMapper.h"
#include "uri.h"
#include "input_stream.h"
diff --git a/src/playlist_control.c b/src/playlist_control.c
index 0dea7676a..57cc428fe 100644
--- a/src/playlist_control.c
+++ b/src/playlist_control.c
@@ -25,6 +25,7 @@
#include "config.h"
#include "playlist_internal.h"
#include "player_control.h"
+#include "song.h"
#include "idle.h"
#include <glib.h>
@@ -239,7 +240,9 @@ playlist_seek_song(struct playlist *playlist, struct player_control *pc,
queued = NULL;
}
- success = pc_seek(pc, queue_get_order(&playlist->queue, i), seek_time);
+ struct song *the_song =
+ song_dup_detached(queue_get_order(&playlist->queue, i));
+ success = pc_seek(pc, the_song, seek_time);
if (!success) {
playlist_update_queued_song(playlist, pc, queued);
diff --git a/src/playlist_edit.c b/src/playlist_edit.c
index d10f49451..2b7cdd8ae 100644
--- a/src/playlist_edit.c
+++ b/src/playlist_edit.c
@@ -45,14 +45,6 @@ playlist_clear(struct playlist *playlist, struct player_control *pc)
{
playlist_stop(playlist, pc);
- /* make sure there are no references to allocated songs
- anymore */
- for (unsigned i = 0; i < queue_length(&playlist->queue); i++) {
- const struct song *song = queue_get(&playlist->queue, i);
- if (!song_in_database(song))
- pc_song_deleted(pc, song);
- }
-
queue_clear(&playlist->queue);
playlist->current = -1;
@@ -136,7 +128,12 @@ playlist_append_uri(struct playlist *playlist, struct player_control *pc,
if (song == NULL)
return PLAYLIST_RESULT_NO_SUCH_SONG;
- return playlist_append_song(playlist, pc, song, added_id);
+ enum playlist_result result =
+ playlist_append_song(playlist, pc, song, added_id);
+ if (song_in_database(song))
+ db_return_song(song);
+
+ return result;
}
enum playlist_result
@@ -287,9 +284,6 @@ playlist_delete_internal(struct playlist *playlist, struct player_control *pc,
/* now do it: remove the song */
- if (!song_in_database(queue_get(&playlist->queue, song)))
- pc_song_deleted(pc, queue_get(&playlist->queue, song));
-
queue_delete(&playlist->queue, song);
/* update the "current" and "queued" variables */
@@ -363,8 +357,6 @@ playlist_delete_song(struct playlist *playlist, struct player_control *pc,
for (int i = queue_length(&playlist->queue) - 1; i >= 0; --i)
if (song == queue_get(&playlist->queue, i))
playlist_delete(playlist, pc, i);
-
- pc_song_deleted(pc, song);
}
enum playlist_result
diff --git a/src/playlist_global.c b/src/playlist_global.c
index 650b88bb8..43bf26755 100644
--- a/src/playlist_global.c
+++ b/src/playlist_global.c
@@ -26,7 +26,7 @@
#include "playlist.h"
#include "playlist_state.h"
#include "event_pipe.h"
-#include "main.h"
+#include "Main.hxx"
struct playlist g_playlist;
diff --git a/src/playlist_queue.c b/src/playlist_queue.c
index aada94984..8eb535dbd 100644
--- a/src/playlist_queue.c
+++ b/src/playlist_queue.c
@@ -41,8 +41,7 @@ playlist_load_into_queue(const char *uri, struct playlist_provider *source,
++i) {
if (i < start_index) {
/* skip songs before the start index */
- if (!song_in_database(song))
- song_free(song);
+ song_free(song);
continue;
}
@@ -51,9 +50,8 @@ playlist_load_into_queue(const char *uri, struct playlist_provider *source,
continue;
result = playlist_append_song(dest, pc, song, NULL);
+ song_free(song);
if (result != PLAYLIST_RESULT_SUCCESS) {
- if (!song_in_database(song))
- song_free(song);
g_free(base_uri);
return result;
}
diff --git a/src/playlist_song.c b/src/playlist_song.c
index a3d9ab4d9..2e2870d38 100644
--- a/src/playlist_song.c
+++ b/src/playlist_song.c
@@ -86,9 +86,7 @@ apply_song_metadata(struct song *dest, const struct song *src)
(e.g. last track on a CUE file); fix it up here */
tmp->tag->time = dest->tag->time - src->start_ms / 1000;
- if (!song_in_database(dest))
- song_free(dest);
-
+ song_free(dest);
return tmp;
}
@@ -104,10 +102,13 @@ playlist_check_load_song(const struct song *song, const char *uri, bool secure)
if (dest == NULL)
return NULL;
} else {
- dest = db_get_song(uri);
- if (dest == NULL)
+ struct song *tmp = db_get_song(uri);
+ if (tmp == NULL)
/* not found in database */
return NULL;
+
+ dest = song_dup_detached(tmp);
+ db_return_song(tmp);
}
return apply_song_metadata(dest, song);