PageRenderTime 47ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

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

https://github.com/watashiwatonydes/ring
ActionScript | 182 lines | 127 code | 26 blank | 29 comment | 35 complexity | 7c192ba5ef5e7a53f70a29bcbc8ce966 MD5 | raw file
  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 buffer by Vector.&lt;Number&gt; */
  85. public function writeVectorNumber(pointer:Vector.<Number>, startPointer:int, startBuffer:int, len:int, vol:Number, pan:int, sampleChannelCount:int) : void
  86. {
  87. var i:int, j:int, n:Number, jmax:int, volL:Number, volR:Number;
  88. if (channels == 2) {
  89. if (sampleChannelCount == 2) {
  90. // stereo data to stereo buffer
  91. vol *= 1.4142135623730951;
  92. volL = _panTable[128-pan] * vol;
  93. volR = _panTable[pan] * vol;
  94. jmax = (startPointer + len)<<1;
  95. for (j=startPointer<<1, i=startBuffer<<1; j<jmax;) {
  96. buffer[i] += pointer[j] * volL; j++; i++;
  97. buffer[i] += pointer[j] * volR; j++; i++;
  98. }
  99. } else {
  100. // monoral data to stereo buffer
  101. volL = _panTable[128-pan] * vol;
  102. volR = _panTable[pan] * vol;
  103. jmax = startPointer + len;
  104. for (j=startPointer, i=startBuffer<<1; j<jmax; j++) {
  105. n = pointer[j];
  106. buffer[i] += n * volL; i++;
  107. buffer[i] += n * volR; i++;
  108. }
  109. }
  110. } else
  111. if (channels == 1) {
  112. if (sampleChannelCount == 2) {
  113. // stereo data to monoral buffer
  114. jmax = (startPointer + len)<<1;
  115. vol *= 0.6;
  116. for (j=startPointer<<1, i=startBuffer<<1; j<jmax;) {
  117. n = pointer[j]; j++;
  118. n += pointer[j]; j++;
  119. n *= vol;
  120. buffer[i] += n; i++;
  121. buffer[i] += n; i++;
  122. }
  123. } else {
  124. // monoral data to monoral buffer
  125. jmax = startPointer + len;
  126. for (j=startPointer, i=startBuffer<<1; j<jmax; j++) {
  127. n = pointer[j] * vol;
  128. buffer[i] += n; i++;
  129. buffer[i] += n; i++;
  130. }
  131. }
  132. }
  133. }
  134. /** write buffer by ByteArray (stereo only). */
  135. public function writeByteArray(bytes:ByteArray, start:int, len:int, vol:Number) : void
  136. {
  137. var i:int, n:Number, imax:int = (start + len)<<1;
  138. var initPosition:int = bytes.position;
  139. if (channels == 2) {
  140. for (i=start<<1; i<imax; i++) {
  141. buffer[i] += bytes.readFloat() * vol;
  142. }
  143. } else
  144. if (channels == 1) {
  145. // stereo data to monoral buffer
  146. vol *= 0.6;
  147. for (i=start<<1; i<imax;) {
  148. n = (bytes.readFloat() + bytes.readFloat()) * vol;
  149. buffer[i] += n; i++;
  150. buffer[i] += n; i++;
  151. }
  152. }
  153. bytes.position = initPosition;
  154. }
  155. }
  156. }