The ogg/vorbis tagger.
authorAndre Noll <maan@systemlinux.org>
Mon, 16 Dec 2013 07:35:59 +0000 (08:35 +0100)
committerAndre Noll <maan@tuebingen.mpg.de>
Sun, 26 Apr 2015 12:13:34 +0000 (14:13 +0200)
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().

error.h
ogg_afh.c

diff --git a/error.h b/error.h
index eb8d659b6c0f3ef6876f26c9ca4031a1d5feeaf4..17c4a293d3236d2cf025a88d8b128c406a4411f4 100644 (file)
--- 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?)"), \
 
 #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"), \
 
        PARA_ERROR(OGG_PACKET_IN, "ogg_stream_packetin() failed"), \
        PARA_ERROR(OGG_STREAM_FLUSH, "ogg_stream_flush() failed"), \
 
index 9dfb028d0a2f9e14dac54cbc5a4ca200cd2dcf6b..32f8bc1beda6f10376db3d3842e0e3cfcaf02e96 100644 (file)
--- a/ogg_afh.c
+++ b/ogg_afh.c
@@ -173,6 +173,39 @@ fail:
 
 static const char* ogg_suffixes[] = {"ogg", NULL};
 
 
 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.
  *
 /**
  * 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->get_file_info = ogg_vorbis_get_file_info;
        afh->get_header = vorbis_get_header;
        afh->suffixes = ogg_suffixes;
+       afh->rewrite_tags = vorbis_rewrite_tags;
 }
 }