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

📄 hxplay.cpp

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#endif /* HELIX_FEATURE_ADVANCEDGROUPMGR && HELIX_FEATURE_MASTERTAC */

#if defined(HELIX_FEATURE_NESTEDMETA)
    m_pPersistentComponentManager->AddRef();
    if (m_pGroupManager)
    {
        m_pGroupManager->AddSink(m_pPersistentComponentManager);
    }
#endif /* HELIX_FEATURE_NESTEDMETA */

#if defined(HELIX_FEATURE_AUTOUPGRADE)
    m_pUpgradeCollection = new HXUpgradeCollection;
    m_pUpgradeCollection->AddRef();
#endif /* HELIX_FEATURE_AUTOUPGRADE */

#if defined(HELIX_FEATURE_EVENTMANAGER)
    // Get our own IUnknown interface
    IUnknown* pUnknown = NULL;
    QueryInterface(IID_IUnknown, (void**) &pUnknown);
    if (pUnknown)
    {
        // Initialize the renderer event manager
        m_pEventManager = new CRendererEventManager(pUnknown);
        if (m_pEventManager) m_pEventManager->AddRef();
    }
    HX_RELEASE(pUnknown);
#endif /* #if defined(HELIX_FEATURE_EVENTMANAGER) */
}

HXPlayer::~HXPlayer()
{
    CloseAllRenderers(m_nCurrentGroup);
    ResetPlayer();
    Close();
    HX_DELETE(m_pSourceMap);
    HX_DELETE(m_pSharedWallClocks);
}

/////////////////////////////////////////////////////////////////////////
//      Method:
//              IUnknown::QueryInterface
//      Purpose:
//              Implement this to export the interfaces supported by your
//              object.
//
STDMETHODIMP HXPlayer::QueryInterface(REFIID riid, void** ppvObj)
{
#if defined(HELIX_FEATURE_PACKETHOOKMGR)
    // create the following objects only if needed
    if (!m_pPacketHookManager && IsEqualIID(riid, IID_IHXPacketHookManager))
    {
        m_pPacketHookManager = new PacketHookManager(this);

        if (m_pPacketHookManager)
        {
            m_pPacketHookManager->AddRef();
        }
    }
#endif /* HELIX_FEATURE_PACKETHOOKMGR */

    QInterfaceList qiList[] =
        {
            { GET_IIDHANDLE(IID_IHXPlayer), (IHXPlayer*)this },
            { GET_IIDHANDLE(IID_IHXPlayer2), (IHXPlayer2*)this },
            { GET_IIDHANDLE(IID_IHXPendingStatus), (IHXPendingStatus*)this },
#if defined(HELIX_FEATURE_AUTHENTICATION)
            { GET_IIDHANDLE(IID_IHXAuthenticationManager), (IHXAuthenticationManager*)this },
            { GET_IIDHANDLE(IID_IHXAuthenticationManager2), (IHXAuthenticationManager2*)this },
#endif /* HELIX_FEATURE_AUTHENTICATION */
            { GET_IIDHANDLE(IID_IHXGroupSink), (IHXGroupSink*)this },
            { GET_IIDHANDLE(IID_IHXAudioPlayerResponse), (IHXAudioPlayerResponse*)this },
            { GET_IIDHANDLE(IID_IHXRegistryID), (IHXRegistryID*)this },
            { GET_IIDHANDLE(IID_IHXErrorMessages), (IHXErrorMessages*)this },
            { GET_IIDHANDLE(IID_IHXLayoutSiteGroupManager), (IHXLayoutSiteGroupManager*)this },
#if defined(HELIX_FEATURE_NESTEDMETA)
            { GET_IIDHANDLE(IID_IHXPersistenceManager), (IHXPersistenceManager*)this },
#endif /* HELIX_FEATURE_NESTEDMETA */
            { GET_IIDHANDLE(IID_IHXDriverStreamManager), (IHXDriverStreamManager*)this },
            { GET_IIDHANDLE(IID_IHXRendererUpgrade), (IHXRendererUpgrade*)this },
            { GET_IIDHANDLE(IID_IHXInternalReset), (IHXInternalReset*)this },
            { GET_IIDHANDLE(IID_IHXPlayerState), (IHXPlayerState*)this },
#if defined(HELIX_FEATURE_PLAYERNAVIGATOR)
            { GET_IIDHANDLE(IID_IHXPlayerNavigator), (IHXPlayerNavigator*)this },
#endif /* HELIX_FEATURE_PLAYERNAVIGATOR */
            { GET_IIDHANDLE(IID_IHXClientStatisticsGranularity), (IHXClientStatisticsGranularity*)this },
            { GET_IIDHANDLE(IID_IHXPlayerPresentation), (IHXPlayerPresentation*)this },
#if defined(HELIX_FEATURE_RECORDCONTROL)
            { GET_IIDHANDLE(IID_IHXRecordManager), (IHXRecordManager*)this },
#endif /* HELIX_FEATURE_RECORDCONTROL */
            { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)(IHXPlayer*)this },
            { GET_IIDHANDLE(IID_IHXOverrideDefaultServices), (IHXOverrideDefaultServices*)this },
        };
    HX_RESULT res = ::QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
    
    // if it succeeded, return immediately...
    if (res == HXR_OK)
    {
        return res;
    }
    // ...otherwise continue onward
    
    if (m_pClientViewSource &&
             IsEqualIID(riid, IID_IHXViewSourceCommand))
    {
        AddRef();
        *ppvObj = (IHXViewSourceCommand*)this;
        return HXR_OK;
    }
    else if (m_pErrorSinkControl &&
             m_pErrorSinkControl->QueryInterface(riid, ppvObj) == HXR_OK)
    {
        return HXR_OK;
    }
    else if (m_pAdviseSink &&
             m_pAdviseSink->QueryInterface(riid, ppvObj) == HXR_OK)
    {
        return HXR_OK;
    }
    else if (m_pAudioPlayer &&
             m_pAudioPlayer->QueryInterface(riid, ppvObj) == HXR_OK)
    {
        return HXR_OK;
    }
