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

📄 ogg_page_reader.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    return HXR_OK;}STDMETHODIMP COggPageReader::CloseDone(THIS_ HX_RESULT status){    DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::CloseDone(0x%08x)\n",                                 status));    return HXR_OK;}STDMETHODIMP COggPageReader::ReadDone(THIS_ HX_RESULT status,                                       IHXBuffer* pBuffer){    DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::ReadDone(0x%08x, %u)\n",                                 status, (pBuffer) ? pBuffer->GetSize() : 0));    // Check for HXR_CANCELLED status. This can happen if a Seek() is    // issued while a Read() is pending. This case only seems to happen    // with HTTP    if ((HXR_CANCELLED == status) &&        (rsReadPending == m_state))    {        ChangeState(rsSeekPending);        return HXR_OK;    }        switch(m_state) {    case rsReadPending:     {        if (HXR_OK == status)        {            /* Handle data */            UINT32 ulBytes = pBuffer->GetSize();                        m_ulFileObjectOffset += ulBytes;            // We are at the end of the file if we get a short            // read OR we have a seekable file and the current             // file object offset is >= the file size.            BOOL bEOF =                 ((pBuffer->GetSize() < DefaultReadSize) ||                 (m_bSeekable && (m_ulFileObjectOffset >= m_ulFileSize)));            char* buffer = ogg_sync_buffer(m_pOy, ulBytes);            memcpy(buffer, pBuffer->GetBuffer(), ulBytes);            ogg_sync_wrote(m_pOy, ulBytes);                        status = DoReadNextPage(bEOF);        }        else if (m_bEndOfFile)        {            // Dispatch an end of file error            status = DispatchPage(HXR_AT_END, 0, 0, NULL);        }        else        {            status = DispatchPage(status, 0, 0, NULL);        }    } break;    case rsSeekDuringPending:        status = DoSeek(m_ulPendingSeekOffset);        break;    default:        status = DispatchPage(HXR_UNEXPECTED, 0, 0, NULL);    };    if ((HXR_OK == status) && (rsSeekDuringPending == m_state))    {        status = DoSeek(m_ulPendingSeekOffset);    }    DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::ReadDone() : done\n"));    return HXR_OK;}STDMETHODIMP COggPageReader::WriteDone(THIS_ HX_RESULT status){    DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::WriteDone(0x%08x)\n",                                 status));    return HXR_UNEXPECTED;}STDMETHODIMP COggPageReader::SeekDone(THIS_ HX_RESULT status){    DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::SeekDone(0x%08x)\n", status));    BOOL bDone = FALSE;    BOOL bDispatchedError = FALSE;    while(!bDone)    {        bDone = TRUE;        if (HXR_OK == status)        {            switch(m_state) {            case rsSeekPending:                status = DoRead();                break;            case rsSeekDuringPending:                status = DoSeek(m_ulPendingSeekOffset);                break;            default :                status = HXR_UNEXPECTED;                break;            };        }        if (HXR_OK != status)        {            DispatchPage(status, 0, 0, NULL);            status = HXR_OK;            bDone = FALSE;        }    }    DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::SeekDone() : done\n"));    return HXR_OK;}/* *      IHXFileStat methods */STDMETHODIMP COggPageReader::StatDone(THIS_                                      HX_RESULT status,                                      UINT32 ulSize,                                      UINT32 ulCreationTime,                                      UINT32 ulAccessTime,                                      UINT32 ulModificationTime,                                      UINT32 ulMode){    DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::StatDone(0x%08x, %lu)\n",                                 status, ulSize));    if (HXR_OK == status)    {        m_ulFileSize = ulSize;        HX_RESULT tmpRes = m_pFile->Advise(HX_FILEADVISE_RANDOMACCESS);        if (m_ulFileSize && (HXR_ADVISE_PREFER_LINEAR != tmpRes))        {            m_bSeekable = TRUE;        }        ChangeState(rsReady);    }    else    {        ChangeState(rsStart);    }    if (m_pResponse)    {        m_pResponse->PageReaderInitDone(status);    }    DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::StatDone() : done\n"));    return HXR_OK;}#ifdef _DEBUGstatic const char* z_pStateNames[] = {    "rsStart",    "rsInitPending",    "rsStatPending",    "rsReady",    "rsSeekPending",    "rsSeekDuringPending",    "rsReadPending",    "rsDispatchReadPageDone",    "rsReadDuringDispatch"};#endifvoid COggPageReader::ChangeState(ReaderState newState){    DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::ChangeState() : %s -> %s\n",                                 z_pStateNames[m_state],                                 z_pStateNames[newState]));    m_state = newState;}HX_RESULT COggPageReader::DoReadNextPage(BOOL bEOF){    DPRINTF(D_OGG_PAGE_READER,             ("COggPageReader::DoReadNextPage()\n"));    HX_RESULT res = HXR_FAILED;    BOOL bDone = FALSE;    while(!bDone)    {        BOOL bRecalcDone = TRUE;        if (m_bEndOfFile)        {            res = DispatchPage(HXR_AT_END, 0, 0, NULL);        }        else        {            ogg_page og;            int err = ogg_sync_pageseek(m_pOy, &og);                        if (err < 0)            {                /* resyncing */                DPRINTF(D_OGG_PAGE_READER,                         ("COggPageReader::DoReadNextPage() : resyncing %d skipped\n",                         -err));                m_ulCurrentFileOffset += -err;                DPRINTF(D_OGG_PAGE_READER,                         ("COggPageReader::DoReadNextPage() : m_ulCurrentFileOffset = %u\n", m_ulCurrentFileOffset));                                if (m_bSeekable && (m_ulCurrentFileOffset >= m_ulFileSize))                {                    m_bEndOfFile = TRUE;                }                bRecalcDone = FALSE;            }            else if (err == 0)            {                DPRINTF(D_OGG_PAGE_READER,                         ("COggPageReader::DoReadNextPage() : Need more data\n"));                if (!bEOF)                {                    // Read more data from the file                    res = DoRead();                }                else                {                    m_bEndOfFile = TRUE;                    bRecalcDone = FALSE;                }            }            else            {                DPRINTF(D_OGG_PAGE_READER,                         ("COggPageReader::DoReadNextPage() : synced on %d byte page\n",                         err));                ULONG32 ulOffset = m_ulCurrentFileOffset;                m_ulCurrentFileOffset += err;                DPRINTF(D_OGG_PAGE_READER,                         ("COggPageReader::DoReadNextPage() : 2 m_ulCurrentFileOffset = %u\n", m_ulCurrentFileOffset));                if (m_bSeekable && (m_ulCurrentFileOffset >= m_ulFileSize))                {                    m_bEndOfFile = TRUE;                }                res = DispatchPage(HXR_OK, ulOffset, err, &og);            }        }        if (bRecalcDone)        {            bDone = (rsReadDuringDispatch != m_state);        }    }    DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::DoReadNextPage() : done\n"));    return res;}HX_RESULT COggPageReader::DoSeek(ULONG32 ulFileOffset){    DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::DoSeek(%lu)\n",                                 ulFileOffset));    ChangeState(rsSeekPending);    m_ulCurrentFileOffset = ulFileOffset;    m_ulFileObjectOffset = ulFileOffset;    DPRINTF(D_OGG_PAGE_READER,                         ("COggPageReader::DoSeek() : m_ulCurrentFileOffset = %u\n", m_ulCurrentFileOffset));    m_bEndOfFile = FALSE;    ogg_sync_reset(m_pOy);    return m_pFile->Seek(ulFileOffset, FALSE);}HX_RESULT COggPageReader::DoRead(){    ChangeState(rsReadPending);    return m_pFile->Read(DefaultReadSize);}HX_RESULT COggPageReader::DispatchPage(HX_RESULT status,                                       ULONG32 ulFileOffset,                                        UINT32 ulPageSize,                                        ogg_page* pOg){    DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::DispatchPage(%lu, %u)\n",                                 ulFileOffset, ulPageSize));    ChangeState(rsDispatchReadPageDone);    if (m_pResponse)    {        m_pResponse->ReadNextPageDone(status, ulFileOffset, ulPageSize, pOg);    }    if (rsDispatchReadPageDone == m_state)    {        ChangeState(rsReady);    }    return HXR_OK;}

⌨️ 快捷键说明

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