helix-sp.cpp

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

CPP
2,109
字号
   }   // get the client engine selector   pCEselect = 0;   pEngine->QueryInterface(IID_IHXClientEngineSelector, (void **) &pCEselect);   if (!pCEselect)      print2stderr("no CE selector\n");   pPluginE = 0;   // get the plugin enumerator   pEngine->QueryInterface(IID_IHXPluginEnumerator, (void **) &pPluginE);   if (!pPluginE)      print2stderr("no plugin enumerator\n");   pPlugin2Handler = 0;   // get the plugin2handler   pEngine->QueryInterface(IID_IHXPlugin2Handler, (void **) &pPlugin2Handler);   if (!pPlugin2Handler)      print2stderr("no plugin enumerator\n");   pAudioDeviceManager = 0;   // get the audio device mananger   pEngine->QueryInterface(IID_IHXAudioDeviceManager, (void **) &pAudioDeviceManager);   if (!pAudioDeviceManager)      print2stderr("no audio device manager\n");   // create players   for (i = 0; i < numPlayers; i++)   {      addPlayer();   }#ifdef USE_HELIX_ALSA   pAudioDevice = 0;   if ( m_outputsink == ALSA && pAudioDeviceManager && !m_AlsaCapableCore)   {      pAudioDevice = new HSPAudioDevice(this, m_device);      // change the AudioDevice if we are using alsa (player 0's audion device is special...)      pAudioDeviceManager->Replace(pAudioDevice);   }#endif   pAudioDeviceResponse = 0;   pEngine->QueryInterface(IID_IHXAudioDeviceResponse, (void**) &pAudioDeviceResponse);   pAudioHookManager = 0;   pFinalAudioHook = 0;   pEngine->QueryInterface(IID_IHXAudioHookManager, (void **) &pAudioHookManager);   if (!pAudioHookManager)      print2stderr("no audio device hook manager\n");   // install hook for visualizations, equalizer, and volume control - for use with streams   // the time in the packets is the presentation time - which maps better to streams   HSPFinalAudioHook *pPMAH = new HSPFinalAudioHook(this);   pAudioHookManager->AddHook(pPMAH);   pFinalAudioHook = pPMAH;   if (pPlugin2Handler)   {      IHXValues* pPluginProps;      const char* szPropName;      IHXBuffer* pPropValue;      char *value;      HX_RESULT ret;      MimeList *ml;      mimehead = 0;      char mime[1024];      char ext[1024];      bool hasmime, hasexts;      pPluginProps = 0;      int n = pPlugin2Handler->GetNumOfPlugins2();      m_numPlugins = n;      print2stderr("Got the plugin2 handler: numplugins =  %d\n", n);      m_pluginInfo = new pluginInfo* [n];      for (i=0; i<n; i++)      {         m_pluginInfo[i] = new pluginInfo;         m_pluginInfo[i]->description = "";         m_pluginInfo[i]->copyright = "";         m_pluginInfo[i]->moreinfourl = "";         hasmime = hasexts = false;         pPlugin2Handler->GetPluginInfo(i, pPluginProps);         if (pPluginProps)         {            ret = pPluginProps->GetFirstPropertyCString(szPropName, pPropValue);            while(SUCCEEDED(ret))            {               value = (char*)pPropValue->GetBuffer();               if (!strcmp(szPropName, "FileMime"))               {                  strcpy(mime, value);                  hasmime = true;               }               if (!strcmp(szPropName, "FileExtensions"))               {                  strcpy(ext, value);                  hasexts = true;               }               if (!strcmp(szPropName, "Description"))               {                  m_pluginInfo[i]->description = new char[ strlen(value) + 1 ];                  strcpy(m_pluginInfo[i]->description, value);               }               if (!strcmp(szPropName, "Copyright"))               {                  m_pluginInfo[i]->copyright = new char[ strlen(value) + 1 ];                  strcpy(m_pluginInfo[i]->copyright, value);               }               if (!strcmp(szPropName, "PlgCopy"))               {                  m_pluginInfo[i]->moreinfourl = new char[ strlen(value) + 1 ];                  strcpy(m_pluginInfo[i]->moreinfourl, value);               }               ret = pPluginProps->GetNextPropertyCString(szPropName, pPropValue);            }            HX_RELEASE(pPluginProps);            if (hasmime && hasexts)            {               mimelistlen++;               ml = new MimeList(mime, ext);               ml->fwd = mimehead;               mimehead = ml;            }         }      }   }}int HelixSimplePlayer::initDirectSS(){   if (m_outputsink == ALSA)   {      closeAudioDevice();      m_direct = ALSA;      openAudioDevice();   }   else   {      closeAudioDevice();      m_direct = OSS;      openAudioDevice();   }#ifdef USE_HELIX_ALSA   m_MvolBefore = m_MvolAtStart = getDirectMasterVolume();   print2stderr("***Master VolAtStart is %d\n", m_MvolAtStart);   setDirectMasterVolume(m_MvolAtStart);#endif   m_volBefore = m_volAtStart = getDirectPCMVolume();   print2stderr("***VolAtStart is %d\n", m_volAtStart);   setDirectPCMVolume(m_volAtStart);   return 0;}int HelixSimplePlayer::addPlayer(){   if ((nNumPlayers+1) == MAX_PLAYERS)   {      print2stderr("MAX_PLAYERS: %d   nNumPlayers: %d\n", MAX_PLAYERS, nNumPlayers);      return -1;   }   ppctrl[nNumPlayers] = new struct playerCtrl;   memset(ppctrl[nNumPlayers], 0, sizeof(struct playerCtrl));   pthread_mutexattr_t ma;   pthread_mutexattr_init(&ma);   pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_FAST_NP); // note this is not portable outside linux and a few others   pthread_mutex_init(&ppctrl[nNumPlayers]->m_scope_m, &ma);   ppctrl[nNumPlayers]->bPlaying  = false;   ppctrl[nNumPlayers]->bStarting = false;   ppctrl[nNumPlayers]->bFadeIn   = false;   ppctrl[nNumPlayers]->bFadeOut  = false;   ppctrl[nNumPlayers]->ulFadeLength = 0;   ppctrl[nNumPlayers]->pStream = 0;   ppctrl[nNumPlayers]->pszURL = 0;   memset(&ppctrl[nNumPlayers]->md, 0, sizeof(ppctrl[nNumPlayers]->md));   ppctrl[nNumPlayers]->pHSPContext = new HSPClientContext(nNumPlayers, this);   if (!ppctrl[nNumPlayers]->pHSPContext)   {      print2stdout("Error: Out of Memory. num players is %d\n", nNumPlayers);      theErr = HXR_UNEXPECTED;      return -1;   }   ppctrl[nNumPlayers]->pHSPContext->AddRef();   //initialize the example context   char pszGUID[GUID_LEN + 1]; /* Flawfinder: ignore */ // add 1 for terminator   //char* token = NULL;   IHXPreferences* pPreferences = NULL;   if (HXR_OK != pEngine->CreatePlayer(ppctrl[nNumPlayers]->pPlayer))   {      theErr = HXR_FAILED;      return -1;   }   pszGUID[0] = '\0';// disable for now - I don't know what I was thinking#ifdef _DISABLE_CUZ_I_MUST_HAVE_BEEN_NUTS_   if (m_pszGUIDList)   {      // Get next GUID from the GUID list      if (nNumPlayers == 0)      {         token = strtok(m_pszGUIDList, "\n\0");      }      else      {         token = strtok(NULL, "\n\0");      }      if (token)      {         strncpy(pszGUID, token, GUID_LEN); /* Flawfinder: ignore */         pszGUID[GUID_LEN] = '\0';      }   }#endif   ppctrl[nNumPlayers]->pPlayer->QueryInterface(IID_IHXPreferences, (void**) &pPreferences);   ppctrl[nNumPlayers]->pHSPContext->Init(ppctrl[nNumPlayers]->pPlayer, pPreferences, pszGUID);   ppctrl[nNumPlayers]->pPlayer->SetClientContext(ppctrl[nNumPlayers]->pHSPContext);   HX_RELEASE(pPreferences);   ppctrl[nNumPlayers]->pPlayer->QueryInterface(IID_IHXErrorSinkControl, (void**) &pErrorSinkControl);   if (pErrorSinkControl)   {      ppctrl[nNumPlayers]->pHSPContext->QueryInterface(IID_IHXErrorSink, (void**) &pErrorSink);      if (pErrorSink)         pErrorSinkControl->AddErrorSink(pErrorSink, HXLOG_EMERG, HXLOG_INFO);      HX_RELEASE(pErrorSink);   }   HX_RELEASE(pErrorSinkControl);   // Get the Player2 interface   ppctrl[nNumPlayers]->pPlayer->QueryInterface(IID_IHXPlayer2, (void**) &ppctrl[nNumPlayers]->pPlayer2);   if (!ppctrl[nNumPlayers]->pPlayer2)      print2stderr("no player2 device\n");   // Get the Audio Player   ppctrl[nNumPlayers]->pPlayer->QueryInterface(IID_IHXAudioPlayer, (void**) &ppctrl[nNumPlayers]->pAudioPlayer);   if (ppctrl[nNumPlayers]->pAudioPlayer)   {      // ...and now the volume interface      //ppctrl[nNumPlayers]->pVolume = ppctrl[nNumPlayers]->pAudioPlayer->GetAudioVolume();      //ppctrl[nNumPlayers]->pVolume = ppctrl[nNumPlayers]->pAudioPlayer->GetDeviceVolume();      if (ppctrl[nNumPlayers]->pVolume)      {#ifndef HELIX_SW_VOLUME_INTERFACE         HelixSimplePlayerVolumeAdvice *pVA = new HelixSimplePlayerVolumeAdvice(this, nNumPlayers);         pVA->AddRef();         ppctrl[nNumPlayers]->pVolume->AddAdviseSink((IHXVolumeAdviseSink *)pVA);         ppctrl[nNumPlayers]->pVolumeAdvise = pVA;         ppctrl[nNumPlayers]->volume = 50; // should get volume advise, which will set this properly#else         // set the helix sw interface volume to 100, we'll control the volume either ourselves post equalization or by         // amaorok using direct hardware volume         //ppctrl[nNumPlayers]->pVolume->SetVolume(100);         ppctrl[nNumPlayers]->pVolume->SetVolume(100);         ppctrl[nNumPlayers]->pVolumeAdvise = 0;#endif      }      // add the IHXAudioStreamInfoResponse it the AudioPlayer      HelixSimplePlayerAudioStreamInfoResponse *pASIR = new HelixSimplePlayerAudioStreamInfoResponse(this, nNumPlayers);      ppctrl[nNumPlayers]->pAudioPlayer->SetStreamInfoResponse(pASIR);      ppctrl[nNumPlayers]->pStreamInfoResponse = pASIR;      // ...and get the CrossFader      ppctrl[nNumPlayers]->pAudioPlayer->QueryInterface(IID_IHXAudioCrossFade, (void **) &(ppctrl[nNumPlayers]->pCrossFader));      if (!ppctrl[nNumPlayers]->pCrossFader)         print2stderr("CrossFader not available\n");      // install hook for visualizations, equalizer, and volume control - for use with local files      // a FinalAudioHook is used for streams      HSPPostMixAudioHook *pPMAH = new HSPPostMixAudioHook(this, nNumPlayers);      ppctrl[nNumPlayers]->pAudioPlayer->AddPostMixHook(pPMAH, false, true);      ppctrl[nNumPlayers]->pPostMixHook = pPMAH;   }   else      print2stderr("No AudioPlayer Found - how can we play music!!\n");   ++nNumPlayers;   //print2stderr("Added player, total is %d\n",nNumPlayers);   return 0;}HelixSimplePlayer::~HelixSimplePlayer(){   tearDown();   // only now invalidate the device, not whenever we teardown   delete [] m_device;}void HelixSimplePlayer::tearDown(){   int i;   FPRMCLOSEENGINE         fpCloseEngine;   if (theErr != HXR_OK) // failed to initialize properly      return;   // make sure all players are stopped,   stop();   print2stderr("TEARDOWN\n");   for (i=nNumPlayers-1; i>=0; i--)   {      if (ppctrl[i]->pCrossFader)         ppctrl[i]->pCrossFader->Release();      if (ppctrl[i]->pAudioPlayer)      {         ppctrl[i]->pAudioPlayer->RemovePostMixHook( ppctrl[i]->pPostMixHook );         ppctrl[i]->pPostMixHook->Release();         ppctrl[i]->pAudioPlayer->RemoveStreamInfoResponse((IHXAudioStreamInfoResponse *) ppctrl[i]->pStreamInfoResponse);         if (ppctrl[i]->pVolume)         {            if (ppctrl[i]->pVolumeAdvise)            {               ppctrl[i]->pVolume->RemoveAdviseSink(ppctrl[i]->pVolumeAdvise);               ppctrl[i]->pVolumeAdvise->Release();            }            ppctrl[i]->pVolume->Release();         }         ppctrl[i]->pAudioPlayer->Release();      }      if ( ppctrl[i]->pszURL )         delete [] ppctrl[i]->pszURL;      if (ppctrl[i]->pHSPContext)         ppctrl[i]->pHSPContext->Release();      if (ppctrl[i]->pPlayer2)         ppctrl[i]->pPlayer2->Release();      if (ppctrl[i]->pPlayer && pEngine)      {         pEngine->ClosePlayer(ppctrl[i]->pPlayer);         ppctrl[i]->pPlayer->Release();      }      delete ppctrl[i];  }   if (pAudioDevice)      pAudioDevice->Release();   if (pAudioDeviceResponse)      pAudioDeviceResponse->Release();   delete [] ppctrl;   if (pCommonClassFactory)      pCommonClassFactory->Release();   if (pCEselect)      pCEselect->Release();   if (pPluginE)      pPluginE->Release();   if (pPlugin2Handler)      pPlugin2Handler->Release();   if (pAudioDeviceManager)      pAudioDeviceManager->Release();   if (pAudioHookManager)   {      pAudioHookManager->RemoveHook(pFinalAudioHook);      pFinalAudioHook->Release();      pAudioHookManager->Release();   }   if (pEngineContext)      pEngineContext->Release();   fpCloseEngine  = (FPRMCLOSEENGINE) dlsym(core_handle, "CloseEngine");   if (fpCloseEngine && pEngine)   {      fpCloseEngine(pEngine);      pEngine = NULL;   }   dlclose(core_handle);   if (m_pszUsername)   {      delete [] m_pszUsername;   }   if (m_pszPassword)   {      delete [] m_pszPassword;   }   if (m_pszGUIDFile)   {      delete [] m_pszGUIDFile;   }   if (m_pszGUIDList)   {      delete [] m_pszGUIDList;   }   for (i=0; i<m_numPlugins; i++)      delete m_pluginInfo[i];   delete [] m_pluginInfo;   if (bEnableVerboseMode)   {      print2stdout("\nDone.\n");   }   MimeList *ml = mimehead, *mh;   while (ml)   {      mh = ml->fwd;      delete ml;      ml = mh;   }   closeAudioDevice();   theErr = HXR_FAILED;   pErrorSink = NULL;   pErrorSinkControl = NULL;   pPluginE = 0;   pPlugin2Handler = 0;   ppctrl = NULL;   bURLFound = false;   nNumPlayers = 0;   nNumPlayRepeats = 1;   nTimeDelta = DEFAULT_TIME_DELTA;   nStopTime = DEFAULT_STOP_TIME;   bStopTime = true;   bStopping = false;   nPlay = 0;   bEnableAdviceSink = false;   bEnableVerboseMode = false;   pEngine = NULL;   m_pszUsername = NULL;   m_pszPassword = NULL;   m_pszGUIDFile = NULL;   m_pszGUIDList = NULL;   m_Error = 0;   m_ulNumSecondsPlayed = 0;   mimehead = 0;   m_preamp = 0;}void HelixSimplePlayer::setOutputSink( HelixSimplePlayer::AUDIOAPI out ){#ifdef USE_HELIX_ALSA   m_outputsink = out;#else   m_outputsink = OSS;#endif}HelixSimplePlayer::AUDIOAPI HelixSimplePlayer::getOutputSink(){   return m_outputsink;}void HelixSimplePlayer::setDevice( const char *dev ){   delete [] m_device;   int len = strlen(dev);   m_device = new char [len + 1];   strcpy(m_device, dev);}const char *HelixSimplePlayer::getDevice(){   return m_device;}#define MAX_DEV_NAME 255#define HX_VOLUME  SOUND_MIXER_PCMvoid HelixSimplePlayer::openAudioDevice(){   switch (m_direct)   {      case OSS:      {         //Check the environmental variable to let user overide default device.         char *pszOverrideName = getenv( "AUDIO" ); /* Flawfinder: ignore */         char szDevName[MAX_DEV_NAME]; /* Flawfinder: ignore */         // Use defaults if no environment variable is set.         if ( pszOverrideName && strlen(pszOverrideName)>0 )         {            SafeStrCpy( szDevName, pszOverrideName, MAX_DEV_NAME );         }         else         {            SafeStrCpy( szDevName, "/dev/mixer", MAX_DEV_NAME );         }         // Open the audio device if it isn't already open         if ( m_nDevID < 0 )         {            m_nDevID = ::open( szDevName, O_WRONLY );         }         if ( m_nDevID < 0 )         {

⌨️ 快捷键说明

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