亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? hxaudstr.cpp

?? symbian 下的helix player源代碼
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
#ifdef _TESTING
    g_log =  open("c:\\log\\stream.raw", O_WRONLY | O_CREAT
                  | O_BINARY | _O_SEQUENTIAL);
#endif

    m_bAudioFormatKnown = TRUE;

    if (m_bSetupToBeDone)
    {
        m_bSetupToBeDone    = FALSE;
        m_Owner->AudioFormatNowKnown();
    }

    if (!theErr && m_bSetupDone && !m_bInited)
    {
        theErr = ProcessInfo();
    }

    return theErr;
}

/************************************************************************
 *  Method:
 *              IHXAudioStream::Write
 *  Purpose:
 *      Write audio data to Audio Services. 
 *
 *      NOTE: If the renderer loses packets and there is no loss
 *      correction, then the renderer should write the next packet 
 *      using a meaningful start time.  Audio Services will play 
 *      silence where packets are missing.
 */
STDMETHODIMP CHXAudioStream::Write
( 
    HXAudioData*        pInData
)
{
    HX_RESULT theErr = HXR_OK;

    if (!pInData)
    {
        return HXR_INVALID_PARAMETER;
    }

    if (!m_bInited)
    {
        return HXR_NOT_INITIALIZED;
    }

    // Init pre-mix hooks. Call this once to set up hook info. 
    if ( !m_bHooksInitialized )
    {
        InitHooks();
    }

    // Process any "hooks"; Add the data to the data list.
    /* If buffer is NULL, it means that the user just 
     * wants to know what timestamp should be placed in the next 
     * STREAMED/TIMED audio data
     */
    if ( !m_bGotHooks || !pInData->pData)
    {
        theErr = AddData( pInData );
    }
    else
    {
        HXAudioData outData;
        
        outData.pData       = 0;
        outData.ulAudioTime = 0;

        theErr = ProcessHooks( pInData, &outData );
        if (!theErr && !m_bDisableWrite )
        {
            theErr = AddData( &outData );
        }

        if (outData.pData)
        {
            outData.pData->Release();
        }
    }

    return theErr;
}

/************************************************************************
 *  Method:
 *              IHXAudioStream::AddPreMixHook
 *      Purpose:
 *      Use this method to add a pre-mix audio data hook.
 */
STDMETHODIMP CHXAudioStream::AddPreMixHook
( 
          IHXAudioHook*    pHook,
    const BOOL              bDisableWrite
)
{
#if defined(HELIX_FEATURE_AUDIO_PREMIXHOOK)
    void* pTmp = 0;
    
    /* Does one already exists */
    if (m_PreMixHookMap.Lookup((void*)pHook, pTmp))
    {
        return HXR_INVALID_PARAMETER;
    }

    HXAudioHookInfo* pPreMixHookInfo = (HXAudioHookInfo*) new HXAudioHookInfo;
    if(!pPreMixHookInfo)
    {
        return HXR_OUTOFMEMORY;
    }
    pPreMixHookInfo->pHook   	    = pHook;
    pPreMixHookInfo->bDisableWrite  = bDisableWrite;
    pPreMixHookInfo->bIgnoreAudioData = FALSE;

    IHXValues* pValues = NULL;
    if (pHook && pHook->QueryInterface(IID_IHXValues, (void**) &pValues) == HXR_OK)
    {
        UINT32 ulValue = 0;
        pValues->GetPropertyULONG32("IgnoreAudioData", ulValue);
        pPreMixHookInfo->bIgnoreAudioData = (ulValue == 1);
        HX_RELEASE(pValues);
    }

    pHook->AddRef();            // Released in destructor

    m_PreMixHookMap.SetAt(pHook, pPreMixHookInfo);

    m_bGotHooks = TRUE;

    /* If any one of them is Disabled, we do not write */
    if (bDisableWrite)
    {
        m_bDisableWrite = TRUE;
    }

    ProcessAudioHook(ACTION_ADD, pHook);

    /* If we are already initialized, send the audio format */
    if (m_bHooksInitialized)
    {
        if (pPreMixHookInfo->bIgnoreAudioData ||
            HXR_OK == ProcessAudioHook(ACTION_CHECK, pHook))
        {
            pHook->OnInit( &m_AudioFmt );
        }
    }

    return HXR_OK;
#else
    return HXR_NOTIMPL;
#endif /* HELIX_FEATURE_AUDIO_PREMIXHOOK */
}

/************************************************************************
 *  Method:
 *              IHXAudioStream::RemovePreMixHook
 *      Purpose:
 *      Use this method to remove a pre-mix audio data hook.
 */
