decode_4to1.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. /*
  2. * Mpeg Layer-1,2,3 audio decoder
  3. * ------------------------------
  4. * copyright (c) 1995,1996,1997 by Michael Hipp, All rights reserved.
  5. * See also 'README'
  6. * version for slower machines .. decodes only every fourth sample
  7. * dunno why it sounds THIS annoying (maybe we should adapt the window?)
  8. * absolutely not optimized for this operation
  9. */
  10. #include <stdlib.h>
  11. #include <math.h>
  12. #include <string.h>
  13. #include "mpg123.h"
  14. #define WRITE_SAMPLE(samples,sum,clip) \
  15. if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \
  16. else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \
  17. else { *(samples) = sum; }
  18. int synth_4to1_8bit(real *bandPtr,int channel,unsigned char *samples,int *pnt)
  19. {
  20. short samples_tmp[16];
  21. short *tmp1 = samples_tmp + channel;
  22. int i,ret;
  23. int pnt1 = 0;
  24. ret = synth_4to1(bandPtr,channel,(unsigned char *) samples_tmp,&pnt1);
  25. samples += channel + *pnt;
  26. for(i=0;i<8;i++) {
  27. *samples = conv16to8[*tmp1>>AUSHIFT];
  28. samples += 2;
  29. tmp1 += 2;
  30. }
  31. *pnt += 16;
  32. return ret;
  33. }
  34. int synth_4to1_8bit_mono(real *bandPtr,unsigned char *samples,int *pnt)
  35. {
  36. short samples_tmp[16];
  37. short *tmp1 = samples_tmp;
  38. int i,ret;
  39. int pnt1 = 0;
  40. ret = synth_4to1(bandPtr,0,(unsigned char *) samples_tmp,&pnt1);
  41. samples += *pnt;
  42. for(i=0;i<8;i++) {
  43. *samples++ = conv16to8[*tmp1>>AUSHIFT];
  44. tmp1 += 2;
  45. }
  46. *pnt += 8;
  47. return ret;
  48. }
  49. int synth_4to1_8bit_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
  50. {
  51. short samples_tmp[16];
  52. short *tmp1 = samples_tmp;
  53. int i,ret;
  54. int pnt1 = 0;
  55. ret = synth_4to1(bandPtr,0,(unsigned char *) samples_tmp,&pnt1);
  56. samples += *pnt;
  57. for(i=0;i<8;i++) {
  58. *samples++ = conv16to8[*tmp1>>AUSHIFT];
  59. *samples++ = conv16to8[*tmp1>>AUSHIFT];
  60. tmp1 += 2;
  61. }
  62. *pnt += 16;
  63. return ret;
  64. }
  65. int synth_4to1_mono(real *bandPtr,unsigned char *samples,int *pnt)
  66. {
  67. short samples_tmp[16];
  68. short *tmp1 = samples_tmp;
  69. int i,ret;
  70. int pnt1 = 0;
  71. ret = synth_4to1(bandPtr,0,(unsigned char *) samples_tmp,&pnt1);
  72. samples += *pnt;
  73. for(i=0;i<8;i++) {
  74. *( (short *)samples) = *tmp1;
  75. samples += 2;
  76. tmp1 += 2;
  77. }
  78. *pnt += 16;
  79. return ret;
  80. }
  81. int synth_4to1_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
  82. {
  83. int i,ret;
  84. ret = synth_4to1(bandPtr,0,samples,pnt);
  85. samples = samples + *pnt - 32;
  86. for(i=0;i<8;i++) {
  87. ((short *)samples)[1] = ((short *)samples)[0];
  88. samples+=4;
  89. }
  90. return ret;
  91. }
  92. int synth_4to1(real *bandPtr,int channel,unsigned char *out,int *pnt)
  93. {
  94. static real buffs[2][2][0x110];
  95. static const int step = 2;
  96. static int bo = 1;
  97. short *samples = (short *) (out + *pnt);
  98. real *b0,(*buf)[0x110];
  99. int clip = 0;
  100. int bo1;
  101. if(equalfile)
  102. do_equalizer(bandPtr,channel);
  103. if(!channel) {
  104. bo--;
  105. bo &= 0xf;
  106. buf = buffs[0];
  107. }
  108. else {
  109. samples++;
  110. buf = buffs[1];
  111. }
  112. if(bo & 0x1) {
  113. b0 = buf[0];
  114. bo1 = bo;
  115. dct64(buf[1]+((bo+1)&0xf),buf[0]+bo,bandPtr);
  116. }
  117. else {
  118. b0 = buf[1];
  119. bo1 = bo+1;
  120. dct64(buf[0]+bo,buf[1]+bo+1,bandPtr);
  121. }
  122. {
  123. register int j;
  124. real *window = decwin + 16 - bo1;
  125. for (j=4;j;j--,b0+=0x30,window+=0x70)
  126. {
  127. real sum;
  128. sum = *window++ * *b0++;
  129. sum -= *window++ * *b0++;
  130. sum += *window++ * *b0++;
  131. sum -= *window++ * *b0++;
  132. sum += *window++ * *b0++;
  133. sum -= *window++ * *b0++;
  134. sum += *window++ * *b0++;
  135. sum -= *window++ * *b0++;
  136. sum += *window++ * *b0++;
  137. sum -= *window++ * *b0++;
  138. sum += *window++ * *b0++;
  139. sum -= *window++ * *b0++;
  140. sum += *window++ * *b0++;
  141. sum -= *window++ * *b0++;
  142. sum += *window++ * *b0++;
  143. sum -= *window++ * *b0++;
  144. WRITE_SAMPLE(samples,sum,clip); samples += step;
  145. #if 0
  146. WRITE_SAMPLE(samples,sum,clip); samples += step;
  147. WRITE_SAMPLE(samples,sum,clip); samples += step;
  148. WRITE_SAMPLE(samples,sum,clip); samples += step;
  149. #endif
  150. }
  151. {
  152. real sum;
  153. sum = window[0x0] * b0[0x0];
  154. sum += window[0x2] * b0[0x2];
  155. sum += window[0x4] * b0[0x4];
  156. sum += window[0x6] * b0[0x6];
  157. sum += window[0x8] * b0[0x8];
  158. sum += window[0xA] * b0[0xA];
  159. sum += window[0xC] * b0[0xC];
  160. sum += window[0xE] * b0[0xE];
  161. WRITE_SAMPLE(samples,sum,clip); samples += step;
  162. #if 0
  163. WRITE_SAMPLE(samples,sum,clip); samples += step;
  164. WRITE_SAMPLE(samples,sum,clip); samples += step;
  165. WRITE_SAMPLE(samples,sum,clip); samples += step;
  166. #endif
  167. b0-=0x40,window-=0x80;
  168. }
  169. window += bo1<<1;
  170. for (j=3;j;j--,b0-=0x50,window-=0x70)
  171. {
  172. real sum;
  173. sum = -*(--window) * *b0++;
  174. sum -= *(--window) * *b0++;
  175. sum -= *(--window) * *b0++;
  176. sum -= *(--window) * *b0++;
  177. sum -= *(--window) * *b0++;
  178. sum -= *(--window) * *b0++;
  179. sum -= *(--window) * *b0++;
  180. sum -= *(--window) * *b0++;
  181. sum -= *(--window) * *b0++;
  182. sum -= *(--window) * *b0++;
  183. sum -= *(--window) * *b0++;
  184. sum -= *(--window) * *b0++;
  185. sum -= *(--window) * *b0++;
  186. sum -= *(--window) * *b0++;
  187. sum -= *(--window) * *b0++;
  188. sum -= *(--window) * *b0++;
  189. WRITE_SAMPLE(samples,sum,clip); samples += step;
  190. #if 0
  191. WRITE_SAMPLE(samples,sum,clip); samples += step;
  192. WRITE_SAMPLE(samples,sum,clip); samples += step;
  193. WRITE_SAMPLE(samples,sum,clip); samples += step;
  194. #endif
  195. }
  196. }
  197. *pnt += 32;
  198. return clip;
  199. }