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

📄 mtrackcontrol.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
字号:
/* Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved. */
/*
File : \Audio\common\mTrackControl.c
Desc : 音频播放管理

Author : FSH
Date :   2007-06-01
Notes :

$Log :
* FSH         2007/06/01 建立此文件
*
* Vincent Hisung    2007/07/xx 修改
*
*/
/****************************************************************/

#include "../include/file_access.h"
#include "../include/audio_main.h"
#include "../include/audio_globals.h"
#include "../include/commoncmd.h"

#include "../mp3enc/MP3Enc.H"
#include "mRECORD.H"
#include "mTrackControl.h"

#include <stdio.h>
#include <string.h>
int gFileHandleOfData;
int gFileHandleOfIndex;
MY_FILE *gFileHandleOfRecord;

int   PcmLength;

extern void FileFuncInit(void);
extern MY_FILE    *RKFSFileOpen(const char *filename, const char *mode);
extern int     RKFSFileClose(MY_FILE        *stream);
#ifdef FLAC_DEC_INCLUDE
extern int CheckFLAC(void);
#endif


BufferState sPlayBuffer;
//AudioInOut_Type AudioIOBuf;
#define ADPCM_FILL_HDR 90
extern unsigned char ADPCM_Hdr[ADPCM_FILL_HDR];
extern unsigned long  ulEndOfRAM;
extern unsigned long buff[0xc000];

#ifdef PCM_ENC_INCLUDE
extern short  RecordWriteBuf[];
#endif

#if  defined(MP3_ENC_INCLUDE)||defined(ADPCM_ENC_INCLUDE)
extern char   RecordWriteBuf[];
#endif
extern unsigned long RecordWriteIndex;
//****************************************************************************
// File System Handles
//****************************************************************************
int TRACK_GetFileHandleOfData()
{
    return gFileHandleOfData;
}

int TRACK_GetFileHandleOfIndex()
{
    return gFileHandleOfIndex;
}

MY_FILE *TRACK_GetFileHandleOfRecord()
{
    return gFileHandleOfRecord;
}

void TRACK_SetFileHandleOfData(int iNewFileHandleOfData)
{
    gFileHandleOfData = iNewFileHandleOfData;
}

void TRACK_SetFileHandleOfIndex(int iNewFileHandleOfIndex)
{
    gFileHandleOfIndex = iNewFileHandleOfIndex;
}

void  TRACK_SetFileHandleOfRecord(MY_FILE *iNewFileHandleOfRecord)
{
    gFileHandleOfRecord = iNewFileHandleOfRecord;
}

