本文整理汇总了C++中CMusicInfoTag::SetLoaded方法的典型用法代码示例。如果您正苦于以下问题:C++ CMusicInfoTag::SetLoaded方法的具体用法?C++ CMusicInfoTag::SetLoaded怎么用?C++ CMusicInfoTag::SetLoaded使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CMusicInfoTag
的用法示例。
在下文中一共展示了CMusicInfoTag::SetLoaded方法的11个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: UpdateItem
bool CPVRManager::UpdateItem(CFileItem& item)
{
/* Don't update if a recording is played */
if (item.IsPVRRecording())
return false;
if (!item.IsPVRChannel())
{
CLog::Log(LOGERROR, "CPVRManager - %s - no channel tag provided", __FUNCTION__);
return false;
}
CSingleLock lock(m_critSection);
if (!m_currentFile || *m_currentFile->GetPVRChannelInfoTag() == *item.GetPVRChannelInfoTag())
return false;
g_application.CurrentFileItem() = *m_currentFile;
g_infoManager.SetCurrentItem(*m_currentFile);
CPVRChannel* channelTag = item.GetPVRChannelInfoTag();
CEpgInfoTag epgTagNow;
bool bHasTagNow = channelTag->GetEPGNow(epgTagNow);
if (channelTag->IsRadio())
{
CMusicInfoTag* musictag = item.GetMusicInfoTag();
if (musictag)
{
musictag->SetTitle(bHasTagNow ?
epgTagNow.Title() :
g_guiSettings.GetBool("epg.hidenoinfoavailable") ?
StringUtils::EmptyString :
g_localizeStrings.Get(19055)); // no information available
if (bHasTagNow)
musictag->SetGenre(epgTagNow.Genre());
musictag->SetDuration(bHasTagNow ? epgTagNow.GetDuration() : 3600);
musictag->SetURL(channelTag->Path());
musictag->SetArtist(channelTag->ChannelName());
musictag->SetAlbumArtist(channelTag->ChannelName());
musictag->SetLoaded(true);
musictag->SetComment(StringUtils::EmptyString);
musictag->SetLyrics(StringUtils::EmptyString);
}
}
else
{
CVideoInfoTag *videotag = item.GetVideoInfoTag();
if (videotag)
{
videotag->m_strTitle = bHasTagNow ?
epgTagNow.Title() :
g_guiSettings.GetBool("epg.hidenoinfoavailable") ?
StringUtils::EmptyString :
g_localizeStrings.Get(19055); // no information available
if (bHasTagNow)
videotag->m_genre = epgTagNow.Genre();
videotag->m_strPath = channelTag->Path();
videotag->m_strFileNameAndPath = channelTag->Path();
videotag->m_strPlot = bHasTagNow ? epgTagNow.Plot() : StringUtils::EmptyString;
videotag->m_strPlotOutline = bHasTagNow ? epgTagNow.PlotOutline() : StringUtils::EmptyString;
videotag->m_iEpisode = bHasTagNow ? epgTagNow.EpisodeNum() : 0;
}
}
return false;
}
示例2: ParseAtom
bool CMusicInfoTagLoaderMP4::Load(const CStdString& strFileName, CMusicInfoTag& tag)
{
try
{
// Initially we say that we've not loaded any tag information
tag.SetLoaded(false);
// Attempt to open the file..
if ( !m_file.Open( strFileName ) )
{
CLog::Log(LOGDEBUG, "Tag loader mp4: failed to open file %s", strFileName.c_str() );
return false;
}
// We've opened it, so associate the tag with the filename.
tag.SetURL(strFileName);
// Now go parse our atom data
m_thumbSize = false;
m_thumbData = NULL;
m_isCompilation = false;
ParseAtom( 0, m_file.GetLength(), tag );
if (m_thumbData)
{ // cache the thumb
// if we don't have an album tag, cache with the full file path so that
// other non-tagged files don't get this album image
CStdString strCoverArt;
if (!tag.GetAlbum().IsEmpty() && (!tag.GetAlbumArtist().IsEmpty() || !tag.GetArtist().IsEmpty()))
strCoverArt = CThumbnailCache::GetAlbumThumb(&tag);
else
strCoverArt = CThumbnailCache::GetMusicThumb(tag.GetURL());
if (!CUtil::ThumbExists(strCoverArt))
{
if (CPicture::CreateThumbnailFromMemory( m_thumbData, m_thumbSize, "", strCoverArt ) )
{
CUtil::ThumbCacheAdd( strCoverArt, true );
}
else
{
CLog::Log(LOGDEBUG, "%s unable to cache thumb as %s", __FUNCTION__, strCoverArt.c_str());
CUtil::ThumbCacheAdd( strCoverArt, false );
}
}
delete[] m_thumbData;
}
if (m_isCompilation)
{ // iTunes compilation flag is set - this could be a various artists file
if (tag.GetAlbumArtist().IsEmpty())
tag.SetAlbumArtist(g_localizeStrings.Get(340)); // Various Artists
}
// Close the file..
m_file.Close();
// Return to caller
return true;
}
catch (...)
{
CLog::Log(LOGERROR, "Tag loader mp4: exception in file %s", strFileName.c_str());
}
// Something must have gone wrong for us to get here, so let's report our failure to the boss..
tag.SetLoaded(false);
return false;
}
示例3: Load
// Based on MediaInfo
// by J�r�me Martinez, [email protected]
// http://sourceforge.net/projects/mediainfo/
bool CMusicInfoTagLoaderWMA::Load(const CStdString& strFileName, CMusicInfoTag& tag)
{
try
{
tag.SetLoaded(false);
CFile file;
if (!file.Open(strFileName)) return false;
tag.SetURL(strFileName);
// Note that we're reading in a bit more than the buffer size, because the 'peek'ing
// below is dealing with integers and reads off the end. Rather than change
// all the checks below, I've simply allocated a bigger buffer.
const unsigned int bufferSize = 256*1024;
auto_aptr<unsigned char> pData(new unsigned char[bufferSize+32]);
file.Read(pData.get(), bufferSize+32);
file.Close();
unsigned int iOffset;
unsigned int* pDataI;
CStdString16 utf16String;
//Play time
iOffset = 0;
pDataI = (unsigned int*)pData.get();
while (!(pDataI[0] == 0x75B22630 && pDataI[1] == 0x11CF668E && pDataI[2] == 0xAA00D9A6 && pDataI[3] == 0x6CCE6200) && iOffset <= bufferSize - 4)
{
iOffset++;
pDataI = (unsigned int*)(pData.get() + iOffset);
}
if (iOffset > bufferSize - 4)
return false;
//Play time
iOffset = 0;
pDataI = (unsigned int*)pData.get();
while (!(pDataI[0] == 0x8CABDCA1 && pDataI[1] == 0x11CFA947 && pDataI[2] == 0xC000E48E && pDataI[3] == 0x6553200C) && iOffset <= bufferSize - 4)
{
iOffset++;
pDataI = (unsigned int*)(pData.get() + iOffset);
}
if (iOffset <= bufferSize - 4)
{
iOffset += 64;
pDataI = (unsigned int*)(pData.get() + iOffset);
float F1 = (float)pDataI[1];
F1 = F1 * 0x10000 * 0x10000 + pDataI[0];
tag.SetDuration((long)((F1 / 10000) / 1000)); // from milliseconds to seconds
}
//Description Title
iOffset = 0;
pDataI = (unsigned int*)pData.get();
while (!(pDataI[0] == 0x75B22633 && pDataI[1] == 0x11CF668E && pDataI[2] == 0xAA00D9A6 && pDataI[3] == 0x6CCE6200) && iOffset <= bufferSize - 4)
{
iOffset++;
pDataI = (unsigned int*)(pData.get() + iOffset);
}
if (iOffset <= bufferSize - 4)
{
iOffset += 24;
int nTitleSize = pData[iOffset + 0] + pData[iOffset + 1] * 0x100;
int nAuthorSize = pData[iOffset + 2] + pData[iOffset + 3] * 0x100;
//int nCopyrightSize = pData[iOffset + 4] + pData[iOffset + 5] * 0x100;
//int nCommentsSize = pData[iOffset + 6] + pData[iOffset + 7] * 0x100;
iOffset += 10;
CStdString utf8String;
if (nTitleSize)
{
// TODO: UTF-8 Do we need to "fixString" these strings at all?
utf16String = (uint16_t*)(pData.get()+iOffset);
g_charsetConverter.utf16LEtoUTF8(utf16String, utf8String);
tag.SetTitle(utf8String);
}
if (nAuthorSize)
{
utf8String = "";
utf16String = (uint16_t*)(pData.get() + iOffset + nTitleSize);
g_charsetConverter.utf16LEtoUTF8(utf16String, utf8String);
tag.SetArtist(utf8String);
}
//General(ZT("Copyright"))=(LPWSTR)(pData.get()+iOffset+(nTitleSize+nAuthorSize));
//General(ZT("Comments"))=(LPWSTR)(pData.get()+iOffset+(nTitleSize+nAuthorSize+nCopyrightSize));
}
// Maybe these information can be usefull in the future
//Info audio
//iOffset=0;
//pDataI=(unsigned int*)pData;
//while (!(pDataI[0]==0xF8699E40 && pDataI[1]==0x11CF5B4D && pDataI[2]==0x8000FDA8 && pDataI[3]==0x2B445C5F) && iOffset<=bufferSize-4)
//{
//iOffset++;
//.........这里部分代码省略.........
示例4: Load
bool CMusicInfoTagLoaderCDDA::Load(const std::string& strFileName, CMusicInfoTag& tag, EmbeddedArt *art)
{
#ifdef HAS_DVD_DRIVE
try
{
tag.SetURL(strFileName);
bool bResult = false;
// Get information for the inserted disc
CCdInfo* pCdInfo = g_mediaManager.GetCdInfo();
if (pCdInfo == NULL)
return bResult;
// Prepare cddb
Xcddb cddb;
cddb.setCacheDir(CProfilesManager::GetInstance().GetCDDBFolder());
int iTrack = atoi(strFileName.substr(13, strFileName.size() - 13 - 5).c_str());
// duration is always available
tag.SetDuration( ( pCdInfo->GetTrackInformation(iTrack).nMins * 60 )
+ pCdInfo->GetTrackInformation(iTrack).nSecs );
// Only load cached cddb info in this tag loader, the internet database query is made in CCDDADirectory
if (pCdInfo->HasCDDBInfo() && cddb.isCDCached(pCdInfo))
{
// get cddb information
if (cddb.queryCDinfo(pCdInfo))
{
// Fill the fileitems music tag with cddb information, if available
std::string strTitle = cddb.getTrackTitle(iTrack);
if (!strTitle.empty())
{
// Tracknumber
tag.SetTrackNumber(iTrack);
// Title
tag.SetTitle(strTitle);
// Artist: Use track artist or disc artist
std::string strArtist = cddb.getTrackArtist(iTrack);
if (strArtist.empty())
cddb.getDiskArtist(strArtist);
tag.SetArtist(strArtist);
// Album
std::string strAlbum;
cddb.getDiskTitle( strAlbum );
tag.SetAlbum(strAlbum);
// Album Artist
std::string strAlbumArtist;
cddb.getDiskArtist(strAlbumArtist);
tag.SetAlbumArtist(strAlbumArtist);
// Year
SYSTEMTIME dateTime;
dateTime.wYear = atoi(cddb.getYear().c_str());
tag.SetReleaseDate( dateTime );
// Genre
tag.SetGenre( cddb.getGenre() );
tag.SetLoaded(true);
bResult = true;
}
}
}
else
{
// No cddb info, maybe we have CD-Text
trackinfo ti = pCdInfo->GetTrackInformation(iTrack);
// Fill the fileitems music tag with CD-Text information, if available
std::string strTitle = ti.cdtext[CDTEXT_TITLE];
if (!strTitle.empty())
{
// Tracknumber
tag.SetTrackNumber(iTrack);
// Title
tag.SetTitle(strTitle);
// Get info for track zero, as we may have and need CD-Text Album info
xbmc_cdtext_t discCDText = pCdInfo->GetDiscCDTextInformation();
// Artist: Use track artist or disc artist
std::string strArtist = ti.cdtext[CDTEXT_PERFORMER];
if (strArtist.empty())
strArtist = discCDText[CDTEXT_PERFORMER];
tag.SetArtist(strArtist);
// Album
std::string strAlbum;
strAlbum = discCDText[CDTEXT_TITLE];
tag.SetAlbum(strAlbum);
// Genre: use track or disc genre
std::string strGenre = ti.cdtext[CDTEXT_GENRE];
if (strGenre.empty())
//.........这里部分代码省略.........
示例5: UpdateItem
bool CPVRManager::UpdateItem(CFileItem& item)
{
/* Don't update if a recording is played */
if (item.IsPVRRecording())
return false;
if (!item.IsPVRChannel())
{
CLog::Log(LOGERROR, "CPVRManager - %s - no channel tag provided", __FUNCTION__);
return false;
}
CSingleLock lock(m_critSection);
if (!m_currentFile || *m_currentFile->GetPVRChannelInfoTag() == *item.GetPVRChannelInfoTag())
return false;
g_application.SetCurrentFileItem(*m_currentFile);
CFileItemPtr itemptr(new CFileItem(*m_currentFile));
g_infoManager.SetCurrentItem(itemptr);
CPVRChannelPtr channelTag(item.GetPVRChannelInfoTag());
CEpgInfoTagPtr epgTagNow(channelTag->GetEPGNow());
if (channelTag->IsRadio())
{
CMusicInfoTag* musictag = item.GetMusicInfoTag();
if (musictag)
{
musictag->SetTitle(epgTagNow ?
epgTagNow->Title() :
CSettings::GetInstance().GetBool(CSettings::SETTING_EPG_HIDENOINFOAVAILABLE) ?
"" :
g_localizeStrings.Get(19055)); // no information available
if (epgTagNow)
musictag->SetGenre(epgTagNow->Genre());
musictag->SetDuration(epgTagNow ? epgTagNow->GetDuration() : 3600);
musictag->SetURL(channelTag->Path());
musictag->SetArtist(channelTag->ChannelName());
musictag->SetAlbumArtist(channelTag->ChannelName());
musictag->SetLoaded(true);
musictag->SetComment("");
musictag->SetLyrics("");
}
}
else
{
CVideoInfoTag *videotag = item.GetVideoInfoTag();
if (videotag)
{
videotag->m_strTitle = epgTagNow ?
epgTagNow->Title() :
CSettings::GetInstance().GetBool(CSettings::SETTING_EPG_HIDENOINFOAVAILABLE) ?
"" :
g_localizeStrings.Get(19055); // no information available
if (epgTagNow)
videotag->m_genre = epgTagNow->Genre();
videotag->m_strPath = channelTag->Path();
videotag->m_strFileNameAndPath = channelTag->Path();
videotag->m_strPlot = epgTagNow ? epgTagNow->Plot() : "";
videotag->m_strPlotOutline = epgTagNow ? epgTagNow->PlotOutline() : "";
videotag->m_iEpisode = epgTagNow ? epgTagNow->EpisodeNumber() : 0;
}
}
return false;
}
示例6: Load
bool CMusicInfoTagLoaderSid::Load(const CStdString& strFileName, CMusicInfoTag& tag)
{
CStdString strFileToLoad = strFileName;
int iTrack = 0;
CStdString strExtension;
CUtil::GetExtension(strFileName,strExtension);
strExtension.MakeLower();
if (strExtension==".sidstream")
{
// Extract the track to play
CStdString strFile=CUtil::GetFileName(strFileName);
int iStart=strFile.ReverseFind("-")+1;
iTrack = atoi(strFile.substr(iStart, strFile.size()-iStart-10).c_str());
// The directory we are in, is the file
// that contains the bitstream to play,
// so extract it
CStdString strPath=strFileName;
CUtil::GetDirectory(strPath, strFileToLoad);
CUtil::RemoveSlashAtEnd(strFileToLoad); // we want the filename
}
CStdString strFileNameLower(strFileToLoad);
strFileNameLower.MakeLower();
int iHVSC = strFileNameLower.find("hvsc"); // need hvsc in path name since our lookupfile is based on hvsc paths
if (iHVSC < 0)
{
iHVSC = strFileNameLower.find("c64music");
if (iHVSC >= 0)
iHVSC += 8;
}
else
iHVSC += 4;
if( iHVSC < 0 )
{
tag.SetLoaded(false);
return( false );
}
CStdString strHVSCpath = strFileToLoad.substr(iHVSC,strFileToLoad.length()-1);
strHVSCpath.Replace('\\','/'); // unix paths
strHVSCpath.MakeLower();
char temp[8192];
CRegExp reg;
if (!reg.RegComp("TITLE: ([^\r\n]*)\r?\n[^A]*ARTIST: ([^\r\n]*)\r?\n"))
{
CLog::Log(LOGINFO,"MusicInfoTagLoaderSid::Load(..): failed to compile regular expression");
tag.SetLoaded(false);
return( false );
}
sprintf(temp,"%s\\%s",g_settings.GetDatabaseFolder().c_str(),"stil.txt"); // changeme?
std::ifstream f(temp);
if( !f.good() ) {
CLog::Log(LOGINFO,"MusicInfoTagLoaderSid::Load(..) unable to locate stil.txt");
tag.SetLoaded(false);
return( false );
}
const char* szStart = NULL;
const char* szEnd = NULL;
char temp2[8191];
char* temp3 = temp2;
while( !f.eof() && !szEnd )
{
f.read(temp,8191);
CStdString strLower = temp;
strLower.MakeLower();
if (!szStart)
szStart= (char *)strstr(strLower.c_str(),strHVSCpath.c_str());
if (szStart)
{
szEnd = strstr(szStart+strHVSCpath.size(),".sid");
if (szEnd)
{
memcpy(temp3,temp+(szStart-strLower.c_str()),szEnd-szStart);
temp3 += szEnd-szStart;
}
else
{
memcpy(temp3,temp+(szStart-strLower.c_str()),strlen(szStart));
szStart = NULL;
temp3 += strlen(szStart);
}
}
}
f.close();
if (!f.eof() && szEnd)
{
temp2[temp3-temp2] = '\0';
temp3 = strstr(temp2,"TITLE:");
}
else
temp3 = NULL;
if (temp3)
{
for (int i=0;i<iTrack-1;++i) // skip tracks
{
//.........这里部分代码省略.........
示例7: if
void CMusicInfoTagLoaderMP4::ParseTag( unsigned int metaKey, const char* pMetaData, int metaSize, CMusicInfoTag& tag, EmbeddedArt *art)
{
switch ( metaKey )
{
case g_TitleAtomName:
{
// We need to zero-terminate the string, which needs workspace..
auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] );
memcpy( dataWorkspace.get(), pMetaData, metaSize );
dataWorkspace[ metaSize ] = '\0';
// we use utf8 internally
tag.SetLoaded( true );
tag.SetTitle( dataWorkspace.get() );
break;
}
case g_ArtistAtomName:
{
// We need to zero-terminate the string, which needs workspace..
auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] );
memcpy( dataWorkspace.get(), pMetaData, metaSize );
dataWorkspace[ metaSize ] = '\0';
tag.SetArtist( dataWorkspace.get() );
break;
}
case g_AlbumAtomName:
{
// We need to zero-terminate the string, which needs workspace..
auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] );
memcpy( dataWorkspace.get(), pMetaData, metaSize );
dataWorkspace[ metaSize ] = '\0';
tag.SetAlbum( dataWorkspace.get() );
break;
}
case g_AlbumArtistAtomName:
{
// We need to zero-terminate the string, which needs workspace..
auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] );
memcpy( dataWorkspace.get(), pMetaData, metaSize );
dataWorkspace[ metaSize ] = '\0';
tag.SetAlbumArtist( dataWorkspace.get() );
break;
}
case g_DayAtomName:
{
// We need to zero-terminate the string, which needs workspace..
auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] );
memcpy( dataWorkspace.get(), pMetaData, metaSize );
dataWorkspace[ metaSize ] = '\0';
SYSTEMTIME dateTime;
dateTime.wYear = atoi( dataWorkspace.get() );
tag.SetReleaseDate( dateTime );
break;
}
case g_GenreAtomName:
{
// When a genre number is specified, we need to translate to a string for display..
// Note that AAC/iTunes genre numbers are the same as ID3 numbers, but are offset by 1.
const char* pGenre = ID3_V1GENRE2DESCRIPTION( (unsigned char)pMetaData[ 1 ] - 1 );
if ( pGenre )
{
tag.SetGenre( pGenre );
}
break;
}
case g_CompilationAtomName:
{
if (metaSize == 1)
tag.SetCompilation(*pMetaData == 1);
break;
}
case g_CommentAtomName:
{
// We need to zero-terminate the string, which needs workspace..
auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] );
memcpy( dataWorkspace.get(), pMetaData, metaSize );
dataWorkspace[ metaSize ] = '\0';
tag.SetComment( dataWorkspace.get() );
break;
}
case g_LyricsAtomName:
{
// We need to zero-terminate the string, which needs workspace..
auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] );
memcpy( dataWorkspace.get(), pMetaData, metaSize );
//.........这里部分代码省略.........
示例8: UpdateItem
bool CPVRManager::UpdateItem(CFileItem& item)
{
/* Don't update if a recording is played */
if (item.IsPVRRecording())
return true;
if (!item.IsPVRChannel())
{
CLog::Log(LOGERROR, "CPVRManager - %s - no channel tag provided", __FUNCTION__);
return false;
}
CSingleLock lock(m_critSection);
if (*m_currentFile->GetPVRChannelInfoTag() == *item.GetPVRChannelInfoTag())
return false;
g_application.CurrentFileItem() = *m_currentFile;
g_infoManager.SetCurrentItem(*m_currentFile);
CPVRChannel* channelTag = item.GetPVRChannelInfoTag();
const CPVREpgInfoTag* epgTagNow = channelTag->GetEPGNow();
if (channelTag->IsRadio())
{
CMusicInfoTag* musictag = item.GetMusicInfoTag();
if (musictag)
{
musictag->SetTitle(epgTagNow ? epgTagNow->Title() : g_localizeStrings.Get(19055));
musictag->SetGenre(epgTagNow ? epgTagNow->Genre() : "");
musictag->SetDuration(epgTagNow ? epgTagNow->GetDuration() : 3600);
musictag->SetURL(channelTag->Path());
musictag->SetArtist(channelTag->ChannelName());
musictag->SetAlbumArtist(channelTag->ChannelName());
musictag->SetLoaded(true);
musictag->SetComment("");
musictag->SetLyrics("");
}
}
else
{
CVideoInfoTag *videotag = item.GetVideoInfoTag();
if (videotag)
{
videotag->m_strTitle = epgTagNow ? epgTagNow->Title() : g_localizeStrings.Get(19055);
videotag->m_strGenre = epgTagNow ? epgTagNow->Genre() : "";
videotag->m_strPath = channelTag->Path();
videotag->m_strFileNameAndPath = channelTag->Path();
videotag->m_strPlot = epgTagNow ? epgTagNow->Plot() : "";
videotag->m_strPlotOutline = epgTagNow ? epgTagNow->PlotOutline() : "";
videotag->m_iEpisode = epgTagNow ? epgTagNow->EpisodeNum() : 0;
}
}
CPVRChannel* tagPrev = item.GetPVRChannelInfoTag();
if (tagPrev && tagPrev->ChannelNumber() != m_LastChannel)
{
m_LastChannel = tagPrev->ChannelNumber();
m_LastChannelChanged = CTimeUtils::GetTimeMS();
}
if (CTimeUtils::GetTimeMS() - m_LastChannelChanged >= (unsigned int) g_guiSettings.GetInt("pvrplayback.channelentrytimeout") && m_LastChannel != m_PreviousChannel[m_PreviousChannelIndex])
m_PreviousChannel[m_PreviousChannelIndex ^= 1] = m_LastChannel;
return false;
}
示例9: Load
//.........这里部分代码省略.........
else if (strExtension == "mpc")
file = mpcFile = new MPC::File(stream);
else if (strExtension == "mp3" || strExtension == "aac")
file = mpegFile = new MPEG::File(stream, ID3v2::FrameFactory::instance());
else if (strExtension == "s3m")
file = s3mFile = new S3M::File(stream);
else if (strExtension == "tta")
file = ttaFile = new TrueAudio::File(stream, ID3v2::FrameFactory::instance());
else if (strExtension == "wv")
file = wvFile = new WavPack::File(stream);
else if (strExtension == "xm")
file = xmFile = new XM::File(stream);
else if (strExtension == "ogg")
file = oggVorbisFile = new Ogg::Vorbis::File(stream);
else if (strExtension == "oga") // Leave this madness until last - oga container can have Vorbis or FLAC
{
file = oggFlacFile = new Ogg::FLAC::File(stream);
if (!file || !file->isValid())
{
delete file;
file = oggVorbisFile = new Ogg::Vorbis::File(stream);
}
}
if (!file || !file->isOpen())
{
delete file;
delete stream;
CLog::Log(LOGDEBUG, "file could not be opened for tag reading");
return false;
}
APE::Tag *ape = NULL;
ASF::Tag *asf = NULL;
MP4::Tag *mp4 = NULL;
ID3v2::Tag *id3v2 = NULL;
Ogg::XiphComment *xiph = NULL;
Tag *generic = NULL;
if (apeFile)
ape = apeFile->APETag(false);
else if (asfFile)
asf = asfFile->tag();
else if (flacFile)
{
xiph = flacFile->xiphComment(false);
id3v2 = flacFile->ID3v2Tag(false);
}
else if (mp4File)
mp4 = mp4File->tag();
else if (mpegFile)
{
id3v2 = mpegFile->ID3v2Tag(false);
ape = mpegFile->APETag(false);
}
else if (oggFlacFile)
xiph = dynamic_cast<Ogg::XiphComment *>(oggFlacFile->tag());
else if (oggVorbisFile)
xiph = dynamic_cast<Ogg::XiphComment *>(oggVorbisFile->tag());
else if (ttaFile)
id3v2 = ttaFile->ID3v2Tag(false);
else if (wvFile)
ape = wvFile->APETag(false);
else // This is a catch all to get generic information for other files types (s3m, xm, it, mod, etc)
generic = file->tag();
if (file->audioProperties())
tag.SetDuration(file->audioProperties()->length());
if (ape && !g_advancedSettings.m_prioritiseAPEv2tags)
ParseAPETag(ape, art, tag);
if (asf)
ParseASF(asf, art, tag);
else if (id3v2)
ParseID3v2Tag(id3v2, art, tag);
else if (generic)
ParseGenericTag(generic, art, tag);
else if (mp4)
ParseMP4Tag(mp4, art, tag);
else if (xiph)
ParseXiphComment(xiph, art, tag);
// art for flac files is outside the tag
if (flacFile)
SetFlacArt(flacFile, art, tag);
// Add APE tags over the top of ID3 tags if we want to prioritize them
if (ape && g_advancedSettings.m_prioritiseAPEv2tags)
ParseAPETag(ape, art, tag);
if (!tag.GetTitle().IsEmpty() || !tag.GetArtist().empty() || !tag.GetAlbum().IsEmpty())
tag.SetLoaded();
tag.SetURL(strFileName);
delete file;
delete stream;
return true;
}
示例10: ParseTag
bool CTagLoaderTagLib::ParseTag(ASF::Tag *asf, EmbeddedArt *art, CMusicInfoTag& tag)
{
if (!asf)
return false;
ReplayGain replayGainInfo;
tag.SetTitle(asf->title().to8Bit(true));
const ASF::AttributeListMap& attributeListMap = asf->attributeListMap();
for (ASF::AttributeListMap::ConstIterator it = attributeListMap.begin(); it != attributeListMap.end(); ++it)
{
if (it->first == "Author")
SetArtist(tag, GetASFStringList(it->second));
else if (it->first == "WM/AlbumArtist")
SetAlbumArtist(tag, GetASFStringList(it->second));
else if (it->first == "WM/AlbumTitle")
tag.SetAlbum(it->second.front().toString().to8Bit(true));
else if (it->first == "WM/TrackNumber" ||
it->first == "WM/Track")
{
if (it->second.front().type() == ASF::Attribute::DWordType)
tag.SetTrackNumber(it->second.front().toUInt());
else
tag.SetTrackNumber(atoi(it->second.front().toString().toCString(true)));
}
else if (it->first == "WM/PartOfSet")
tag.SetDiscNumber(atoi(it->second.front().toString().toCString(true)));
else if (it->first == "WM/Genre")
SetGenre(tag, GetASFStringList(it->second));
else if (it->first == "WM/Mood")
tag.SetMood(it->second.front().toString().to8Bit(true));
else if (it->first == "WM/Composer")
AddArtistRole(tag, "Composer", GetASFStringList(it->second));
else if (it->first == "WM/Conductor")
AddArtistRole(tag, "Conductor", GetASFStringList(it->second));
//No ASF/WMA tag from Taglib for "ensemble"
else if (it->first == "WM/Writer")
AddArtistRole(tag, "Lyricist", GetASFStringList(it->second));
else if (it->first == "WM/ModifiedBy")
AddArtistRole(tag, "Remixer", GetASFStringList(it->second));
else if (it->first == "WM/Engineer")
AddArtistRole(tag, "Engineer", GetASFStringList(it->second));
else if (it->first == "WM/Producer")
AddArtistRole(tag, "Producer", GetASFStringList(it->second));
else if (it->first == "WM/DJMixer")
AddArtistRole(tag, "DJMixer", GetASFStringList(it->second));
else if (it->first == "WM/Mixer")
AddArtistRole(tag, "mixer", GetASFStringList(it->second));
else if (it->first == "WM/Publisher")
{} // Known unsupported, supress warnings
else if (it->first == "WM/AlbumArtistSortOrder")
{} // Known unsupported, supress warnings
else if (it->first == "WM/ArtistSortOrder")
{} // Known unsupported, supress warnings
else if (it->first == "WM/Script")
{} // Known unsupported, supress warnings
else if (it->first == "WM/Year")
tag.SetYear(atoi(it->second.front().toString().toCString(true)));
else if (it->first == "MusicBrainz/Artist Id")
tag.SetMusicBrainzArtistID(SplitMBID(GetASFStringList(it->second)));
else if (it->first == "MusicBrainz/Album Id")
tag.SetMusicBrainzAlbumID(it->second.front().toString().to8Bit(true));
else if (it->first == "MusicBrainz/Album Artist")
SetAlbumArtist(tag, GetASFStringList(it->second));
else if (it->first == "MusicBrainz/Album Artist Id")
tag.SetMusicBrainzAlbumArtistID(SplitMBID(GetASFStringList(it->second)));
else if (it->first == "MusicBrainz/Track Id")
tag.SetMusicBrainzTrackID(it->second.front().toString().to8Bit(true));
else if (it->first == "MusicBrainz/Album Status")
{}
else if (it->first == "MusicBrainz/Album Type")
{}
else if (it->first == "MusicIP/PUID")
{}
else if (it->first == "replaygain_track_gain")
replayGainInfo.ParseGain(ReplayGain::TRACK, it->second.front().toString().toCString(true));
else if (it->first == "replaygain_album_gain")
replayGainInfo.ParseGain(ReplayGain::ALBUM, it->second.front().toString().toCString(true));
else if (it->first == "replaygain_track_peak")
replayGainInfo.ParsePeak(ReplayGain::TRACK, it->second.front().toString().toCString(true));
else if (it->first == "replaygain_album_peak")
replayGainInfo.ParsePeak(ReplayGain::ALBUM, it->second.front().toString().toCString(true));
else if (it->first == "WM/Picture")
{ // picture
ASF::Picture pic = it->second.front().toPicture();
tag.SetCoverArtInfo(pic.picture().size(), pic.mimeType().toCString());
if (art)
art->set(reinterpret_cast<const uint8_t *>(pic.picture().data()), pic.picture().size(), pic.mimeType().toCString());
}
else if (g_advancedSettings.m_logLevel == LOG_LEVEL_MAX)
CLog::Log(LOGDEBUG, "unrecognized ASF tag name: %s", it->first.toCString(true));
}
// artist may be specified in the ContentDescription block rather than using the 'Author' attribute.
if (tag.GetArtist().empty())
tag.SetArtist(asf->artist().toCString(true));
if (asf->comment() != String::null)
tag.SetComment(asf->comment().toCString(true));
tag.SetReplayGain(replayGainInfo);
tag.SetLoaded(true);
return true;
//.........这里部分代码省略.........
示例11: switch
void CMusicInfoTagLoaderMP4::ParseTag( unsigned int metaKey, const char* pMetaData, int metaSize, CMusicInfoTag& tag)
{
switch ( metaKey )
{
case g_TitleAtomName:
{
// We need to zero-terminate the string, which needs workspace..
auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] );
memcpy( dataWorkspace.get(), pMetaData, metaSize );
dataWorkspace[ metaSize ] = '\0';
// we use utf8 internally
tag.SetLoaded( true );
tag.SetTitle( dataWorkspace.get() );
break;
}
case g_ArtistAtomName:
{
// We need to zero-terminate the string, which needs workspace..
auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] );
memcpy( dataWorkspace.get(), pMetaData, metaSize );
dataWorkspace[ metaSize ] = '\0';
tag.SetArtist( dataWorkspace.get() );
break;
}
case g_AlbumAtomName:
{
// We need to zero-terminate the string, which needs workspace..
auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] );
memcpy( dataWorkspace.get(), pMetaData, metaSize );
dataWorkspace[ metaSize ] = '\0';
tag.SetAlbum( dataWorkspace.get() );
break;
}
case g_AlbumArtistAtomName:
{
// We need to zero-terminate the string, which needs workspace..
auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] );
memcpy( dataWorkspace.get(), pMetaData, metaSize );
dataWorkspace[ metaSize ] = '\0';
tag.SetAlbumArtist( dataWorkspace.get() );
break;
}
case g_DayAtomName:
{
// We need to zero-terminate the string, which needs workspace..
auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] );
memcpy( dataWorkspace.get(), pMetaData, metaSize );
dataWorkspace[ metaSize ] = '\0';
SYSTEMTIME dateTime;
dateTime.wYear = atoi( dataWorkspace.get() );
tag.SetReleaseDate( dateTime );
break;
}
case g_GenreAtomName:
{
// When a genre number is specified, we need to translate to a string for display..
// Note that AAC/iTunes genre numbers are the same as ID3 numbers, but are offset by 1.
const char* pGenre = ID3_V1GENRE2DESCRIPTION( (unsigned char)pMetaData[ 1 ] - 1 );
if ( pGenre )
{
tag.SetGenre( pGenre );
}
break;
}
case g_CompilationAtomName:
{
if (metaSize == 1)
m_isCompilation = *pMetaData == 1;
break;
}
case g_CommentAtomName:
{
// We need to zero-terminate the string, which needs workspace..
auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] );
memcpy( dataWorkspace.get(), pMetaData, metaSize );
dataWorkspace[ metaSize ] = '\0';
tag.SetComment( dataWorkspace.get() );
break;
}
case g_LyricsAtomName:
{
// We need to zero-terminate the string, which needs workspace..
auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] );
memcpy( dataWorkspace.get(), pMetaData, metaSize );
//.........这里部分代码省略.........