Obuffer.java 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /*
  2. * 11/19/04 1.0 moved to LGPL.
  3. * 12/12/99 Added appendSamples() method for efficiency. MDM.
  4. * 15/02/99 ,Java Conversion by E.B ,ebsp@iname.com, JavaLayer
  5. *
  6. * Declarations for output buffer, includes operating system
  7. * implementation of the virtual Obuffer. Optional routines
  8. * enabling seeks and stops added by Jeff Tsay.
  9. *
  10. * @(#) obuffer.h 1.8, last edit: 6/15/94 16:51:56
  11. * @(#) Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de)
  12. * @(#) Berlin University of Technology
  13. *
  14. * Idea and first implementation for u-law output with fast downsampling by
  15. * Jim Boucher (jboucher@flash.bu.edu)
  16. *
  17. * LinuxObuffer class written by
  18. * Louis P. Kruger (lpkruger@phoenix.princeton.edu)
  19. *-----------------------------------------------------------------------
  20. * This program is free software; you can redistribute it and/or modify
  21. * it under the terms of the GNU Library General Public License as published
  22. * by the Free Software Foundation; either version 2 of the License, or
  23. * (at your option) any later version.
  24. *
  25. * This program is distributed in the hope that it will be useful,
  26. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  27. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  28. * GNU Library General Public License for more details.
  29. *
  30. * You should have received a copy of the GNU Library General Public
  31. * License along with this program; if not, write to the Free Software
  32. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  33. *----------------------------------------------------------------------
  34. */
  35. package javazoom.jl.decoder;
  36. /**
  37. * Base Class for audio output.
  38. */
  39. public abstract class Obuffer
  40. {
  41. public static final int OBUFFERSIZE = 2 * 1152; // max. 2 * 1152 samples per frame
  42. public static final int MAXCHANNELS = 2; // max. number of channels
  43. /**
  44. * Takes a 16 Bit PCM sample.
  45. */
  46. public abstract void append(int channel, short value);
  47. /**
  48. * Accepts 32 new PCM samples.
  49. */
  50. public void appendSamples(int channel, float[] f)
  51. {
  52. short s;
  53. for (int i=0; i<32;)
  54. {
  55. s = clip(f[i++]);
  56. append(channel, s);
  57. }
  58. }
  59. /**
  60. * Clip Sample to 16 Bits
  61. */
  62. private final short clip(float sample)
  63. {
  64. return ((sample > 32767.0f) ? 32767 :
  65. ((sample < -32768.0f) ? -32768 :
  66. (short) sample));
  67. }
  68. /**
  69. * Write the samples to the file or directly to the audio hardware.
  70. */
  71. public abstract void write_buffer(int val);
  72. public abstract void close();
  73. /**
  74. * Clears all data in the buffer (for seeking).
  75. */
  76. public abstract void clear_buffer();
  77. /**
  78. * Notify the buffer that the user has stopped the stream.
  79. */
  80. public abstract void set_stop_flag();
  81. }