📄 mtrackcontrol.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 + -