For those that have ripped all their CD's to wav w/ LIST tags, like those used by the 
Audiotron.
 
This patch will set the ID3 tags when converting a wav => mp3
 
 
--- lame-3.93.1/frontend/get_audio.c    2002-10-17 08:38:32.000000000 -0400
+++ lame-3.93.1-work/frontend/get_audio.c       2003-06-28 21:56:30.000000000 -0400
@@ -1009,9 +1009,132 @@
 #define WAV_ID_WAVE 0x57415645 /* "WAVE" */
 #define WAV_ID_FMT  0x666d7420 /* "fmt " */
 #define WAV_ID_DATA 0x64617461 /* "data" */
+#define WAV_ID_LIST 0x4c495354 /* "LIST" */
+#define WAV_ID_INFO 0x494e464f /* "INFO" */
+#define WAV_ID_INAM 0x494e414d /* "INAM" */
+#define WAV_ID_IART 0x49415254 /* "IART" */
+#define WAV_ID_IGNR 0x49474e52 /* "IGNR" */
+#define WAV_ID_IPRD 0x49505244 /* "IPRD" */
+#define WAV_ID_ITRK 0x6974726b /* "itrk" */
+
+#define INFO_SIZE 256
+
+/**********************************************
+ * Pull RIFF LIST INFO headers out of WAV files
+ * and set their matching id3 tags
+ * INFO headers are used by Turtle Beach's Audiotron 
+ * itrk is their extension for Track Number
+ * 
+ * refer to 
+ * http://www.saettler.com/RIFFMCI/riffmci.html
+ * http://www.turtlebeach.com/site/kb_ftp/1166005.asp
+ *********************************************/
+
+void SetIDTagsFromRiffTags(lame_global_flags * gfp, FILE * sf)
+{
+       int subSize =Read32BitsLowHigh(sf);
+       while (0 != subSize )
+       {
+               int type = Read32BitsHighLow(sf);
+               subSize -= 4;
+               if (WAV_ID_INFO == type)
+               {
+               }
+               else if (WAV_ID_INAM == type)
+               {
+                       // Track Name
+                       char buf[INFO_SIZE]={0};
+                       unsigned int length=Read32BitsLowHigh(sf);
+                       subSize -= 4;
+
+                       ReadBytes(sf,&buf[0],length);
+                       id3tag_set_title(gfp,strdup(&buf[0]));
+
+                       subSize -= length;
+                       if (length & 0x00000001 )  
+                       {
+                               // resolve word padding
+                               ReadByte(sf);
+                               subSize--;
+                       }
+               }
+               else if (WAV_ID_IART == type)
+               {
+                       // Artist Name
+                       unsigned int length=Read32BitsLowHigh(sf);
+                       char buf[INFO_SIZE]={0};
+                       subSize -= 4;
 
+                       ReadBytes(sf,&buf[0],length);
+                       id3tag_set_artist(gfp, strdup(&buf[0]));
 
+                       subSize -= length;
+                       if (length & 0x00000001 )  // resolve word padding
+                       {
+                               // resolve word padding
+                               ReadByte(sf);
+                               subSize--;
+                       }
+               }
+               else if (WAV_ID_IGNR == type)
+               {
+                       // Genre Name
+                       char buf[INFO_SIZE]={0};
+                       unsigned int length=Read32BitsLowHigh(sf);
+                       subSize -= 4;
+
+                       ReadBytes(sf,&buf[0],length);
+                       if (id3tag_set_genre(gfp,strdup(&buf[0]))) 
+                       {
+                               fprintf(stderr,"Unknown genre: %s.  Specify genre name 
or number\n", buf);
+                       }
+
+                       subSize -= length;
+                       if (length & 0x00000001 )  // resolve word padding
+                       {
+                               // resolve word padding
+                               ReadByte(sf);
+                               subSize--;
+                       }
+               }
+               else if (WAV_ID_IPRD == type)
+               {
+                       // Title
+                       char buf[INFO_SIZE]={0};
+                       unsigned int length=Read32BitsLowHigh(sf);
+                       subSize -= 4;
+
+                       ReadBytes(sf,&buf[0],length);
+                       id3tag_set_album(gfp, strdup(&buf[0]));
 
+                       subSize -= length;
+                       if (length & 0x00000001 )  // resolve word padding
+                       {
+                               // resolve word padding
+                               ReadByte(sf);
+                               subSize--;
+                       }
+               }
+               else if (WAV_ID_ITRK == type)
+               {
+                       // Track Number
+                       char buf[INFO_SIZE]={0};
+                       unsigned int length=Read32BitsLowHigh(sf);
+                       subSize -= 4;
+
+                       ReadBytes(sf,&buf[0],length);
+                       id3tag_set_track(gfp, strdup(&buf[0]));
+
+                       subSize -= length;
+                       if (length & 0x00000001 )  // resolve word padding
+                       {
+                               // resolve word padding
+                               ReadByte(sf);
+                               subSize--;
+                       }
+               }
+       }
+}
 
 /*****************************************************************************
  *
@@ -1022,6 +1145,7 @@
  *
  *****************************************************************************/
 
+
 static int
 parse_wave_header(lame_global_flags * gfp, FILE * sf)
 {
@@ -1031,28 +1155,35 @@
     int     bits_per_sample = 0;
     int     samples_per_sec = 0;
     int     avg_bytes_per_sec = 0;
-
+       int             data_offset=0;
 
     int     is_wav = 0;
     long    data_length = 0, file_length, subSize = 0;
     int     loop_sanity = 0;
 
     file_length = Read32BitsHighLow(sf);
+       data_offset +=4;
 
     if (Read32BitsHighLow(sf) != WAV_ID_WAVE)
         return 0;
+       data_offset +=4;
 
     for (loop_sanity = 0; loop_sanity < 20; ++loop_sanity) {
         int     type = Read32BitsHighLow(sf);
+               data_offset+=4;
 
         if (type == WAV_ID_FMT) {
             subSize = Read32BitsLowHigh(sf);
+                       data_offset += 4;
+
             if (subSize < 16) {
                 /*DEBUGF(
                    "'fmt' chunk too short (only %ld bytes)!", subSize);  */
                 return 0;
             }
 
+                       data_offset += subSize;
+
             format_tag = Read16BitsLowHigh(sf);
             subSize -= 2;
             channels = Read16BitsLowHigh(sf);
@@ -1076,11 +1207,20 @@
         }
         else if (type == WAV_ID_DATA) {
             subSize = Read32BitsLowHigh(sf);
+                       data_offset += 4;
+
             data_length = subSize;
             is_wav = 1;
-            /* We've found the audio data. Read no further! */
-            break;
 
+                       if (fskip(sf, (long) subSize, SEEK_CUR) != 0)
+                return 0;
+        }
+        else if (type == WAV_ID_LIST) {
+                       SetIDTagsFromRiffTags(gfp, sf);
+                       // Position read ptr back to data chunk
+            if (fskip(sf, (long) data_offset, SEEK_SET) != 0)
+                return 0;
+                       break;
         }
         else {
             subSize = Read32BitsLowHigh(sf);
_______________________________________________
mp3encoder mailing list
[EMAIL PROTECTED]
http://minnie.tuhs.org/mailman/listinfo/mp3encoder

Reply via email to