⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oggfiles.cpp

📁 OggPlay for Symbian 是symbian上的一个媒体播放程序的源码。它支持ogg,wav等等多媒体格式。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#endif
  }

void TOggFiles::CreateDb(RFs& session)
{
  TBuf<256> buf;
  CEikonEnv::Static()->ReadResource(buf, R_OGG_STRING_1);
  CEikonEnv::Static()->BusyMsgL(buf);

  ClearFiles();
  AddDirectory(_L("D:\\Media files\\audio\\"),session);
  AddDirectory(_L("C:\\documents\\Media files\\audio\\"),session);
  AddDirectory(_L("D:\\Media files\\other\\"),session);
  AddDirectory(_L("C:\\documents\\Media files\\other\\"),session);
  AddDirectory(_L("D:\\Media files\\document\\"),session);
  AddDirectory(_L("C:\\documents\\Media files\\document\\"),session);
#if defined(SERIES60)  
  AddDirectory(_L("C:\\Oggs\\"),session);
  AddDirectory(_L("E:\\Oggs\\"),session);
#endif

#ifdef PLAYLIST_SUPPORT
	// Parse playlists
	TInt numFiles = iFiles->Count();
	TInt err;
	for (TInt i = 0 ; i<numFiles ; i++)
	{
		TOggFile* o = (*iFiles)[i];
		if (o->FileType() == TOggFile::EPlayList)
		{
			// Parse the playlist, ignoring any errors.
			TRAP(err, ((TOggPlayList*) o)->ScanPlayListL(session, this));
		}
	}
#endif

  CEikonEnv::Static()->BusyMsgCancel();
}

void TOggFiles::AddDirectory(const TDesC& aDir,RFs& session)
{
    if (AddDirectoryStart(aDir,session) ==KErrNone) {
        while ( !FileSearchIsProcessDone() ) {
            FileSearchStepL();
        }
    }
    AddDirectoryStop();
}

TInt TOggFiles::AddDirectoryStart(const TDesC& aDir,RFs& session)
{
  TRACE(COggLog::VA(_L("Scanning directory %S for oggfiles"), &aDir ));

  // Check if the drive is available (i.e. memory stick is inserted)
#if defined(UIQ)
  if (!EikFileUtils::FolderExists(aDir)) 
#else
  // UIQ_? Have had some problems with FolderExists in the WIN emulator (?)
  if (!EikFileUtils::PathExists(aDir)) 
#endif
    {
    TRACEF(COggLog::VA(_L("Folder %S doesn't exist"), &aDir ));
      return KErrNotFound;
    }
 
    if (iPathArray == NULL)
    {
        iPathArray = new (ELeave) CDesC16ArrayFlat (3);
    iDs = CDirScan::NewL(session);
        iDirScanFinished = EFalse;
		iPlayListScanFinished = EFalse;
        iDirScanSession = &session;
        iDirScanDir = const_cast < TDesC *> (&aDir);
        iNbDirScanned = 0;
        iNbFilesFound = 0;
        iNbPlayListsFound = 0;
        iCurrentIndexInDirectory = 0;
        iCurrentDriveIndex = 0;
        iDirectory=NULL;
    TRAPD(err,iDs->SetScanDataL(aDir,KEntryAttNormal,ESortByName|EAscending,CDirScan::EScanDownTree));
  if (err!=KErrNone) 
    {
    TRACEF(COggLog::VA(_L("Unable to setup scan directory %S for oggfiles"), &aDir ));
        delete iDs; iDs=0;
        return KErrNotFound;
    }
    }
    iPathArray->AppendL(aDir);
    return KErrNone;
}

void TOggFiles::AddDirectoryStop()
{
    delete iDs; iDs=0;
    delete iDirectory; iDirectory = 0;
    if (iOggPlayback)
        iOggPlayback->ClearComments();
    if (iPathArray)
        iPathArray->Reset();
    delete iPathArray; iPathArray = 0;
    
}

