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

📄 pwav.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 3 页
字号:
                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 + -