From: Andre Noll Date: Mon, 16 Dec 2013 07:35:59 +0000 (+0100) Subject: The ogg/vorbis tagger. X-Git-Tag: v0.5.6~100^2~5 X-Git-Url: http://git.tue.mpg.de/?a=commitdiff_plain;h=76b96e3530d576e2a5a8da487ee975d3bec6ae44;p=paraslash.git The ogg/vorbis tagger. Thanks to the previous commit which implemented the generic ogg_rewrite_tags() as part of the the ogg/opus tagger, it is rather simple to provide the same functionality also for the ogg/vorbis audio format. This patch adds a new function to ogg_afh.c which creates a vorbis-specific metadata ogg packet and passes it to ogg_rewrite_tags(). --- diff --git a/error.h b/error.h index eb8d659b..17c4a293 100644 --- a/error.h +++ b/error.h @@ -421,6 +421,7 @@ extern const char **para_errlist[]; #define OGG_AFH_ERRORS \ PARA_ERROR(VORBIS, "vorbis synthesis header-in error (not vorbis?)"), \ + PARA_ERROR(VORBIS_COMMENTHEADER, "could not create vorbis comment header"), \ PARA_ERROR(OGG_PACKET_IN, "ogg_stream_packetin() failed"), \ PARA_ERROR(OGG_STREAM_FLUSH, "ogg_stream_flush() failed"), \ diff --git a/ogg_afh.c b/ogg_afh.c index 9dfb028d..32f8bc1b 100644 --- a/ogg_afh.c +++ b/ogg_afh.c @@ -173,6 +173,39 @@ fail: static const char* ogg_suffixes[] = {"ogg", NULL}; +static int vorbis_make_meta_packet(struct taginfo *tags, ogg_packet *result) +{ + vorbis_comment vc; + int ret; + + vorbis_comment_init(&vc); + vorbis_comment_add_tag(&vc, "artist", tags->artist); + vorbis_comment_add_tag(&vc, "title", tags->title); + vorbis_comment_add_tag(&vc, "album", tags->album); + vorbis_comment_add_tag(&vc, "year", tags->year); + vorbis_comment_add_tag(&vc, "comment", tags->comment); + ret = vorbis_commentheader_out(&vc, result); + vorbis_comment_clear(&vc); + if (ret != 0) + return -E_VORBIS_COMMENTHEADER; + return 1; +} + +static int vorbis_rewrite_tags(const char *map, size_t mapsize, + struct taginfo *tags, int output_fd, + __a_unused const char *filename) +{ + int ret; + ogg_packet packet; + + ret = vorbis_make_meta_packet(tags, &packet); + if (ret < 0) + return ret; + ret = ogg_rewrite_tags(map, mapsize, output_fd, (char *)packet.packet, + packet.bytes); + free(packet.packet); + return ret; +} /** * The init function of the ogg vorbis audio format handler. * @@ -183,4 +216,5 @@ void ogg_init(struct audio_format_handler *afh) afh->get_file_info = ogg_vorbis_get_file_info; afh->get_header = vorbis_get_header; afh->suffixes = ogg_suffixes; + afh->rewrite_tags = vorbis_rewrite_tags; }