#if defined(HELIX_FEATURE_PREFERENCES)
    else if (m_pPreferences &&
             m_pPreferences->QueryInterface(riid, ppvObj) == HXR_OK)
    {
        return HXR_OK;
    }
#endif /* HELIX_FEATURE_PREFERENCES */
#if defined(HELIX_FEATURE_HYPER_NAVIGATE)
    else if (m_pHyperNavigate &&
             m_pHyperNavigate->QueryInterface(riid, ppvObj) == HXR_OK)
    {
        return HXR_OK;
    }
#endif /* HELIX_FEATURE_HYPER_NAVIGATE */
#if defined(HELIX_FEATURE_ASM)
    /* m_pASM will be available on a per player basis ONLY under Load testing */
    else if (m_pASM &&
             m_pASM->QueryInterface(riid, ppvObj) == HXR_OK)
    {
        return HXR_OK;
    }
#endif /* HELIX_FEATURE_ASM */
#if defined(HELIX_FEATURE_VIDEO)
    else if (m_pSiteManager &&
             m_pSiteManager->QueryInterface(riid, ppvObj) == HXR_OK)
    {
        return HXR_OK;
    }
#endif /* HELIX_FEATURE_VIDEO */
#if defined(HELIX_FEATURE_AUTOUPGRADE)
    else if (m_pUpgradeCollection &&
             m_pUpgradeCollection->QueryInterface(riid, ppvObj) == HXR_OK)
    {
        return HXR_OK;
    }
#endif /* HELIX_FEATURE_AUTOUPGRADE */
#if defined(HELIX_FEATURE_PACKETHOOKMGR)
    else if (m_pPacketHookManager &&
             m_pPacketHookManager->QueryInterface(riid, ppvObj) == HXR_OK)
    {
        return HXR_OK;
    }
#endif /* HELIX_FEATURE_PACKETHOOKMGR */
#if defined(HELIX_FEATURE_BASICGROUPMGR)
    else if (m_pGroupManager &&
             m_pGroupManager->QueryInterface(riid, ppvObj) == HXR_OK)
    {
        return HXR_OK;
    }
#endif /* HELIX_FEATURE_BASICGROUPMGR */
    else if (m_pViewPortManager &&
             m_pViewPortManager->QueryInterface(riid, ppvObj) == HXR_OK)
    {
        return HXR_OK;
    }
#if defined(HELIX_FEATURE_MEDIAMARKER)
    else if (m_pMediaMarkerManager &&
             m_pMediaMarkerManager->QueryInterface(riid, ppvObj) == HXR_OK)
    {
        return HXR_OK;
    }
#endif /* #if defined(HELIX_FEATURE_MEDIAMARKER) */
#if defined(HELIX_FEATURE_EVENTMANAGER)
    else if (m_pEventManager &&
             m_pEventManager->QueryInterface(riid, ppvObj) == HXR_OK)
    {
        return HXR_OK;
    }
#endif /* #if defined(HELIX_FEATURE_EVENTMANAGER) */
#if defined(HELIX_FEATURE_NESTEDMETA)
    else if (m_pPersistentComponentManager &&
             m_pPersistentComponentManager->QueryInterface(riid, ppvObj) == HXR_OK)
    {
        return HXR_OK;
    }
#endif /* HELIX_FEATURE_NESTEDMETA */
    else if (m_pPlugin2Handler &&
             m_pPlugin2Handler->QueryInterface(riid, ppvObj) == HXR_OK)
    {
        return HXR_OK;
    }
    else if (m_pClient &&
             m_pClient->QueryInterface(riid, ppvObj) == HXR_OK)
    {
        return HXR_OK;
    }
    else if (m_pEngine &&
             m_pEngine->QueryInterface(riid, ppvObj) == HXR_OK)
    {
        return HXR_OK;
    }
    /* DO NOT ADD ANY MROE QIs HERE. ADD IT BEFORE m_pClient QI*/

    *ppvObj = NULL;
    return HXR_NOINTERFACE;
}

/////////////////////////////////////////////////////////////////////////
//      Method:
//              IUnknown::AddRef
//      Purpose:
//              Everyone usually implements this the same... feel free to use
//              this implementation.
//
STDMETHODIMP_(ULONG32) HXPlayer::AddRef()
{
    return InterlockedIncrement(&m_lRefCount);
}

