diff options
Diffstat (limited to 'src/playlist')
-rw-r--r-- | src/playlist/EmbeddedCuePlaylistPlugin.cxx | 68 |
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 */ |