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

📄 synth.c

📁 基于mips架构的ATI-XILLEON 226的mp3解码程序
💻 C
📖 第 1 页 / 共 2 页
字号:
  t134 = (t168 * 2) - t104;



  t120 = (t134 * 2) - t105;



  /* 14 */ hi[ 1][slot] = SHIFT(t120);



  t135 = (MUL(t118 - t119, costab16) * 2) - t120;



  /* 18 */ lo[ 2][slot] = SHIFT(t135);



  t169 = (MUL(t132 - t133, costab16) * 2) - t134;



  t151 = (t169 * 2) - t135;



  /* 22 */ lo[ 6][slot] = SHIFT(t151);



  t170 = (((MUL(t148 - t149, costab16) * 2) - t150) * 2) - t151;



  /* 26 */ lo[10][slot] = SHIFT(t170);

  /* 30 */ lo[14][slot] =

	     SHIFT((((((MUL(t166 - t167, costab16) * 2) -

		       t168) * 2) - t169) * 2) - t170);



  t171 = MUL(t106 - t107, costab8);

  t172 = MUL(t108 - t109, costab24);

  t173 = t171 + t172;



  t138 = (t173 * 2) - t110;



  t123 = (t138 * 2) - t111;



  t139 = (MUL(t121 - t122, costab16) * 2) - t123;



  t117 = (t123 * 2) - t112;



  /* 15 */ hi[ 0][slot] = SHIFT(t117);



  t124 = (MUL(t115 - t116, costab16) * 2) - t117;



  /* 17 */ lo[ 1][slot] = SHIFT(t124);



  t131 = (t139 * 2) - t124;



  /* 19 */ lo[ 3][slot] = SHIFT(t131);



  t140 = (t164 * 2) - t131;



  /* 21 */ lo[ 5][slot] = SHIFT(t140);



  t174 = (MUL(t136 - t137, costab16) * 2) - t138;



  t155 = (t174 * 2) - t139;



  t147 = (t155 * 2) - t140;



  /* 23 */ lo[ 7][slot] = SHIFT(t147);



  t156 = (((MUL(t144 - t145, costab16) * 2) - t146) * 2) - t147;



  /* 25 */ lo[ 9][slot] = SHIFT(t156);



  t175 = (((MUL(t152 - t153, costab16) * 2) - t154) * 2) - t155;



  t165 = (t175 * 2) - t156;



  /* 27 */ lo[11][slot] = SHIFT(t165);



  t176 = (((((MUL(t161 - t162, costab16) * 2) -

	     t163) * 2) - t164) * 2) - t165;



  /* 29 */ lo[13][slot] = SHIFT(t176);

  /* 31 */ lo[15][slot] =

	     SHIFT((((((((MUL(t171 - t172, costab16) * 2) -

			 t173) * 2) - t174) * 2) - t175) * 2) - t176);



  /*

   * Totals:

   *  80 multiplies

   *  80 additions

   * 119 subtractions

   *  49 shifts (not counting SSO)

   */

}



# undef MUL

# undef SHIFT



/* third SSO shift and/or D[] optimization preshift */



# if defined(OPT_SSO)

#  if MAD_F_FRACBITS != 28

#   error "MAD_F_FRACBITS must be 28 to use OPT_SSO"

#  endif

#  define ML0(hi, lo, x, y)	((lo)  = (x) * (y))

#  define MLA(hi, lo, x, y)	((lo) += (x) * (y))

#  define MLN(hi, lo)		((lo)  = -(lo))

#  define MLZ(hi, lo)		((void) (hi), (mad_fixed_t) (lo))

#  define SHIFT(x)		((x) >> 2)

#  define PRESHIFT(x)		((MAD_F(x) + (1L << 13)) >> 14)

# else

#  define ML0(hi, lo, x, y)	MAD_F_ML0((hi), (lo), (x), (y))

#  define MLA(hi, lo, x, y)	MAD_F_MLA((hi), (lo), (x), (y))

#  define MLN(hi, lo)		MAD_F_MLN((hi), (lo))

#  define MLZ(hi, lo)		MAD_F_MLZ((hi), (lo))

#  define SHIFT(x)		(x)

#  if defined(MAD_F_SCALEBITS)

#   undef  MAD_F_SCALEBITS

#   define MAD_F_SCALEBITS	(MAD_F_FRACBITS - 12)

#   define PRESHIFT(x)		(MAD_F(x) >> 12)

#  else

#   define PRESHIFT(x)		MAD_F(x)

#  endif

# endif



static

mad_fixed_t const D[17][32] = {

# include "D.dat"

};



# if defined(ASO_SYNTH)

void synth_full(struct mad_synth *, struct mad_frame const *,

		unsigned int, unsigned int);

