🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: borland.public.cppbuilder.multimedia
Article #1115

mpeg audio headers

#1115
From: Adam Casperson
Date: Sun, 09 Dec 2001 09:45
96 lines
3606 bytes
Hi all

Im having a lot of trouble trying to read mp3 file headers (its driving me
nuts actually). I only need to read the version, layer, and bitrate so that
I can then calculate the play time of the song. Below is the code I'm using
to do this

int __fastcall TForm1::GetMPEGFileLength(String fileName)
{
        DWORD buffer;
        int fileSize, temp;
        FILE *openFile;
        if((openFile = fopen(fileName.c_str(), "rb")) != NULL) {
                fileSize = fseek(openFile, 0, 2);
                fseek(openFile, 0, 0);
                fread(&buffer, 1, 4, openFile);

         temp = ExtractBinary(buffer, 19, 20);
                PlayList->Items->Add("Ver bin " + String(temp));
         switch (temp)
         {
          case 1:
           mpegVer = 0;
           break;
          case 2:
           mpegVer = 2;
           break;
          case 3:
           mpegVer = 1;
           break;
          default:
           mpegVer = -1;
         }

                temp = ExtractBinary(buffer, 17, 18);
                PlayList->Items->Add("Layer bin " + String(temp));
         switch (temp)
         {
          case 1:
           mpegLayer = 3;
           break;
          case 2:
           mpegLayer = 2;
           break;
          case 3:
           mpegLayer = 1;
           break;
          default:
           mpegLayer = -1;
         }

                temp = ExtractBinary(buffer, 12, 15);
                PlayList->Items->Add("Rate bin " + String(temp));
         int x = -1;
         if (mpegVer == 1)
         {
          if (mpegLayer == 1) x = 0;
          else if (mpegLayer == 2) x = 1;
          else if (mpegLayer == 3) x = 2;
         }
         else if (mpegVer == 2)
         {
          if (mpegLayer == 1) x = 3;
          else if ((mpegLayer == 2) || (mpegLayer == 3)) x = 4;
         }
         mpegBitRate = bitrates[x][temp];

                fclose(openFile);
                int seconds = (fileSize * 8) / (mpegBitRate * 1000);
                return seconds;
        } else {
                return 0;
        }
}
//--------------------------------------------------------------------------
-
int __fastcall TForm1::ExtractBinary(DWORD binary, int leastSig, int
mostSig)
{
 DWORD temp = binary;
 for(int x = 0; x < (32 - (mostSig + 1)); x++) {
  temp <<= 1;
        }
 for(int x2 = 0; x2 < (32 - (mostSig + 1)); x2++) {
  temp >>= 1;
        }
 for(int y = 0; y < leastSig; y++) {
  temp >>= 1;
        }
 return (int)temp;
}

Using this code, for some files I get the correct version and layer but
incorrect bitrate, or I get the wrong version and layer and the bitrate is
then blown out to some stupid number like -480000. Does anyone know what I'm
doing wrong? Thanks
Technical Details
Message-ID: <3c13328e_1@dnews>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!supernews.com!newsfeed.direct.ca!look.ca!newsfeed.wirehub.nl!PeerFeed.KWeb.on.ca!dnews

Show Full Headers
Complete Article Headers
X-Google-Language: ENGLISH,ASCII-7-bit
X-Google-Thread: 10d0fc,3b37c3bd0be588af,start
X-Google-Attributes: gid10d0fc,public
X-Google-ArrivalTime: 2001-12-09 01:55:54 PST
From: "Adam Casperson" <casper2700@yahoo.com.au>
Newsgroups: borland.public.cppbuilder.multimedia
Subject: mpeg audio headers
Date: Sun, 9 Dec 2001 19:45:47 +1000
Lines: 98
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2600.0000
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000
NNTP-Posting-Host: 203.102.79.171
Message-ID: <3c13328e_1@dnews>
X-Trace: dnews 1007891086 203.102.79.171 (9 Dec 2001 01:44:46 -0800)
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!supernews.com!newsfeed.direct.ca!look.ca!newsfeed.wirehub.nl!PeerFeed.KWeb.on.ca!dnews