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 + -
显示快捷键?