helix-sp.cpp

来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C++ 代码 · 共 2,109 行 · 第 1/4 页

CPP
2,109
字号
                                     const char *&description,                                     const char *&copyright,                                     const char *&moreinfourl) const{   if (index < m_numPlugins)   {      description = m_pluginInfo[index]->description;      copyright   = m_pluginInfo[index]->copyright;      moreinfourl = m_pluginInfo[index]->moreinfourl;      return 0;   }   return -1;}void HelixSimplePlayer::play(const char *file, int playerIndex, bool fadein, bool fadeout, unsigned long fadetime){   if (!setURL(file, playerIndex))      play(playerIndex, fadein, fadeout, fadetime);}void HelixSimplePlayer::play(int playerIndex, bool fadein, bool fadeout, unsigned long fadetime){   int i;   int firstPlayer = playerIndex == ALL_PLAYERS ? 0 : playerIndex;   int lastPlayer  = playerIndex == ALL_PLAYERS ? nNumPlayers : playerIndex + 1;   nPlay = 0;   nNumPlayRepeats=1;   while(nPlay < nNumPlayRepeats)   {      nPlay++;      if (bEnableVerboseMode)      {         print2stdout("Starting play #%d...\n", nPlay);      }      //print2stderr("firstplayer = %d  lastplayer=%d\n",firstPlayer,lastPlayer);      UINT32 starttime=0, endtime=0, now=0;      for (i = firstPlayer; i < lastPlayer; i++)      {         // start is already protected...         start(i, fadein, fadetime);         starttime = GetTime();         endtime = starttime + nTimeDelta;         while (1)         {            pthread_mutex_lock(&m_engine_m);            DoEvents(nTimeDelta);            pthread_mutex_unlock(&m_engine_m);            now = GetTime();            if (now >= endtime)               break;            if (fadeout && !ppctrl[i]->bFadeOut && now > endtime - fadetime)            {               ppctrl[i]->bFadeOut = true;               ((HSPPreMixAudioHook *)ppctrl[i]->pPreMixHook)->setFadelength(fadetime);               ((HSPPreMixAudioHook *)ppctrl[i]->pPreMixHook)->setFadeout(true);            }         }      }      starttime = GetTime();      if (nStopTime == -1)      {         bStopTime = false;      }      else      {         endtime = starttime + nStopTime;      }      bStopping = false;      // Handle events coming from all of the players      while (!done(playerIndex))      {         now = GetTime();         if (!bStopping && bStopTime && now >= endtime)         {	    // Stop all of the players, as they should all be done now	    if (bEnableVerboseMode)	    {               print2stdout("\nEnd (Stop) time reached. Stopping...\n");	    }	    stop(playerIndex);            bStopping = true;         }         pthread_mutex_lock(&m_engine_m);         DoEvent();         pthread_mutex_unlock(&m_engine_m);      }      // Stop all of the players, as they should all be done now      if (bEnableVerboseMode)      {         print2stdout("\nPlayback complete. Stopping all players...\n");      }      stop(playerIndex);      // repeat until nNumRepeats   }}void HelixSimplePlayer::start(int playerIndex, bool fadein, unsigned long fadetime){   if (playerIndex == ALL_PLAYERS)   {      int i;      for (i=0; i<nNumPlayers; i++)         start(i, fadein, fadetime);   }   else   {      if (!ppctrl[playerIndex]->pszURL)         return;      print2stderr("START MASTER VOL: %d\n",getDirectMasterVolume());      if (bEnableVerboseMode)      {         print2stdout("Starting player %d...\n", playerIndex);      }      ppctrl[playerIndex]->bFadeIn = fadein;      ppctrl[playerIndex]->bFadeOut = false; // assume we'll only fade out if we have another track      ppctrl[playerIndex]->ulFadeLength = fadetime;      if (!ppctrl[playerIndex]->bPlaying)      {         pthread_mutex_lock(&m_engine_m);         ppctrl[playerIndex]->pPlayer->Begin();         pthread_mutex_unlock(&m_engine_m);         ppctrl[playerIndex]->bPlaying = true;         ppctrl[playerIndex]->bStarting = true;         //print2stderr("Begin player %d\n", playerIndex);      }   }}void HelixSimplePlayer::start(const char *file, int playerIndex, bool fadein, unsigned long fadetime){   setURL(file, playerIndex);   start(playerIndex, fadein, fadetime);}bool HelixSimplePlayer::done(int playerIndex){   BOOL bAllDone = true;   if (playerIndex == ALL_PLAYERS)      // Start checking at the end of the array since those players      // were started last and are therefore more likely to not be      // finished yet.      for (int i = nNumPlayers - 1; i >= 0 && bAllDone; i--)      {         pthread_mutex_lock(&m_engine_m);         if (ppctrl[i]->bStarting || !ppctrl[i]->pPlayer->IsDone())            ppctrl[i]->bPlaying = (bAllDone = false);         pthread_mutex_unlock(&m_engine_m);      }   else   {      if (playerIndex < nNumPlayers)      {         pthread_mutex_lock(&m_engine_m);         if ((bAllDone = (!ppctrl[playerIndex]->bStarting && ppctrl[playerIndex]->pPlayer->IsDone())))            ppctrl[playerIndex]->bPlaying = false;         pthread_mutex_unlock(&m_engine_m);      }   }   return bAllDone;}void HelixSimplePlayer::stop(int playerIndex){   if (playerIndex == ALL_PLAYERS)      for (int i = 0; i < nNumPlayers; i++)      {         pthread_mutex_lock(&m_engine_m);         ppctrl[i]->pPlayer->Stop();         pthread_mutex_unlock(&m_engine_m);         ppctrl[i]->bPlaying = false;         ppctrl[i]->bStarting = false;         ppctrl[i]->isLocal = false;      }   else   {      if (playerIndex < nNumPlayers)      {         pthread_mutex_lock(&m_engine_m);         ppctrl[playerIndex]->pPlayer->Stop();         pthread_mutex_unlock(&m_engine_m);         ppctrl[playerIndex]->bPlaying = false;         ppctrl[playerIndex]->bStarting = false;         ppctrl[playerIndex]->isLocal = false;         memset(&ppctrl[playerIndex]->md, 0, sizeof(ppctrl[playerIndex]->md));      }   }}HelixSimplePlayer::metaData *HelixSimplePlayer::getMetaData(int playerIndex){   return &ppctrl[playerIndex]->md;}void HelixSimplePlayer::dispatch(){   struct _HXxEvent *pNothing = 0x0;   struct timeval tv;   int volAfter = 0;   tv.tv_sec = 0;   tv.tv_usec = SLEEP_TIME*1000;   if (m_urlchanged)   {#ifdef USE_HELIX_ALSA      m_MvolBefore = getDirectMasterVolume();      print2stderr("Master Volume is: %d\n", m_MvolBefore);#endif      m_volBefore = getDirectPCMVolume();      m_urlchanged = false;      print2stderr("Volume is: %d\n", m_volBefore);   }   pEngine->EventOccurred(pNothing);#ifdef USE_HELIX_ALSA   if (m_MvolBefore > 0 && m_MvolAtStart != m_MvolBefore && (volAfter = getDirectMasterVolume()) != m_MvolBefore)   {      print2stderr("RESETTING MASTER VOLUME TO: %d\n", m_MvolBefore);      setDirectMasterVolume(m_volBefore);      print2stderr("Now Master Volume is %d\n", getDirectMasterVolume());      m_MvolBefore = -1;   }#endif   if (m_volBefore > 0 && m_volAtStart != m_volBefore && (volAfter = getDirectPCMVolume()) != m_volBefore)   {      print2stderr("RESETTING VOLUME TO: %d\n", m_volBefore);      setDirectPCMVolume(m_volBefore);      print2stderr("Now Volume is %d\n", getDirectPCMVolume());      m_volBefore = -1;   }}bool HelixSimplePlayer::isPlaying(int playerIndex) const{   if (playerIndex < nNumPlayers)      return ppctrl[playerIndex]->bPlaying;   else      return false;}bool HelixSimplePlayer::isLocal(int playerIndex) const{   if (playerIndex < nNumPlayers)      return (ppctrl[playerIndex]->isLocal && duration(playerIndex));   else      return false;}void HelixSimplePlayer::pause(int playerIndex){   int i;   if (playerIndex == ALL_PLAYERS)      for (i=0; i<nNumPlayers; i++)         pause(i);   else      if (playerIndex < nNumPlayers)      {         pthread_mutex_lock(&m_engine_m);         ppctrl[playerIndex]->pPlayer->Pause();         pthread_mutex_unlock(&m_engine_m);         ppctrl[playerIndex]->bPlaying = false;      }}void HelixSimplePlayer::resume(int playerIndex){   int i;   if (playerIndex == ALL_PLAYERS)      for (i=0; i<nNumPlayers; i++)         resume(i);   else      if (playerIndex < nNumPlayers)      {         pthread_mutex_lock(&m_engine_m);         ppctrl[playerIndex]->pPlayer->Begin();         pthread_mutex_unlock(&m_engine_m);         ppctrl[playerIndex]->bPlaying = true;      }}void HelixSimplePlayer::seek(unsigned long pos, int playerIndex){   int i;   if (playerIndex == ALL_PLAYERS)      for (i=0; i<nNumPlayers; i++)         seek(pos, i);   else      if (playerIndex < nNumPlayers)      {         pthread_mutex_lock(&m_engine_m);         ppctrl[playerIndex]->pPlayer->Seek(pos);         pthread_mutex_unlock(&m_engine_m);      }}unsigned long HelixSimplePlayer::where(int playerIndex) const{   if (playerIndex < nNumPlayers && ppctrl[playerIndex]->pHSPContext)      //return ppctrl[playerIndex]->pHSPContext->position();      return ppctrl[playerIndex]->pPlayer->GetCurrentPlayTime();   else      return 0;}unsigned long HelixSimplePlayer::duration(int playerIndex) const{   if (playerIndex < nNumPlayers && ppctrl[playerIndex]->pHSPContext)      return ppctrl[playerIndex]->pHSPContext->duration();   else      return 0;}unsigned long HelixSimplePlayer::getVolume(int playerIndex){   unsigned long vol;   if (playerIndex < nNumPlayers)   {      pthread_mutex_lock(&m_engine_m);      vol = ppctrl[playerIndex]->volume;      //if (ppctrl[playerIndex]->pVolume)         //pVolume->GetVolume();      pthread_mutex_unlock(&m_engine_m);      return (vol);   }   else      return 0;}void HelixSimplePlayer::setVolume(unsigned long vol, int playerIndex){   int i;   if (playerIndex == ALL_PLAYERS)   {      for (i=0; i<nNumPlayers; i++)         setVolume(vol, i);   }   else      if (playerIndex < nNumPlayers)      {         pthread_mutex_lock(&m_engine_m);#ifndef HELIX_SW_VOLUME_INTERFACE         ppctrl[playerIndex]->volume = vol;         ((HSPFinalAudioHook *)pFinalAudioHook)->setGain(vol);#else         ppctrl[playerIndex]->pVolume->SetVolume(vol);#endif         pthread_mutex_unlock(&m_engine_m);      }}void HelixSimplePlayer::setMute(bool mute, int playerIndex){   int i;   if (playerIndex == ALL_PLAYERS)   {      for (i=0; i<nNumPlayers; i++)         setMute(mute, i);   }   else      if (playerIndex < nNumPlayers)      {         pthread_mutex_lock(&m_engine_m);         ppctrl[playerIndex]->pVolume->SetMute(mute);         pthread_mutex_unlock(&m_engine_m);      }}bool HelixSimplePlayer::getMute(int playerIndex){   bool ismute;   if (playerIndex < nNumPlayers)   {      pthread_mutex_lock(&m_engine_m);      ismute = ppctrl[playerIndex]->ismute;//pVolume->GetMute();      pthread_mutex_unlock(&m_engine_m);      return ismute;   }   else      return false;}bool HelixSimplePlayer::ReadGUIDFile(){   BOOL  bSuccess = false;   FILE* pFile    = NULL;   int   nNumRead = 0;   int   readSize = 10000;   char*  pszBuffer = new char[readSize];   if (m_pszGUIDFile)   {      if((pFile = fopen(m_pszGUIDFile, "r")) != NULL)      {         // Read in the entire file         nNumRead = fread(pszBuffer, sizeof(char), readSize, pFile);         pszBuffer[nNumRead] = '\0';         // Store it for later parsing         m_pszGUIDList = new char[nNumRead + 1];         strcpy(m_pszGUIDList, pszBuffer); /* Flawfinder: ignore */         fclose(pFile);         pFile = NULL;         if (nNumRead > 0)         {            bSuccess = true;         }      }   }   delete [] pszBuffer;   return bSuccess;}void HelixSimplePlayer::addScopeBuf(struct DelayQueue *item, int playerIndex){   if (playerIndex >=0 && playerIndex < nNumPlayers)   {      pthread_mutex_lock(&ppctrl[playerIndex]->m_scope_m);      if (ppctrl[playerIndex]->scopebuftail)      {         item->fwd = 0;         ppctrl[playerIndex]->scopebuftail->fwd = item;         ppctrl[playerIndex]->scopebuftail = item;         ppctrl[playerIndex]->scopecount++;      }      else      {         item->fwd = 0;         ppctrl[playerIndex]->scopebufhead = item;         ppctrl[playerIndex]->scopebuftail = item;         ppctrl[playerIndex]->scopecount = 1;      }      pthread_mutex_unlock(&ppctrl[playerIndex]->m_scope_m);   }}struct DelayQueue *HelixSimplePlayer::getScopeBuf(int playerIndex){   if (playerIndex >=0 && playerIndex < nNumPlayers)   {      pthread_mutex_lock(&ppctrl[playerIndex]->m_scope_m);      struct DelayQueue *item = ppctrl[playerIndex]->scopebufhead;      if (item)      {         ppctrl[playerIndex]->scopebufhead = item->fwd;         ppctrl[playerIndex]->scopecount--;         if (!ppctrl[playerIndex]->scopebufhead)            ppctrl[playerIndex]->scopebuftail = 0;      }      pthread_mutex_unlock(&ppctrl[playerIndex]->m_scope_m);      return item;   }   else      return 0;}int HelixSimplePlayer::peekScopeTime(unsigned long &t, int playerIndex){   if (playerIndex >=0 && playerIndex < nNumPlayers)   {      if (ppctrl[playerIndex]->scopebufhead)         t = ppctrl[playerIndex]->scopebufhead->time;      else         return -1;      return 0;   }   return -1;}void HelixSimplePlayer::clearScopeQ(int playerIndex){   if (playerIndex < 0)   {      for (int i=0; i<nNumPlayers; i++)         clearScopeQ(i);   }   else   {      struct DelayQueue *item;      while ((item = getScopeBuf(playerIndex)))         delete item;   }}

⌨️ 快捷键说明

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