PageRenderTime 56ms CodeModel.GetById 27ms RepoModel.GetById 1ms app.codeStats 0ms

/src/org/si/sion/module/SiOPMStream.as

https://github.com/rustleson/MotIL
ActionScript | 211 lines | 151 code | 28 blank | 32 comment | 42 complexity | fafedaa3dcf70355a2c4b179ac2c2c5f MD5 | raw file
Possible License(s): GPL-3.0
  1. //----------------------------------------------------------------------------------------------------
  2. // Stream buffer class
  3. // Copyright (c) 2008 keim All rights reserved.
  4. // Distributed under BSD-style license (see org.si.license.txt).
  5. //----------------------------------------------------------------------------------------------------
  6. package org.si.sion.module {
  7. import flash.utils.ByteArray;
  8. import org.si.utils.SLLint;
  9. /** Stream buffer class */
  10. public class SiOPMStream {
  11. // valiables
  12. //--------------------------------------------------
  13. /** number of channels */
  14. public var channels:int = 2;
  15. /** stream buffer */
  16. public var buffer:Vector.<Number> = new Vector.<Number>();
  17. // coefficient of volume/panning
  18. private var _panTable:Vector.<Number>;
  19. private var _i2n:Number;
  20. // constructor
  21. //--------------------------------------------------
  22. /** constructor */
  23. function SiOPMStream()
  24. {
  25. var st:SiOPMTable = SiOPMTable.instance;
  26. _panTable = st.panTable;
  27. _i2n = st.i2n;
  28. }
  29. // operation
  30. //--------------------------------------------------
  31. /** clear buffer */
  32. public function clear() : void
  33. {
  34. var i:int, imax:int = buffer.length;
  35. for (i=0; i<imax; i++) {
  36. buffer[i] = 0;
  37. }
  38. }
  39. /** limit buffered signals between -1 and 1 */
  40. public function limit() : void
  41. {
  42. var n:Number, i:int, imax:int = buffer.length;
  43. for (i=0; i<imax; i++) {
  44. n = buffer[i];
  45. if (n < -1) buffer[i] = -1;
  46. else if (n > 1) buffer[i] = 1;
  47. }
  48. }
  49. /** Quantize buffer by bit rate. */
  50. public function quantize(bitRate:int) : void
  51. {
  52. var i:int, imax:int = buffer.length,
  53. r:Number = 1<<bitRate, ir:Number = 2/r;
  54. for (i=0; i<imax; i++) {
  55. buffer[i] = ((buffer[i] * r) >> 1) * ir;
  56. }
  57. }
  58. /** write buffer by org.si.utils.SLLint */
  59. public function write(pointer:SLLint, start:int, len:int, vol:Number, pan:int) : void
  60. {
  61. var i:int, n:Number, imax:int = (start + len)<<1;
  62. vol *= _i2n;
  63. if (channels == 2) {
  64. // stereo
  65. var volL:Number = _panTable[128-pan] * vol,
  66. volR:Number = _panTable[pan] * vol;
  67. for (i=start<<1; i<imax;) {
  68. n = Number(pointer.i);
  69. buffer[i] += n * volL; i++;
  70. buffer[i] += n * volR; i++;
  71. pointer = pointer.next;
  72. }
  73. } else
  74. if (channels == 1) {
  75. // monoral
  76. for (i=start<<1; i<imax;) {
  77. n = Number(pointer.i) * vol;
  78. buffer[i] += n; i++;
  79. buffer[i] += n; i++;
  80. pointer = pointer.next;
  81. }
  82. }
  83. }
  84. /** write stereo buffer by 2 pipes */
  85. public function writeStereo(pointerL:SLLint, pointerR:SLLint, start:int, len:int, vol:Number, pan:int) : void
  86. {
  87. var i:int, n:Number, imax:int = (start + len)<<1;
  88. vol *= _i2n;
  89. if (channels == 2) {
  90. // stereo
  91. var volL:Number = _panTable[128-pan] * vol,
  92. volR:Number = _panTable[pan] * vol;
  93. for (i=start<<1; i<imax;) {
  94. buffer[i] += Number(pointerL.i) * volL; i++;
  95. buffer[i] += Number(pointerR.i) * volR; i++;
  96. pointerL = pointerL.next;
  97. pointerR = pointerR.next;
  98. }
  99. } else
  100. if (channels == 1) {
  101. // monoral
  102. vol *= 0.5;
  103. for (i=start<<1; i<imax;) {
  104. n = Number(pointerL.i + pointerR.i) * vol;
  105. buffer[i] += n; i++;
  106. buffer[i] += n; i++;
  107. pointerL = pointerL.next;
  108. pointerR = pointerR.next;
  109. }
  110. }
  111. }
  112. /** write buffer by Vector.&lt;Number&gt; */
  113. public function writeVectorNumber(pointer:Vector.<Number>, startPointer:int, startBuffer:int, len:int, vol:Number, pan:int, sampleChannelCount:int) : void
  114. {
  115. var i:int, j:int, n:Number, jmax:int, volL:Number, volR:Number;
  116. if (channels == 2) {
  117. if (sampleChannelCount == 2) {
  118. // stereo data to stereo buffer
  119. volL = _panTable[128-pan] * vol;
  120. volR = _panTable[pan] * vol;
  121. jmax = (startPointer + len)<<1;
  122. for (j=startPointer<<1, i=startBuffer<<1; j<jmax;) {
  123. buffer[i] += pointer[j] * volL; j++; i++;
  124. buffer[i] += pointer[j] * volR; j++; i++;
  125. }
  126. } else {
  127. // monoral data to stereo buffer
  128. volL = _panTable[128-pan] * vol * 0.707;
  129. volR = _panTable[pan] * vol * 0.707;
  130. jmax = startPointer + len;
  131. for (j=startPointer, i=startBuffer<<1; j<jmax; j++) {
  132. n = pointer[j];
  133. buffer[i] += n * volL; i++;
  134. buffer[i] += n * volR; i++;
  135. }
  136. }
  137. } else
  138. if (channels == 1) {
  139. if (sampleChannelCount == 2) {
  140. // stereo data to monoral buffer
  141. jmax = (startPointer + len)<<1;
  142. vol *= 0.5;
  143. for (j=startPointer<<1, i=startBuffer<<1; j<jmax;) {
  144. n = pointer[j]; j++;
  145. n += pointer[j]; j++;
  146. n *= vol;
  147. buffer[i] += n; i++;
  148. buffer[i] += n; i++;
  149. }
  150. } else {
  151. // monoral data to monoral buffer
  152. jmax = startPointer + len;
  153. for (j=startPointer, i=startBuffer<<1; j<jmax; j++) {
  154. n = pointer[j] * vol;
  155. buffer[i] += n; i++;
  156. buffer[i] += n; i++;
  157. }
  158. }
  159. }
  160. }
  161. /** write buffer by ByteArray (stereo only). */
  162. public function writeByteArray(bytes:ByteArray, start:int, len:int, vol:Number) : void
  163. {
  164. var i:int, n:Number, imax:int = (start + len)<<1;
  165. var initPosition:int = bytes.position;
  166. if (channels == 2) {
  167. for (i=start<<1; i<imax; i++) {
  168. buffer[i] += bytes.readFloat() * vol;
  169. }
  170. } else
  171. if (channels == 1) {
  172. // stereo data to monoral buffer
  173. vol *= 0.6;
  174. for (i=start<<1; i<imax;) {
  175. n = (bytes.readFloat() + bytes.readFloat()) * vol;
  176. buffer[i] += n; i++;
  177. buffer[i] += n; i++;
  178. }
  179. }
  180. bytes.position = initPosition;
  181. }
  182. }
  183. }