www.pudn.com > SimplePlayer.rar > Mp3Tags.cpp


/*											CMp3Tags 
								Written By Dean Thomas - 01/02/2005 
				All source code may be used freely and/or modified, if source is used 
				in a commercial application then a mention would be nice =) 
 
				Comments/Bugs/Suggestions to Dean.Thomas[AT]Gmail.com 
				Hate/Threats/Annoyance to a[at]b.com												*/ 
 
 
	 
									//	Mp3Tags.cpp 
#include "stdafx.h" 
 
#include "mp3tags.h" 
 
CMp3Tags::CMp3Tags(void) 
{ 
	m_iFileBytes = 0; 
} 
 
CMp3Tags::~CMp3Tags(void) 
{ 
} 
 
int CMp3Tags::OpenFile(LPCTSTR lpFileName) 
{ 
	/*if ( !m_fHandle.Open(lpFileName, CFile::modeReadWrite | CFile::typeBinary ) ) 
	{ 
		return -1; 
	}*/ 
 
	if ( !m_fHandle.Open(lpFileName, CFile::modeRead | CFile::typeBinary ) ) 
	{ 
		return -1; 
	} 
 
	//If we get here, the file's opened. So, we need to parse the data! 
 
	//We want to set the 'cursor' at 128 bytes before the end of the file.  
	m_iFileBytes = (int) m_fHandle.GetLength(); 
 
	m_fHandle.Seek( (m_fHandle.GetLength()-128), 0); 
 
 
	//Now we parse it's last 128 bytes and store it all. 
 
	int iBytesRead = 0; 
	char *pBuf[30]; 
	CString strTmp; 
 
	//Read the first 3 bytes of the header, to see if it's a TAG. 
	iBytesRead = m_fHandle.Read(pBuf, 3); 
	strTmp.Format("%s", pBuf); 
	strTmp.Insert(iBytesRead, '\0'); 
 
	if ( strTmp == "TAG" ) 
	{ 
		//If we get here, then it's a ID3v1.0/1 Tag. 
 
		//Read the next 30 bytes, which is the TrackName. 
		iBytesRead = m_fHandle.Read(pBuf, 30); 
		m_strSongTitle.Format("%s", pBuf); 
		m_strSongTitle.Insert(iBytesRead, '@'); 
		m_strSongTitle.Insert(iBytesRead, '\0'); 
 
		//The next 30 are the Artist. 
		iBytesRead = m_fHandle.Read(pBuf, 12); 
		m_strArtist.Format("%s", pBuf); 
		m_strArtist.Insert(iBytesRead, '@'); 
		m_strArtist.Insert(iBytesRead+1, '\0'); 
 
		//The next 30 are the Album Name. 
		iBytesRead = m_fHandle.Read(pBuf, 30); 
		m_strAlbum.Format("%s", pBuf); 
		m_strAlbum.Insert(iBytesRead, '\0'); 
 
		//The next 4 bytes are Year. 
		iBytesRead = m_fHandle.Read(pBuf, 4); 
		m_strYear.Format("%s", pBuf); 
		m_strYear.Insert(iBytesRead, '\0'); 
 
		//The next 28 are comments. 
		iBytesRead = m_fHandle.Read(pBuf, 28); 
		m_strComment.Format("%s", pBuf); 
		m_strComment.Insert(iBytesRead, '\0'); 
 
		return 0; 
 
	} 
 
	return -1; 
	 
} 
 
int CMp3Tags::SetSongTitle(LPCTSTR lpSongName) 
{ 
	//Set the cursor on the file to -95 Bytes from the end. 
	m_fHandle.SeekToBegin(); 
	m_fHandle.Seek( ( SONG_TITLE_OFFSET ) , 0 ); 
 
	char *pSongTitle = new char[30]; 
	strcpy(pSongTitle, lpSongName); 
	 
	//Try to write to the file, if we get a error, report it. 
	TRY 
	{ 
		m_fHandle.Write(pSongTitle, 30); 
	} 
	CATCH(CFileException, e) 
	{ 
		LPTSTR lpError = ""; 
		e->GetErrorMessage(lpError, 255); 
		OutputDebugString(lpError); 
		e->Delete(); 
		return -1; 
	} 
	END_CATCH 
 
	//delete our memory allocation. 
	delete pSongTitle; 
 
	return 0; 
} 
 
int CMp3Tags::SetArtist(LPCTSTR lpArtist) 
{ 
	m_fHandle.SeekToBegin(); 
	m_fHandle.Seek( ( SONG_ARTIST_OFFSET ) , 0 ); 
 
	char *pArtist = new char[30]; 
	strcpy(pArtist, lpArtist); 
 
	TRY 
	{ 
		m_fHandle.Write(pArtist, 30); 
	} 
	CATCH(CFileException, e) 
	{ 
		LPSTR lpError = ""; 
		e->GetErrorMessage(lpError, 255); 
		OutputDebugString(lpError); 
		e->Delete(); 
		return -1; 
	} 
	END_CATCH 
 
	delete pArtist; 
 
	return 0; 
} 
 
int CMp3Tags::SetAlbum(LPCTSTR lpAlbum) 
{ 
	m_fHandle.SeekToBegin(); 
	m_fHandle.Seek( ( SONG_ALBUM_OFFSET ) , 0 ); 
 
	char *pAlbum = new char[30]; 
	strcpy(pAlbum, lpAlbum); 
 
	TRY 
	{ 
		m_fHandle.Write(pAlbum, 30); 
	} 
	CATCH(CFileException, e) 
	{ 
		LPSTR lpError = ""; 
		e->GetErrorMessage(lpError, 255); 
		OutputDebugString(lpError); 
		e->Delete(); 
		return -1; 
	} 
	END_CATCH 
	 
	delete pAlbum; 
 
	return 0; 
 
} 
 
int CMp3Tags::SetYear(LPCTSTR lpYear) 
{ 
	m_fHandle.SeekToBegin(); 
	m_fHandle.Seek( ( SONG_YEAR_OFFSET ), 0 ); 
 
	char *pYear = new char[5]; 
	strcpy(pYear, lpYear); 
 
	TRY 
	{ 
		m_fHandle.Write(pYear, 4); 
	} 
	CATCH(CFileException, e) 
	{ 
		LPSTR lpError = ""; 
		e->GetErrorMessage(lpError, 255); 
		OutputDebugString(lpError); 
		e->Delete(); 
		return -1; 
	} 
	END_CATCH 
 
	delete pYear; 
	 
	return 0; 
} 
 
int CMp3Tags::SetComment(LPCTSTR lpComment) 
{ 
	m_fHandle.SeekToBegin(); 
	m_fHandle.Seek( ( SONG_COMMENT_OFFSET ), 0 ); 
 
	char *pComment = new char[28]; 
	strcpy(pComment, lpComment); 
 
	TRY 
	{ 
		m_fHandle.Write(pComment, 28); 
	} 
	CATCH( CFileException, e ) 
	{ 
		LPSTR lpError = ""; 
		e->GetErrorMessage(lpError, 255); 
		OutputDebugString(lpError); 
		e->Delete(); 
		return -1; 
	} 
	END_CATCH 
 
	delete pComment; 
 
	return 0; 
}