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

📄 hxaudses.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    HX_DELETE(m_pTimeLineWatchers);#endif        HX_DELETE(m_pFakeAudioCBTime);    HX_DELETE(m_pInDataPtr);    HX_DELETE(m_pOutDataPtr);    HX_RELEASE(m_pContext);    HX_DELETE(m_pMutex);    HX_RELEASE(m_pFinalHook);    HX_RELEASE(m_pMPPSupport);}///////////////////////////////////////////////////////////////////////////  Method://      IUnknown::QueryInterface//  Purpose://      Implement this to export the interfaces supported by your//      object.//STDMETHODIMP CHXAudioSession::QueryInterface(REFIID riid, void** ppvObj){    QInterfaceList  qiList[] =        {            { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)(IHXAudioDeviceResponse*)this},            { GET_IIDHANDLE(IID_IHXAudioDeviceResponse), (IHXAudioDeviceResponse*)this  },            { GET_IIDHANDLE(IID_IHXAudioDeviceManager),  (IHXAudioDeviceManager*)this   },            { GET_IIDHANDLE(IID_IHXAudioDeviceManager2), (IHXAudioDeviceManager2*)this  },            { GET_IIDHANDLE(IID_IHXAudioPushdown),       (IHXAudioPushdown*)this        },#ifdef HELIX_FEATURE_VOLUME            { GET_IIDHANDLE(IID_IHXVolumeAdviseSink), (IHXVolumeAdviseSink*)this        },#endif#if defined(HELIX_FEATURE_AUDIO_POSTMIXHOOK)            { GET_IIDHANDLE(IID_IHXAudioHookManager),    (IHXAudioHookManager*)this     },#endif#if defined(HELIX_FEATURE_RESAMPLER) && !defined (HELIX_CONFIG_FIXEDPOINT)              { GET_IIDHANDLE(IID_IHXAudioResamplerManager), (IHXAudioResamplerManager*)this },#endif#if defined(HELIX_FEATURE_TIMELINE_WATCHER)            { GET_IIDHANDLE(IID_IHXTimelineManager),      (IHXTimelineManager*)this       },#endif            { GET_IIDHANDLE(IID_IHXAudioPushdown2),      (IHXAudioPushdown2*)this       }        };    return ::QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);}///////////////////////////////////////////////////////////////////////////  Method://      IUnknown::AddRef//  Purpose://      Everyone usually implements this the same... feel free to use//      this implementation.//STDMETHODIMP_(ULONG32) CHXAudioSession::AddRef(){    return InterlockedIncrement(&m_lRefCount);}///////////////////////////////////////////////////////////////////////////  Method://      IUnknown::Release//  Purpose://      Everyone usually implements this the same... feel free to use//      this implementation.//STDMETHODIMP_(ULONG32) CHXAudioSession::Release(){    if (InterlockedDecrement(&m_lRefCount) > 0)    {        return m_lRefCount;    }    delete this;    return 0;}/************************************************************************ *  Method: *              CHXAudioSession::SetVolume *      Purpose: *              Set device volume. This is the audio device volume. * */void CHXAudioSession::SetVolume( const UINT16 uVolume){    m_uVolume = uVolume;    // only set the volume of not muted    if (!m_bMute)    {        HX_ASSERT(m_pCurrentAudioDev || !m_bReplacedDev);        _ConstructIfNeeded();        if (m_pCurrentAudioDev)        {            m_pCurrentAudioDev->SetVolume(uVolume);        }    }}void CHXAudioSession::_ConstructIfNeeded(){    if (!m_pCurrentAudioDev)    {        CreateAudioDevice();        if (!m_bAudioDeviceSupportsVolume)        {            ReleaseAudioDevice();        }    }}/************************************************************************ *  Method: *              CHXAudioSession::GetVolume *      Purpose: *              Get device volume. This is the audio device volume. * */UINT16 CHXAudioSession::GetVolume(){    if(!m_bMute)    {        HX_ASSERT(m_pCurrentAudioDev || !m_bReplacedDev);        _ConstructIfNeeded();        if (m_pCurrentAudioDev)        {            m_uVolume = m_pCurrentAudioDev->GetVolume();        }    }    return m_uVolume;}/************************************************************************ *  Method: *              CHXAudioSession::SetMute *      Purpose: *              Mute device volume. This is the audio device volume. * */void CHXAudioSession::SetMute( const BOOL bMute){    if (bMute != m_bMute)    {        m_bMute = bMute;        UINT16 volLevel = (m_bMute ? 0 : m_uVolume);        HX_ASSERT(m_pCurrentAudioDev || !m_bReplacedDev);        _ConstructIfNeeded();        if (m_pCurrentAudioDev)        {            m_pCurrentAudioDev->SetVolume( volLevel );        }    }}/************************************************************************ *  Method: *              CHXAudioSession::Init *      Purpose: *              Setup the Audio Player list. */HX_RESULT CHXAudioSession::Init(IUnknown* pContext){    HX_RESULT   theErr  = HXR_OK;    IHXBuffer* pBuffer = 0;    if (!pContext)    {        theErr = HXR_INVALID_PARAMETER;        goto cleanup;    }    m_pContext = pContext;    m_pContext->AddRef();#if defined(HELIX_FEATURE_PREFERENCES)    // Get preferences interface and info..    pContext->QueryInterface(IID_IHXPreferences, (void **) &m_pPreferences);#ifdef _UNIX    //Set up a global so we can read the ESDSupport pref    //when we create the audio device    z_pIHXPrefs = m_pPreferences;#endif#endif /* HELIX_FEATURE_PREFERENCES */    if (HXR_OK != pContext->QueryInterface(IID_IHXScheduler,                            (void**) &m_pScheduler))    {        theErr = HXR_INVALID_PARAMETER;        goto cleanup;    }    pContext->QueryInterface(IID_IHXInterruptState, (void**) &m_pInterruptState);    // Create audio player list.    m_pPlayerList = new CHXSimpleList;    if (!m_pPlayerList || !m_pPlayerList->IsPtrListValid())    {        theErr = HXR_OUTOFMEMORY;        goto cleanup;    }#if defined(HELIX_FEATURE_PREFERENCES)    if (m_pPreferences)    {        ReadPrefINT32(m_pPreferences, "MinimumInitalPushdown", m_ulMinimumPushdown);        ReadPrefINT32(m_pPreferences, "IdealMinimumInitalPushdown", m_ulIdealMinimumPushdown);        if (m_ulIdealMinimumPushdown > m_ulMinimumPushdown)        {            m_ulMinimumPushdown = m_ulIdealMinimumPushdown;        }    }#endif /* HELIX_FEATURE_PREFERENCES */    // Create a device volume interface.    if ( !theErr )    {#if defined(HELIX_FEATURE_VOLUME)#if defined(HELIX_FEATURE_PREFERENCES)        if (m_pPreferences)        {            BOOL bOpenAudioDeviceOnPlayback = TRUE;            ReadPrefBOOL(m_pPreferences, "OpenAudioDeviceOnPlayback", bOpenAudioDeviceOnPlayback);            if (!bOpenAudioDeviceOnPlayback)            {                // rgammon 12/17/03                // Create audio device on init if OpenAudioDeviceOnPlayback is                // false. This means that we will be able to query the volume                // successfully on startup. It also means that if there are                // errors opening the audio device, they will show up at                // startup. Some players (the windows player, for example),                // save the system volume at shutdown and use that volume for                // the ui on startup.                CreateAudioDevice();                m_uVolume = GetVolume();            }        }        if (m_pPreferences)        {            if (ReadPrefINT16(m_pPreferences, "Volume", m_uVolume) != HXR_OK)            {                BOOL bUseDS = FALSE;                ReadPrefBOOL(m_pPreferences, "UseDirectSound", bUseDS);                if(bUseDS)                {                    m_uVolume = HX_MAX_VOLUME;                }            }#if defined(HELIX_FEATURE_MUTE_PREFERENCE )            ReadPrefBOOL(m_pPreferences, "Mute", m_bMute);#endif /* HELIX_FEATURE_MUTE_PREFERENCE */        }#endif /* HELIX_FEATURE_PREFERENCES */        m_pDeviceVolume = (IHXVolume*)new CHXVolume;        if( m_pDeviceVolume )        {            m_pDeviceVolume->AddRef();            m_pDeviceVolume->SetVolume(m_uVolume);#if defined(HELIX_FEATURE_MUTE_PREFERENCE )            m_pDeviceVolume->SetMute(m_bMute);#endif /* HELIX_FEATURE_MUTE_PREFERENCE */            m_pDeviceVolume->AddAdviseSink((IHXVolumeAdviseSink*)this);        }        else            theErr = HXR_OUTOFMEMORY;#endif /* HELIX_FEATURE_VOLUME */    }cleanup:    return theErr;}/************************************************************************ *  Method: *              CHXAudioSession::CreateAudioPlayer *      Purpose: *       The RMA session object calls this to create an audio player. Each *       audio player represents a unique time-line. */HX_RESULT CHXAudioSession::CreateAudioPlayer(    CHXAudioPlayer**  ppAudioPlayer){    m_pMutex->Lock();    HX_RESULT theErr = HXR_OK;    // Create a new audio player.    *ppAudioPlayer= 0;    *ppAudioPlayer = new CHXAudioPlayer( this );    if ( !(*ppAudioPlayer) )        theErr = HXR_OUTOFMEMORY;    // Add new player to player list.    if (!theErr)    {        theErr = _CreateAudioPlayer(ppAudioPlayer);    }    m_pMutex->Unlock();    return theErr;}HX_RESULTCHXAudioSession::_CreateAudioPlayer(CHXAudioPlayer** ppAudioPlayer){    HX_RESULT   theErr = HXR_OK;    // Add new player to player list.    // Setup internal lists, etc.    theErr = (*ppAudioPlayer)->InitializeStructures();    if (!theErr)    {        // This one to keep it around.        (*ppAudioPlayer)->AddRef();        // This one to return back to the caller of CreateAudioPlayer.        (*ppAudioPlayer)->AddRef();    }    // Add new player to player list.    if ( !theErr && m_pPlayerList )    {        m_pPlayerList->AddTail((void*) *ppAudioPlayer);    }    if (theErr && *ppAudioPlayer)    {        /* Destructor is private. so this is the only way of destructing it */        (*ppAudioPlayer)->AddRef();        (*ppAudioPlayer)->Release();        *ppAudioPlayer = 0;    }    return theErr;}/************************************************************************ *  Method: *              CHXAudioSession::CreateAudioPlayer *      Purpose: *       The RMA session object calls this to create an audio player. Each *       audio player represents a unique time-line. */HX_RESULT CHXAudioSession::CloseAudioPlayer(    CHXAudioPlayer*  pAudioPlayer){    m_pMutex->Lock();    if ( m_pPlayerList )    {        LISTPOSITION lPosition = NULL;        lPosition = m_pPlayerList->Find(pAudioPlayer);        if (lPosition)        {            m_pPlayerList->RemoveAt(lPosition);            pAudioPlayer->Close();            _NotifyTimelineWatchers( TLW_CLOSE );            pAudioPlayer->Release();        }    }    m_pMutex->Unlock();    return HXR_OK;}/* *********************************************************************** *  Method: *              CHXAudioSession::Setup *      Purpose: *              Create the audio buffer.. */HX_RESULT CHXAudioSession::Setup(BOOL bHasStreams){    HX_RESULT theErr = HXR_OK;    // A new audio player may start while an existing player is    // already playing.    if ( m_bInited )        return HXR_OK;    /* Only do all of this if there are audio streams... */    m_bHasStreams = bHasStreams;    if (m_bHasStreams)    {        // Get the audio device format        // NOTE: The order of these function calls is important.        // Specifically, the GetDeviceFormat() must precede any of        // these calls because GetDeviceFormat() determines the        // final device audio format.        if (!theErr)            theErr = GetDeviceFormat();        // Create the playback buffers        /* We still need to create playback buffers since we will use the

⌨️ 快捷键说明

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