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

📄 pe_consumer_cdda.cpp

📁 这是DVD中伺服部分的核心代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    }

    return (PE_SUCCESS);

} /* end cPEConsumer::SetRate() */


BOOLEAN cPEConsumer_CDDA::checkForDtsSyncWord(cPayload *pPayload)
{
    USHORT *payload_buffer = 0;
    size_t payload_words_left = 0;
    ULONG words_scanned = 0;

    if (NULL != pPayload)
    {
        payload_buffer    = (USHORT *)pPayload->get_rd_ptr();
        payload_words_left = pPayload->get_size()/2;
    }

    while ((payload_words_left > 0) && (m_n14bitDtsSyncWords < 2) && (m_n16bitDtsSyncWords < 2))
    {
        switch (m_DtsSyncDetectState) {
            case DTS_SYNC_DETECT_STATE_INIT:
                if (payload_buffer[words_scanned] == 0x1fff)
                {
                    m_DtsSyncDetectState = DTS_SYNC_DETECT_STATE_14BIT_SYNCWORD1;
                }
                else if (payload_buffer[words_scanned] == 0x7ffe)
                {
                    m_DtsSyncDetectState = DTS_SYNC_DETECT_STATE_16BIT_SYNCWORD1;
                }
                else
                {
                    m_DtsSyncDetectState = DTS_SYNC_DETECT_STATE_INIT;
                }

                break;

            case DTS_SYNC_DETECT_STATE_16BIT_SYNCWORD1:
                if (payload_buffer[words_scanned] == 0x8001)
                {
                    m_DtsSyncDetectState = DTS_SYNC_DETECT_STATE_16BIT_SYNCWORD2;
                }
                else if (payload_buffer[words_scanned] == 0x1fff)
                {
                    m_DtsSyncDetectState = DTS_SYNC_DETECT_STATE_14BIT_SYNCWORD1;
                }
                else if (payload_buffer[words_scanned] == 0x7ffe)
                {
                    m_DtsSyncDetectState = DTS_SYNC_DETECT_STATE_16BIT_SYNCWORD1;
                }
                else
                {
                    m_DtsSyncDetectState = DTS_SYNC_DETECT_STATE_INIT;
                }
                break;

            case DTS_SYNC_DETECT_STATE_14BIT_SYNCWORD1:
                if (payload_buffer[words_scanned] == 0xe800)
                {
                    m_DtsSyncDetectState = DTS_SYNC_DETECT_STATE_14BIT_SYNCWORD2;
                }
                else if (payload_buffer[words_scanned] == 0x7ffe)
                {
                    m_DtsSyncDetectState = DTS_SYNC_DETECT_STATE_16BIT_SYNCWORD1;
                }
                else if (payload_buffer[words_scanned] == 0x1fff)
                {
                    m_DtsSyncDetectState = DTS_SYNC_DETECT_STATE_14BIT_SYNCWORD1;
                }
                else
                {
                    m_DtsSyncDetectState = DTS_SYNC_DETECT_STATE_INIT;
                }
                break;

            case DTS_SYNC_DETECT_STATE_16BIT_SYNCWORD2:
                if ((payload_buffer[words_scanned]  & 0xfc00) == 0xfc00)
                {
                    m_n16bitDtsSyncWords++;                
                    m_DtsSyncDetectState = DTS_SYNC_DETECT_STATE_INIT;
                }
                else if (payload_buffer[words_scanned] == 0x1fff)
                {
                    m_DtsSyncDetectState = DTS_SYNC_DETECT_STATE_14BIT_SYNCWORD1;
                }
                else if (payload_buffer[words_scanned] == 0x7ffe)
                {
                    m_DtsSyncDetectState = DTS_SYNC_DETECT_STATE_16BIT_SYNCWORD1;
                }
                else
                {
                    m_DtsSyncDetectState = DTS_SYNC_DETECT_STATE_INIT;
                }
                break;

            case DTS_SYNC_DETECT_STATE_14BIT_SYNCWORD2:
                if ((payload_buffer[words_scanned] & 0xfff0) == 0x07f0)
                {
                    m_n14bitDtsSyncWords++;
                    m_DtsSyncDetectState = DTS_SYNC_DETECT_STATE_INIT;
                }
                else if (payload_buffer[words_scanned] == 0x1fff)
                {
                    m_DtsSyncDetectState = DTS_SYNC_DETECT_STATE_14BIT_SYNCWORD1;
                }
                else if (payload_buffer[words_scanned] == 0x7ffe)
                {
                    m_DtsSyncDetectState = DTS_SYNC_DETECT_STATE_16BIT_SYNCWORD1;
                }
                else
                {
                    m_DtsSyncDetectState = DTS_SYNC_DETECT_STATE_INIT;
                }
                break;
        }

        words_scanned++;
        payload_words_left--;
    }

    return ((m_n16bitDtsSyncWords > 1) || (m_n14bitDtsSyncWords > 1));
}


/**
 * If active start consuming and presenting AV data.
 *
 * @return PE_STATUS
 */
