📄 pwav.c
字号:
long i, lLength;
tPCM *pPCM;
unsigned long count;
pPCM = (tPCM *)ulParam1;
psLeft = pPCM->FrameOutputLeft;
psRight = pPCM->FrameOutputRight;
#if 1
#ifdef ADPCM_ENC_INCLUDE
if (REC_GetCurrCodec() == 2)
{
encodetemp = pPCM->pucEncodedData;
{
int i;
pPCM->usValid = 0; // 头文件已经写入
for (i = 0;i < ADPCM_ENC_RATE; i++)
{
ADPCMENCODE(&pPCM->sPCMHeader, psLeft + i * pPCM->usSamplesPerBlock, psRight + i * pPCM->usSamplesPerBlock,
pPCM->pucEncodedData + pPCM->usValid + i * pPCM->usBytesPerBlock);
pPCM->ulDataValid += pPCM->usBytesPerBlock;
pPCM->ulTimePos += pPCM->usSamplesPerBlock;
}
}
//RKFIO_FWrite((MY_FILE*)XW_TestFile, pPCM->pucEncodedData,pPCM->usBytesPerBlock);
//尾部剩余空间不够放整块时
if ((2*REC_WRITE_BUF_LEN - RecordWriteIndex) <= (pPCM->usBytesPerBlock*ADPCM_ENC_RATE))
{
memcpy(&RecordWriteBuf[RecordWriteIndex], &encodetemp[0], (2*REC_WRITE_BUF_LEN - RecordWriteIndex));
memcpy(&RecordWriteBuf[0], &encodetemp[2*REC_WRITE_BUF_LEN - RecordWriteIndex], (pPCM->usBytesPerBlock * ADPCM_ENC_RATE + RecordWriteIndex - 2*REC_WRITE_BUF_LEN));
RecordWriteIndex = pPCM->usBytesPerBlock * ADPCM_ENC_RATE + RecordWriteIndex - 2 * REC_WRITE_BUF_LEN;
//后一半BUF已填满,可以将其写入文件
SendSecondBufSign = 1;
}
else
{
//normal: 将数据复制到BUF中即可
if ((RecFisrtNoWrite <= 3) && (RecFisrtNoWrite >= 1))
{
RecFisrtNoWrite ++;
memset(&RecordWriteBuf[RecordWriteIndex], 0, (pPCM->usBytesPerBlock *ADPCM_ENC_RATE));
}
else
{
RecFisrtNoWrite = 0;
memcpy(&RecordWriteBuf[RecordWriteIndex], &encodetemp[0], (pPCM->usBytesPerBlock *ADPCM_ENC_RATE));
}
RecordWriteIndex += pPCM->usBytesPerBlock * ADPCM_ENC_RATE;
}
if ((RecordWriteIndex >= REC_WRITE_BUF_LEN) && (RecordWriteIndex < (REC_WRITE_BUF_LEN + pPCM->usBytesPerBlock*ADPCM_ENC_RATE)))
{
//前一半BUF已填满,可以将其写入文件
SendFirstBufSign = 1;
}
memcpy(pPCM->pucEncodedData,
pPCM->pucEncodedData + pPCM->usBytesPerBlock*ADPCM_ENC_RATE, pPCM->usValid);
//pPCM->usValid = 0;
}
#endif
#endif
#if 1
#ifdef PCM_ENC_INCLUDE
if (REC_GetCurrCodec() == 1)
{
short *temp = (short*)MALLOC(5458 * sizeof(short));
if (pPCM->ucChannels == 1)
{
// Cache_FlushDataLine((UINT32)psLeft, pPCM->usSamplesPerBlock*2);
if ((2*REC_WRITE_BUF_LEN - RecordWriteIndex) <= (pPCM->usSamplesPerBlock))
{
memcpy(&RecordWriteBuf[RecordWriteIndex], &psLeft[0], 2*(2*REC_WRITE_BUF_LEN - RecordWriteIndex));
memcpy(&RecordWriteBuf[0], &psLeft[2*REC_WRITE_BUF_LEN - RecordWriteIndex], 2*(pPCM->usSamplesPerBlock + RecordWriteIndex - 2*REC_WRITE_BUF_LEN));
RecordWriteIndex = pPCM->usSamplesPerBlock + RecordWriteIndex - 2 * REC_WRITE_BUF_LEN;
SendSecondBufSign = 1;
}
else
{
memcpy(&RecordWriteBuf[RecordWriteIndex], &psLeft[0], 2*pPCM->usSamplesPerBlock);
RecordWriteIndex += pPCM->usSamplesPerBlock;
}
if ((RecordWriteIndex >= REC_WRITE_BUF_LEN) && (RecordWriteIndex < (REC_WRITE_BUF_LEN + pPCM->usSamplesPerBlock)))
{
SendFirstBufSign = 1;
}
}
else if (pPCM->ucChannels == 2)
{
// Cache_FlushDataLine((UINT32)psLeft, pPCM->usSamplesPerBlock*2);
// Cache_FlushDataLine((UINT32)psRight, pPCM->usSamplesPerBlock*2);
for (i = 0;i < pPCM->usSamplesPerBlock;i++)
{
temp[2*i] = *psLeft++;
temp[2*i+1] = *psRight++;
}
if ((2*REC_WRITE_BUF_LEN - RecordWriteIndex) <= 2*(pPCM->usSamplesPerBlock))
{
memcpy(&RecordWriteBuf[RecordWriteIndex], &temp[0], 2*(2*REC_WRITE_BUF_LEN - RecordWriteIndex));
memcpy(&RecordWriteBuf[0], &temp[2*REC_WRITE_BUF_LEN - RecordWriteIndex], 2*(2*pPCM->usSamplesPerBlock + RecordWriteIndex - 2*REC_WRITE_BUF_LEN));
RecordWriteIndex = (2 * pPCM->usSamplesPerBlock + RecordWriteIndex - 2 * REC_WRITE_BUF_LEN);
SendSecondBufSign = 1;
}
else
{
memcpy(&RecordWriteBuf[RecordWriteIndex], &temp[0], 2*(2*pPCM->usSamplesPerBlock));
RecordWriteIndex += 2 * pPCM->usSamplesPerBlock;
}
if ((RecordWriteIndex >= REC_WRITE_BUF_LEN) && (RecordWriteIndex < (REC_WRITE_BUF_LEN + 2*pPCM->usSamplesPerBlock)))
{
SendFirstBufSign = 1;
}
}
pPCM->ulDataValid += pPCM->usSamplesPerBlock * 2 * pPCM->ucChannels;
FREE(temp);
pPCM->ulTimePos += pPCM->usSamplesPerBlock;
}
#endif
#endif
return 1;
}
#if ROCK_CAMERA&&CAM_FUN_DV //DV audio 部分
case SUBFN_CODEC_DVENCODE:
{
short *psLeft, *psRight;
unsigned char *encodetemp;
int i;
tPCM *pPCM;
pPCM = (tPCM *)ulParam1;
psLeft=pPCM->FrameOutputLeft;
psRight=pPCM->FrameOutputRight;
#if 0
//debug audio data
for (i = 0; i<pPCM->usSamplesPerBlock * ADPCM_ENC_RATE; i++)
{
psLeft[i] = i;
psRight[i] = i;
}
#endif
if (REC_GetCurrCodec()==2)
{
//编码
for (i = 0;i<ADPCM_ENC_RATE; i++)
{
DVFile_Record_Movi_Audio_ID( pCurDvAudioOutputBuf, pPCM->usBytesPerBlock ); //创建id
ADPCMENCODE(&pPCM->sPCMHeader, psLeft + i * pPCM->usSamplesPerBlock, psRight + i * pPCM->usSamplesPerBlock,
(unsigned char *)pCurDvAudioOutputBuf+8/*pPCM->pucEncodedData + pPCM->usValid + i * pPCM->usBytesPerBlock*/ );
pPCM->ulDataValid += pPCM->usBytesPerBlock;
pPCM->ulTimePos += pPCM->usSamplesPerBlock;
curDvAudioOutputBufLen += (pPCM->usBytesPerBlock+8);
pCurDvAudioOutputBuf += (pPCM->usBytesPerBlock+8);
}
//这里固定每个block长度,buf也会刚好达到 REC_WRITE_BUF_LEN 和 REC_WRITE_BUF_NUM*REC_WRITE_BUF_LEN
if ( curDvAudioOutputBufLen == REC_WRITE_BUF_LEN )
{
pCurDvAudioOutputBuf = (char *)&RecordWriteBuf[REC_WRITE_BUF_LEN];
SendFirstBufSign = 1; //前半buf
}
else if ( curDvAudioOutputBufLen == REC_WRITE_BUF_NUM*REC_WRITE_BUF_LEN )
{
pCurDvAudioOutputBuf = (char *)&RecordWriteBuf[0];
SendSecondBufSign = 1; //后半buf
curDvAudioOutputBufLen = 0;
}
}
return 1;
}
#endif
case SUBFN_CODEC_SEEK:
{
tPCM *pPCM;
unsigned long ulPos;
pPCM = (tPCM *)ulParam1;
if (ulParam2 > pPCM->ulTimeLength)
{
ulParam2 = pPCM->ulTimeLength;
}
ulPos = (((ulParam2 / 1000) * pPCM->usSampleRate) / pPCM->usSamplesPerBlock) +
(((ulParam2 % 1000) * pPCM->usSampleRate) / (pPCM->usSamplesPerBlock * 1000));
pPCM->ulTimePos = ulPos * pPCM->usSamplesPerBlock;
if (pPCM->wFormatTag == 1)
{
ulPos = pPCM->ulDataStart + (ulPos * pPCM->usBytesPerBlock) * pPCM->usSamplesPerBlock; //(PCM 沥惑 Seek 荐青)
}
else //else if(pPCM->sWaveFormat.wFormatTag == 2)
{
ulPos = pPCM->ulDataStart + (ulPos * pPCM->usBytesPerBlock); //(ADPCM 沥惑 Seek 荐青)
}
if (ulPos > pPCM->ulLength)
return 0;
if (!VideoPlaying)
RKFIO_FSeek(pRawFileCache, (int)(ulPos&~511), 0);
pPCM->usValid = RKFIO_FRead(pRawFileCache, pPCM->pucEncodedData, 1024);
pPCM->usOffset = (unsigned short)(ulPos & 511);
pPCM->ulDataValid = pPCM->ulLength + pPCM->ulDataStart - (ulPos & ~511);
return(1);
}
case SUBFN_CODEC_CLOSE:
{
tPCM *pPCM;
if (ulParam2 & CODEC_OPEN_ENCODE)
{
//#ifdef ADPCM_ENC_INCLUDE
PCMWAVEFORMAT sWaveFormat;
unsigned long ulIdx;
pPCM = (tPCM *)ulParam1;
#ifdef ADPCM_ENC_INCLUDE //hug
if (REC_GetCurrCodec() == 2)
{
RKFIO_FWrite((MY_FILE*)TRACK_GetFileHandleOfRecord(), pPCM->pucEncodedData, pPCM->usValid); //MPEG4_INDEX_BUFFERSIZE
pPCM->pucEncodedData[70] = 'f';
pPCM->pucEncodedData[71] = 'a';
pPCM->pucEncodedData[72] = 'c';
pPCM->pucEncodedData[73] = 't';
pPCM->pucEncodedData[74] = 4;
pPCM->pucEncodedData[75] = 0;
pPCM->pucEncodedData[76] = 0;
pPCM->pucEncodedData[77] = 0;
pPCM->pucEncodedData[78] = pPCM->ulTimePos;
pPCM->pucEncodedData[79] = pPCM->ulTimePos >> 8;
pPCM->pucEncodedData[80] = pPCM->ulTimePos >> 16;
pPCM->pucEncodedData[81] = pPCM->ulTimePos >> 24;
pPCM->pucEncodedData[82] = 'd';
pPCM->pucEncodedData[83] = 'a';
pPCM->pucEncodedData[84] = 't';
pPCM->pucEncodedData[85] = 'a';
pPCM->pucEncodedData[86] = pPCM->ulDataValid;
pPCM->pucEncodedData[87] = pPCM->ulDataValid >> 8;
pPCM->pucEncodedData[88] = pPCM->ulDataValid >> 16;
pPCM->pucEncodedData[89] = pPCM->ulDataValid >> 24;
pPCM->ulDataValid += 82;
pPCM->pucEncodedData[0] = 'R';
pPCM->pucEncodedData[1] = 'I';
pPCM->pucEncodedData[2] = 'F';
pPCM->pucEncodedData[3] = 'F';
pPCM->pucEncodedData[4] = pPCM->ulDataValid;
pPCM->pucEncodedData[5] = pPCM->ulDataValid >> 8;
pPCM->pucEncodedData[6] = pPCM->ulDataValid >> 16;
pPCM->pucEncodedData[7] = pPCM->ulDataValid >> 24;
pPCM->pucEncodedData[8] = 'W';
pPCM->pucEncodedData[9] = 'A';
pPCM->pucEncodedData[10] = 'V';
pPCM->pucEncodedData[11] = 'E';
pPCM->pucEncodedData[12] = 'f';
pPCM->pucEncodedData[13] = 'm';
pPCM->pucEncodedData[14] = 't';
pPCM->pucEncodedData[15] = ' ';
pPCM->pucEncodedData[16] = 50;
pPCM->pucEncodedData[17] = 0;
pPCM->pucEncodedData[18] = 0;
pPCM->pucEncodedData[19] = 0;
sWaveFormat.wFormatTag = 2;
sWaveFormat.nChannels = pPCM->ucChannels;
sWaveFormat.nSamplesPerSec = pPCM->usSampleRate;
sWaveFormat.nAvgBytesPerSec = pPCM->usByteRate;
sWaveFormat.nBlockAlign = pPCM->usBytesPerBlock;
sWaveFormat.wBitsPerSample = 4;
sWaveFormat.cbSize = 32;
sWaveFormat.wSamplesPerBlock = pPCM->usSamplesPerBlock;
sWaveFormat.wNumCoef = 7;
for (ulIdx = 0; ulIdx < 7; ulIdx++)
{
sWaveFormat.aCoef[ulIdx].iCoef1 = psCoefficient1[ulIdx];
sWaveFormat.aCoef[ulIdx].iCoef2 = psCoefficient2[ulIdx];
}
memcpy(pPCM->pucEncodedData + 20, (void *)&sWaveFormat, 50);
memcpy(ADPCM_Hdr, pPCM->pucEncodedData, ADPCM_FILL_HDR);
RKFIO_FSeek((MY_FILE*)TRACK_GetFileHandleOfRecord(), 0, FSEEK_SET);
RKFIO_FWrite((MY_FILE*)TRACK_GetFileHandleOfRecord(), ADPCM_Hdr, 90);
RKFIO_FSeek((MY_FILE*)TRACK_GetFileHandleOfRecord(), 0, FSEEK_END);
}
#endif
#ifdef PCM_ENC_INCLUDE
if (REC_GetCurrCodec() == 1)
{
Close_LPCM(pPCM);
}
#endif //ADPCM_ENC_INCLUDE
}
return 1;
}
default:
{
return 0;
}
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -