?? mtrackcontrol.c
字號(hào):
/* 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: 打開(kāi)音軌準(zhǔn)備播放【OpenTrack prepares to decode and play the specified track.】
Param: 無(wú)
Return: 1-成功 0-失敗
Global: 無(wú)
Note: 無(wú)
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,給數(shù)據(jù)在建立數(shù)據(jù)庫(kù)時(shí)可
// 根據(jù)文件后綴等
/***************************************/
//(2) 通過(guò)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)
{
//驗(yàn)證APE歌曲
result = CheckAPE();
RKFIO_FSeek(pRawFileCache, 0, 0);
if (result != 0)//zero is SUCCESS ,non-zero is error
{
return 0;//驗(yàn)證不通過(guò)
}
else
{
CurrentCodec = CODEC_APE_DEC;//驗(yàn)證通過(guò)
}
}
#endif
///FLAC解碼 section added by hxd 20070707
#ifdef FLAC_DEC_INCLUDE
if (CurrentCodec == CODEC_FLAC_DEC)
{
//驗(yàn)證FLAC歌曲
result = CheckFLAC();
if (result != 0)//zero is SUCCESS ,non-zero is error
{
return 0;//驗(yàn)證不通過(guò)
}
else
{
CurrentCodec = CODEC_FLAC_DEC;//驗(yàn)證通過(guò)
}
}
#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;
}
//相關(guān)初始化工作
{
// 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!
//此處可根據(jù)具體的模塊設(shè)置晶體
return 1;
}
/******************************************************
Name: CreateTrack
Desc: 創(chuàng)建音軌準(zhǔn)備錄制【CreatTrack prepares to encode and creats new file.】
Param: 無(wú)
Return: 1-成功 0-失敗
Global: 無(wú)
Note: 尚不可在硬件平臺(tái)上使用!
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 //需要找個(gè)地方初始化
ulEndOfRAM = (unsigned long)buff; //test
if (ucRecInput == LINEIN_REC)
{
#ifdef PCM_ENC_INCLUDE
if (REC_GetCurrCodec() == 1)
{
//尋找一個(gè)逐漸遞增的文件名,做為錄音文件。
//還回錄音文件的數(shù)字count
}
#endif
#ifdef ADPCM_ENC_INCLUDE
if (REC_GetCurrCodec() == 2)
{
//尋找一個(gè)逐漸遞增的文件名,做為錄音文件。
//還回錄音文件的數(shù)字count
}
#endif
#ifdef MP3_ENC_INCLUDE
if (REC_GetCurrCodec() == 4)
{
//尋找一個(gè)逐漸遞增的文件名,做為錄音文件。
//還回錄音文件的數(shù)字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);
//***********************
//創(chuàng)建錄音文件
if ((gFileHandleOfRecord = (MY_FILE *)RKFSFileOpen(pRecFileNameTemp, "r")) == 0)
{
memcpy(&RecFileNameLong[0], &pRecFileNameTemp[0], sizeof(pRecFileNameTemp));
//gFileHandleOfRecord=(MY_FILE *)RKFSFileOpen( pRecFileNameTemp, "wb" );
WriteFileSign = 1; /* 寫(xiě)文件標(biāo)志 */
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: 關(guān)閉當(dāng)前播放音軌【CloseTrack closes the currently opened file.】
Param: 無(wú)
Return: 1-成功 0-失敗
Global: 無(wú)
Note: 無(wú)
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;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -