Index: Fixer/VbrFixer.cpp
===================================================================
--- Fixer/VbrFixer.cpp	(Revision 121)
+++ Fixer/VbrFixer.cpp	(Arbeitskopie)
@@ -212,16 +212,26 @@
 			return;
 		}
 	
-		// insert a vbr header object if needed before the 1st frame
+		// insert a Xing header object before the 1st frame
 		std::auto_ptr<XingFrame> xingFrame;
+		Mp3Reader::ConstMp3ObjectList::iterator firstFrame = std::find_if(Mp3Objects.begin(), Mp3Objects.end(), IsOfMp3ObjectType(Mp3ObjectType::GetFrameTypes()));
+		assert(firstFrame != Mp3Objects.end()); // as it is vbr there must be a first frame
+		xingFrame.reset(new XingFrame(consistencyChecker.mostPopularFrameHeader));
+		//Mp3Objects.insert(firstFrame, xingFrame.get());
+
 		if(m_ProgressDetails.IsVbr())
 		{
-			Mp3Reader::ConstMp3ObjectList::iterator firstFrame = std::find_if(Mp3Objects.begin(), Mp3Objects.end(), IsOfMp3ObjectType(Mp3ObjectType::GetFrameTypes()));
-			assert(firstFrame != Mp3Objects.end()); // as it is vbr there must be a first frame
-			xingFrame.reset(new XingFrame(consistencyChecker.mostPopularFrameHeader));
+			xingFrame->SetUseInfo(false);
+		}
+		else
+		{
+			xingFrame->SetUseInfo(true);
+		}
+
+		// only insert if vbr
+		if(m_ProgressDetails.IsVbr())
 			Mp3Objects.insert(firstFrame, xingFrame.get());
-		}
-	
+
 		// TODO order the objects
 	
 		if(m_rFeedBackInterface.HasUserCancelled())
Index: Fixer/XingFrame.cpp
===================================================================
--- Fixer/XingFrame.cpp	(Revision 121)
+++ Fixer/XingFrame.cpp	(Arbeitskopie)
@@ -49,6 +49,7 @@
 	const int XING_DATA_SIZE = HEADER_BYTES + HEADER_BYTES + TOC_SIZE + HEADER_BYTES + HEADER_BYTES + HEADER_BYTES;
 
 	const std::string XingIdentifier = "Xing";
+	const std::string InfoIdentifier = "Info";
 
 	bool TocSimilar(const unsigned char& a, const unsigned char & b)
 	{
@@ -128,7 +129,14 @@
 
 	AddAsBigEndian(buffer, m_Header.GetHeader());
 	buffer.insert(buffer.end(), iXingOffset - HEADER_BYTES, '\0');
-	buffer.insert(buffer.end(), XingIdentifier.begin(), XingIdentifier.end());
+	if(m_bUseInfo)
+	{
+		buffer.insert(buffer.end(), InfoIdentifier.begin(), InfoIdentifier.end());
+	}
+	else
+	{
+		buffer.insert(buffer.end(), XingIdentifier.begin(), XingIdentifier.end());
+	}
 	AddAsBigEndian(buffer, m_Flags);
 	AddAsBigEndian(buffer, m_FrameCount);
 	AddAsBigEndian(buffer, m_StreamSize);
@@ -211,6 +219,7 @@
 	, m_FrameCount(0)
 	, m_StreamSize(0)
 	, m_VbrScale(0)
+	, m_bUseInfo(false)
 	, m_bReCalculateLameCrc(false)
 {
 	assert(header.IsValid());
@@ -334,9 +343,12 @@
 	// must be called from Mp3Frame::Check() or the Mp3Header might not have been verified and things like that`
 	Mp3Header header(mp3FileBuffer.GetFromBigEndianToNative());
 	const int iXingHeaderPos = GetXingHeaderOffset(header);
-	if(mp3FileBuffer.DoesSay("Info", iXingHeaderPos))
-		throw "VBRFix doesn't currently support Lame 'Info' tags as this is usually associated with CBR files";
-	if(mp3FileBuffer.DoesSay(XingIdentifier, iXingHeaderPos))
+
+//	if(mp3FileBuffer.DoesSay("Info", iXingHeaderPos))
+//		throw "VBRFix doesn't currently support Lame 'Info' tags as this is usually associated with CBR files";
+//	if(mp3FileBuffer.DoesSay(XingIdentifier, iXingHeaderPos))
+	const bool bUsesInfo = mp3FileBuffer.DoesSay(InfoIdentifier, iXingHeaderPos);
+	if(bUsesInfo || mp3FileBuffer.DoesSay( XingIdentifier, iXingHeaderPos))
 	{
 		const unsigned long uXingFlags = mp3FileBuffer.GetFromBigEndianToNative( iXingHeaderPos + XingIdentifier.size());
 		const unsigned long uLamePosition = GetLameInfoPosition(iXingHeaderPos, uXingFlags);
@@ -348,7 +360,8 @@
 		}
 		const bool bContainsLameInfo = mp3FileBuffer.DoesSay("LAME", uLamePosition);
 		XingFrame *pNewFrame = new XingFrame(mp3FileBuffer.position(), header);
-		pNewFrame->m_Flags = uXingFlags;
+//		pNewFrame->m_Flags = uXingFlags;
+		if(bUsesInfo) pNewFrame->SetUseInfo(true);
 		if(bContainsLameInfo)
 		{
 			const int lameLength = (header.GetFrameSize() - uLamePosition);
@@ -390,6 +403,7 @@
 		}
 
 		std::string sMsg = "Found Xing Header Frame";
+		if(bUsesInfo) sMsg += " using Info magic";
 		if(bContainsLameInfo) sMsg += " with LAME info";
 		rParams.m_feedBack.addLogMessage( Log::LOG_INFO, sMsg);
 		
@@ -414,6 +428,11 @@
 	m_VbrScale = quality;
 }
 
+void XingFrame::SetUseInfo( bool bUseInfo )
+{
+	m_bUseInfo = bUseInfo;
+}
+
 void XingFrame::SetLameData( const std::vector< unsigned char > & lameData )
 {
 	m_LameData = lameData;
Index: Fixer/XingFrame.h
===================================================================
--- Fixer/XingFrame.h	(Revision 121)
+++ Fixer/XingFrame.h	(Arbeitskopie)
@@ -50,6 +50,9 @@
 		int GetQuality() const {return m_VbrScale;}
 		void SetQuality(int quality);
 
+		bool GetUseInfo() const {return m_bUseInfo;}
+		void SetUseInfo(bool bUseInfo);
+
 		void SetLameData(const std::vector<unsigned char> &lameData);
 		const std::vector<unsigned char>& GetLameData() const;
 
@@ -69,6 +72,8 @@
 		_ul32 m_StreamSize;
 		_ul32 m_VbrScale;
 
+		bool m_bUseInfo;
+
 		std::vector<unsigned char> m_LameData;
 
 		bool m_bReCalculateLameCrc;
