diff options
Diffstat (limited to 'audio/mserv/patches/patch-ai')
-rw-r--r-- | audio/mserv/patches/patch-ai | 139 |
1 files changed, 122 insertions, 17 deletions
diff --git a/audio/mserv/patches/patch-ai b/audio/mserv/patches/patch-ai index e5f063dc6b2..c9a51e1f852 100644 --- a/audio/mserv/patches/patch-ai +++ b/audio/mserv/patches/patch-ai @@ -1,19 +1,124 @@ -$NetBSD: patch-ai,v 1.2 2002/08/02 23:01:47 abs Exp $ +$NetBSD: patch-ai,v 1.3 2002/10/03 15:46:58 abs Exp $ ---- mserv/mserv.c.orig Sat Jul 15 18:01:15 2000 -+++ mserv/mserv.c -@@ -3370,7 +3370,13 @@ int mserv_setmixer(t_client *cl, int wha - mserv_response(cl, "IOCTLWR", NULL); - return -1; - } -- newval = newval & 0xFF; -+ if (ioctl(mixer_fd, MIXER_READ(what), &newval) == -1) { -+ close(mixer_fd); -+ perror("iotcl read"); -+ mserv_response(cl, "IOCTLRD", 0); -+ return -1; +--- mserv/mp3info.c.orig Thu Oct 3 16:10:58 2002 ++++ mserv/mp3info.c +@@ -7,6 +7,7 @@ + #include <stdlib.h> + #include <string.h> + #include <errno.h> ++#include "mserv.h" + #include "mp3info.h" + + /* mp3 frame header structure */ +@@ -25,6 +26,8 @@ + #define h_id(val) ((val>>19)&1) + #define h_thing(val) ((val>>20)&0xfff) + ++#define ID3V2HEADERLEN 10 ++ + /* mp3 bit rate and sampling frequency tables */ + + const int bitrate_table[2][3][16] = +@@ -51,6 +54,16 @@ typedef struct id3tag_disc_str + unsigned char genre; + } id3tag_disc; + ++/* id3 v2 frame tag data */ ++ ++typedef struct id3v2_frame_str ++{ ++ char frameid[4]; ++ uint32_t size; ++ uint16_t flags; ++ char data[1024]; ++ size_t datalen; ++} id3v2_frame; + /* id3 tags genre */ + + const char *genres_table[] = { +@@ -201,20 +214,46 @@ static int is_mp3(unsigned long int flag + return 1; + } + ++/* returns 0 if id3v2 frame found, -1 otherwise */ ++ ++static int read_id3v2_frame(FILE *f, id3v2_frame *frame) ++{ ++ if (fread(frame->frameid, 1, 4, f) != 4 || ++ fread(&frame->size, 1, 4, f) != 4 || fread(&frame->flags, 1, 2, f) != 2) ++ return -1; ++ frame->size = ntohl(frame->size); ++ frame->flags = ntohs(frame->flags); ++ frame->datalen = (frame->size >= sizeof(frame->data) - 1) ++ ?(sizeof(frame->data) - 1) :frame->size; ++ if (fread(frame->data, 1, frame->datalen, f) != frame->datalen) ++ return -1; ++ if (frame->frameid[0] == 'T' && memcmp(frame->frameid + 1, "XXX", 3)) { ++ frame->data[frame->datalen] = 0; ++ if (frame->data[0] == 0) /* Only handle non unicode */ ++ strcpy(frame->data, frame->data + 1); ++ else ++ frame->data[0] = 0; ++ } ++ return 0; ++} ++ + /* returns 0 if no id3v2 header, otherwise returns tag length, or -1 + and errno set */ + + static int mp3_id3v2head(FILE *f) + { + char tag[3]; ++ char size[4]; + if (fseek(f, 0, SEEK_SET) == -1 || fread(tag, 1, 3, f) != 3) + return -1; + + if (strncmp(tag, "ID3", 3)) + return 0; /* no header */ ++ if (fseek(f, 2 + 1, SEEK_CUR) == -1 || fread(size, 1, 4, f) != 4) ++ return -1; + +- errno = ENOSYS; +- return -1; ++ return ID3V2HEADERLEN + size[3] + (size[2] << 7) + (size[1] << 14) + ++ (size[0] << 21); + } + + /* determines length and bitrate of an mp3. returns -1 on failure with errno +@@ -321,12 +360,35 @@ int mserv_mp3info_readlen(const char *fn + /* No ID3 tag present; last 128 bytes is music. */ + filelen += 128; + } +- fclose(f); /* ignore error */ + + *bitrate_ret = bitrate; + length = ((filelen - headerlen) / mean_frame_size ) * + ((115200/2) * (1+h_id(flags)) ) / fs; /* in 1/100 seconds */ ++ ++ /* If mp3v2 header present, read its contents */ ++ if (headerlen && fseek(f, ID3V2HEADERLEN, SEEK_SET) != -1) { ++ id3v2_frame frame; ++ while (read_id3v2_frame(f, &frame) != -1) { ++ if (!memcmp(frame.frameid, "TALB", 4)) { ++ memcpy(id3tag->album, frame.data, sizeof(id3tag->album) - 1); ++ id3tag->album[sizeof(id3tag->album) - 1] = 0; + } -+ newval = newval & 0xff; - if (type == 0 || newval != curval) - break; - param++; ++ else if (!memcmp(frame.frameid, "TPE1", 4)) { ++ memcpy(id3tag->artist, frame.data, sizeof(id3tag->artist) - 1); ++ id3tag->artist[sizeof(id3tag->artist) - 1] = 0; ++ } ++ else if (!memcmp(frame.frameid, "TIT2", 4)) { ++ memcpy(id3tag->title, frame.data, sizeof(id3tag->title) - 1); ++ id3tag->title[sizeof(id3tag->title) - 1] = 0; ++ } ++ if (ftell(f) >= headerlen) ++ break; ++ } ++ } ++ ++ fclose(f); /* ignore error */ + return length; ++ + error: + errnok = errno; + fclose(f); /* ignore error */ |