📄 pe_consumer_cdda.cpp
字号:
}
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, ¤tPlayTime);
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 + -