/******************************************************
Name:  OpenTrack
Desc:  打开音轨准备播放【OpenTrack prepares to decode and play the specified track.】
Param: 无
Return: 1-成功 0-失败
Global: 无
Note:  无
Author: FSH,Vincent Hisung
Log:
******************************************************/
int OpenTrack(void)
{
    unsigned long ulSampleRate, ulChannels, ulBitrate;
    unsigned long Err;
    int result, BRWIndex;
    unsigned char Cmd;
    int       gIndexOfFile;
    unsigned int  uiDBIndex;



    gIndexOfFile = 0;

    //(1) 首先必须获取CurrentCodec,给数据在建立数据库时可
    // 根据文件后缀等
    /***************************************/

    //(2) 通过INDEX(gIndexOfFile) 获取该文件句柄gFileHandleOfData



    /***************************************************************/
#ifdef MP2_INCLUDE
    if ((CurrentCodec == CODEC_MP3) || (CurrentCodec == CODEC_MP2))
    {
        result = CheckMP3orMP2();

        RKFIO_FSeek(pRawFileCache, 0, 0);

        if (result == 2)
        {
            CurrentCodec = CODEC_MP2;
        }
        else if (result == 1)
        {
            CurrentCodec = CODEC_MP3;
        }
        else
        {
            return 0; //error, added by vincent.
        }
    }
#endif

    ///ape解码 section added by hxd 20070707
#ifdef APE_DEC_INCLUDE
    if (CurrentCodec == CODEC_APE_DEC)
    {
        //验证APE歌曲
        result = CheckAPE();
        RKFIO_FSeek(pRawFileCache, 0, 0);

        if (result != 0)//zero is SUCCESS ,non-zero is error
        {
            return 0;//验证不通过
        }
        else
        {
            CurrentCodec = CODEC_APE_DEC;//验证通过
        }
    }
#endif

    ///FLAC解码 section added by hxd 20070707
#ifdef FLAC_DEC_INCLUDE
    if (CurrentCodec == CODEC_FLAC_DEC)
    {
        //验证FLAC歌曲
        result = CheckFLAC();

        if (result != 0)//zero is SUCCESS ,non-zero is error
        {
            return 0;//验证不通过
        }
        else
        {
            CurrentCodec = CODEC_FLAC_DEC;//验证通过
        }
    }
#endif

#ifdef WAV_INCLUDE
#if 0   //目前需要支持 IMA,MS,PCM
    else if (CurrentCodec == CODEC_WAV)
    {
        result = CheckWAV();
        RKFIO_FSeek(pRawFileCache, 0, 0);
        if (result <= 0)
            return 0;
        if (result == 2)
        {
            CurrentCodec = CODEC_ADPCM;
        }
    }
#endif
#endif



#ifdef MP4_INCLUDE
    else if (CurrentCodec == CODEC_M4A)
    {
        ///////////////////////
        ;
        //////////////////////
    }
#endif


#ifdef MP2_INCLUDE
    if ((CurrentCodec == CODEC_MP3) || (CurrentCodec == CODEC_MP2))
    {
        RKFIO_FSeek(pRawFileCache, 0, 0);
    }
#endif

    REC_SetMpegMode(1);

    Err = CodecOpen(0, CODEC_OPEN_DECODE);

    // See if we are able to decode this file.
    switch (Err)
    {
        case 0:
            // Codec Open Error


            // RKFIO_FClose((MY_FILE*)gFileHandleOfData);

            //Opentrack_return 0
            return 0;
    }

    //相关初始化工作
    {
        // Set the sample rate of the output processing.
#if 0
        CodecGetSampleRate(&ulSampleRate);
        CodecGetChannels(&ulChannels);
        CodecGetBitrate(&ulBitrate);

        PlaySamplingRate  = (unsigned int)(ulSampleRate / 1000);
        PlayBitrate     = (unsigned int)(ulBitrate / 1000);


        if (SampleRate >= 8000 && SampleRate <= 48000)
            SampleRate = ulSampleRate;
        else
            SampleRate = 44100;
#endif
    }

    ABFlag = 0;   // OpenTrack Time!clear A-B repeate!

    //此处可根据具体的模块设置晶体


    return 1;
}