/////////////////////////////////////////////////////////////////////////
//      Method:
//              IUnknown::Release
//      Purpose:
//              Everyone usually implements this the same... feel free to use
//              this implementation.
//
STDMETHODIMP_(ULONG32) HXPlayer::Release()
{
    if (InterlockedDecrement(&m_lRefCount) > 0)
    {
        return m_lRefCount;
    }

    if(m_lRefCount == 0)
    {
        delete this;
    }
    return 0;
}

// *** IHXPlayer methods ***

/************************************************************************
 *      Method:
 *              IHXPlayer::GetClientEngine
 *      Purpose:
 *              Get the interface to the client engine object of which the player
 *              is a part of.
 *
 */
STDMETHODIMP HXPlayer::GetClientEngine(IHXClientEngine* &pEngine)
{
    pEngine = m_pEngine;

    if (pEngine)
    {
        pEngine->AddRef();
    }

    return HXR_OK;
}

/************************************************************************
 *      Method:
 *              IHXPlayer::Begin
 *      Purpose:
 *              Tell the player to begin playback of all its sources.
 *
 */
STDMETHODIMP HXPlayer::Begin(void)
{
    HX_RESULT theErr = HXR_OK;

    m_bCoreLocked = TRUE;
    m_pCoreMutex->Lock();
    theErr = BeginPlayer();
    m_pCoreMutex->Unlock();
    m_bCoreLocked = FALSE;

    return theErr;
}

HX_RESULT
HXPlayer::BeginPlayer(void)
{
    HX_RESULT   theErr = HXR_OK;

    m_bUserHasCalledBegin   = TRUE;
    m_bFastStartInProgress  = FALSE;

    if (!m_bInternalPauseResume && !m_bIsFirstBegin && !m_bPaused)
    {
        return HXR_OK;
    }

    if (m_bIsLive && m_bPaused && m_bLiveSeekToBeDone)
    {
        m_ulElapsedPauseTime = CALCULATE_ELAPSED_TICKS(m_ulTimeOfPause, HX_GET_TICKCOUNT());

        /* This is an internal seek due to live pause */
        theErr = SeekPlayer(m_ulLiveSeekTime + m_ulElapsedPauseTime);
    }

    m_bPaused = FALSE;

    if (m_bIsFirstBegin)
    {
        UpdateSourceActive();
    }

    if (!theErr)
    {
        theErr = UpdateStatistics();
    }

    if (!theErr)
    {
        UpdateCurrentPlayTime( m_pAudioPlayer->GetCurrentPlayBackTime() );
    }

    /* Unregister all the sources that are not currently active */
    UnregisterNonActiveSources();

    if (!m_bIsDone)
    {
        CheckSourceRegistration();

        CHXMapPtrToPtr::Iterator ndxSources = m_pSourceMap->Begin();
        /* Check if we are done. This may be TRUE for empty files */
        for (;  !theErr && ndxSources != m_pSourceMap->End(); ++ndxSources)
        {
            SourceInfo* pSourceInfo = (SourceInfo*) (*ndxSources);
            theErr = pSourceInfo->Begin();
        }
    }

    /* Only send this OnBegin()'s if not the first begin. In the case
     * of the first begin, these are actually sent after the header's
     * arrive...
     */
    if (!theErr && !m_bIsFirstBegin && !m_bInternalPauseResume && !m_bInternalReset && m_pAdviseSink)
    {
        m_pAdviseSink->OnBegin(m_ulCurrentPlayTime);
    }

    m_bIsFirstBegin = FALSE;
    m_bBeginPending = TRUE;

    m_bFastStartInProgress  = FALSE;

    if (!m_ToBeginRendererList.IsEmpty())
    {
        CheckBeginList();
    }

    return (theErr);
}

/************************************************************************
 *      Method:
 *              IHXPlayer::Stop
 *      Purpose:
 *              Tell the player to stop playback of all its sources.
 *
 */
STDMETHODIMP HXPlayer::Stop(void)
{
    // we want to protect against the TLC opening another URL
    if (m_bSetModal)
    {
        return HXR_OK;
    }

    m_bCoreLocked = TRUE;
    m_pCoreMutex->Lock();
    StopPlayer(END_STOP);
    m_pCoreMutex->Unlock();
    m_bCoreLocked = FALSE;

    return HXR_OK;
}

void
HXPlayer::StopPlayer(EndCode endCode)
{
    StopAllStreams(endCode);
    /* Reset player condition */
    ResetPlayer();
}


/************************************************************************
 *      Method:
 *              IHXPlayer::Pause
 *      Purpose:
 *              Tell the player to pause playback of all its sources.
 *
 */
STDMETHODIMP HXPlayer::Pause(void)
{
    HX_RESULT theErr = HXR_OK;

    m_bCoreLocked = TRUE;
    m_pCoreMutex->Lock();
    theErr = PausePlayer();
    m_pCoreMutex->Unlock();
    m_bCoreLocked = FALSE;

    return theErr;
}

HX_RESULT

⌨️ 快捷键说明

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