STDMETHODIMP CHXAudioStream::RemovePreMixHook
( 
      IHXAudioHook*    pHook
)
{
#if defined(HELIX_FEATURE_AUDIO_PREMIXHOOK)
    HXAudioHookInfo* pPreMixHookInfo = 0;
    BOOL bCheckForDisableWrite        = FALSE;

    if (!m_PreMixHookMap.Lookup((void*)pHook, (void*&) pPreMixHookInfo))
    {
        return HXR_INVALID_PARAMETER;
    }

    m_PreMixHookMap.RemoveKey(pHook);

    /* If we are removing a hook which had disable write, 
     * we need to re-determine if any of the remaining hooks
     * has DisableWrite set to TRUE
     */
    if (pPreMixHookInfo->bDisableWrite)
    {
        bCheckForDisableWrite = TRUE;
        m_bDisableWrite       = FALSE;
    }

    ProcessAudioHook(ACTION_REMOVE, pHook);

    pPreMixHookInfo->pHook->Release();
    delete pPreMixHookInfo;

    if (m_PreMixHookMap.GetCount() == 0)
    {
        m_bGotHooks     = FALSE;
        m_bDisableWrite = FALSE;
    }
    else if (bCheckForDisableWrite)
    {
        CHXMapPtrToPtr::Iterator lIter = m_PreMixHookMap.Begin();
        for (; lIter != m_PreMixHookMap.End(); ++lIter)
        {
            HXAudioHookInfo* pPreMixHook = (HXAudioHookInfo*) (*lIter);
            
            /* atleast one has Disable Write ON */
            if (pPreMixHook->bDisableWrite)
            {
                m_bDisableWrite = TRUE;
                break;
            }
        }
    }
#endif /* HELIX_FEATURE_AUDIO_PREMIXHOOK */

    return HXR_OK;
}

/************************************************************************
*  Method:
*       IHXAudioStream::AddDryNotification
*  Purpose:
*       Use this to add a notification response object to get notifications
*       when audio stream is running dry.
*/
STDMETHODIMP CHXAudioStream::AddDryNotification
                        (
                            IHXDryNotification* /*IN*/ pNotification
                        )
{
    if (!pNotification)
    {
        return HXR_INVALID_PARAMETER;
    }

    void* pTmp = 0;
    
    /* Does one already exists */
    if (m_DryNotificationMap.Lookup((void*)pNotification, pTmp))
    {
        return HXR_INVALID_PARAMETER;
    }

    pNotification->AddRef();

    m_DryNotificationMap.SetAt((void*)pNotification, (void*)pNotification);

    return HXR_OK;
}


/************************************************************************
*  Method:
*      IHXAudioStream2::RemoveDryNotification
*  Purpose:
*           Use this to remove itself from the notification response object
*           during the stream switching.
*/
STDMETHODIMP CHXAudioStream::RemoveDryNotification   
                            (
                                IHXDryNotification* /*IN*/ pNotification
                            )
{
    HX_RESULT   hr = HXR_OK;

    void* pTmp = 0;

    if (!pNotification)
    {
        hr = HXR_INVALID_PARAMETER;
        goto cleanup;
    }

    // remove only if it is exists
    if (m_DryNotificationMap.Lookup((void*)pNotification, pTmp))
    {
        m_DryNotificationMap.RemoveKey((void*)pNotification);
        HX_RELEASE(pNotification);
    }
    else
    {
        hr = HXR_INVALID_PARAMETER;
        goto cleanup;
    }

cleanup:

    return hr;
}

/************************************************************************
*  Method:
*      IHXAudioStream2::GetAudioFormat
*  Purpose:
*           Returns the input audio format of the data written by the 
*           renderer. This function will fill in the pre-allocated 
*           HXAudioFormat structure passed in.
*/
STDMETHODIMP
CHXAudioStream::GetAudioFormat(HXAudioFormat*   /*IN/OUT*/pAudioFormat)
{
    HX_ASSERT(pAudioFormat);
    if (!pAudioFormat)
    {
        return HXR_INVALID_PARAMETER;
    }

    if (!m_bInited)
    {
        return HXR_UNEXPECTED;
    }

    pAudioFormat->uChannels         = m_AudioFmt.uChannels;
    pAudioFormat->uBitsPerSample    = m_AudioFmt.uBitsPerSample;
    pAudioFormat->ulSamplesPerSec   = m_AudioFmt.ulSamplesPerSec;
    pAudioFormat->uMaxBlockSize     = m_AudioFmt.uMaxBlockSize;

    return HXR_OK;
}


 
/************************************************************************
 *  Method:
 *              IHXAudioStream::GetAudioVolume
 *      Purpose:
 *              Return this stream's IRMA volume interface.
 */