void  TOggFiles::FileSearchStepL()
{
    if (iCurrentIndexInDirectory == 0)
	{
		// Add New directory
		if (!NextDirectory())
			return;
    }

    for (; iCurrentIndexInDirectory<iDirectory->Count(); iCurrentIndexInDirectory++) 
    {
		// Add new files
		if (AddNextFileL())
			break;
	}

    if (iCurrentIndexInDirectory == iDirectory->Count())
	{
        // Go to next directory
        iCurrentIndexInDirectory = 0;
	}
}

TBool TOggFiles::NextDirectory()
{
	// Move on to the next directory
    delete iDirectory;
    iDirectory = NULL;

	TRAPD(err,iDs->NextL(iDirectory));
    if (err!=KErrNone) 
    {
        TRACEF(COggLog::VA(_L("Unable to scan directory %S for oggfiles"), &iDirScanDir ));
        delete iDs; iDs=0;
        iDirScanFinished = ETrue;
        return EFalse;
    }
        
    if (iDirectory==0) 
    {
        // No more files in that drive.
        // Any other drive to search in?
        iCurrentDriveIndex++;
        if (iCurrentDriveIndex < iPathArray->Count() ){
            // More drives to search
            TRAPD(err,iDs->SetScanDataL((*iPathArray)[iCurrentDriveIndex],
                KEntryAttNormal,ESortByName|EAscending,CDirScan::EScanDownTree));
            if (err!=KErrNone) 
            {
                TPtrC aBuf((*iPathArray)[iCurrentDriveIndex]);
                TRACEF(COggLog::VA(_L("Unable to setup scan directory %S for oggfiles"), &aBuf ));
                delete iDs; iDs=0;
                iDirScanFinished = ETrue;
            }

            return EFalse;
        }
		else
		{
            // No more directories to search
            iDirScanFinished = ETrue;
            return EFalse;
        }
    }

    iNbDirScanned++;
	return ETrue;
}

TBool TOggFiles::AddNextFileL()
{
    TBuf<256> shortname;
	TBool fileFound = EFalse; 
	const TEntry e= (*iDirectory)[iCurrentIndexInDirectory];
        
    iFullname.Copy(iDs->FullPath());
    iFullname.Append(e.iName);
        
    TParsePtrC p(iFullname);
    if (IsSupportedAudioFile(p)) 
    {
        shortname.Copy(e.iName);
        shortname.Delete(shortname.Length()-4,4); // get rid of the .ogg extension

		iPath.Copy(iDs->AbbreviatedPath());
        if (iPath.Length()>1 && iPath[iPath.Length()-1]==L'\\')
            iPath.SetLength(iPath.Length()-1); // get rid of trailing back slash
            
        TInt err = iOggPlayback->Info(iFullname, ETrue);
        if( err == KErrNone )
        {
            TOggFile* o = TOggFile::NewL(iNbFilesFound,
                iOggPlayback->Title(), 
                iOggPlayback->Album(), 
                iOggPlayback->Artist(), 
                iOggPlayback->Genre(), 
                iPath,
                iFullname,
                shortname,
                iOggPlayback->TrackNumber());
                
            iFiles->AppendL(o);
            iNbFilesFound++;
			iCurrentIndexInDirectory++;
			fileFound = ETrue;
        }
        else
        {
            TRACEF(COggLog::VA(_L("Failed with code %d"), err ));
        }
    }
#ifdef PLAYLIST_SUPPORT
	else if (IsPlayListFile(p))
	{
		// Add the playlist to the list of playlists.
        shortname.Copy(e.iName);
        shortname.Delete(shortname.Length()-4,4); // get rid of the .m3u extension

		iPath.Copy(iDs->AbbreviatedPath());
        if (iPath.Length()>1 && iPath[iPath.Length()-1]==L'\\')
            iPath.SetLength(iPath.Length()-1); // get rid of trailing back slash

		TOggPlayList* o = TOggPlayList::NewL(iNbPlayListsFound, iPath, iFullname, shortname);
        iFiles->AppendL(o);
        
		iNbPlayListsFound++;
		iCurrentIndexInDirectory++;
		fileFound = ETrue;
	}
#endif

	return fileFound;
}
	
