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

📄 aud_atom.c

📁 IBM source for pallas/vulcan/vesta
💻 C
📖 第 1 页 / 共 3 页
字号:
/* Stops (pauses) stream decoding at end of frame */void aud_atom_stop(){  MT_DCR(AUD_CTRL2, MF_DCR(AUD_CTRL2) | DECOD_AUD_CTRL2_HD);}/* re-starts paused stream decoding */void aud_atom_play(){  MT_DCR(AUD_CTRL2, MF_DCR(AUD_CTRL2) & ~DECOD_AUD_CTRL2_HD);}void aud_atom_mute(void){    unsigned long reg;    reg = MF_DCR(AUD_CTRL1) | DECOD_AUD_CTRL1_SOFT_MUTE;    MT_DCR(AUD_CTRL1, reg);    reg = MF_DCR(AUD_CTRL2) | DECOD_AUD_CTRL2_MUTE;    MT_DCR(AUD_CTRL2, reg);    _mute = 1;    PDEBUG("mute\n");}void aud_atom_unmute(void){    unsigned long reg;    reg = MF_DCR(AUD_CTRL1) & (~DECOD_AUD_CTRL1_SOFT_MUTE);    MT_DCR(AUD_CTRL1, reg);    reg = MF_DCR(AUD_CTRL2) & (~DECOD_AUD_CTRL2_MUTE);    MT_DCR(AUD_CTRL2, reg);    _mute = 0;    PDEBUG("unmute\n");}#ifdef DTS_ENABLE/* LPCM tables */#define A_LPCM_STAT_EMPH_MASK 0x8000#define A_LPCM_STAT_BIT_MASK  0x00C0#define A_LPCM_STAT_BIT_SHIFT 6#define A_LPCM_STAT_BIT_16    0x0000#define A_LPCM_STAT_BIT_20    0x0040#define A_LPCM_STAT_BIT_24    0x0080#define A_LPCM_STAT_BIT_INV   0x00C0#define A_LPCM_STAT_FS_MASK   0x0030#define A_LPCM_STAT_FS_SHIFT  4#define A_LPCM_STAT_FS_48KHZ  0x0000#define A_LPCM_STAT_FS_96KHZ  0x0010#define A_LPCM_STAT_FS_INV    0x0020#define A_LPCM_CHAN_MASK      0x0007long lpcm_fs[] = { 48000, 96000, 0, 0 };long lpcm_bit[] = { 16, 20, 24, 0 };INT aud_atom_lpcm_status (audioStatus *pStatus){  unsigned long astat;  astat = pStatus->raw[2] >> 16;  if (0 == (pStatus->sample_rate = 	    lpcm_fs[(astat & A_LPCM_STAT_FS_MASK) >> A_LPCM_STAT_FS_SHIFT])) {    return 0;  }  if (0 == (pStatus->bit_rate = 	    lpcm_bit[(astat & A_LPCM_STAT_BIT_MASK) >> A_LPCM_STAT_BIT_SHIFT])) {    return 0;  }  pStatus->bit_rate *=     pStatus->sample_rate * ((astat & A_LPCM_CHAN_MASK) + 1);  return 1;}/* DTS tables  */#define A_DTS_NBLKS ((pStatus->raw[2] & 0x007f0000) >> 16)#define A_DTS_FSIZE  (pStatus->raw[2] & 0x00003fff)#define A_DTS_FS    ((pStatus->raw[3] & 0x01e00000) >> 21)#define A_DTS_RATE  ((pStatus->raw[3] & 0x001f0000) >> 16)#define A_DTS_XTEND  (pStatus->raw[3] & 0x00000010)#define A_DTS_XVAL  ((pStatus->raw[3] & 0x000000e0) >> 5)long dts_fs[16] = {  0, 8000, 16000, 32000,  0,  0, 11025, 22050, 44100,  0,  0, 12000, 24000, 48000,  0,  0};long dts_rate[32] = {   32000,   56000,   64000,   96000,  112000,  128000,  192000,  224000,  256000,  320000,  384000,  448000,  512000,  576000,  640000,  768000,  960000, 1024000, 1152000, 1280000, 1344000, 1408000, 1411200, 1472000, 1536000, 1920000, 2048000, 3072000, 3840000,       0,       0,       0 };long dts_chan[16] = {  0+1  /* A */,  0+2  /* A+B dual mono */,  0+2  /* L+R stereo    */,  0+2  /* (L+R) + (L-R) sum-difference */,  0+2  /* LT + RT left/right total */,  0+3  /* C + L + R */,  0+3  /* L + R + S */,  0+4  /* C + L + R + S */,  0+4  /* L + R + SL + SR */,  0+5  /* C + L + R + SL + SR */,  0+6  /* CL + CR + L + R + SL + SR */,  0+6  /* C + L + R + LR + RR + OV  */,  0+6  /* CF + CR + LF +RF + LF + RR */,  0+7  /* CL + C + CR + L + R + SL + SR */,  0+8  /* CL + CR + L + R + SL1 + SL2 + SR + SR2 */,  0+8  /* CL + C + CR + L + R + SL + S + SR */,}; /* values >= 16 are user-defined */INT aud_atom_dts_status (audioStatus *pStatus){  pStatus->bit_rate = dts_rate[A_DTS_RATE];  pStatus->sample_rate = dts_fs[A_DTS_FS];  if (A_DTS_XTEND) {    if ((A_DTS_XVAL == 2) || (A_DTS_XVAL == 3))      pStatus->sample_rate *= 2;  }  return 1;}#endif/* UPCM tables */unsigned long upcm_sample_rate[16] = {  0, 16000, 22050, 24000,  0, 32000, 44100, 48000,  0,  8000, 11025, 12000,  0, 64000, 88200, 96000};INT aud_atom_upcm_status (audioStatus *pStatus){  unsigned long astat;  int num_bits = 1;  astat = MF_DCR(AUD_DSP_CTRL);  pStatus->sample_rate = upcm_sample_rate[astat & 0x0f];    switch (astat & AUD_DSP_PCM_BIT_MASK) {  case AUD_DSP_PCM_16BIT:    num_bits = 16;    break;  case AUD_DSP_PCM_8BIT:    num_bits = 8;    break;  default:    num_bits = 24;  };  if (!(astat & AUD_DSP_PCM_MONO)) num_bits *= 2;  pStatus->bit_rate = pStatus->sample_rate * num_bits;  return 1;}/* Dolby AC3 status tables */unsigned long ac3_sample_rate[4] =  { 48000, 44100, 32000, 0};unsigned long ac3_bit_rate[32] = {  32,  40,  48,  56,  64,  80,  96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 576, 640};#if 0int ac3_num_channel = {  2 /* 1+1 */, 1 /* mono */, 2 /* stereo */, 3 /* LCR */,   3 /* LRS */, 4 /* LCRS */, 4 /* LRLsRs */, 5 /* LCRLsRs */}#endifINT aud_atom_ac3_status (audioStatus *pStatus){  int i;  unsigned long astat;  astat = pStatus->raw[2];  /* Lookup current sample rate */  pStatus->sample_rate = ac3_sample_rate[(astat >> 16) & 0x03];  /* Lookup current bit rate */  i = (astat >> 23) & 0x1f;  pStatus->bit_rate = (i > 18) ? -1 : ac3_bit_rate[i];  return 1;}/* MPEG status tables */unsigned long mpeg_sample_rate[4] = { 44100, 48000, 32000, 0};unsigned long mpeg_bit_rate[2][3][16] = {  {    /* ID == 0 (LSF) */    {   0,  32,  48,  56,  64,  80,  96, 112, /* Layer I   */	128, 144, 160, 176, 192, 224, 256, -1},     {   0,   8,  16,  24,  32,  40,  48,  56, /* Layer II  */	 64,  80,  96, 112, 128, 144, 160, -1},     {   0,   8,  16,  24,  32,  40,  48,  56, /* Layer III */	 64,  80,  96, 112, 128, 144, 160, -1},   },  {    /* ID == 1 */    {   0,  32,  64,  96, 128, 160, 192, 224, /* Layer I   */	256, 288, 320, 352, 384, 416, 448, -1},     {   0,  32,  48,  56,  64,  80,  96, 112, /* Layer II  */	128, 160, 192, 224, 256, 320, 384, -1},     {   0,  32,  40,  48,  56,  64,  80,  96, /* Layer III */	112, 128, 160, 192, 224, 256, 320, -1}  }};INT aud_atom_mpeg_status (audioStatus *pStatus){  unsigned long astat, astat1;  int layer, id;  astat = pStatus->raw[2];  astat1 = pStatus->raw[3];  layer = ((astat >> 17) & 0x03) ^ 0x03;  id = (astat >> 19) & 0x01;  if (layer == 3) return 0; /* if invalid layer, exit */  /* Lookup current sample rate */  pStatus->sample_rate = mpeg_sample_rate[((astat >> 10) & 0x3)];    if (id == 0)    pStatus->sample_rate /= 2;  /* Lookup current bit rate */  pStatus->bit_rate =     mpeg_bit_rate[id][layer][(astat >> 12) & 0x0f];      return 1;}INT aud_atom_get_status(unsigned long *aud_status_mem_ptr,			audioStatus *pStatus){  int i;  /* Get and store audio status register */  pStatus->dsp_status = MF_DCR(AUD_DSP_STATUS);  if (!(pStatus->dsp_status & 0x02)) { /* check if valid play */    pStatus->bit_rate = 0;    pStatus->sample_rate = 0;    for (i = 0; i < (64 / sizeof(unsigned long)); i++)      pStatus->raw[i] = 0;    return 0;  }  /* Get and store raw status from status memory area */  for (i = 0; i < (64 / sizeof(unsigned long)); i++)    pStatus->raw[i] = *aud_status_mem_ptr++;  /* call appropriate decode status generation subroutine */  switch (pStatus->stream_decode_type) {  case AUD_MODE_STB_PCM:    return aud_atom_upcm_status(pStatus);  case AUD_MODE_AC3:    return aud_atom_ac3_status(pStatus);#ifdef DTS_ENABLE  case AUD_MODE_DTS:    return aud_atom_dts_status(pStatus);  case AUD_MODE_LPCM:    return aud_atom_lpcm_status(pStatus);#endif  case AUD_MODE_STB_MPEG:    return aud_atom_mpeg_status(pStatus);  }  return 0;}INT aud_atom_get_mute_state(){    return _mute;}void aud_atom_get_vol(AUDVOL* pVol){    unsigned long val;    unsigned long reg;    val = MF_DCR(AUD_ATTEN_VAL_FRONT);    reg = val & 0x0000003F;    pVol->frontright = reg;    reg = (val >> 8) & 0x0000003F;    pVol->frontleft = reg;    val = MF_DCR(AUD_ATTEN_VAL_REAR);    reg = val & 0x0000003F;    pVol->rearright = reg;    reg = (val >> 8) & 0x0000003F;    pVol->rearleft = reg;    val = MF_DCR(AUD_ATTEN_VAL_CENTER);    reg = val & 0x0000003F;    pVol->lfe = reg;    reg = (val >> 8) & 0x0000003F;    pVol->center = reg;}void aud_atom_set_vol(AUDVOL *pAudVol){    unsigned long reg1;    unsigned long reg;    unsigned long val;    reg1 = pAudVol->frontleft;    reg = pAudVol->frontright;    if (reg1 > 63)        reg1 = 63;    if (reg > 63)        reg = 63;    val = ((reg1 & 0x0000003F) << 8) | (reg & 0x0000003F);    MT_DCR(AUD_ATTEN_VAL_FRONT, val);    reg1 = pAudVol->rearleft;    reg = pAudVol->rearright;    if (reg1 > 63)        reg1 = 63;    if (reg > 63)        reg = 63;    val = ((reg1 & 0x0000003F) << 8) | (reg & 0x0000003F);    MT_DCR(AUD_ATTEN_VAL_REAR, val);    reg1 = pAudVol->center;    reg = pAudVol->lfe;    if (reg1 > 63)        reg1 = 63;    if (reg > 63)        reg = 63;    val = ((reg1 & 0x0000003F) << 8) | (reg & 0x0000003F);    MT_DCR(AUD_ATTEN_VAL_CENTER, val);}void aud_atom_set_channel(audChannel_t channel){    unsigned long reg;    reg = MF_DCR(AUD_CTRL1) & (~DECOD_AUD_CTRL1_CHANNEL_MASK);    switch (channel)    {        case AUD_CHANNEL_STEREO:            MT_DCR(AUD_CTRL1, reg | DECOD_AUD_CTRL1_STEREO);            break;        case AUD_CHANNEL_MONOLEFT:            MT_DCR(AUD_CTRL1, reg | DECOD_AUD_CTRL1_MONO_LEFT);            break;        case AUD_CHANNEL_MONORIGHT:            MT_DCR(AUD_CTRL1, reg | DECOD_AUD_CTRL1_MONO_RIGHT);            break;    }}

⌨️ 快捷键说明

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