]> granicus.if.org Git - taglib/commitdiff
Check if the header is TTA1 before parsing
authorStephen F. Booth <me@sbooth.org>
Sat, 4 Feb 2012 13:39:45 +0000 (08:39 -0500)
committerLukáš Lalinský <lalinsky@gmail.com>
Sat, 10 Mar 2012 08:11:51 +0000 (09:11 +0100)
taglib/trueaudio/trueaudioproperties.cpp

index 5b1bf12d4c0c4733053c978765bc1b3936bdd0a9..3cab855bf6e191587c1a9cf1b828b2100406fd83 100644 (file)
@@ -118,19 +118,26 @@ void TrueAudio::Properties::read()
   int pos = 3;
 
   d->version = d->data[pos] - '0';
-  pos += 1 + 2;
+  pos += 1;
 
-  d->channels = d->data.mid(pos, 2).toShort(false);
-  pos += 2;
+  // According to http://en.true-audio.com/TTA_Lossless_Audio_Codec_-_Format_Description
+  // TTA2 headers are in development, and have a different format
+  if(1 == d->version) {
+    // Skip the audio format
+    pos += 2;
 
-  d->bitsPerSample = d->data.mid(pos, 2).toShort(false);
-  pos += 2;
+    d->channels = d->data.mid(pos, 2).toShort(false);
+    pos += 2;
 
-  d->sampleRate = d->data.mid(pos, 4).toUInt(false);
-  pos += 4;
+    d->bitsPerSample = d->data.mid(pos, 2).toShort(false);
+    pos += 2;
 
-  unsigned long samples = d->data.mid(pos, 4).toUInt(false);
-  d->length = samples / d->sampleRate;
+    d->sampleRate = d->data.mid(pos, 4).toUInt(false);
+    pos += 4;
 
-  d->bitrate = d->length > 0 ? ((d->streamLength * 8L) / d->length) / 1000 : 0;
+    uint sampleFrames = d->data.mid(pos, 4).toUInt(false);
+    d->length = d->sampleRate > 0 ? sampleFrames / d->sampleRate : 0;
+
+    d->bitrate = d->length > 0 ? ((d->streamLength * 8L) / d->length) / 1000 : 0;
+  }
 }