/******************************************************
Name:  CreateTrack
Desc:  创建音轨准备录制【CreatTrack prepares to encode and creats new file.】
Param: 无
Return: 1-成功 0-失败
Global: 无
Note:  尚不可在硬件平台上使用!
Author: FSH
Log:
******************************************************/
unsigned char WriteFileSign = 0;
char RecFileNameLong[23];
#if ROCK_CAMERA
int CreateDvTrack(void)
{
	ulEndOfRAM=(unsigned long)buff; //test

	CurrentCodec	= CODEC_WAV;
	// Open the codec.
	if(CodecOpen(0, CODEC_OPEN_ENCODE) == 0)
	{
		//FClose(gFileHandleOfRecord);
		return(0);
	}
	
	return(1);
}
#endif
int CreateTrack(void)
{

    short *psData;
    short *EncLeft;
    short *EncRight;
    long lLength;
    unsigned char a;
    unsigned int count;
    int dir_num = 1;
#if defined(ADPCM_ENC_INCLUDE)||defined(PCM_ENC_INCLUDE)
    unsigned char ucTmp[512];
#endif

    unsigned char ucRecInput = REC_GetCurrRecInput();
    unsigned char *pRecFileName = REC_GetRecFileName();
    char pRecFileNameTemp[23];



    FileFuncInit();     //test   //需要找个地方初始化
    ulEndOfRAM = (unsigned long)buff; //test


    if (ucRecInput == LINEIN_REC)
    {

#ifdef PCM_ENC_INCLUDE
        if (REC_GetCurrCodec() == 1)
        {
            //寻找一个逐渐递增的文件名,做为录音文件。
            //还回录音文件的数字count
        }
#endif
#ifdef ADPCM_ENC_INCLUDE
        if (REC_GetCurrCodec() == 2)
        {
            //寻找一个逐渐递增的文件名,做为录音文件。
            //还回录音文件的数字count

        }
#endif

#ifdef MP3_ENC_INCLUDE
        if (REC_GetCurrCodec() == 4)
        {
            //寻找一个逐渐递增的文件名,做为录音文件。
            //还回录音文件的数字count

        }
#endif


        pRecFileName[0] = 'L';
        pRecFileName[1] = 'I';
        pRecFileName[2] = 'N';
        pRecFileName[3] = 'E'; // RecFileName[4] = 'O';
        a = count / 100;
        pRecFileName[4] = a + 0x30;
        a = (count % 100) / 10;
        pRecFileName[5] = a + 0x30;
        a = count % 10;
        pRecFileName[6] = a + 0x30;
    }
    else if (ucRecInput == VOICE_REC)
    {

#ifdef PCM_ENC_INCLUDE
        if (REC_GetCurrCodec() == 1)
        {

            //
        }

#endif
#ifdef ADPCM_ENC_INCLUDE
        if (REC_GetCurrCodec() == 2)
        {
            //

        }
#endif
#ifdef MP3_ENC_INCLUDE
        if (REC_GetCurrCodec() == 3)
        {
            //
        }
#endif


        pRecFileName[0] = 'V';
        pRecFileName[1] = 'R';
        pRecFileName[2] = 'E';
        pRecFileName[3] = 'C'; // RecFileName[4] = 'O';
        a = count / 100;
        pRecFileName[4] = a + 0x30;
        a = (count % 100) / 10;
        pRecFileName[5] = a + 0x30;
        a = count % 10;
        pRecFileName[6] = a + 0x30;
    }

//#ifdef RADIO_REC_INCLUDE
    else if (ucRecInput == FM_REC)
    {

#ifdef PCM_ENC_INCLUDE
        if (REC_GetCurrCodec() == 1)
        {
            ///
        }
#endif
#ifdef ADPCM_ENC_INCLUDE
        if (REC_GetCurrCodec() == 2)
        {
            ///
        }
#endif
#ifdef MP3_ENC_INCLUDE
        if (REC_GetCurrCodec() == 3)
        {
            ///
        }
#endif



        pRecFileName[0] = 'F';
        pRecFileName[1] = 'M';
        pRecFileName[2] = 'R';
        pRecFileName[3] = 'C'; // RecFileName[4] = 'O';
        a = count / 100;
        pRecFileName[4] = a + 0x30;
        a = (count % 100) / 10;
        pRecFileName[5] = a + 0x30;
        a = count % 10;
        pRecFileName[6] = a + 0x30;
    }
//#endif


#ifdef PCM_ENC_INCLUDE
    if (REC_GetCurrCodec() == 1)
    {
        pRecFileName[7] = '.';
        pRecFileName[8] = 'W';
        pRecFileName[9] = 'A';
        pRecFileName[10] = 'V';
        pRecFileName[11] = NULL;
        CurrentCodec = CODEC_WAV;
    }
#endif
#ifdef ADPCM_ENC_INCLUDE
    if (REC_GetCurrCodec() == 2)
    {
        pRecFileName[7] = '.';
        pRecFileName[8] = 'W';
        pRecFileName[9] = 'A';
        pRecFileName[10] = 'V';
        pRecFileName[11] = NULL;
        CurrentCodec = CODEC_WAV;
    }
#endif

#ifdef MP3_ENC_INCLUDE
    if (REC_GetCurrCodec() == 3)
    {
        pRecFileName[7] = '.';
        pRecFileName[8] = 'M';
        pRecFileName[9] = 'P';
        pRecFileName[10] = '3';
        pRecFileName[11] = NULL;
        CurrentCodec = CODEC_MP3_ENC;
    }
#endif
    for (count = 0; count < 999; count++)
    {
        a = count / 100;
        pRecFileName[4] = a + 0x30;
        a = (count % 100) / 10;
        pRecFileName[5] = a + 0x30;
        a = count % 10;
        pRecFileName[6] = a + 0x30;

        strcpy(pRecFileNameTemp, "D:\\RECORD\\");
        strcat(pRecFileNameTemp, (char *)pRecFileName);
        //***********************

        //创建录音文件
        if ((gFileHandleOfRecord = (MY_FILE *)RKFSFileOpen(pRecFileNameTemp, "r")) == 0)
        {
            memcpy(&RecFileNameLong[0], &pRecFileNameTemp[0], sizeof(pRecFileNameTemp));
            //gFileHandleOfRecord=(MY_FILE *)RKFSFileOpen( pRecFileNameTemp, "wb" );
            WriteFileSign = 1;     /* 写文件标志 */
            break;
        }
        RKFSFileClose((MY_FILE *)gFileHandleOfRecord);
    }




    // Open the codec.
    if (CodecOpen(0, CODEC_OPEN_ENCODE) == 0)
    {
        //FClose(gFileHandleOfRecord);
        return(0);
    }


#if defined(ADPCM_ENC_INCLUDE)||defined(PCM_ENC_INCLUDE)
    if (CurrentCodec == CODEC_WAV)
    {
        ADPCM_Hdr[4] = 0xFF;
        ADPCM_Hdr[5] = 0xFF;
        ADPCM_Hdr[6] = 0xFF;
        ADPCM_Hdr[7] = 0xFF;
        ADPCM_Hdr[86] = 0xFF;
        ADPCM_Hdr[87] = 0xFF;
        ADPCM_Hdr[88] = 0xFF;
        ADPCM_Hdr[89] = 0xFF;

        ADPCM_Hdr[70] = 'f';
        ADPCM_Hdr[71] = 'a';
        ADPCM_Hdr[72] = 'c';
        ADPCM_Hdr[73] = 't';
        ADPCM_Hdr[74] = 4;
        ADPCM_Hdr[75] = 0;
        ADPCM_Hdr[76] = 0;
        ADPCM_Hdr[77] = 0;

        ADPCM_Hdr[82] = 'd';
        ADPCM_Hdr[83] = 'a';
        ADPCM_Hdr[84] = 't';
        ADPCM_Hdr[85] = 'a';


        ADPCM_Hdr[0] = 'R';
        ADPCM_Hdr[1] = 'I';
        ADPCM_Hdr[2] = 'F';
        ADPCM_Hdr[3] = 'F';
        ADPCM_Hdr[8] = 'W';
        ADPCM_Hdr[9] = 'A';
        ADPCM_Hdr[10] = 'V';
        ADPCM_Hdr[11] = 'E';
        ADPCM_Hdr[12] = 'f';
        ADPCM_Hdr[13] = 'm';
        ADPCM_Hdr[14] = 't';
        ADPCM_Hdr[15] = ' ';
        ADPCM_Hdr[16] = 50;
        ADPCM_Hdr[17] = 0;
        ADPCM_Hdr[18] = 0;

        ADPCM_Hdr[19] = 0;
    }
#endif


    return(1);


}



/******************************************************
Name:  CloseTrack
Desc:  关闭当前播放音轨【CloseTrack closes the currently opened file.】
Param: 无
Return: 1-成功 0-失败
Global: 无
Note:  无
Author: FSH
Log:
******************************************************/
void CloseTrack(void)
{
    BufferState *pBuffer;
    unsigned char Cmd;
    unsigned  uCPSR;

    CodecClose();

    if (gFileHandleOfData)
    {
        RKFIO_FClose((MY_FILE*)gFileHandleOfData);
        gFileHandleOfData = 0;
    }
    if (gFileHandleOfRecord)
    {

        RKFSFileClose((MY_FILE *)gFileHandleOfRecord);
        gFileHandleOfRecord = 0;
    }

    ///PlaySec = 0;
}


⌨️ 快捷键说明

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