需要WMA格式的TAG信息,整理了一下,在这里与大家分享一下。
首先介绍下WMA文件头的结构,如下图
/*************************************************************************
// 分为文件头和各个帧数据(文件头前16个字节WMA格式是固定的,8个字节的大小是高位存在后面,以后遇到大小都是高位存在后面)
+--------------------------------------------------------------+
| Header (30 bytes) HeadFlag:16; HeadSize:8; Unknow:6 |
+--------------------------------------------------------------+
| Frames (1....n) |
+--------------------------------------------------------------+
// 所有的TAG信息存放在标准帧和扩展帧中,其他帧可以不予考虑,标准帧以及扩展帧的16个字节标识头都是固定的
// 所有的信息都是UNICODE编码
// 标准帧结构
+--------------------------------------------------------------+
| Header (24 bytes) HeadFlag:16; HeadSize:8; |
+--------------------------------------------------------------+
| 标题信息大小(2 bytes) |
+--------------------------------------------------------------+
| 艺术家信息大小(2 bytes) |
+--------------------------------------------------------------+
| 版权信息大小(2 bytes) |
+--------------------------------------------------------------+
| 备注信息大小(2 bytes) |
+--------------------------------------------------------------+
| 未知信息大小(2 bytes) |
+--------------------------------------------------------------+
| 标题信息内容(0x00 0x00结束) |
+--------------------------------------------------------------+
| 艺术家信息内容(0x00 0x00结束) |
+--------------------------------------------------------------+
| 版权信息内容(0x00 0x00结束) |
+--------------------------------------------------------------+
| 备注信息内容(0x00 0x00结束) |
+--------------------------------------------------------------+
| 未知信息内容(0x00 0x00结束) |
+--------------------------------------------------------------+
// 扩展帧结构
+--------------------------------------------------------------+
| Header (24 bytes) HeadFlag:16; HeadSize:8; |
+--------------------------------------------------------------+
| 扩展信息个数EXNO(2 bytes) |
+--------------------------------------------------------------+
| EXINFO (1....EXNO) |
+--------------------------------------------------------------+
// 每个扩展信息EXINFO结构
+--------------------------------------------------------------+
| EXINFO NAME Size (2 bytes) 扩展信息名字大小 |
+--------------------------------------------------------------+
| 扩展信息名称 |
+--------------------------------------------------------------+
| 标志FLAG (2 bytes) |
+--------------------------------------------------------------+
| 值的大小 (2 bytes) |
+--------------------------------------------------------------+
| 实际的值 (若是图片格式参考ID3V2.3) |
+--------------------------------------------------------------+
当扩展信息名字为WMFSDKVersion时,这个值表示的是这个WMA文件的版本;
当扩展信息名字为WM/AlbumTitle时,这个值代表的就是专辑名;
当扩展信息名字为WM/Genre时,这个值代表的就是流派;
下面再来看看那个标志Flag,这个基本上是为没什么用的(通常值为0),
对WM/TrackNumber和WM/Track这两个扩展信息名字有用,
当Flag为3的时候后面的值(也就是曲目信息)是以4个字节的整数的形式表示,
当Flag为0的时候,曲目信息是以普通的字符串形式表示的。
// 查看http://msdn.microsoft.com/en-us/library/ms867702.aspx
=================================================================
贴出实现类头文件:
-
-
-
-
-
-
-
-
-
-
-
- #ifndef _CMY_WMA_TAG_H_
- #define _CMY_WMA_TAG_H_
-
- #include "CMyPicInfo.h"
- #include <string>
- #include <vector>
- using namespace std;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- enum WMA_FRAMESTYLE_T
- {
- WMA_FRAMESTYLE_STANDARD,
- WMA_FRAMESTYLE_EXTEND,
- WMA_FRAMESTYLE_UNKNOWN,
- };
-
-
- enum WMA_FRAMEID_T
- {
-
- WMA_FRAMEID_AUTHOR = 0,
- WMA_FRAMEID_COPYRIGHT,
- WMA_FRAMEID_DESCRIPTION,
- WMA_FRAMEID_RATING,
- WMA_FRAMEID_TITLE,
-
-
- WMA_FRAMEID_ALBUMARTIST,
- WMA_FRAMEID_ALBUMCOVERURL,
- WMA_FRAMEID_ALBUMTITLE,
- WMA_FRAMEID_AUDIOFILEURL,
- WMA_FRAMEID_AUDIOSOURCEURL,
- WMA_FRAMEID_AUTHORURL,
- WMA_FRAMEID_BPMT,
- WMA_FRAMEID_CATEGORY,
- WMA_FRAMEID_COMPOSER,
- WMA_FRAMEID_CONDUCTOR,
- WMA_FRAMEID_CONTENTDISTRIBUTOR,
- WMA_FRAMEID_CGDPN,
- WMA_FRAMEID_DIRECTOR,
- WMA_FRAMEID_DVDID,
- WMA_FRAMEID_ENCODEDBY,
- WMA_FRAMEID_ENCODINGSETTINGS,
- WMA_FRAMEID_ENCODINGTIME,
- WMA_FRAMEID_GENRE,
- WMA_FRAMEID_GENREID,
- WMA_FRAMEID_INITIALKEY,
- WMA_FRAMEID_ISRC,
- WMA_FRAMEID_LANGUAGE,
- WMA_FRAMEID_LYRICS,
- WMA_FRAMEID_LYRICSSYNC,
- WMA_FRAMEID_MCDI,
- WMA_FRAMEID_MCPID,
- WMA_FRAMEID_MCSID,
- WMA_FRAMEID_MDACREDITS,
- WMA_FRAMEID_MDAISDELAY,
- WMA_FRAMEID_MDAISFINALE,
- WMA_FRAMEID_MDAISLIVE,
- WMA_FRAMEID_MDAISPREMIERE,
- WMA_FRAMEID_MDAISREPEAT,
- WMA_FRAMEID_MDAISSAP,
- WMA_FRAMEID_MDAISSUBTITLED,
- WMA_FRAMEID_MDAISSTEREO,
- WMA_FRAMEID_MDANETWORKAFFILIATION,
- WMA_FRAMEID_MDAORIGINALBDT,
- WMA_FRAMEID_MDAORIGINALCHANNEL,
- WMA_FRAMEID_MDASTATIONCALLSIGN,
- WMA_FRAMEID_MDASTATIONNAME,
- WMA_FRAMEID_MODIFIEDBY,
- WMA_FRAMEID_MOOD,
- WMA_FRAMEID_ORIGALBUMTITLE,
- WMA_FRAMEID_ORIGARTIST,
- WMA_FRAMEID_ORIGFILENAME,
- WMA_FRAMEID_ORIGLYRICIST,
- WMA_FRAMEID_ORIGRELEASETIME,
- WMA_FRAMEID_ORIGRELEASEYEAR,
- WMA_FRAMEID_PARENTALRATING,
- WMA_FRAMEID_PARENTALRATINGREASON,
- WMA_FRAMEID_PARTOFSET,
- WMA_FRAMEID_PERIOD,
- WMA_FRAMEID_PICTURE,
- WMA_FRAMEID_PRODUCER,
- WMA_FRAMEID_PROMOTIONURL,
- WMA_FRAMEID_PROVIDER,
- WMA_FRAMEID_PROVIDERCPYRIGHT,
- WMA_FRAMEID_PROVIDERRATING,
- WMA_FRAMEID_PROVIDERSTYLE,
- WMA_FRAMEID_PUBLISHER,
- WMA_FRAMEID_RADIOSTATIONNAME,
- WMA_FRAMEID_RADIOSTATIONOWNER,
- WMA_FRAMEID_SHAREUSERRATING,
- WMA_FRAMEID_SUBTITLE,
- WMA_FRAMEID_SUBTITLEDESCRIPTION,
- WMA_FRAMEID_TEXT,
- WMA_FRAMEID_TOOLNAME,
- WMA_FRAMEID_TOOLVERSION,
- WMA_FRAMEID_TRACK,
- WMA_FRAMEID_TRACKNUMBER,
- WMA_FRAMEID_UNIQUEFILEIDENTIFIER,
- WMA_FRAMEID_USERWEBURL,
- WMA_FRAMEID_WMCOLLECTIONGROUPID,
- WMA_FRAMEID_WMCOLLECTIONID,
- WMA_FRAMEID_CONTENTID,
- WMA_FRAMEID_WRITER,
- WMA_FRAMEID_YEAR,
-
- WMA_FRAMEID_SDKVERSION,
- WMA_FRAMEID_SDKNEEDED,
- WMA_FRAMEID_ISVBR,
-
-
-
- WMA_FRAMEID_UNKNOWN,
-
- };
-
-
- typedef struct _WMA_HEADFLAG_INFO_
- {
- unsigned char WmaFlag[16];
- }WMAHEADFLAG;
-
-
- const WMAHEADFLAG WMA_HEAD_FLAGCONST = {0x30, 0x26, 0xB2, 0x75, 0x8E, 0x66, 0xCF, 0x11, 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C};
-
-
- typedef struct _WMA_HEADSIZE_INFO_
- {
- unsigned char Size[8];
- }WMAHEADSIZE;
-
-
- typedef struct _WMA_HEADINFO_
- {
- WMAHEADFLAG HeadFlag;
- WMAHEADSIZE HeadSize;
- unsigned char Unknown[6];
- }WMAHEADINFO;
-
-
- typedef struct _WMA_FRAMEHEADFLAG_INFO_
- {
- unsigned char Flag[16];
- }WMAFRAMEHEADFLAG;
-
-
- const WMAFRAMEHEADFLAG WMA_FRAMEHEAD_STANDARD = {0x33, 0x26, 0xB2, 0x75, 0x8E, 0x66, 0xCF, 0x11, 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C};
- const WMAFRAMEHEADFLAG WMA_FRAMEHEAD_EXTEND = {0x40, 0xA4, 0xD0, 0xD2, 0x07, 0xE3, 0xD2, 0x11, 0x97, 0xF0, 0x00, 0xA0, 0xC9, 0x5E, 0xA8, 0x50};
-
-
- typedef struct _WMA_FRAMEHEADSIZE_INFO_
- {
- unsigned char Size[8];
- }WMAFRAMEHEADSIZE;
-
-
- typedef struct _WMA_FRAMEHEAD_INFO_
- {
- WMAFRAMEHEADFLAG FrameFlag;
- WMAFRAMEHEADSIZE FrameSize;
- }WMAFRAMEHEADINFO;
-
-
- enum WMA_ATTRSTYLE_T
- {
- WMA_ATTRSTYLE_TXT = 0,
- WMA_ATTRSTYLE_VAL,
- };
-
-
- typedef struct _WMA_ATTR_INFO_
- {
- WMA_FRAMEID_T ID;
- WMA_ATTRSTYLE_T AttrStyle;
- wstring StrContent;
- unsigned long ValContent;
- }WMAATTRINFO;
-
-
- typedef vector<WMAATTRINFO> CWMAAttrArray;
-
-
- typedef struct _WMA_PICITEMINFO_
- {
- wstring MimeType;
- char PicType;
- wstring Description;
- CMYPICINFO PicData;
- }WMAPICITEMINFO;
-
-
- typedef vector<WMAPICITEMINFO> CWMAPicArray;
-
-
-
- class CMyWMATag
- {
- public:
-
- CMyWMATag();
-
-
- ~CMyWMATag();
-
- public:
-
-
- bool AnalyzeWMAFile(const char *filePathName);
- bool AnalyzeWMAFile(const wchar_t *filePathName);
- bool AnalyzeWMAFile(const wstring &filePathName);
-
-
- bool BeSuccess();
-
-
- unsigned long GetHeadSize();
-
-
-
- bool GetTxtItemContent(WMA_FRAMEID_T frameID, wstring &itemContent);
- bool GetTxtItemContent(WMA_FRAMEID_T frameID, string &itemContent);
-
-
-
-
- bool GetFirstPic(CMYPICINFO &picInfo);
-
-
- bool SaveFirstPicToFile(const char *filePathName);
- bool SaveFirstPicToFile(const wchar_t *filePathName);
-
-
- const unsigned char* GetFirstPicAddr(unsigned long *pPicSize=NULL);
-
-
- unsigned long GetFirstPicSize();
-
-
- unsigned long GetPicCounts();
-
-
- bool GetPic(unsigned long picIndex, CMYPICINFO &picInfo);
-
-
- const unsigned char* GetPicAddr(unsigned long picIndex, unsigned long *pPicSize=NULL);
-
-
- bool SavePicToFile(unsigned long picIndex, const char *filePathName);
- bool SavePicToFile(unsigned long picIndex, const wchar_t *filePathName);
-
- private:
-
-
- bool BeWMAFile(const WMAHEADFLAG &headFlag);
-
-
- void ClearDataInfo();
-
-
- unsigned long GetHeadSize(const WMAHEADSIZE &headSize);
-
-
- WMA_FRAMESTYLE_T GetFrameStyle(const WMAFRAMEHEADFLAG &frameFlag);
-
-
- bool BeSameFrameFlag(const WMAFRAMEHEADFLAG &firstFlag, const WMAFRAMEHEADFLAG &secondFlag);
-
-
- unsigned long GetFrameSize(const WMAFRAMEHEADSIZE &frameSize);
-
-
- unsigned long CalUInt16Val(const unsigned char *pByteBuf, int bufSize);
-
-
- unsigned long CalUInt32Val(const unsigned char *pByteBuf, int bufSize);
-
-
- unsigned long ParseFrameData(const unsigned char *pFrameData, unsigned long bufLength);
-
-
- bool GetFrameHeadInfo(const unsigned char *pFrameData, unsigned long bufLength, WMAFRAMEHEADINFO &frameHead);
-
-
- bool ParseStandardFrame(const unsigned char *pItemFrameData, unsigned long frameSize, CWMAAttrArray &WMAAttrArray);
-
-
- bool ParseExtendFrame(const unsigned char *pItemFrameData, unsigned long frameSize, CWMAAttrArray &WMAAttrArray, CWMAPicArray &WMAPicArray);
-
-
- wstring GetWString(const unsigned char* pUCharBuf, unsigned long charsNums);
-
-
- string TransFromWString(const wstring &wstrVal);
-
-
- WMA_FRAMEID_T GetExFrameID(const wstring &exName);
-
-
- unsigned long GetWstringByWChars(const unsigned char* pPicDataBuf, unsigned long bufSize, wstring &strVal);
-
- private:
-
- WMAHEADINFO m_HeadInfo;
- bool m_bAnalyzeSuccess;
- CWMAAttrArray m_WMAAttrArray;
- CWMAPicArray m_WMAPicArray;
- };
-
- #endif
贴出实现文件:
-
-
-
-
-
-
-
-
-
-
-
-
- #include <Windows.h>
- #include "CMyWMATag.h"
-
-
- CMyWMATag::CMyWMATag()
- {
-
- ClearDataInfo();
-
- }
-
-
- CMyWMATag::~CMyWMATag()
- {
-
- }
-
-
-
-
- bool CMyWMATag::AnalyzeWMAFile(const char *filePathName)
- {
-
- ClearDataInfo();
-
-
- if (filePathName == NULL)
- {
- return false;
- }
-
-
- FILE *pWMAFile = fopen(filePathName, "rb");
- if (pWMAFile == NULL)
- {
- return false;
- }
-
-
- memset(&m_HeadInfo, 0, sizeof(m_HeadInfo));
- if (fread(&m_HeadInfo, sizeof(m_HeadInfo), 1, pWMAFile) != 1)
- {
- fclose(pWMAFile);
- return false;
- }
-
-
- m_bAnalyzeSuccess = BeWMAFile(m_HeadInfo.HeadFlag);
- if (!m_bAnalyzeSuccess)
- {
- memset(&m_HeadInfo, 0, sizeof(m_HeadInfo));
- fclose(pWMAFile);
- return false;
- }
-
-
- unsigned long lFrameDataSize = GetHeadSize(m_HeadInfo.HeadSize) - sizeof(WMAHEADINFO);
-
-
- unsigned char *pFrameData = new unsigned char[lFrameDataSize];
- if (pFrameData == NULL)
- {
- fclose(pWMAFile);
- m_bAnalyzeSuccess = false;
- return false;
- }
-
-
- memset(pFrameData, 0, lFrameDataSize);
- if (fread(pFrameData, lFrameDataSize, 1, pWMAFile) != 1)
- {
-
- if (pFrameData != NULL)
- {
- delete[] pFrameData;
- pFrameData = NULL;
- }
-
- fclose(pWMAFile);
- m_bAnalyzeSuccess = false;
- return false;
- }
-
-
- fclose(pWMAFile);
-
-
- ParseFrameData(pFrameData, lFrameDataSize);
-
-
- if (pFrameData != NULL)
- {
- delete[] pFrameData;
- pFrameData = NULL;
- }
-
-
- return m_bAnalyzeSuccess;
- }
-
-
- bool CMyWMATag::AnalyzeWMAFile(const wchar_t *filePathName)
- {
-
- if (filePathName == NULL)
- {
- return false;
- }
-
-
- int nChars = WideCharToMultiByte(CP_ACP, 0, filePathName, -1, NULL, 0, NULL, NULL);
-
-
- char *pFileName = new char[nChars+1];
- if (pFileName == NULL)
- {
- return false;
- }
-
-
- memset(pFileName, 0, nChars+1);
- WideCharToMultiByte(CP_ACP, 0, filePathName, -1, pFileName, nChars, NULL, NULL);
-
-
- bool bResult = AnalyzeWMAFile(pFileName);
-
-
- if (pFileName != NULL)
- {
- delete[] pFileName;
- pFileName = NULL;
- }
-
-
- return bResult;
- }
-
-
- bool CMyWMATag::AnalyzeWMAFile(const wstring &filePathName)
- {
- return AnalyzeWMAFile(filePathName.c_str());
- }
-
-
- bool CMyWMATag::BeSuccess()
- {
- return m_bAnalyzeSuccess;
- }
-
-
- unsigned long CMyWMATag::GetHeadSize()
- {
- return GetHeadSize(m_HeadInfo.HeadSize);
- }
-
-
-
- bool CMyWMATag::GetTxtItemContent(WMA_FRAMEID_T frameID, wstring &itemContent)
- {
-
- if (!BeSuccess())
- {
- return false;
- }
-
-
- for (unsigned long i=0; i<m_WMAAttrArray.size(); i++)
- {
- if (frameID == m_WMAAttrArray[i].ID)
- {
- if (m_WMAAttrArray[i].AttrStyle == WMA_ATTRSTYLE_TXT)
- {
- itemContent = m_WMAAttrArray[i].StrContent;
- return true;
- }
- else
- {
- return false;
- }
- }
- }
-
-
- return false;
- }
-
-
- bool CMyWMATag::GetTxtItemContent(WMA_FRAMEID_T frameID, string &itemContent)
- {
- wstring wContent;
- bool bOK = GetTxtItemContent(frameID, wContent);
- itemContent = TransFromWString(wContent);
- return bOK;
- }
-
-
-
-
- bool CMyWMATag::GetFirstPic(CMYPICINFO &picInfo)
- {
-
- if (!BeSuccess())
- {
- return false;
- }
-
-
- if (m_WMAPicArray.size() == 0)
- {
- return false;
- }
-
-
- picInfo = m_WMAPicArray[0].PicData;
- return true;
- }
-
-
- bool CMyWMATag::SaveFirstPicToFile(const char *filePathName)
- {
- if (BeSuccess() && m_WMAPicArray.size()>0)
- {
- return m_WMAPicArray[0].PicData.SavePicToFile(filePathName);
- }
-
- return false;
- }
- bool CMyWMATag::SaveFirstPicToFile(const wchar_t *filePathName)
- {
- if (BeSuccess() && m_WMAPicArray.size()>0)
- {
- return m_WMAPicArray[0].PicData.SavePicToFile(filePathName);
- }
-
- return false;
- }
-
-
- const unsigned char* CMyWMATag::GetFirstPicAddr(unsigned long *pPicSize)
- {
- if (BeSuccess() && m_WMAPicArray.size()>0)
- {
- if (pPicSize != NULL)
- {
- *pPicSize = m_WMAPicArray[0].PicData.GetPicBufSize();
- }
-
- return m_WMAPicArray[0].PicData.GetPicBufAddr();
- }
-
- return NULL;
- }
-
-
- unsigned long CMyWMATag::GetFirstPicSize()
- {
- if (BeSuccess() && m_WMAPicArray.size()>0)
- {
- return m_WMAPicArray[0].PicData.GetPicBufSize();
- }
-
- return 0;
- }
-
-
- unsigned long CMyWMATag::GetPicCounts()
- {
- return (unsigned long)m_WMAPicArray.size();
- }
-
-
- bool CMyWMATag::GetPic(unsigned long picIndex, CMYPICINFO &picInfo)
- {
-
- if (!BeSuccess())
- {
- return false;
- }
-
-
- unsigned long picCounts = GetPicCounts();
-
-
- if (picCounts == 0)
- {
- return false;
- }
-
-
- if (picIndex >= picCounts)
- {
- return false;
- }
-
-
- picInfo = m_WMAPicArray[picIndex].PicData;
- return true;
- }
-
-
- const unsigned char* CMyWMATag::GetPicAddr(unsigned long picIndex, unsigned long *pPicSize)
- {
-
- if (!BeSuccess())
- {
- return NULL;
- }
-
-
- unsigned long picCounts = GetPicCounts();
-
-
- if (picCounts == 0)
- {
- return NULL;
- }
-
-
- if (picIndex >= picCounts)
- {
- return NULL;
- }
-
-
- if (pPicSize != NULL)
- {
- *pPicSize = m_WMAPicArray[picIndex].PicData.GetPicBufSize();
- }
-
-
- return m_WMAPicArray[picIndex].PicData.GetPicBufAddr();
- }
-
-
- bool CMyWMATag::SavePicToFile(unsigned long picIndex, const char *filePathName)
- {
-
- if (filePathName == NULL)
- {
- return false;
- }
-
-
- if (!BeSuccess())
- {
- return false;
- }
-
-
- unsigned long picCounts = GetPicCounts();
-
-
- if (picCounts == 0)
- {
- return false;
- }
-
-
- if (picIndex >= picCounts)
- {
- return false;
- }
-
- return m_WMAPicArray[picIndex].PicData.SavePicToFile(filePathName);
- }
-
-
- bool CMyWMATag::SavePicToFile(unsigned long picIndex, const wchar_t *filePathName)
- {
-
- if (filePathName == NULL)
- {
- return false;
- }
-
-
- if (!BeSuccess())
- {
- return false;
- }
-
-
- unsigned long picCounts = GetPicCounts();
-
-
- if (picCounts == 0)
- {
- return false;
- }
-
-
- if (picIndex >= picCounts)
- {
- return false;
- }
-
- return m_WMAPicArray[picIndex].PicData.SavePicToFile(filePathName);
- }
-
-
-
- bool CMyWMATag::BeWMAFile(const WMAHEADFLAG &headFlag)
- {
- for (int i=0; i<sizeof(WMA_HEAD_FLAGCONST.WmaFlag); i++)
- {
- if (headFlag.WmaFlag[i] != WMA_HEAD_FLAGCONST.WmaFlag[i])
- {
- return false;
- }
- }
-
- return true;
- }
-
-
- void CMyWMATag::ClearDataInfo()
- {
- memset(&m_HeadInfo, 0, sizeof(m_HeadInfo));
- m_bAnalyzeSuccess = false;
- m_WMAAttrArray.clear();
- m_WMAPicArray.clear();
- }
-
-
- unsigned long CMyWMATag::GetHeadSize(const WMAHEADSIZE &headSize)
- {
- return (unsigned long)((headSize.Size[3]<<24) | (headSize.Size[2]<<16) | (headSize.Size[1]<<8) | headSize.Size[0]);
- }
-
-
- WMA_FRAMESTYLE_T CMyWMATag::GetFrameStyle(const WMAFRAMEHEADFLAG &frameFlag)
- {
-
- if (BeSameFrameFlag(frameFlag, WMA_FRAMEHEAD_STANDARD))
- {
- return WMA_FRAMESTYLE_STANDARD;
- }
-
-
- if (BeSameFrameFlag(frameFlag, WMA_FRAMEHEAD_EXTEND))
- {
- return WMA_FRAMESTYLE_EXTEND;
- }
-
-
- return WMA_FRAMESTYLE_UNKNOWN;
- }
-
-
- bool CMyWMATag::BeSameFrameFlag(const WMAFRAMEHEADFLAG &firstFlag, const WMAFRAMEHEADFLAG &secondFlag)
- {
- for (int i=0; i<16; i++)
- {
- if (firstFlag.Flag[i] != secondFlag.Flag[i])
- {
- return false;
- }
- }
-
- return true;
- }
-
-
- unsigned long CMyWMATag::GetFrameSize(const WMAFRAMEHEADSIZE &frameSize)
- {
- return (unsigned long)((frameSize.Size[3]<<24) | (frameSize.Size[2]<<16) | (frameSize.Size[1]<<8) | frameSize.Size[0]);
- }
-
-
- unsigned long CMyWMATag::CalUInt16Val(const unsigned char *pByteBuf, int bufSize)
- {
-
- if (pByteBuf==NULL || bufSize<2)
- {
- return 0;
- }
-
-
- return ((pByteBuf[1]<<8) | pByteBuf[0]);
- }
-
-
- unsigned long CMyWMATag::CalUInt32Val(const unsigned char *pByteBuf, int bufSize)
- {
-
- if (pByteBuf==NULL || bufSize<4)
- {
- return 0;
- }
-
-
- return ((pByteBuf[3]<<24) | (pByteBuf[2]<<16) | (pByteBuf[1]<<8) | pByteBuf[0]);
- }
-
-
- unsigned long CMyWMATag::ParseFrameData(const unsigned char *pFrameData, unsigned long bufLength)
- {
-
- m_WMAAttrArray.clear();
- m_WMAPicArray.clear();
-
-
- if (pFrameData==NULL || bufLength==0)
- {
- return 0;
- }
-
-
- WMAFRAMEHEADINFO frameHead;
- WMA_FRAMESTYLE_T frameStyle = WMA_FRAMESTYLE_UNKNOWN;
- unsigned long frameSize = 0;
- WMAATTRINFO attrItemInfo;
-
-
-
- unsigned long pos = 0;
- while (pos+24 < bufLength)
- {
-
- if (!GetFrameHeadInfo(pFrameData+pos, bufLength-pos, frameHead))
- {
- break;
- }
-
-
- frameStyle = GetFrameStyle(frameHead.FrameFlag);
-
-
- frameSize = GetFrameSize(frameHead.FrameSize);
-
-
- if (frameSize>=24 && pos+23+frameSize<bufLength)
- {
-
- if (frameStyle == WMA_FRAMESTYLE_STANDARD)
- {
- ParseStandardFrame(pFrameData+pos+24, frameSize-24, m_WMAAttrArray);
- }
-
- else if (frameStyle == WMA_FRAMESTYLE_EXTEND)
- {
- ParseExtendFrame(pFrameData+pos+24, frameSize-24, m_WMAAttrArray, m_WMAPicArray);
- }
-
-
- pos += frameSize;
- }
- else
- {
- pos++;
- }
- }
-
- for (unsigned int i=0; i<m_WMAAttrArray.size(); i++)
- {
- printf("ID:%d Content:%s/n", m_WMAAttrArray[i].ID, TransFromWString(m_WMAAttrArray[i].StrContent).c_str());
- }
-
-
- return (unsigned long)m_WMAAttrArray.size() + (unsigned long)m_WMAPicArray.size();
- }
-
-
- bool CMyWMATag::GetFrameHeadInfo(const unsigned char *pFrameData, unsigned long bufLength, WMAFRAMEHEADINFO &frameHead)
- {
-
- if (pFrameData==NULL || bufLength<24)
- {
- return false;
- }
-
-
- int i = 0;
- for (i=0; i<16; i++)
- {
- frameHead.FrameFlag.Flag[i] = pFrameData[i];
- }
-
-
- for (i=0; i<8; i++)
- {
- frameHead.FrameSize.Size[i] = pFrameData[i+16];
- }
-
- return true;
- }
-
-
- bool CMyWMATag::ParseStandardFrame(const unsigned char *pItemFrameData, unsigned long frameSize, CWMAAttrArray &WMAAttrArray)
- {
-
- if (pItemFrameData==NULL || frameSize==0)
- {
- return false;
- }
-
-
- unsigned long titleSize = CalUInt16Val(pItemFrameData, 2);
-
-
- unsigned long artistSize = CalUInt16Val(pItemFrameData+2, 2);
-
-
- unsigned long copyRightSize = CalUInt16Val(pItemFrameData+4, 2);
-
-
- unsigned long commentSize = CalUInt16Val(pItemFrameData+6, 2);
-
-
- unsigned long unknownSize = CalUInt16Val(pItemFrameData+8, 2);
-
-
- unsigned long offset = 10;
-
-
- WMAATTRINFO attrInfo;
- memset(&attrInfo, 0, sizeof(attrInfo));
- attrInfo.AttrStyle = WMA_ATTRSTYLE_TXT;
-
-
- attrInfo.ID = WMA_FRAMEID_TITLE;
- attrInfo.StrContent = GetWString(pItemFrameData+offset, titleSize);
- WMAAttrArray.push_back(attrInfo);
- offset += titleSize;
-
-
- attrInfo.ID = WMA_FRAMEID_AUTHOR;
- attrInfo.StrContent = GetWString(pItemFrameData+offset, artistSize);
- WMAAttrArray.push_back(attrInfo);
- offset += artistSize;
-
-
- attrInfo.ID = WMA_FRAMEID_COPYRIGHT;
- attrInfo.StrContent = GetWString(pItemFrameData+offset, copyRightSize);
- WMAAttrArray.push_back(attrInfo);
- offset += copyRightSize;
-
-
- attrInfo.ID = WMA_FRAMEID_DESCRIPTION;
- attrInfo.StrContent = GetWString(pItemFrameData+offset, commentSize);
- WMAAttrArray.push_back(attrInfo);
- offset += commentSize;
-
-
- attrInfo.ID = WMA_FRAMEID_RATING;
- attrInfo.StrContent = GetWString(pItemFrameData+offset, unknownSize);
- WMAAttrArray.push_back(attrInfo);
- offset += unknownSize;
-
-
- return true;
- }
-
-
- wstring CMyWMATag::GetWString(const unsigned char* pUCharBuf, unsigned long charsNums)
- {
-
- wstring strRet = L"";
-
-
- if (pUCharBuf==NULL || charsNums==0)
- {
- return strRet;
- }
-
-
- strRet.append((const wchar_t*)pUCharBuf, charsNums/2);
- return strRet;
- }
-
-
- string CMyWMATag::TransFromWString(const wstring &wstrVal)
- {
-
- int nCharNums = (int)wstrVal.length();
- int mulBufSize = 2*nCharNums+10;
-
-
- char *pCharBuf = new char[mulBufSize];
- if (pCharBuf == NULL)
- {
- return "";
- }
- memset(pCharBuf, 0, mulBufSize);
-
-
- WideCharToMultiByte(CP_ACP, 0, wstrVal.c_str(), -1, pCharBuf, mulBufSize, NULL, NULL);
-
-
- string strVal(pCharBuf);
-
-
- if (pCharBuf != NULL)
- {
- delete[] pCharBuf;
- pCharBuf = NULL;
- }
-
- return strVal;
- }
-
-
- bool CMyWMATag::ParseExtendFrame(const unsigned char *pItemFrameData, unsigned long frameSize, CWMAAttrArray &WMAAttrArray, CWMAPicArray &WMAPicArray)
- {
-
- if (pItemFrameData==NULL || frameSize==0)
- {
- return false;
- }
-
-
- unsigned long exInfoCounts = CalUInt16Val(pItemFrameData, 2);
-
-
- unsigned long offset = 2;
-
-
- unsigned long exNameSize = 0;
- wstring exName = L"";
- unsigned long exFlagVal = 0;
- unsigned long valSize = 0;
- WMA_FRAMEID_T frameID = WMA_FRAMEID_UNKNOWN;
- WMAATTRINFO attrInfo;
- WMAPICITEMINFO picItem;
- unsigned lenTmp = 0;
-
-
- for (unsigned exIndex=0; exIndex<exInfoCounts; exIndex++)
- {
-
- memset(&attrInfo, 0, sizeof(attrInfo));
-
-
- exNameSize = CalUInt16Val(pItemFrameData+offset, 2);
- offset += 2;
-
-
- exName = GetWString(pItemFrameData+offset, exNameSize);
- offset += exNameSize;
-
-
- exFlagVal = CalUInt16Val(pItemFrameData+offset, 2);
- offset += 2;
-
-
- valSize = CalUInt16Val(pItemFrameData+offset, 2);
- offset += 2;
-
-
- frameID = GetExFrameID(exName);
-
-
- if (frameID != WMA_FRAMEID_UNKNOWN)
- {
-
- attrInfo.ID = frameID;
-
-
- if (frameID == WMA_FRAMEID_PICTURE)
- {
- lenTmp = GetWstringByWChars(pItemFrameData+offset, frameSize-offset, picItem.MimeType);
- picItem.PicType = (char)((pItemFrameData+offset+lenTmp)[0]);
- lenTmp += 1;
- lenTmp += GetWstringByWChars(pItemFrameData+offset+lenTmp, frameSize-offset-lenTmp, picItem.Description);
- picItem.PicData.SetPicBufData((const char*)(pItemFrameData+offset+lenTmp), valSize-lenTmp);
- m_WMAPicArray.push_back(picItem);
- }
- else
- {
-
-
- if (exFlagVal == 3)
- {
- attrInfo.AttrStyle = WMA_ATTRSTYLE_VAL;
- if (valSize >= 4)
- {
- attrInfo.ValContent = CalUInt32Val(pItemFrameData+offset, 4);
- }
- WMAAttrArray.push_back(attrInfo);
- }
- else
- {
- attrInfo.AttrStyle = WMA_ATTRSTYLE_TXT;
- attrInfo.StrContent = GetWString(pItemFrameData+offset, valSize);
- WMAAttrArray.push_back(attrInfo);
- }
- }
- }
-
-
- offset += valSize;
- }
-
-
- return true;
- }
-
-
- unsigned long CMyWMATag::GetWstringByWChars(const unsigned char* pPicDataBuf, unsigned long bufSize, wstring &strVal)
- {
-
- unsigned long lResult = 0;
-
-
- if (pPicDataBuf==NULL || bufSize==0)
- {
- return lResult;
- }
-
-
- const wchar_t *pWBuf = (const wchar_t*)pPicDataBuf;
- unsigned long wBufSize = bufSize/2;
- unsigned long wPos = 0;
- while (wPos < wBufSize)
- {
- if (pWBuf[wPos] == 0x00)
- {
- lResult = 2*(wPos+1);
- break;
- }
- else
- {
- wPos++;
- }
- }
-
-
- strVal = L"";
- strVal.append(pWBuf, wPos+1);
-
-
- return lResult;
- }
-
-
- WMA_FRAMEID_T CMyWMATag::GetExFrameID(const wstring &exName)
- {
-
- WMA_FRAMEID_T rtExFrameID = WMA_FRAMEID_UNKNOWN;
-
-
- if (wcscmp(exName.c_str(), L"WM/AlbumArtist") == 0)
- {
- rtExFrameID = WMA_FRAMEID_ALBUMARTIST;
- }
- else if (wcscmp(exName.c_str(), L"WM/AlbumCoverURL") == 0)
- {
- rtExFrameID = WMA_FRAMEID_ALBUMCOVERURL;
- }
- else if (wcscmp(exName.c_str(), L"WM/AlbumTitle") == 0)
- {
- rtExFrameID = WMA_FRAMEID_ALBUMTITLE;
- }
- else if (wcscmp(exName.c_str(), L"WM/AudioFileURL") == 0)
- {
- rtExFrameID = WMA_FRAMEID_AUDIOFILEURL;
- }
- else if (wcscmp(exName.c_str(), L"WM/AudioSourceURL") == 0)
- {
- rtExFrameID = WMA_FRAMEID_AUDIOSOURCEURL;
- }
- else if (wcscmp(exName.c_str(), L"WM/AuthorURL") == 0)
- {
- rtExFrameID = WMA_FRAMEID_AUTHORURL;
- }
- else if (wcscmp(exName.c_str(), L"WM/BeatsPerMinute") == 0)
- {
- rtExFrameID = WMA_FRAMEID_BPMT;
- }
- else if (wcscmp(exName.c_str(), L"WM/Category") == 0)
- {
- rtExFrameID = WMA_FRAMEID_CATEGORY;
- }
- else if (wcscmp(exName.c_str(), L"WM/Composer") == 0)
- {
- rtExFrameID = WMA_FRAMEID_COMPOSER;
- }
- else if (wcscmp(exName.c_str(), L"WM/Conductor") == 0)
- {
- rtExFrameID = WMA_FRAMEID_CONDUCTOR;
- }
- else if (wcscmp(exName.c_str(), L"WM/ContentDistributor") == 0)
- {
- rtExFrameID = WMA_FRAMEID_CONTENTDISTRIBUTOR;
- }
- else if (wcscmp(exName.c_str(), L"WM/ContentGroupDescription") == 0)
- {
- rtExFrameID = WMA_FRAMEID_CGDPN;
- }
- else if (wcscmp(exName.c_str(), L"WM/Director") == 0)
- {
- rtExFrameID = WMA_FRAMEID_DIRECTOR;
- }
- else if (wcscmp(exName.c_str(), L"WM/DVDID") == 0)
- {
- rtExFrameID = WMA_FRAMEID_DVDID;
- }
- else if (wcscmp(exName.c_str(), L"WM/EncodedBy") == 0)
- {
- rtExFrameID = WMA_FRAMEID_ENCODEDBY;
- }
- else if (wcscmp(exName.c_str(), L"WM/EncodingSettings") == 0)
- {
- rtExFrameID = WMA_FRAMEID_ENCODINGSETTINGS;
- }
- else if (wcscmp(exName.c_str(), L"WM/EncodingTime") == 0)
- {
- rtExFrameID = WMA_FRAMEID_ENCODINGTIME;
- }
- else if (wcscmp(exName.c_str(), L"WM/Genre") == 0)
- {
- rtExFrameID = WMA_FRAMEID_GENRE;
- }
- else if (wcscmp(exName.c_str(), L"WM/GenreID") == 0)
- {
- rtExFrameID = WMA_FRAMEID_GENREID;
- }
- else if (wcscmp(exName.c_str(), L"WM/InitialKey") == 0)
- {
- rtExFrameID = WMA_FRAMEID_INITIALKEY;
- }
- else if (wcscmp(exName.c_str(), L"WM/ISRC") == 0)
- {
- rtExFrameID = WMA_FRAMEID_ISRC;
- }
- else if (wcscmp(exName.c_str(), L"WM/Language") == 0)
- {
- rtExFrameID = WMA_FRAMEID_LANGUAGE;
- }
- else if (wcscmp(exName.c_str(), L"WM/Lyrics") == 0)
- {
- rtExFrameID = WMA_FRAMEID_LYRICS;
- }
- else if (wcscmp(exName.c_str(), L"WM/Lyrics_Synchronised") == 0)
- {
- rtExFrameID = WMA_FRAMEID_LYRICSSYNC;
- }
- else if (wcscmp(exName.c_str(), L"WM/MCDI") == 0)
- {
- rtExFrameID = WMA_FRAMEID_MCDI;
- }
- else if (wcscmp(exName.c_str(), L"WM/MediaClassPrimaryID") == 0)
- {
- rtExFrameID = WMA_FRAMEID_MCPID;
- }
- else if (wcscmp(exName.c_str(), L"WM/MediaClassSecondaryID") == 0)
- {
- rtExFrameID = WMA_FRAMEID_MCSID;
- }
- else if (wcscmp(exName.c_str(), L"WM/MediaCredits") == 0)
- {
- rtExFrameID = WMA_FRAMEID_MDACREDITS;
- }
- else if (wcscmp(exName.c_str(), L"WM/MediaIsDelay") == 0)
- {
- rtExFrameID = WMA_FRAMEID_MDAISDELAY;
- }
- else if (wcscmp(exName.c_str(), L"WM/MediaIsFinale") == 0)
- {
- rtExFrameID = WMA_FRAMEID_MDAISFINALE;
- }
- else if (wcscmp(exName.c_str(), L"WM/MediaIsLive") == 0)
- {
- rtExFrameID = WMA_FRAMEID_MDAISLIVE;
- }
- else if (wcscmp(exName.c_str(), L"WM/MediaIsPremiere") == 0)
- {
- rtExFrameID = WMA_FRAMEID_MDAISPREMIERE;
- }
- else if (wcscmp(exName.c_str(), L"WM/MediaIsRepeat") == 0)
- {
- rtExFrameID = WMA_FRAMEID_MDAISREPEAT;
- }
- else if (wcscmp(exName.c_str(), L"WM/MediaIsSAP") == 0)
- {
- rtExFrameID = WMA_FRAMEID_MDAISSAP;
- }
- else if (wcscmp(exName.c_str(), L"WM/MediaIsSubtitled") == 0)
- {
- rtExFrameID = WMA_FRAMEID_MDAISSUBTITLED;
- }
- else if (wcscmp(exName.c_str(), L"WM/MediaIsStereo") == 0)
- {
- rtExFrameID = WMA_FRAMEID_MDAISSTEREO;
- }
- else if (wcscmp(exName.c_str(), L"WM/MediaNetworkAffiliation") == 0)
- {
- rtExFrameID = WMA_FRAMEID_MDANETWORKAFFILIATION;
- }
- else if (wcscmp(exName.c_str(), L"WM/MediaOriginalBroadcastDateTime") == 0)
- {
- rtExFrameID = WMA_FRAMEID_MDAORIGINALBDT;
- }
- else if (wcscmp(exName.c_str(), L"WM/MediaOriginalChannel") == 0)
- {
- rtExFrameID = WMA_FRAMEID_MDAORIGINALCHANNEL;
- }
- else if (wcscmp(exName.c_str(), L"WM/MediaStationCallSign") == 0)
- {
- rtExFrameID = WMA_FRAMEID_MDASTATIONCALLSIGN;
- }
- else if (wcscmp(exName.c_str(), L"WM/MediaStationName") == 0)
- {
- rtExFrameID = WMA_FRAMEID_MDASTATIONNAME;
- }
- else if (wcscmp(exName.c_str(), L"WM/ModifiedBy") == 0)
- {
- rtExFrameID = WMA_FRAMEID_MODIFIEDBY;
- }
- else if (wcscmp(exName.c_str(), L"WM/Mood") == 0)
- {
- rtExFrameID = WMA_FRAMEID_MOOD;
- }
- else if (wcscmp(exName.c_str(), L"WM/OriginalAlbumTitle") == 0)
- {
- rtExFrameID = WMA_FRAMEID_ORIGALBUMTITLE;
- }
- else if (wcscmp(exName.c_str(), L"WM/OriginalArtist") == 0)
- {
- rtExFrameID = WMA_FRAMEID_ORIGARTIST;
- }
- else if (wcscmp(exName.c_str(), L"WM/OriginalFilename") == 0)
- {
- rtExFrameID = WMA_FRAMEID_ORIGFILENAME;
- }
- else if (wcscmp(exName.c_str(), L"WM/OriginalLyricist") == 0)
- {
- rtExFrameID = WMA_FRAMEID_ORIGLYRICIST;
- }
- else if (wcscmp(exName.c_str(), L"WM/OriginalReleaseTime") == 0)
- {
- rtExFrameID = WMA_FRAMEID_ORIGRELEASETIME;
- }
- else if (wcscmp(exName.c_str(), L"WM/OriginalReleaseYear") == 0)
- {
- rtExFrameID = WMA_FRAMEID_ORIGRELEASEYEAR;
- }
- else if (wcscmp(exName.c_str(), L"WM/ParentalRating") == 0)
- {
- rtExFrameID = WMA_FRAMEID_PARENTALRATING;
- }
- else if (wcscmp(exName.c_str(), L"WM/ParentalRatingReason") == 0)
- {
- rtExFrameID = WMA_FRAMEID_PARENTALRATINGREASON;
- }
- else if (wcscmp(exName.c_str(), L"WM/PartOfSet") == 0)
- {
- rtExFrameID = WMA_FRAMEID_PARTOFSET;
- }
- else if (wcscmp(exName.c_str(), L"WM/Period") == 0)
- {
- rtExFrameID = WMA_FRAMEID_PERIOD;
- }
- else if (wcscmp(exName.c_str(), L"WM/Picture") == 0)
- {
- rtExFrameID = WMA_FRAMEID_PICTURE;
- }
- else if (wcscmp(exName.c_str(), L"WM/Producer") == 0)
- {
- rtExFrameID = WMA_FRAMEID_PRODUCER;
- }
- else if (wcscmp(exName.c_str(), L"WM/PromotionURL") == 0)
- {
- rtExFrameID = WMA_FRAMEID_PROMOTIONURL;
- }
- else if (wcscmp(exName.c_str(), L"WM/Provider") == 0)
- {
- rtExFrameID = WMA_FRAMEID_PROVIDER;
- }
- else if (wcscmp(exName.c_str(), L"WM/ProviderCopyright") == 0)
- {
- rtExFrameID = WMA_FRAMEID_PROVIDERCPYRIGHT;
- }
- else if (wcscmp(exName.c_str(), L"WM/ProviderRating") == 0)
- {
- rtExFrameID = WMA_FRAMEID_PROVIDERRATING;
- }
- else if (wcscmp(exName.c_str(), L"WM/ProviderStyle") == 0)
- {
- rtExFrameID = WMA_FRAMEID_PROVIDERSTYLE;
- }
- else if (wcscmp(exName.c_str(), L"WM/Publisher") == 0)
- {
- rtExFrameID = WMA_FRAMEID_PUBLISHER;
- }
- else if (wcscmp(exName.c_str(), L"WM/RadioStationName") == 0)
- {
- rtExFrameID = WMA_FRAMEID_RADIOSTATIONNAME;
- }
- else if (wcscmp(exName.c_str(), L"WM/RadioStationOwner") == 0)
- {
- rtExFrameID = WMA_FRAMEID_RADIOSTATIONOWNER;
- }
- else if (wcscmp(exName.c_str(), L"WM/SharedUserRating") == 0)
- {
- rtExFrameID = WMA_FRAMEID_SHAREUSERRATING;
- }
- else if (wcscmp(exName.c_str(), L"WM/SubTitle") == 0)
- {
- rtExFrameID = WMA_FRAMEID_SUBTITLE;
- }
- else if (wcscmp(exName.c_str(), L"WM/SubTitleDescription") == 0)
- {
- rtExFrameID = WMA_FRAMEID_SUBTITLEDESCRIPTION;
- }
- else if (wcscmp(exName.c_str(), L"WM/Text") == 0)
- {
- rtExFrameID = WMA_FRAMEID_TEXT;
- }
- else if (wcscmp(exName.c_str(), L"WM/ToolName") == 0)
- {
- rtExFrameID = WMA_FRAMEID_TOOLNAME;
- }
- else if (wcscmp(exName.c_str(), L"WM/ToolVersion") == 0)
- {
- rtExFrameID = WMA_FRAMEID_TOOLVERSION;
- }
- else if (wcscmp(exName.c_str(), L"WM/Track") == 0)
- {
- rtExFrameID = WMA_FRAMEID_TRACK;
- }
- else if (wcscmp(exName.c_str(), L"WM/TrackNumber") == 0)
- {
- rtExFrameID = WMA_FRAMEID_TRACKNUMBER;
- }
- else if (wcscmp(exName.c_str(), L"WM/UniqueFileIdentifier") == 0)
- {
- rtExFrameID = WMA_FRAMEID_UNIQUEFILEIDENTIFIER;
- }
- else if (wcscmp(exName.c_str(), L"WM/UserWebURL") == 0)
- {
- rtExFrameID = WMA_FRAMEID_USERWEBURL;
- }
- else if (wcscmp(exName.c_str(), L"WM/WMCollectionGroupID") == 0)
- {
- rtExFrameID = WMA_FRAMEID_WMCOLLECTIONGROUPID;
- }
- else if (wcscmp(exName.c_str(), L"WM/WMCollectionID") == 0)
- {
- rtExFrameID = WMA_FRAMEID_WMCOLLECTIONID;
- }
- else if (wcscmp(exName.c_str(), L"WM/WMContentID") == 0)
- {
- rtExFrameID = WMA_FRAMEID_CONTENTID;
- }
- else if (wcscmp(exName.c_str(), L"WM/Writer") == 0)
- {
- rtExFrameID = WMA_FRAMEID_WRITER;
- }
- else if (wcscmp(exName.c_str(), L"WM/Year") == 0)
- {
- rtExFrameID = WMA_FRAMEID_YEAR;
- }
- else if (wcscmp(exName.c_str(), L"WMFSDKVersion") == 0)
- {
- rtExFrameID = WMA_FRAMEID_SDKVERSION;
- }
- else if (wcscmp(exName.c_str(), L"WMFSDKNeeded") == 0)
- {
- rtExFrameID = WMA_FRAMEID_SDKNEEDED;
- }
- else if (wcscmp(exName.c_str(), L"IsVBR") == 0)
- {
- rtExFrameID = WMA_FRAMEID_ISVBR;
- }
- else
- {
- rtExFrameID = WMA_FRAMEID_UNKNOWN;
- }
-
- return rtExFrameID;
- }
贴出上面实现中用到存储图片的类头文件:
-
-
-
-
-
-
-
-
-
-
-
- #ifndef _CMY_PIC_INFO_H
- #define _CMY_PIC_INFO_H
-
-
-
- class CMYPICINFO
- {
- public:
-
- CMYPICINFO();
-
-
- ~CMYPICINFO();
-
-
- CMYPICINFO(const CMYPICINFO &otherPicInfo);
-
-
- CMYPICINFO& operator =(const CMYPICINFO &otherPicInfo);
-
- public:
-
-
- const unsigned char* GetPicBufAddr();
-
-
- unsigned long GetPicBufSize();
-
-
- bool SetPicBufData(const char *pPicData, unsigned long picDataLength);
-
-
- void ReleaseData();
-
-
- bool SavePicToFile(const char *filePathName);
- bool SavePicToFile(const wchar_t *filePathName);
-
- private:
-
-
- bool NewPicBuf(unsigned long bufSize);
-
-
- void DeletePicBuf();
-
- private:
-
- unsigned char *m_pPicBuf;
- unsigned long m_lBufSize;
- };
-
- #endif
贴出图片存储类实现文件:
-
-
-
-
-
-
-
-
-
-
-
-
- #include "CMyPicInfo.h"
- #include <Windows.h>
- #include <stdio.h>
-
-
-
-
- CMYPICINFO::CMYPICINFO()
- {
-
- m_pPicBuf = NULL;
- m_lBufSize = 0;
- }
-
-
- CMYPICINFO::~CMYPICINFO()
- {
-
- DeletePicBuf();
- }
-
-
- CMYPICINFO::CMYPICINFO(const CMYPICINFO &otherPicInfo)
- {
-
- m_lBufSize = otherPicInfo.m_lBufSize;
-
-
- m_pPicBuf = NULL;
- if (otherPicInfo.m_pPicBuf != NULL)
- {
- m_pPicBuf = new unsigned char[otherPicInfo.m_lBufSize];
- if (m_pPicBuf != NULL)
- {
- memcpy(m_pPicBuf, otherPicInfo.m_pPicBuf, otherPicInfo.m_lBufSize);
- }
- }
- }
-
-
- CMYPICINFO& CMYPICINFO::operator =(const CMYPICINFO &otherPicInfo)
- {
-
- if (this == &otherPicInfo)
- {
- return *this;
- }
-
-
- DeletePicBuf();
-
-
- m_lBufSize = otherPicInfo.m_lBufSize;
-
-
- if (otherPicInfo.m_pPicBuf != NULL)
- {
- m_pPicBuf = new unsigned char[otherPicInfo.m_lBufSize];
- if (m_pPicBuf != NULL)
- {
- memcpy(m_pPicBuf, otherPicInfo.m_pPicBuf, otherPicInfo.m_lBufSize);
- }
- }
-
-
- return *this;
- }
-
-
-
-
- const unsigned char* CMYPICINFO::GetPicBufAddr()
- {
- return m_pPicBuf;
- }
-
-
- unsigned long CMYPICINFO::GetPicBufSize()
- {
- return m_lBufSize;
- }
-
-
- bool CMYPICINFO::SetPicBufData(const char *pPicData, unsigned long picDataLength)
- {
-
- if (pPicData==NULL || picDataLength==0)
- {
- return false;
- }
-
-
- if (!NewPicBuf(picDataLength))
- {
- return false;
- }
-
-
- memcpy(m_pPicBuf, pPicData, picDataLength);
-
-
- return true;
- }
-
-
- void CMYPICINFO::ReleaseData()
- {
- DeletePicBuf();
- }
-
-
- bool CMYPICINFO::SavePicToFile(const char *filePathName)
- {
-
- if (m_pPicBuf == NULL)
- {
- return false;
- }
-
-
- FILE *pFile = fopen(filePathName, "wb");
- if (pFile == NULL)
- {
- return false;
- }
-
-
- fwrite(m_pPicBuf, m_lBufSize, 1, pFile);
- fclose(pFile);
- return true;
- }
-
-
- bool CMYPICINFO::SavePicToFile(const wchar_t *filePathName)
- {
-
- if (m_pPicBuf == NULL)
- {
- return false;
- }
-
-
- FILE *pFile = _wfopen(filePathName, L"wb");
- if (pFile == NULL)
- {
- return false;
- }
-
-
- fwrite(m_pPicBuf, m_lBufSize, 1, pFile);
- fclose(pFile);
- return true;
- }
-
-
-
-
- bool CMYPICINFO::NewPicBuf(unsigned long bufSize)
- {
-
- DeletePicBuf();
-
-
- if (bufSize == 0)
- {
- return false;
- }
-
-
- m_pPicBuf = new unsigned char[bufSize];
- if (m_pPicBuf == NULL)
- {
- return false;
- }
-
-
- m_lBufSize = bufSize;
-
-
- memset(m_pPicBuf, 0, m_lBufSize);
-
-
- return true;
- }
-
-
- void CMYPICINFO::DeletePicBuf()
- {
- if (m_pPicBuf != NULL)
- {
- delete[] m_pPicBuf;
- m_pPicBuf = NULL;
- m_lBufSize = 0;
- }
- }