TBool TOggFiles::FileSearchIsProcessDone() const
{
    return iDirScanFinished;
};

#ifdef PLAYLIST_SUPPORT
void TOggFiles::ScanNextPlayList()
{
	TInt numFiles = iFiles->Count();
	if (iCurrentIndexInDirectory == numFiles)
	{
		iPlayListScanFinished = ETrue;
		return;
	}

	for ( ; iCurrentIndexInDirectory<numFiles ; iCurrentIndexInDirectory++)
	{
		TOggFile* o = (*iFiles)[iCurrentIndexInDirectory];
		if (o->FileType() == TOggFile::EPlayList)
		{
			// Parse the playlist, ignoring any errors.
			TRAPD(err, ((TOggPlayList*) o)->ScanPlayListL(*iDirScanSession, this));
			iCurrentIndexInDirectory++;
			break;
		}
	}
}

TBool TOggFiles::PlayListScanIsProcessDone() const
{
    return iPlayListScanFinished;
}
#endif

void  TOggFiles::FileSearchProcessFinished()
{// Not used
};
void  TOggFiles::FileSearchDialogDismissedL(TInt /*aButtonId*/)
{// Not used
};

TInt  TOggFiles::FileSearchCycleError(TInt aError)
{// Not used
    return(aError);
};

#ifdef PLAYLIST_SUPPORT
void  TOggFiles::FileSearchGetCurrentStatus(TInt &aNbDir, TInt &aNbFiles, TInt &aNbPlayLists)
{
    aNbDir = iNbDirScanned;
    aNbFiles = iNbFilesFound;
    aNbPlayLists = iNbPlayListsFound;
};
#else
void  TOggFiles::FileSearchGetCurrentStatus(TInt &aNbDir, TInt &aNbFiles)
{
    aNbDir = iNbDirScanned;
    aNbFiles = iNbFilesFound;
};
#endif

TInt TOggFiles::SearchAllDrives(CEikDialog * aDialog, TInt aDialogID,RFs& session)
{
    ClearFiles();
    
    TChar driveLetter; TDriveInfo driveInfo;
    TInt err=KErrNone;
    TInt driveNumber;
    for (driveNumber=EDriveA; driveNumber<=EDriveZ; driveNumber++) {
      session.Drive(driveInfo,driveNumber); 
      if (driveInfo.iDriveAtt == (TUint)KDriveAbsent)
          continue; 
      if ( (driveInfo.iType != (TUint) EMediaRom) 
          && (driveInfo.iType != (TUint) EMediaNotPresent)
#ifdef __WINS__
          // For some reasons, the emulator finds a non-existing drive X, which blows up everything...
          && (driveInfo.iType != EMediaHardDisk) 
#endif
          ){
          TRAP(err, session.DriveToChar(driveNumber,driveLetter));
          if (err) break;
          TBuf <10> driveName;
          driveName.Format(_L("%c:\\"), ((TUint) driveLetter));
          err = AddDirectoryStart(driveName,session);
          if (err) break;
      }
    }
    if ( err == KErrNone) {
        TRAP(err, aDialog->ExecuteLD(aDialogID));
    }
    else {
        delete (aDialog);
        aDialog = NULL;
    }
    AddDirectoryStop();
    return (err);
}

