PageRenderTime 39ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/ac3_function/org/si/sion/effector/SiEffectDownSampler.as

http://cainclass.googlecode.com/
ActionScript | 212 lines | 168 code | 18 blank | 26 comment | 17 complexity | 981e615742b851da74c2c51ae9c1ae88 MD5 | raw file
  1. //----------------------------------------------------------------------------------------------------
  2. // Down sampler
  3. // Copyright (c) 2009 keim All rights reserved.
  4. // Distributed under BSD-style license (see org.si.license.txt).
  5. //----------------------------------------------------------------------------------------------------
  6. package org.si.sion.effector {
  7. /** Down sampler. */
  8. public class SiEffectDownSampler extends SiEffectBase
  9. {
  10. // variables
  11. //------------------------------------------------------------
  12. private var _freqShift:int = 0;
  13. private var _bitConv0:Number = 1;
  14. private var _bitConv1:Number = 1;
  15. private var _channelCount:int = 2;
  16. // constructor
  17. //------------------------------------------------------------
  18. /** Constructor.
  19. * @param freqShift frequency shift 0=44.1kHz, 1=22.05kHz, 2=11.025kHz.
  20. * @param bitRate bit rate of the sample
  21. * @param channelCount channel count 1=monoral, 2=stereo
  22. */
  23. function SiEffectDownSampler(freqShift:int=0, bitRate:int=16, channelCount:int=2)
  24. {
  25. setParameters(freqShift, bitRate, channelCount);
  26. }
  27. /** set parameter
  28. * @param freqShift frequency shift 0=44.1kHz, 1=22.05kHz, 2=11.025kHz.
  29. * @param bitRate bit rate of the sample
  30. * @param channelCount channel count 1=monoral, 2=stereo
  31. */
  32. public function setParameters(freqShift:int=0, bitRate:int=16, channelCount:int=2) : void
  33. {
  34. _freqShift = freqShift;
  35. _bitConv0 = 1<<bitRate;
  36. _bitConv1 = 1/_bitConv0;
  37. _channelCount = channelCount;
  38. }
  39. // callback functions
  40. //------------------------------------------------------------
  41. /** @private */
  42. override public function initialize() : void
  43. {
  44. setParameters();
  45. }
  46. /** @private */
  47. override public function mmlCallback(args:Vector.<Number>) : void
  48. {
  49. setParameters((!isNaN(args[0])) ? args[0] : 0,
  50. (!isNaN(args[1])) ? args[1] : 16,
  51. (!isNaN(args[2])) ? args[2] : 2);
  52. }
  53. /** @private */
  54. override public function prepareProcess() : int
  55. {
  56. return 2;
  57. }
  58. /** @private */
  59. override public function process(channels:int, buffer:Vector.<Number>, startIndex:int, length:int) : int
  60. {
  61. startIndex <<= 1;
  62. length <<= 1;
  63. var i:int, j:int, jmax:int, bc0:Number, l:Number, r:Number, imax:int=startIndex+length;
  64. if (_channelCount == 1) {
  65. switch (_freqShift) {
  66. case 0:
  67. bc0 = 0.5 * _bitConv0;
  68. for (i=startIndex; i<imax;) {
  69. l = buffer[i]; i++;
  70. l += buffer[i]; i--;
  71. l = (int(l * bc0)) * _bitConv1;
  72. buffer[i] = l; i++;
  73. buffer[i] = l; i++;
  74. }
  75. break;
  76. case 1:
  77. bc0 = 0.25 * _bitConv0;
  78. for (i=startIndex; i<imax;) {
  79. l = buffer[i]; i++;
  80. l += buffer[i]; i++;
  81. l += buffer[i]; i++;
  82. l += buffer[i]; i-=3;
  83. l = (int(l * bc0)) * _bitConv1;
  84. buffer[i] = l; i++;
  85. buffer[i] = l; i++;
  86. buffer[i] = l; i++;
  87. buffer[i] = l; i++;
  88. }
  89. break;
  90. case 2:
  91. bc0 = 0.125 * _bitConv0;
  92. for (i=startIndex; i<imax;) {
  93. l = buffer[i]; i++;
  94. l += buffer[i]; i++;
  95. l += buffer[i]; i++;
  96. l += buffer[i]; i++;
  97. l += buffer[i]; i++;
  98. l += buffer[i]; i++;
  99. l += buffer[i]; i++;
  100. l += buffer[i]; i-=7;
  101. l = (int(l * bc0)) * _bitConv1;
  102. buffer[i] = l; i++;
  103. buffer[i] = l; i++;
  104. buffer[i] = l; i++;
  105. buffer[i] = l; i++;
  106. buffer[i] = l; i++;
  107. buffer[i] = l; i++;
  108. buffer[i] = l; i++;
  109. buffer[i] = l; i++;
  110. }
  111. break;
  112. default:
  113. jmax = 2<<_freqShift;
  114. bc0 = (1/jmax) * _bitConv0;
  115. for (i=startIndex; i<imax;) {
  116. for (j=0, l=0; j<jmax; j++, i++) {
  117. l += buffer[i];
  118. }
  119. i -= jmax;
  120. l = (int(l * bc0)) * _bitConv1;
  121. for (j=0; j<jmax; j++, i++) {
  122. buffer[i] = l;
  123. }
  124. }
  125. break;
  126. }
  127. } else {
  128. switch (_freqShift) {
  129. case 0:
  130. for (i=startIndex; i<imax; i++) {
  131. buffer[i] = (int(buffer[i] * _bitConv0)) * _bitConv1;
  132. }
  133. break;
  134. case 1:
  135. bc0 = 0.5 * _bitConv0;
  136. for (i=startIndex; i<imax;) {
  137. l = buffer[i]; i++;
  138. r = buffer[i]; i++;
  139. l += buffer[i]; i++;
  140. r += buffer[i]; i-=3;
  141. l = (int(l * bc0)) * _bitConv1;
  142. r = (int(r * bc0)) * _bitConv1;
  143. buffer[i] = l; i++;
  144. buffer[i] = r; i++;
  145. buffer[i] = l; i++;
  146. buffer[i] = r; i++;
  147. }
  148. break;
  149. case 2:
  150. bc0 = 0.25 * _bitConv0;
  151. for (i=startIndex; i<imax;) {
  152. l = buffer[i]; i++;
  153. r = buffer[i]; i++;
  154. l += buffer[i]; i++;
  155. r += buffer[i]; i++;
  156. l += buffer[i]; i++;
  157. r += buffer[i]; i++;
  158. l += buffer[i]; i++;
  159. r += buffer[i]; i-=7;
  160. l = (int(l * bc0)) * _bitConv1;
  161. r = (int(r * bc0)) * _bitConv1;
  162. buffer[i] = l; i++;
  163. buffer[i] = r; i++;
  164. buffer[i] = l; i++;
  165. buffer[i] = r; i++;
  166. buffer[i] = l; i++;
  167. buffer[i] = r; i++;
  168. buffer[i] = l; i++;
  169. buffer[i] = r; i++;
  170. }
  171. break;
  172. default:
  173. jmax = 1<<_freqShift;
  174. bc0 = (1/jmax) * _bitConv0;
  175. for (i=startIndex; i<imax;) {
  176. for (j=0, l=0, r=0; j<jmax; j++, i++) {
  177. l += buffer[i];
  178. r += buffer[i];
  179. }
  180. i -= jmax;
  181. l = (int(l * bc0)) * _bitConv1;
  182. r = (int(r * bc0)) * _bitConv1;
  183. for (j=0; j<jmax; j++) {
  184. buffer[i] = l; i++;
  185. buffer[i] = r; i++;
  186. }
  187. }
  188. break;
  189. }
  190. }
  191. return _channelCount;
  192. }
  193. }
  194. }