PE_STATUS cPEConsumer_CDDA::processData(PEINPUTMESSAGE *pInMessage)
{
    VDVD_ERROR   error = VDVD_SUCCESS;

    if (pInMessage != NULL)
    {
        ULONG currentPlayTime;

        while ((m_playrate.rate == PLAY_RATE_PAUSE) && (m_fStop == FALSE) && (m_fAbort == FALSE))
        {
            OS_TaskDelayMsec(100);
        }

        TCH_PAYLOAD(pInMessage->payload);

        currentPlayTime = pInMessage->payload->get_user_data();
        SendEvent(PE_EVENT_POSITION, &currentPlayTime);

        if (pInMessage->BegOfStream == TRUE)
        {
            /* most DTS-CD tracks have DTS sync code within first 16k but at least one required search to be extended to 96k */
            m_nDtsBytesToSearch = 96*1024;
            m_n14bitDtsSyncWords = 0;
            m_n16bitDtsSyncWords = 0;
            m_DtsSyncDetectState = DTS_SYNC_DETECT_STATE_INIT;
        }

        if (m_nDtsBytesToSearch > 0)
        {
            BOOLEAN isDtsCd = false;

            isDtsCd = checkForDtsSyncWord(pInMessage->payload);
            if (isDtsCd) 
            {
                if (!m_pcm_settings.spdif_output_only)
                {
                    if (m_audioDecode[0] != NULL)
                    {
                        error = m_audioDecode[0]->Stop(FALSE);

                        DECODER_SETTINGS_TYPE settings;
                        settings.streamType = DECODER_STREAM_TYPE_PCM;
                        m_pcm_settings.spdif_output_only = true;
                        settings.pcm = m_pcm_settings;

                        error = m_audioDecode[0]->Setup(&settings);
                        DBGPRINT(DBG_ON(DBG_VERBOSE), ("cPEConsumer_CDDA::ProcessData -- DTS-CD detected, switching to spdif only mode\n"));
                    }
                }
                m_nDtsBytesToSearch = 0;
                m_n14bitDtsSyncWords = 0;
                m_n16bitDtsSyncWords = 0;
            }
            else if (((!isDtsCd) && (m_nDtsBytesToSearch <= 0)) && (m_pcm_settings.spdif_output_only))
            {
                /* restore normal CD-DA settings if track is not DTS */

                if (m_audioDecode[0] != NULL)
                {
                     DECODER_SETTINGS_TYPE settings;






                    error = m_audioDecode[0]->Stop(FALSE);

                    settings.streamType = DECODER_STREAM_TYPE_PCM;
                    m_pcm_settings.spdif_output_only = false;
                    settings.pcm = m_pcm_settings;
                    error = m_audioDecode[0]->Setup(&settings);

                    DBGPRINT(DBG_ON(DBG_VERBOSE), ("cPEConsumer_CDDA::ProcessData -- non DTS-CD detected, restoring normal pcm mode\n"));
                }



            }
            else if (!isDtsCd)
            {
                m_nDtsBytesToSearch -= pInMessage->payload->get_size();
            }
        }

        SendPayloadToDecoder(m_audioDecode[0], pInMessage->payload);
    }

    return (PE_SUCCESS);
}

/**
 * Process an info payload
 *
 * @return PE_STATUS
 */
PE_STATUS cPEConsumer_CDDA::processInfo(PEINPUTMESSAGE *pInMessage)
{
    INFOPAYLOAD *infoPayload;
    BYTE bControl;
    BYTE bCopy;
    BYTE bEmphasis;

    /* get payload info */
    infoPayload = (INFOPAYLOAD*)pInMessage->payload->get_base_ptr();

    /* Check for QData */
    if (infoPayload->bType == INFOTYPE_CDDA_QDATA)
    {
        /* Packet and bit definitions can be found in Mt. Fuji spec */
        bControl = infoPayload->data_packet.data[5];
        bCopy = (bControl & 0x02) >> 1; 
        bEmphasis = (bControl & 0x01);
        /* ulMSF = MAKE_DWORD(&(infoPayload->data_packet.data[8])); */

        /* DBGPRINT(DBG_ON(DBG_TRACE), ("INFOTYPE_CDDA_QDATA bControl %02x ulMSF %08x\n", bControl, ulMSF)); */

        /* If the value is different than the current setting */
        if (bCopy != m_bPrevCopy)
        {
            /* This condition means that the copy has toggled within a track */
            if (m_bPrevCopy != CDDA_COPY_UNITIALIZED)
            {
                /* If we haven't already detected that the copy is toggling */
                if (m_bPrevCopy != CDDA_COPY_TOGGLING)
                {
                    /* This means that we will tell the SPDIF layer to toggle the copy bit */


                    /* SDK: ToDo: get the current spdif settings */

                    /* If the copy bit is set, copy is prohibited, if the emphasis bit is set, pre-emphasis is on */
                    DBGPRINT(DBG_ON(DBG_TRACE), ("cPEConsumer_CDDA::processInfo copy_once\n"));


                    m_bPrevCopy = CDDA_COPY_TOGGLING;
                }
            }
            else
            {
                /* This section is executed at the start of every track when the copy control is unitialized */



                /* SDK: ToDo: get the current spdif settings */

                /* If the copy bit is set, copy is prohibited, if the emphasis bit is set, pre-emphasis is on */

                DBGPRINT(DBG_ON(DBG_TRACE), ("cPEConsumer_CDDA::processInfo %02x\n", bCopy));


                m_bPrevCopy = bCopy;
            }
        }
    }

    return (PE_SUCCESS);
}

⌨️ 快捷键说明

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