TInt TOggFiles::SearchSingleDrive(const TDesC& aDir, CEikDialog * aDialog, TInt aDialogID,RFs& session)
{
    ClearFiles();
    if (!EikFileUtils::PathExists(aDir)) 
    {
      TRACEF(COggLog::VA(_L("Folder %S doesn't exist"), &aDir ));
      TBuf<256> buf1,buf2;
      CEikonEnv::Static()->ReadResource(buf2, R_OGG_ERROR_28);
      buf1.Append(aDir);
      ((COggPlayAppUi*)CEikonEnv::Static()->AppUi())->iOggMsgEnv->OggErrorMsgL(buf2,buf1);
      return KErrNotFound;
    }
    TInt err = AddDirectoryStart(aDir,session);
    if ( err == KErrNone) {
        TRAP(err, aDialog->ExecuteLD(aDialogID));
    }
    else {
        delete (aDialog);
        aDialog = NULL;
    }
    AddDirectoryStop();
    return (err);
}

TBool TOggFiles::CreateDbWithSingleFile(const TDesC& aFile){

  TParsePtrC p(aFile);	
	if (IsSupportedAudioFile(p)) {
		
		ClearFiles();
		AddFile(aFile);

		if (iFiles->Count()) {
			return ETrue;
		}
	}
	return EFalse;
}

void TOggFiles::AddFile(const TDesC& aFile){
	//_LIT(KS,"adding File %s to oggfiles");
	//OGGLOG.WriteFormat(KS,aFile.Ptr());
	
	TParsePtrC p(aFile);

	if (IsSupportedAudioFile(p)) {
		
		iFullname.Copy(aFile);

		TBuf<256> shortname;
		shortname.Append(p.Name());

		iPath.Copy(p.DriveAndPath());
		if (iPath.Length()>1 && iPath[iPath.Length()-1]==L'\\'){
			iPath.Delete(iPath.Length()-1,1); // get rid of trailing back slash
		}
		if ( iOggPlayback->Info(aFile, EFalse) == KErrNone) {

			TOggFile* o = TOggFile::NewL(
                iFiles->Count(),
                iOggPlayback->Title(), 
				iOggPlayback->Album(), 
				iOggPlayback->Artist(), 
				iOggPlayback->Genre(), 
				iPath,
				iFullname,
				shortname,
				iOggPlayback->TrackNumber());
			
			TRAPD(err, iFiles->AppendL(o));
		} 	
	}
	iOggPlayback->ClearComments();
}

TBool TOggFiles::ReadDb(const TFileName& aFileName, RFs& session)
{
  RFile in;
  if(in.Open(session, aFileName, EFileRead|EFileStreamText)== KErrNone) {

    TFileText tf;
    tf.Set(in);
    
    // check file version:
    TBuf<KTFileTextBufferMaxSize> line;
	TInt err;
    iVersion= -1;
    if(tf.Read(line)==KErrNone) {
      TLex parse(line);
      parse.Val(iVersion);
    }
    
#ifdef PLAYLIST_SUPPORT
	if ((iVersion!=0) && (iVersion!=1) && (iVersion!=2))
#else
	if ((iVersion!=0) && (iVersion!=1))
#endif
	{
      in.Close();
      return EFalse;
    }

#ifdef PLAYLIST_SUPPORT
	TInt i;
	TInt numPlayLists = 0;
	RPointerArray<TOggPlayList> playLists;
	CleanupClosePushL(playLists);
	if (iVersion==2)
	{
		if(tf.Read(line)==KErrNone)
		{
	      TLex parse(line);
		  err = parse.Val(numPlayLists);
		  if (err != KErrNone)
		  {
			  in.Close();
			  return EFalse;
		  }
		}
		else 
		{
			in.Close();
			return EFalse;
		}

		for (i = 0 ; i<numPlayLists ; i++)
		{
		  // Read in the line number.
		  err = tf.Read(line);
		  if (err != KErrNone)
		  {
			  in.Close();
			  return ETrue;
		  }

	      TOggPlayList* o = NULL;
		  TRAP (err, o = TOggPlayList::NewL(tf));
          if (err != KErrNone)
		  {
             in.Close();
			 return ETrue;
		  }
     
		  o->iAbsoluteIndex = i;
	      iFiles->AppendL(o);
		  playLists.Append(o);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -