From e57bacff55d0ece7e1807d2d1cadf738f6b2a7da Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sun, 29 Jun 2008 21:03:27 +0200 Subject: [PATCH] Implement ogg vorbis comment parsing. --- NEWS | 7 +++++-- ogg_afh.c | 29 +++++++++++++++++++++++------ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/NEWS b/NEWS index e5730e78..3e5f1ce8 100644 --- a/NEWS +++ b/NEWS @@ -4,16 +4,19 @@ NEWS ------------------------------------------------- 0.3.3 (to be announced) "axiomatic perspectivity" ------------------------------------------------- -Internal code cleanups and id3v2 support. + +Internal code cleanups and improved tag handling. - para_server uses the generic scheduling code. - overhaul of the virtual streaming system. - - id3 version 2 support via libid3tag (optional) + - mp3: id3 version 2 support via libid3tag (optional) + - ogg: vorbis comment support. - mp3 audio format handler cleanups. ----------------------------------------- 0.3.2 (2008-04-11) "probabilistic parity" ----------------------------------------- + The new para_afh executable, scheduling and documentation improvements. - new ls option: -lc (list chunk table) diff --git a/ogg_afh.c b/ogg_afh.c index 2b934ddd..11f7f5ad 100644 --- a/ogg_afh.c +++ b/ogg_afh.c @@ -157,7 +157,6 @@ static int ogg_compute_header_len(char *map, size_t numbytes, goto err2; PARA_DEBUG_LOG("channels: %i, rate: %li\n", vi.channels, vi.rate); ogg_stream_packetin(stream_out, &packet); - ret = ogg_sync_pageout(sync_in, &page); if (ret <= 0) { ret = -E_SYNC_PAGEOUT; @@ -235,6 +234,28 @@ static long unsigned ogg_compute_chunk_table(OggVorbis_File *of, return num_chunks; } +static void ogg_write_info_string(OggVorbis_File *vf, struct afh_info *afhi) +{ + char *taginfo; + vorbis_comment *vc = ov_comment(vf,-1); + + if (vc) { + char *artist, *title, *album, *year, *comment; + artist = vorbis_comment_query(vc, "artist", 0); + title = vorbis_comment_query(vc, "title", 0); + album = vorbis_comment_query(vc, "album", 0); + year = vorbis_comment_query(vc, "year", 0); + comment = vorbis_comment_query(vc, "comment", 0); + taginfo = make_taginfo(title, artist, album, year, comment); + } else + taginfo = make_message("%s: (no vorbis comments found)\n%s:\n", + status_item_list[SI_TAGINFO1], + status_item_list[SI_TAGINFO2]); + afhi->info_string = make_message("%s:\n%s", + status_item_list[SI_AUDIO_FILE_INFO], taginfo); + free(taginfo); +} + /* * Init oggvorbis file and write some tech data to given pointers. */ @@ -267,14 +288,10 @@ static int ogg_get_file_info(char *map, size_t numbytes, __a_unused int fd, afhi->bitrate = ov_bitrate(&of, 0) / 1000; afhi->channels = vi->channels; afhi->chunks_total = ogg_compute_chunk_table(&of, afhi, afhi->seconds_total); - afhi->info_string = make_message("%s:\n%s:\n%s:\n", - status_item_list[SI_AUDIO_FILE_INFO], - status_item_list[SI_TAGINFO1], - status_item_list[SI_TAGINFO2] - ); afhi->chunk_tv.tv_sec = 0; afhi->chunk_tv.tv_usec = 250 * 1000; tv_scale(10 / afhi->channels, &afhi->chunk_tv, &afhi->eof_tv); + ogg_write_info_string(&of, afhi); ret = 1; err: ov_clear(&of); /* keeps the file open */ -- 2.39.5