www.pudn.com > wav_mp3_recorder.rar > encode.c
/* main.c
* Command line interface.
*
* This fixed point version of shine is based on Gabriel Bouvigne's original
* source, version 0.1.2
*/
#include "types.h"
config_t config;
int cutoff;
int raw;
int mono_from_stereo;
//int fd;
//int mixerhander;
/*
* error:
* ------
*/
void error(char *s)
{
printf("[ERROR] %s\n",s);
exit(1);
}
/*
* set_defaults:
* -------------
*/
static void set_defaults()
{
config.mpeg.type = MPEG1;
config.mpeg.layr = LAYER_3;
config.mpeg.mode = MODE_DUAL_CHANNEL;
config.mpeg.bitr = 48;
config.mpeg.psyc = 0;
config.mpeg.emph = 0;
config.mpeg.crc = 0;
config.mpeg.ext = 0;
config.mpeg.mode_ext = 0;
config.mpeg.copyright = 0;
config.mpeg.original = 1;
config.mpeg.channels = 1;
config.mpeg.granules = 1;
cutoff = 418; /* 16KHz @ 44.1Ksps */
config.wave.samplerate = 44100;
}
/*
* find_samplerate_index:
* ----------------------
*/
static int find_samplerate_index(long freq)
{
static long sr[4][3] = {{11025, 12000, 8000}, /* mpeg 2.5 */
{ 0, 0, 0}, /* reserved */
{22050, 24000, 16000}, /* mpeg 2 */
{44100, 48000, 32000}}; /* mpeg 1 */
int i, j;
for(j=0; j<4; j++)
for(i=0; i<3; i++)
if((freq == sr[j][i]) && (j != 1))
{
config.mpeg.type = j;
return i;
}
error("Invalid samplerate");
return 0;
}
/*
* find_bitrate_index:
* -------------------
*/
static int find_bitrate_index(int bitr)
{
static long br[2][15] =
{{0, 8,16,24,32,40,48,56, 64, 80, 96,112,128,144,160}, /* mpeg 2/2.5 */
{0,32,40,48,56,64,80,96,112,128,160,192,224,256,320}}; /* mpeg 1 */
int i;
for(i=1; i<15; i++)
if(bitr==br[config.mpeg.type & 1][i]) return i;
error("Invalid bitrate");
return 0;
}
int set_cutoff(void)
{
static int cutoff_tab[3][2][15] =
{
{ /* 44.1k, 22.05k, 11.025k */
{100,104,131,157,183,209,261,313,365,418,418,418,418,418,418}, /* stereo */
{183,209,261,313,365,418,418,418,418,418,418,418,418,418,418} /* mono */
},
{ /* 48k, 24k, 12k */
{100,104,131,157,183,209,261,313,384,384,384,384,384,384,384}, /* stereo */
{183,209,261,313,365,384,384,384,384,384,384,384,384,384,384} /* mono */
},
{ /* 32k, 16k, 8k */
{100,104,131,157,183,209,261,313,365,418,522,576,576,576,576}, /* stereo */
{183,209,261,313,365,418,522,576,576,576,576,576,576,576,576} /* mono */
}
};
return cutoff_tab[config.mpeg.samplerate_index]
[config.mpeg.mode == MODE_MONO]
[config.mpeg.bitrate_index];
}
/*
* check_config:
* -------------
*/
static void check_config()
{
static char *mode_names[4] = { "stereo", "j-stereo", "dual-ch", "mono" };
static char *layer_names[4] = { "", "III", "II", "I" };
static char *version_names[4] = { "MPEG 2.5", "", "MPEG 2", "MPEG 1" };
static char *psy_names[3] = { "none", "MUSICAM", "Shine" };
static char *demp_names[4] = { "none", "50/15us", "", "CITT" };
config.mpeg.samplerate_index = find_samplerate_index(config.wave.samplerate);
config.mpeg.bitrate_index = find_bitrate_index(config.mpeg.bitr);
cutoff = set_cutoff();
printf("%s layer %s, %s Psychoacoustic Model: %s\n",
version_names[config.mpeg.type],
layer_names[config.mpeg.layr],
mode_names[config.mpeg.mode],
psy_names[config.mpeg.psyc] );
printf("Bitrate=%d kbps ",config.mpeg.bitr );
printf("De-emphasis: %s %s %s\n",
demp_names[config.mpeg.emph],
(config.mpeg.original) ? "Original" : "",
(config.mpeg.copyright) ? "(C)" : "" );
}
/*
wave_initial
*/
void wave_initial(void)
{
long length;
raw = 0;
mono_from_stereo = 1;
set_defaults();
//config.outfile = "/home/src/shine8/hello.mp3";
config.mpeg.bitr = BITRATE;
config.wave.samplerate = RATE;
length = 1152;
config.wave.channels = 1;
config.wave.bits = 16;
config.wave.length = length/(2*config.wave.samplerate);
config.wave.total_samples = length/2;
config.mpeg.channels = 1;
config.mpeg.mode = MODE_MONO;
}
/*
initial all
*/
int Mp3_Initial(void)
{
int i;
wave_initial();
check_config();
Mp3_Encode_Initial();
printf("begin recorde...\n");
return 1;
}