# else

/*

 * NAME:	synth->full()

 * DESCRIPTION:	perform full frequency PCM synthesis

 */

static

void synth_full(struct mad_synth *synth, struct mad_frame const *frame,

		unsigned int nch, unsigned int ns)

{

  unsigned int phase, ch, s, sb, pe, po;

  mad_fixed_t *pcm1, *pcm2, (*filter)[2][2][16][8];

  mad_fixed_t const (*sbsample)[36][32];

  register mad_fixed_t (*fe)[8], (*fx)[8], (*fo)[8];

  register mad_fixed_t const (*Dptr)[32], *ptr;

  register mad_fixed64hi_t hi;

  register mad_fixed64lo_t lo;



  for (ch = 0; ch < nch; ++ch) {

    sbsample = &frame->sbsample[ch];

    filter   = &synth->filter[ch];

    phase    = synth->phase;

    pcm1     = synth->pcm.samples[ch];



    for (s = 0; s < ns; ++s) {

      dct32((*sbsample)[s], phase >> 1,

	    (*filter)[0][phase & 1], (*filter)[1][phase & 1]);



      pe = phase & ~1;

      po = ((phase - 1) & 0xf) | 1;



      /* calculate 32 samples */



      fe = &(*filter)[0][ phase & 1][0];

      fx = &(*filter)[0][~phase & 1][0];

      fo = &(*filter)[1][~phase & 1][0];



      Dptr = &D[0];



      ptr = *Dptr + po;

      ML0(hi, lo, (*fx)[0], ptr[ 0]);

      MLA(hi, lo, (*fx)[1], ptr[14]);

      MLA(hi, lo, (*fx)[2], ptr[12]);

      MLA(hi, lo, (*fx)[3], ptr[10]);

      MLA(hi, lo, (*fx)[4], ptr[ 8]);

      MLA(hi, lo, (*fx)[5], ptr[ 6]);

      MLA(hi, lo, (*fx)[6], ptr[ 4]);

      MLA(hi, lo, (*fx)[7], ptr[ 2]);

      MLN(hi, lo);



      ptr = *Dptr + pe;

      MLA(hi, lo, (*fe)[0], ptr[ 0]);

      MLA(hi, lo, (*fe)[1], ptr[14]);

      MLA(hi, lo, (*fe)[2], ptr[12]);

      MLA(hi, lo, (*fe)[3], ptr[10]);

      MLA(hi, lo, (*fe)[4], ptr[ 8]);

      MLA(hi, lo, (*fe)[5], ptr[ 6]);

      MLA(hi, lo, (*fe)[6], ptr[ 4]);

      MLA(hi, lo, (*fe)[7], ptr[ 2]);



      *pcm1++ = SHIFT(MLZ(hi, lo));



      pcm2 = pcm1 + 30;



      for (sb = 1; sb < 16; ++sb) {

	++fe;

	++Dptr;



	/* D[32 - sb][i] == -D[sb][31 - i] */



	ptr = *Dptr + po;

	ML0(hi, lo, (*fo)[0], ptr[ 0]);

	MLA(hi, lo, (*fo)[1], ptr[14]);

	MLA(hi, lo, (*fo)[2], ptr[12]);

	MLA(hi, lo, (*fo)[3], ptr[10]);

	MLA(hi, lo, (*fo)[4], ptr[ 8]);

	MLA(hi, lo, (*fo)[5], ptr[ 6]);

	MLA(hi, lo, (*fo)[6], ptr[ 4]);

	MLA(hi, lo, (*fo)[7], ptr[ 2]);

	MLN(hi, lo);



	ptr = *Dptr + pe;

	MLA(hi, lo, (*fe)[7], ptr[ 2]);

	MLA(hi, lo, (*fe)[6], ptr[ 4]);

	MLA(hi, lo, (*fe)[5], ptr[ 6]);

	MLA(hi, lo, (*fe)[4], ptr[ 8]);

	MLA(hi, lo, (*fe)[3], ptr[10]);

	MLA(hi, lo, (*fe)[2], ptr[12]);

	MLA(hi, lo, (*fe)[1], ptr[14]);

	MLA(hi, lo, (*fe)[0], ptr[ 0]);



	*pcm1++ = SHIFT(MLZ(hi, lo));



	ptr = *Dptr - pe;

	ML0(hi, lo, (*fe)[0], ptr[31 - 16]);

	MLA(hi, lo, (*fe)[1], ptr[31 - 14]);

	MLA(hi, lo, (*fe)[2], ptr[31 - 12]);

	MLA(hi, lo, (*fe)[3], ptr[31 - 10]);

	MLA(hi, lo, (*fe)[4], ptr[31 -  8]);

	MLA(hi, lo, (*fe)[5], ptr[31 -  6]);

	MLA(hi, lo, (*fe)[6], ptr[31 -  4]);

	MLA(hi, lo, (*fe)[7], ptr[31 -  2]);



	ptr = *Dptr - po;

	MLA(hi, lo, (*fo)[7], ptr[31 -  2]);

	MLA(hi, lo, (*fo)[6], ptr[31 -  4]);

	MLA(hi, lo, (*fo)[5], ptr[31 -  6]);

	MLA(hi, lo, (*fo)[4], ptr[31 -  8]);

	MLA(hi, lo, (*fo)[3], ptr[31 - 10]);

	MLA(hi, lo, (*fo)[2], ptr[31 - 12]);

	MLA(hi, lo, (*fo)[1], ptr[31 - 14]);

	MLA(hi, lo, (*fo)[0], ptr[31 - 16]);



	*pcm2-- = SHIFT(MLZ(hi, lo));



	++fo;

      }



      ++Dptr;



      ptr = *Dptr + po;

      ML0(hi, lo, (*fo)[0], ptr[ 0]);

      MLA(hi, lo, (*fo)[1], ptr[14]);

      MLA(hi, lo, (*fo)[2], ptr[12]);

      MLA(hi, lo, (*fo)[3], ptr[10]);

      MLA(hi, lo, (*fo)[4], ptr[ 8]);

      MLA(hi, lo, (*fo)[5], ptr[ 6]);

      MLA(hi, lo, (*fo)[6], ptr[ 4]);

      MLA(hi, lo, (*fo)[7], ptr[ 2]);



      *pcm1 = SHIFT(-MLZ(hi, lo));

      pcm1 += 16;



      phase = (phase + 1) % 16;

    }

  }

}

