PageRenderTime 41ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

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

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