STDMETHODIMP_(IHXVolume*) CHXAudioStream::GetAudioVolume()
{
    if ( m_pStreamVolume )
    {
        m_pStreamVolume->AddRef();
        return m_pStreamVolume;
    }
    else
    {
        return 0;
    }
}

#if defined(HELIX_FEATURE_VOLUME)

/*
 *      IHXVolumeAdviseSink methods
 */
STDMETHODIMP CHXAudioStream::OnVolumeChange
(
    const UINT16 uVolume
)
{
    m_uVolume = uVolume;
    return HXR_OK;
}

STDMETHODIMP CHXAudioStream::OnMuteChange
(
    const BOOL bMute
)
{
    m_bMute = bMute;
    return HXR_OK;
}
#endif /* HELIX_FEATURE_VOLUME */

/************************************************************************
 *  Method:
 *              IHXAudioStream::AddData
 *      Purpose:
 *              Add audio data to list.
 *      NOTE: Mark Streamed data also as Timed data IF we don't write a streamed packet
 *       since it was LATE!!!
 */
HX_RESULT CHXAudioStream::AddData
(
    HXAudioData* pAudioData
)
{
    HX_RESULT       theErr = HXR_OK;
    BOOL            bInTSRollOver = FALSE;
    HXAudioInfo*    pAinfo = 0;

    /* If buffer is NULL, it means that the user just 
     * wants to know what timestamp should be placed in the next 
     * STREAMED/TIMED audio data
     */
    if (!pAudioData->pData)
    {
        HXAudioInfo* pInfo = NULL;
        
        if (!m_pDataList->IsEmpty() && 
            NULL != (pInfo = (HXAudioInfo*) m_pDataList->GetTail()))
        {
            pAudioData->ulAudioTime = pInfo->ulStartTime + 
                                      CalcMs(pInfo->pBuffer->GetSize());
        }
        else
        {
            pAudioData->ulAudioTime = INT64_TO_UINT32(m_llLastWriteTime - CAST_TO_INT64 m_ulTSRollOver * CAST_TO_INT64 MAX_UINT32);
        }

        return HXR_OK;
    }

    // make sure the renderer does not pass NULL data!!
    HX_ASSERT(pAudioData->pData->GetBuffer() != NULL &&

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品综合网| 99国产欧美另类久久久精品| 国产精品久久久久7777按摩| 欧美人狂配大交3d怪物一区| 成人免费视频caoporn| 亚洲gay无套男同| 中文字幕日韩av资源站| 精品国产电影一区二区| 在线看日韩精品电影| 国产成人精品一区二区三区网站观看 | 在线观看免费视频综合| 蜜臀a∨国产成人精品| 玉米视频成人免费看| 日本一区二区三区在线不卡 | 精品剧情在线观看| 欧美日韩小视频| 色狠狠av一区二区三区| 懂色av一区二区夜夜嗨| 久久综合综合久久综合| 亚洲一区二区三区精品在线| 最新成人av在线| 欧美国产欧美综合| 久久久精品免费免费| 日韩一区二区三区免费看| 欧美日韩小视频| 欧美综合视频在线观看| 波多野结衣在线aⅴ中文字幕不卡| 国产酒店精品激情| 精品无码三级在线观看视频| 美女精品一区二区| 免费成人在线观看| 免费久久99精品国产| 日产国产高清一区二区三区| 婷婷激情综合网| 丝袜a∨在线一区二区三区不卡 | 国产69精品久久久久毛片| 国产自产v一区二区三区c| 九九**精品视频免费播放| 日本欧美加勒比视频| 免费成人在线影院| 久久国产精品一区二区| 国产真实精品久久二三区| 久久国产综合精品| 国模一区二区三区白浆| 国产xxx精品视频大全| 国产91精品露脸国语对白| 大白屁股一区二区视频| 91香蕉国产在线观看软件| 欧美韩日一区二区三区四区| 欧美激情一区二区三区四区| 国产精品电影院| 亚洲精品国产无天堂网2021| 亚洲国产另类av| 丝袜国产日韩另类美女| 久久不见久久见免费视频7| 国产剧情在线观看一区二区| 成人精品gif动图一区| 91污片在线观看| 欧美精品自拍偷拍动漫精品| 日韩欧美国产麻豆| 欧美国产精品劲爆| 亚洲精选视频免费看| 三级亚洲高清视频| 狠狠色综合色综合网络| 成人av网站在线| 一本色道综合亚洲| 日韩一区和二区| 国产三级三级三级精品8ⅰ区| 亚洲欧洲成人av每日更新| 亚洲一区二区免费视频| 美女视频网站黄色亚洲| 不卡高清视频专区| 精品视频在线免费观看| 亚洲精品在线一区二区| 最新久久zyz资源站| 五月婷婷综合在线| 国产精品18久久久久久久久| 色综合久久久久| 日韩欧美精品在线| 最新不卡av在线| 美美哒免费高清在线观看视频一区二区| 国产乱人伦偷精品视频不卡| 欧美中文字幕一区二区三区 | 玉足女爽爽91| 精品一区二区精品| 在线影院国内精品| 精品国产乱码久久久久久夜甘婷婷| 中文字幕制服丝袜成人av| 日本美女一区二区三区视频| 成人免费毛片高清视频| 欧美一级片在线观看| 亚洲私人影院在线观看| 麻豆国产欧美日韩综合精品二区 | 亚洲va国产天堂va久久en| 国产乱妇无码大片在线观看| 欧美三级日本三级少妇99| 国产清纯白嫩初高生在线观看91| 91性感美女视频| 欧美xxxxxxxx| 午夜精品影院在线观看| 91视频免费观看| 久久久精品人体av艺术| 日韩电影在线看| 色狠狠色噜噜噜综合网| 国产精品人成在线观看免费| 蜜臀av性久久久久av蜜臀妖精| 在线观看免费亚洲| 国产精品国产三级国产aⅴ原创 | 狠狠v欧美v日韩v亚洲ⅴ| 欧美午夜视频网站| 国产精品无圣光一区二区| 精品一区二区在线看| 欧美日韩亚洲高清一区二区| 亚洲视频香蕉人妖| 国产成a人亚洲精品| 日韩欧美成人一区| 亚洲国产精品影院| 91国偷自产一区二区使用方法| 国产欧美视频一区二区| 久久不见久久见免费视频7| 欧美精品久久一区二区三区| 亚洲一区免费视频| 色哟哟一区二区三区| 综合久久综合久久| a级精品国产片在线观看| 国产三级欧美三级日产三级99| 久久精品国内一区二区三区| 日韩欧美一级二级三级久久久| 五月综合激情婷婷六月色窝| 欧美午夜视频网站| 亚洲国产日韩精品| 欧美午夜免费电影| 亚洲小说春色综合另类电影| 欧美中文字幕亚洲一区二区va在线| 亚洲天堂中文字幕| 91免费视频网址| 亚洲欧美另类久久久精品2019| 99久久99久久精品国产片果冻| 国产精品毛片高清在线完整版| 风间由美一区二区三区在线观看| 蜜乳av一区二区三区| 日韩一区二区电影在线| 六月婷婷色综合| 久久夜色精品国产噜噜av| 国产一区二区精品久久99| 国产校园另类小说区| 成人免费视频视频| 中文字幕一区三区| 在线观看视频91| 婷婷综合另类小说色区| 欧美大度的电影原声| 久88久久88久久久| 国产视频一区二区在线| eeuss国产一区二区三区| 亚洲乱码国产乱码精品精小说| 欧美天天综合网| 日本免费新一区视频| 亚洲精品在线三区| 成人爱爱电影网址| 亚洲自拍与偷拍| 日韩午夜精品视频| 国产成人亚洲综合色影视| 亚洲欧美自拍偷拍色图| 欧美午夜精品一区二区三区| 天天做天天摸天天爽国产一区| 日韩一级完整毛片| 粉嫩av一区二区三区粉嫩| 亚洲日本在线视频观看| 91精品福利在线一区二区三区 | 在线免费不卡视频| 天堂蜜桃一区二区三区 | 午夜精品福利久久久| 欧美精品一区二区三区久久久| www.亚洲国产| 日日骚欧美日韩| 欧美激情在线看| 欧美一区二区三区视频在线| 成人一区二区三区视频在线观看| 亚洲一区二区不卡免费| 久久色在线视频| 色哟哟精品一区| 精品一区二区国语对白| 亚洲精品五月天| 2020国产精品自拍| **性色生活片久久毛片| 91精品久久久久久久91蜜桃| 成人黄页毛片网站| 蜜臀av性久久久久蜜臀aⅴ| 最新欧美精品一区二区三区| 欧美电影免费观看高清完整版在 | 日韩国产一二三区| 国产精品免费人成网站| 欧美一区二区三区日韩| 99re热这里只有精品视频| 美女视频一区二区三区| 一区二区在线看| 中文在线资源观看网站视频免费不卡 | 午夜精品福利久久久| 国产精品久久99| 欧美精品一区二区精品网|