# endif



/*

 * NAME:	synth->half()

 * DESCRIPTION:	perform half frequency PCM synthesis

 */

static

void synth_half(struct mad_synth *synth, struct mad_frame const *frame,

		unsigned int nch, unsigned int ns)

{

  unsigned int phase, ch, s, sb, pe, po;

  mad_fixed_t *pcm1, *pcm2, (*filter)[2][2][16][8];

  mad_fixed_t const (*sbsample)[36][32];

  register mad_fixed_t (*fe)[8], (*fx)[8], (*fo)[8];

  register mad_fixed_t const (*Dptr)[32], *ptr;

  register mad_fixed64hi_t hi;

  register mad_fixed64lo_t lo;



  for (ch = 0; ch < nch; ++ch) {

    sbsample = &frame->sbsample[ch];

    filter   = &synth->filter[ch];

    phase    = synth->phase;

    pcm1     = synth->pcm.samples[ch];



    for (s = 0; s < ns; ++s) {

      dct32((*sbsample)[s], phase >> 1,

	    (*filter)[0][phase & 1], (*filter)[1][phase & 1]);



      pe = phase & ~1;

      po = ((phase - 1) & 0xf) | 1;



      /* calculate 16 samples */



      fe = &(*filter)[0][ phase & 1][0];

      fx = &(*filter)[0][~phase & 1][0];

      fo = &(*filter)[1][~phase & 1][0];



      Dptr = &D[0];



      ptr = *Dptr + po;

      ML0(hi, lo, (*fx)[0], ptr[ 0]);

      MLA(hi, lo, (*fx)[1], ptr[14]);

      MLA(hi, lo, (*fx)[2], ptr[12]);

      MLA(hi, lo, (*fx)[3], ptr[10]);

      MLA(hi, lo, (*fx)[4], ptr[ 8]);

      MLA(hi, lo, (*fx)[5], ptr[ 6]);

      MLA(hi, lo, (*fx)[6], ptr[ 4]);

      MLA(hi, lo, (*fx)[7], ptr[ 2]);

      MLN(hi, lo);



      ptr = *Dptr + pe;

      MLA(hi, lo, (*fe)[0], ptr[ 0]);

      MLA(hi, lo, (*fe)[1], ptr[14]);

      MLA(hi, lo, (*fe)[2], ptr[12]);

      MLA(hi, lo, (*fe)[3], ptr[10]);

      MLA(hi, lo, (*fe)[4], ptr[ 8]);

      MLA(hi, lo, (*fe)[5], ptr[ 6]);

      MLA(hi, lo, (*fe)[6], ptr[ 4]);

      MLA(hi, lo, (*fe)[7], ptr[ 2]);



      *pcm1++ = SHIFT(MLZ(hi, lo));



      pcm2 = pcm1 + 14;



      for (sb = 1; sb < 16; ++sb) {

	++fe;

	++Dptr;



	/* D[32 - sb][i] == -D[sb][31 - i] */



	if (!(sb & 1)) {

	  ptr = *Dptr + po;

	  ML0(hi, lo, (*fo)[0], ptr[ 0]);

	  MLA(hi, lo, (*fo)[1], ptr[14]);

	  MLA(hi, lo, (*fo)[2], ptr[12]);

	  MLA(hi, lo, (*fo)[3], ptr[10]);

	  MLA(hi, lo, (*fo)[4], ptr[ 8]);

	  MLA(hi, lo, (*fo)[5], ptr[ 6]);

	  MLA(hi, lo, (*fo)[6], ptr[ 4]);

	  MLA(hi, lo, (*fo)[7], ptr[ 2]);

	  MLN(hi, lo);



	  ptr = *Dptr + pe;

	  MLA(hi, lo, (*fe)[7], ptr[ 2]);

	  MLA(hi, lo, (*fe)[6], ptr[ 4]);

	  MLA(hi, lo, (*fe)[5], ptr[ 6]);

	  MLA(hi, lo, (*fe)[4], ptr[ 8]);

	  MLA(hi, lo, (*fe)[3], ptr[10]);

	  MLA(hi, lo, (*fe)[2], ptr[12]);

	  MLA(hi, lo, (*fe)[1], ptr[14]);

	  MLA(hi, lo, (*fe)[0], ptr[ 0]);



	  *pcm1++ = SHIFT(MLZ(hi, lo));



	  ptr = *Dptr - po;

	  ML0(hi, lo, (*fo)[7], ptr[31 -  2]);

	  MLA(hi, lo, (*fo)[6], ptr[31 -  4]);

	  MLA(hi, lo, (*fo)[5], ptr[31 -  6]);

	  MLA(hi, lo, (*fo)[4], ptr[31 -  8]);

	  MLA(hi, lo, (*fo)[3], ptr[31 - 10]);

	  MLA(hi, lo, (*fo)[2], ptr[31 - 12]);

	  MLA(hi, lo, (*fo)[1], ptr[31 - 14]);

	  MLA(hi, lo, (*fo)[0], ptr[31 - 16]);



	  ptr = *Dptr - pe;

	  MLA(hi, lo, (*fe)[0], ptr[31 - 16]);

	  MLA(hi, lo, (*fe)[1], ptr[31 - 14]);

	  MLA(hi, lo, (*fe)[2], ptr[31 - 12]);

	  MLA(hi, lo, (*fe)[3], ptr[31 - 10]);

	  MLA(hi, lo, (*fe)[4], ptr[31 -  8]);

	  MLA(hi, lo, (*fe)[5], ptr[31 -  6]);

	  MLA(hi, lo, (*fe)[6], ptr[31 -  4]);

	  MLA(hi, lo, (*fe)[7], ptr[31 -  2]);



	  *pcm2-- = SHIFT(MLZ(hi, lo));

	}



	++fo;

      }



      ++Dptr;



      ptr = *Dptr + po;

      ML0(hi, lo, (*fo)[0], ptr[ 0]);

      MLA(hi, lo, (*fo)[1], ptr[14]);

      MLA(hi, lo, (*fo)[2], ptr[12]);

      MLA(hi, lo, (*fo)[3], ptr[10]);

      MLA(hi, lo, (*fo)[4], ptr[ 8]);

      MLA(hi, lo, (*fo)[5], ptr[ 6]);

      MLA(hi, lo, (*fo)[6], ptr[ 4]);

      MLA(hi, lo, (*fo)[7], ptr[ 2]);



      *pcm1 = SHIFT(-MLZ(hi, lo));

      pcm1 += 8;



      phase = (phase + 1) % 16;

    }

  }

}



/*

 * NAME:	synth->frame()

 * DESCRIPTION:	perform PCM synthesis of frame subband samples

 */

void mad_synth_frame(struct mad_synth *synth, struct mad_frame const *frame)

{

  unsigned int nch, ns;

  void (*synth_frame)(struct mad_synth *, struct mad_frame const *,

		      unsigned int, unsigned int);



  nch = MAD_NCHANNELS(&frame->header);

  ns  = MAD_NSBSAMPLES(&frame->header);



  synth->pcm.samplerate = frame->header.samplerate;

  synth->pcm.channels   = nch;

  synth->pcm.length     = 32 * ns;



  synth_frame = synth_full;



  if (frame->options & MAD_OPTION_HALFSAMPLERATE) {

    synth->pcm.samplerate /= 2;

    synth->pcm.length     /= 2;



    synth_frame = synth_half;

  }



  synth_frame(synth, frame, nch, ns);



  synth->phase = (synth->phase + ns) % 16;

}

⌨️ 快捷键说明

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