aboutsummaryrefslogtreecommitdiffstats
path: root/src/playlist
diff options
context:
space:
mode:
Diffstat (limited to 'src/playlist')
-rw-r--r--src/playlist/EmbeddedCuePlaylistPlugin.cxx68
1 files changed, 41 insertions, 27 deletions
diff --git a/src/playlist/EmbeddedCuePlaylistPlugin.cxx b/src/playlist/EmbeddedCuePlaylistPlugin.cxx
index 3d69ed72b..978c05026 100644
--- a/src/playlist/EmbeddedCuePlaylistPlugin.cxx
+++ b/src/playlist/EmbeddedCuePlaylistPlugin.cxx
@@ -41,7 +41,7 @@
#undef G_LOG_DOMAIN
#define G_LOG_DOMAIN "cue"
-struct embcue_playlist {
+struct EmbeddedCuePlaylist {
struct playlist_provider base;
/**
@@ -62,12 +62,25 @@ struct embcue_playlist {
char *next;
CueParser *parser;
+
+ EmbeddedCuePlaylist()
+ :filename(nullptr), cuesheet(nullptr), parser(nullptr) {
+ playlist_provider_init(&base, &embcue_playlist_plugin);
+ }
+
+ ~EmbeddedCuePlaylist() {
+ delete parser;
+ g_free(cuesheet);
+ g_free(filename);
+ }
+
+ Song *Read();
};
static void
embcue_tag_pair(const char *name, const char *value, void *ctx)
{
- struct embcue_playlist *playlist = (struct embcue_playlist *)ctx;
+ EmbeddedCuePlaylist *playlist = (EmbeddedCuePlaylist *)ctx;
if (playlist->cuesheet == NULL &&
g_ascii_strcasecmp(name, "cuesheet") == 0)
@@ -89,9 +102,7 @@ embcue_playlist_open_uri(const char *uri,
/* only local files supported */
return NULL;
- struct embcue_playlist *playlist = g_new(struct embcue_playlist, 1);
- playlist_provider_init(&playlist->base, &embcue_playlist_plugin);
- playlist->cuesheet = NULL;
+ const auto playlist = new EmbeddedCuePlaylist();
tag_file_scan(uri, &embcue_tag_handler, playlist);
if (playlist->cuesheet == NULL) {
@@ -102,7 +113,7 @@ embcue_playlist_open_uri(const char *uri,
if (playlist->cuesheet == NULL) {
/* no "CUESHEET" tag found */
- g_free(playlist);
+ delete playlist;
return NULL;
}
@@ -117,48 +128,51 @@ embcue_playlist_open_uri(const char *uri,
static void
embcue_playlist_close(struct playlist_provider *_playlist)
{
- struct embcue_playlist *playlist = (struct embcue_playlist *)_playlist;
+ EmbeddedCuePlaylist *playlist = (EmbeddedCuePlaylist *)_playlist;
- delete playlist->parser;
- g_free(playlist->cuesheet);
- g_free(playlist->filename);
- g_free(playlist);
+ delete playlist;
}
-static Song *
-embcue_playlist_read(struct playlist_provider *_playlist)
+inline Song *
+EmbeddedCuePlaylist::Read()
{
- struct embcue_playlist *playlist = (struct embcue_playlist *)_playlist;
-
- Song *song = playlist->parser->Get();
+ Song *song = parser->Get();
if (song != NULL)
return song;
- while (*playlist->next != 0) {
- const char *line = playlist->next;
- char *eol = strpbrk(playlist->next, "\r\n");
+ while (*next != 0) {
+ const char *line = next;
+ char *eol = strpbrk(next, "\r\n");
if (eol != NULL) {
/* null-terminate the line */
*eol = 0;
- playlist->next = eol + 1;
+ next = eol + 1;
} else
/* last line; put the "next" pointer to the
end of the buffer */
- playlist->next += strlen(line);
+ next += strlen(line);
- playlist->parser->Feed(line);
- song = playlist->parser->Get();
+ parser->Feed(line);
+ song = parser->Get();
if (song != NULL)
- return song->ReplaceURI(playlist->filename);
+ return song->ReplaceURI(filename);
}
- playlist->parser->Finish();
- song = playlist->parser->Get();
+ parser->Finish();
+ song = parser->Get();
if (song != NULL)
- song = song->ReplaceURI(playlist->filename);
+ song = song->ReplaceURI(filename);
return song;
}
+static Song *
+embcue_playlist_read(struct playlist_provider *_playlist)
+{
+ EmbeddedCuePlaylist *playlist = (EmbeddedCuePlaylist *)_playlist;
+
+ return playlist->Read();
+}
+
static const char *const embcue_playlist_suffixes[] = {
/* a few codecs that are known to be supported; there are
probably many more */