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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hxaudstr.cpp

?? symbian 下的helix player源代碼
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
 *      Return the stream's audio format.
 */
HX_RESULT CHXAudioStream::GetFormat
( 
    HXAudioFormat*      pAudioFormat
)
{
    if (!m_bAudioFormatKnown)
    {
        return HXR_NOT_INITIALIZED;
    }

    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::Setup
 *      Purpose:
 *              This is called by the player's Setup method. At this
 *              time the audio device format is set and we can now
 *              set up the streams pre-mixing buffer. This buffer
 *              contains data that has been resampled to match the
 *              audio device format.
 */
HX_RESULT CHXAudioStream::Setup(
        HXAudioFormat*  pFormat
,       ULONG32         ulGranularity
)
{
    HX_RESULT theErr = HXR_OK;

    m_DeviceFmt.uChannels       = pFormat->uChannels;
    m_DeviceFmt.uBitsPerSample  = pFormat->uBitsPerSample;
    m_DeviceFmt.ulSamplesPerSec = pFormat->ulSamplesPerSec;
    m_DeviceFmt.uMaxBlockSize   = pFormat->uMaxBlockSize;

    m_ulGranularity = ulGranularity;

    m_bSetupDone = TRUE;
    
    /* we have all the info now.. so setup the resampler */
    if (m_bAudioFormatKnown && !m_bInited)
    {
        theErr = ProcessInfo();
    }

    return theErr;
}

/************************************************************************
 *  Method:
 *              IHXAudioStream::ResetStream
 *      Purpose:
 */
void CHXAudioStream::ResetStream()
{
    m_bInited           = FALSE;
    m_bCanBeRewound     = FALSE;
    m_bSetupDone        = FALSE;
    m_bAudioFormatKnown = FALSE;
    m_bIsResumed        = FALSE;
    
    UnRegister();

    while (m_pAvailableBuffers && m_pAvailableBuffers->GetCount() > 0)
    {
        IHXBuffer* pBuffer = (IHXBuffer*) m_pAvailableBuffers->RemoveHead();
        HX_RELEASE(pBuffer);
    }

    HX_DELETE(m_pAvailableBuffers);

    // Delete all entries in the audio data list
    FlushBuffers();
    HX_DELETE(m_pDataList);
    HX_DELETE(m_pInstantaneousList);

    CleanupRAByToTs();
    HX_DELETE(m_pRAByToTsInList);
    HX_DELETE(m_pRAByToTsAdjustedList);
    
    // Delete resample buffer
    HX_VECTOR_DELETE(m_pResampleBuf);
    // Delete tmp resample buffer
    HX_VECTOR_DELETE(m_pTmpResBuf);

    HX_VECTOR_DELETE(m_pCrossFadeBuffer);
    HX_VECTOR_DELETE(m_pExcessInterpBuffer);
    HX_VECTOR_DELETE(m_pTempInterpBuffer);
    m_ulExcessInterpBufferSize = m_ulPreviousExcessInterpBufferSize = 0;
    
#if defined(HELIX_FEATURE_CROSSFADE)
    HX_DELETE(m_pCrossFader);
#endif /* HELIX_FEATURE_CROSSFADE */

    // Free the resampler
    HX_RELEASE(m_pResampler);

    m_bGotHooks = FALSE;

    m_llLastWriteTime = 0;
    m_ulTSRollOver = 0;

#ifdef _TESTING
    if ( g_log > 0 )
        close(g_log);
    g_log = -1;
#endif

    HX_RELEASE(m_pValues);

#if defined(HELIX_FEATURE_AUDIO_PREMIXHOOK)
    // Delete all entries in the pre-mix hook list.
    if ( m_PreMixHookMap.GetCount() > 0)
    {
        HXAudioHookInfo* h = 0;
        CHXMapPtrToPtr::Iterator lIter = m_PreMixHookMap.Begin();
        for (; lIter != m_PreMixHookMap.End(); ++lIter)
        {
            h = (HXAudioHookInfo*) (*lIter);
            ProcessAudioHook(ACTION_REMOVE, h->pHook);
            h->pHook->Release();
            delete h;
        }
        
        m_PreMixHookMap.RemoveAll();
    }
#endif /* HELIX_FEATURE_AUDIO_PREMIXHOOK */

#if defined(HELIX_FEATURE_VOLUME)
    // Delete IRMA volume object.
    if (m_pStreamVolume && m_pVolumeAdviseSink)
    {
        m_pStreamVolume->RemoveAdviseSink(m_pVolumeAdviseSink);
        m_pVolumeAdviseSink->m_pCHXAudioStream = 0;
    }
    HX_RELEASE(m_pVolumeAdviseSink);
#endif /* HELIX_FEATURE_VOLUME */

    HX_RELEASE(m_pStreamVolume);

    HX_DELETE(m_pInDataPtr);
    HX_DELETE(m_pOutDataPtr);

    if (m_DryNotificationMap.GetCount() > 0)
    {
        IHXDryNotification* pDryNotification = 0;
        CHXMapPtrToPtr::Iterator lIter = m_DryNotificationMap.Begin();
        for (; lIter != m_DryNotificationMap.End(); ++lIter)
        {
            pDryNotification = (IHXDryNotification*) (*lIter);
            pDryNotification->Release();
        }
        
        m_DryNotificationMap.RemoveAll();
    }

    HX_RELEASE(m_pCrossFadeStream);
    HX_RELEASE(m_pCommonClassFactory);
#if defined(HELIX_FEATURE_PREFERENCES)
    HX_RELEASE(m_pPreferences);
#endif /* HELIX_FEATURE_PREFERENCES */
    HX_RELEASE(m_Owner);

    return;
}

HX_RESULT
CHXAudioStream::ProcessAudioHook(PROCESS_ACTION action, 
                                 IHXAudioHook* pAudioHook)
{
    return HXR_OK;
}

// Dummy version of this method - real version would be in hxaudstr_new.cpp
BOOL CHXAudioStream::ConvertIntoBuffer(tAudioSample* buffer, UINT32 nSamples, INT64 llStartTimeInSamples)
{
    return FALSE;
}

/************************************************************************
 *  Method:
 *              IHXAudioStream::InitHooks
 *      Purpose:
 *      Init any pre-mix hooks. Return TRUE if hooks exist else return
 *      FALSE.
 */
void CHXAudioStream::InitHooks()
{
#if defined(HELIX_FEATURE_AUDIO_PREMIXHOOK)
    /* Iterate thru the hook list and call the hook's OnInit().
     * If any of the hooks have disabled write set to TRUE, then
     * we will let this override any set to FALSE.
     */
    if ( m_PreMixHookMap.GetCount() > 0 )
    {
        HXAudioHookInfo* h = 0;
        CHXMapPtrToPtr::Iterator lIter = m_PreMixHookMap.Begin();
        for (; lIter != m_PreMixHookMap.End(); ++lIter)
        {
            h = (HXAudioHookInfo*) (*lIter);
            if (h->bIgnoreAudioData ||
                HXR_OK == ProcessAudioHook(ACTION_CHECK, h->pHook))
            {
                h->pHook->OnInit( &m_AudioFmt );
            }
        }
    }
#endif /* HELIX_FEATURE_AUDIO_PREMIXHOOK */

    m_bHooksInitialized = TRUE;
}

/************************************************************************
 *  Method:
 *              IHXAudioStream::ProcessHooks
 *      Purpose:
 */
HX_RESULT CHXAudioStream::ProcessHooks
( 
    HXAudioData*        pInData,
    HXAudioData*        pOutData
)
{
    HX_RESULT theErr = HXR_OK;

#if defined(HELIX_FEATURE_AUDIO_PREMIXHOOK)
    m_pInDataPtr->pData         = pInData->pData;
    m_pInDataPtr->pData->AddRef();
    m_pInDataPtr->ulAudioTime   = pInData->ulAudioTime;
    
    m_pOutDataPtr->pData        = NULL;
    m_pOutDataPtr->ulAudioTime  = pInData->ulAudioTime;

    m_pInDataPtr->uAudioStreamType    = pInData->uAudioStreamType;
    m_pOutDataPtr->uAudioStreamType   = pInData->uAudioStreamType;

    if ( m_PreMixHookMap.GetCount() > 0 )
    {
        HXAudioHookInfo* pPreMixHookInfo = 0;
        CHXMapPtrToPtr::Iterator lIter = m_PreMixHookMap.Begin();
        for (; !theErr && lIter != m_PreMixHookMap.End(); ++lIter)
        {
            pPreMixHookInfo = (HXAudioHookInfo*) (*lIter);

            if (HXR_OK == ProcessAudioHook(ACTION_CHECK, pPreMixHookInfo->pHook))
            {
                theErr = pPreMixHookInfo->pHook->OnBuffer( m_pInDataPtr, m_pOutDataPtr);

                /* Check to see if renderer changed the buffer. If so, then
                 * make this output as input to the next Hook.
                 */
                if (!theErr && m_pOutDataPtr->pData)
                {
                    m_pInDataPtr->pData->Release();
                    m_pInDataPtr->pData     = m_pOutDataPtr->pData;
                    m_pInDataPtr->ulAudioTime   = m_pOutDataPtr->ulAudioTime;

                    m_pOutDataPtr->pData        = 0;
                }
            }
            else if (pPreMixHookInfo->bIgnoreAudioData)
            {
                IHXBuffer* pTempBuf = m_pInDataPtr->pData;
                m_pInDataPtr->pData = NULL;
                theErr = pPreMixHookInfo->pHook->OnBuffer( m_pInDataPtr, m_pOutDataPtr);
                m_pInDataPtr->pData = pTempBuf;
            }
        }
    }

    /* Final output is always in InDataPtr*/
    pOutData->pData             = m_pInDataPtr->pData;
    pOutData->ulAudioTime       = m_pInDataPtr->ulAudioTime;

    pOutData->uAudioStreamType  = m_pInDataPtr->uAudioStreamType;
#endif /* HELIX_FEATURE_AUDIO_PREMIXHOOK */

    return theErr;
}

/************************************************************************
 *  Method:
 *      CHXAudioStream::MixIntoBuffer
 *  Purpose:
 *      Mix stream data into this pPlayerBuf.
 *  Note:
 *      
 *      Resampler always works on 16 bit PCM. If the input is
 *      8 bit, it converts it first to 16 bit before making
 *      any resampling calculations. 
 *      We always try to open audio device in 16 bit stereo mode.
 *      This is because a new player/stream may be instantiated in the
 *      midst of a presentation and this new stream may be stereo. If we 
 *      earlier opened the device as mono, we will have to force this stereo
 *      stream to be played as mono! Not a good idea. Also any mono-streo
 *      conversion almost comes for free (some extra memory usage and 
 *      an extra assignment) since it can be done in the mixing loop in
 *      MixBuffer().
 *
 *      Any 8-16 and stereo-mono conversion, if required, SHOULD be done
 *      before resampling.
 *      Any mono-stereo conversion should be done after resampling.
 *
 *      Stereo-Mono conversion code resides in the resampler. 
 *      Mono-Stereo conversion code resides in the mixer. 
 *
 */
HX_RESULT CHXAudioStream::MixIntoBuffer
(
    UCHAR*   pPlayerBuf,
    ULONG32  ulBufSize,
    ULONG32& ulBufTime,
    BOOL&    bIsMixBufferDirty,
    BOOL     bGetCrossFadeData
)
{
    BOOL    bCrossFadeThisTime  = FALSE;
    UINT32  ulTimeActuallyFaded = m_ulGranularity;
    if (!m_bInited)
    {
        return HXR_NOT_INITIALIZED;
    }

//{FILE* f1 = ::fopen("c:\\temp\\rasync.txt", "a+"); ::fprintf(f1, "Call MixIntoBuffer: %lu\n", m_ulLastWriteTime);::fclose(f1);}
    /* If this is a *FROM* stream, we may have already mixed
     * data during cross-fade with *TO* stream
     */
    if (m_bFadeAlreadyDone && !m_bFadeToThisStream)
    {
        m_bFadeAlreadyDone = FALSE;
        return HXR_OK;
    }

    HX_ASSERT(!bGetCrossFadeData || !m_bFadeToThisStream);

    /* If we need to mix cross fade data from the *from* stream,
     * it better be available 
     */
    HX_ASSERT(!bGetCrossFadeData || m_pDataList->GetCount() > 0);

    /* If this stream needs to be cross-faded and is a
     * NOT a fade-to stream, it would have been already taken
     * care of by the fade-to stream in an earlier call to 
     * MixIntoBuffer()
     */
    if (m_bCrossFadingToBeDone && m_pDataList->GetCount() > 0)
    {
        HXAudioInfo* pInfo = (HXAudioInfo*) m_pDataList->GetHead();
        INT64 llActualStartTime  = 0;
        if (pInfo)
        {
            llActualStartTime   = CAST_TO_INT64 (pInfo->ulStartTime) + 
                                  CAST_TO_INT64 (CalcMs(pInfo->pBuffer->GetSize() - pInfo->ulBytesLeft)) +
                                  CAST_TO_INT64 m_ulTSRollOver * CAST_TO_INT64 MAX_UINT32;
            if (m_bFadeToThisStream)
            {
                /* Cool! It is time for cross-fading */
                if ((m_llLastWriteTime <= m_llCrossFadeStartTime                            &&
                     m_llCrossFadeStartTime - m_llLastWriteTime <= CAST_TO_INT64 m_ulGranularity)  ||
                    (m_llLastWriteTime > m_llCrossFadeStartTime                             &&
                     m_llLastWriteTime - m_llCrossFadeStartTime <= CAST_TO_INT64 m_ulFudge))
                {
                    bCrossFadeThisTime = TRUE;
                    if (m_llLastWriteTime <= m_llCrossFadeStartTime)
                    {
                        ulTimeActuallyFaded = m_ulGranularity - 
                                              INT64_TO_UINT32(m_llCrossFadeStartTime - m_llLastWriteTime);
                    }

//{FILE* f1 = ::fopen("c:\\raroot\\racross.txt", "a+"); ::fprintf(f1, "m_ulLastWriteTime: %lu ulStartTime: %lu m_ulCrossFadeStartTime: %lu pInfo->ulStartTime: %lu pInfo->pBuffer->GetSize(): %lu pInfo->ulBytesLeft: %lu\n", m_ulLastWriteTime, ulStartTime, m_ulCrossFadeStartTime, pInfo->ulStartTime, pInfo->pBuffer->GetSize(), pInfo->ulBytesLeft);::fclose(f1);}
                    HX_ASSERT(
                        (llActualStartTime >= m_llCrossFadeStartTime &&
                        (llActualStartTime <= m_llCrossFadeStartTime + 
                                              m_ulCrossFadeDuration)) ||
                        (llActualStartTime < m_llCrossFadeStartTime && 
                        (m_llCrossFadeStartTime - llActualStartTime <= CAST_TO_INT64 m_ulFudge)));
                }
            }
        }
    }

    UINT32  ulLastWriteTime = INT64_TO_UINT32(m_llLastWriteTime - CAST_TO_INT64 m_ulTSRollOver * CAST_TO_INT64 MAX_UINT32);

    if (!bGetCrossFadeData && ulBufTime < ulLastWriteTime)
    {
        ulBufTime = ulLastWriteTime;
    }

    /* If there are any DryNotifications and the data list is empty
     * we need to notify them so that they can write more data.
     */

    if (m_DryNotificationMap.GetCount() > 0 || m_Owner->GetAudioStreamCount() == 1)
    {
        UINT32 ulNumMsRequired = m_ulGranularity;
        if (m_pDataList->IsEmpty() || !EnoughDataAvailable(ulLastWriteTime, ulNumMsRequired))
        {
            if (!bIsMixBufferDirty && !bGetCrossFadeData && !m_Owner->m_Owner->ReallyNeedData())

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕制服丝袜一区二区三区 | 91精品国产91久久久久久最新毛片| 偷拍一区二区三区四区| 久久久av毛片精品| 欧美久久一二区| 成人毛片在线观看| 日本最新不卡在线| 亚洲免费观看高清完整版在线| 一本到高清视频免费精品| 国内精品不卡在线| 日韩中文字幕区一区有砖一区 | 国产成人av电影在线观看| 午夜精品福利一区二区蜜股av| 国产精品久久夜| 久久香蕉国产线看观看99| 欧美日韩国产影片| 91久久精品一区二区| 丁香婷婷综合色啪| 久久99热这里只有精品| 日日夜夜精品视频天天综合网| 国产精品久久久久久户外露出| 日韩欧美激情四射| 欧美美女网站色| 91福利在线观看| 91丝袜高跟美女视频| 国产不卡高清在线观看视频| 日韩精品免费专区| 亚洲国产精品天堂| 亚洲综合色视频| 亚洲欧美成人一区二区三区| 国产精品乱人伦一区二区| 久久免费看少妇高潮| 日韩欧美精品在线视频| 欧美一区二区黄| 91精品国产综合久久精品app| 欧美色网一区二区| 欧美色综合天天久久综合精品| 色丁香久综合在线久综合在线观看| 成人app网站| 99视频一区二区| 色综合久久中文综合久久97| 99天天综合性| 在线视频你懂得一区| 欧洲激情一区二区| 欧美中文字幕一区二区三区亚洲| 色香蕉久久蜜桃| 在线免费观看日本欧美| 久久精品人人爽人人爽| 国产亚洲短视频| 国产精品美女久久久久久久久久久| 国产日韩欧美制服另类| 日本一区二区高清| 综合久久国产九一剧情麻豆| 亚洲乱码国产乱码精品精可以看| 亚洲另类在线一区| 亚洲6080在线| 六月丁香婷婷色狠狠久久| 国产乱码一区二区三区| 国产98色在线|日韩| 91丨porny丨国产| 欧美日韩精品一区二区天天拍小说 | 7777精品伊人久久久大香线蕉的| 91精品国产色综合久久久蜜香臀| 精品国产免费久久| 国产精品另类一区| 亚洲一区二区高清| 美女脱光内衣内裤视频久久网站| 国产精品综合一区二区| 99视频一区二区| 欧美电影在哪看比较好| 久久综合九色综合欧美98 | 国产精品的网站| 亚洲午夜一二三区视频| 久久超碰97中文字幕| 波多野结衣的一区二区三区| 欧美色男人天堂| 久久免费国产精品| 亚洲激情第一区| 久久精品99国产精品| a美女胸又www黄视频久久| 欧美久久久久久久久久| 久久久国际精品| 亚洲成人动漫一区| 大白屁股一区二区视频| 欧美日韩国产美女| 中文字幕欧美日本乱码一线二线| 一个色综合av| 久久精品99国产精品日本| 成人黄色软件下载| 日韩一区国产二区欧美三区| 国产精品女同一区二区三区| 香港成人在线视频| 不卡视频一二三四| 欧美mv和日韩mv国产网站| 一区二区三区中文在线观看| 狠狠色狠狠色综合日日91app| 色综合夜色一区| 久久精品一区蜜桃臀影院| 亚洲第一成人在线| 99久久er热在这里只有精品66| 欧美日韩在线播| 国产精品私人自拍| 精品一区二区三区免费播放| 欧美午夜一区二区三区| 国产欧美日韩中文久久| 美女视频网站久久| 国产精品美女久久久久久久久| 亚洲aⅴ怡春院| 91麻豆免费看| 国产欧美日韩精品在线| 免费成人美女在线观看| 色婷婷av一区二区三区大白胸| 久久午夜电影网| 蜜桃av一区二区三区电影| 欧美视频完全免费看| 亚洲欧美日韩在线| 不卡av在线免费观看| 久久午夜羞羞影院免费观看| 免费在线欧美视频| 欧美美女一区二区| 午夜欧美2019年伦理| 91国偷自产一区二区开放时间| 亚洲欧美综合色| 成人黄色大片在线观看| 中文在线一区二区 | 欧美精品丝袜中出| 亚洲综合色噜噜狠狠| 色婷婷久久久综合中文字幕| 国产精品久久久久久久久搜平片| 国产精品亚洲综合一区在线观看| 日韩欧美国产系列| 久久精品免费观看| 日韩欧美国产一区二区三区| 麻豆久久久久久| 欧美mv日韩mv国产网站app| 麻豆一区二区三区| 2024国产精品| 国产高清不卡一区| 中文欧美字幕免费| av激情成人网| 亚洲精品一二三四区| 欧美亚洲国产一区在线观看网站| 亚洲伊人色欲综合网| 欧美日韩小视频| 日产欧产美韩系列久久99| 欧美sm美女调教| 国产宾馆实践打屁股91| 中文字幕一区不卡| 欧美在线观看视频一区二区| 天堂资源在线中文精品| 欧美一区二区三区视频在线观看 | www国产精品av| 国产成人福利片| 亚洲私人影院在线观看| 91高清在线观看| 男人操女人的视频在线观看欧美| 欧美成人综合网站| 国产成人免费在线视频| 国产精品久久福利| 欧美日韩中字一区| 蜜桃视频在线观看一区二区| 久久久噜噜噜久噜久久综合| 国产不卡视频在线播放| 亚洲欧美福利一区二区| 91精品国产入口| 国产精品99久久久久久似苏梦涵| 1区2区3区国产精品| 一区二区三区**美女毛片| 欧美日韩二区三区| 韩国精品久久久| 亚洲色图欧洲色图| 欧美一区二区在线观看| 福利视频网站一区二区三区| 亚洲综合久久av| 精品国产一二三区| 色网综合在线观看| 裸体歌舞表演一区二区| 国产精品嫩草影院av蜜臀| 欧美日韩久久久| 成人丝袜18视频在线观看| 亚洲成av人片一区二区梦乃| 久久久精品黄色| 欧美日韩国产一级| 国产99久久久国产精品潘金网站| 亚洲一区自拍偷拍| 国产人久久人人人人爽| 欧美色区777第一页| 高清视频一区二区| 日韩av一级片| 亚洲免费在线观看| 久久久久9999亚洲精品| 欧美日韩专区在线| 成人国产精品免费| 另类小说综合欧美亚洲| 亚洲精品亚洲人成人网| 国产偷v国产偷v亚洲高清| 欧美精品久久99| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 日韩欧美电影一二三| 欧洲一区在线电影|