Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4469409

AudioFormat.getFrameSize() sometimes returns incorrect value

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: P4 P4
    • 1.4.0
    • 1.4.0
    • client-libs
    • beta2
    • x86
    • windows_98
    • Verified

      Name: bsC130419 Date: 06/13/2001


      java version "1.4.0-beta"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-beta-b65)
      Java HotSpot(TM) Client VM (build 1.4.0-beta-b65, mixed mode)

      I ran the following program on my computer:

      import javax.sound.sampled.*;

      class FrameSizeTest {
        public static void main(String[] args) {
          Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();
          for (int i = 0; i < mixerInfo.length; i++) {
            Mixer mixer = AudioSystem.getMixer(mixerInfo[i]);
            System.out.println(mixer);
            Line.Info[] lineinfo = mixer.getSourceLineInfo();
            for (int j = 0; j < lineinfo.length; j++) {
              System.out.println(" " + lineinfo[j]);
              try {
                AudioFormat[] formats = ((DataLine.Info)lineinfo[j]).getFormats();
                for (int k = 0; k < formats.length; k++) {
                  System.out.println(" " + formats[k] + ", getFrameSize() returns "
      + formats[k].getFrameSize());
                }
              } catch (ClassCastException e) {
              }
            }
          }
        }
      }



      And the program printed the following:

      com.sun.media.sound.HeadspaceMixer@6e1408
        interface SourceDataLine supporting 8 audio formats
          PCM_SIGNED, -1.0 Hz, 8 bit, mono, audio data, getFrameSize() returns 1
          PCM_UNSIGNED, -1.0 Hz, 8 bit, mono, audio data, getFrameSize() returns 1
          PCM_SIGNED, -1.0 Hz, 8 bit, stereo, audio data, getFrameSize() returns 2
          PCM_UNSIGNED, -1.0 Hz, 8 bit, stereo, audio data, getFrameSize() returns 2
          PCM_SIGNED, -1.0 Hz, 16 bit, mono, big-endian, audio data, getFrameSize()
      returns 2
          PCM_SIGNED, -1.0 Hz, 16 bit, mono, little-endian, audio data, getFrameSize()
      returns 2
          PCM_SIGNED, -1.0 Hz, 16 bit, stereo, big-endian, audio data, getFrameSize()
      returns 4
          PCM_SIGNED, -1.0 Hz, 16 bit, stereo, little-endian, audio data,
      getFrameSize() returns 4
        interface Clip supporting 8 audio formats, and buffers of 0 to 4194304 bytes
          PCM_SIGNED, -1.0 Hz, 8 bit, mono, audio data, getFrameSize() returns 1
          PCM_UNSIGNED, -1.0 Hz, 8 bit, mono, audio data, getFrameSize() returns 1
          PCM_SIGNED, -1.0 Hz, 8 bit, stereo, audio data, getFrameSize() returns 2
          PCM_UNSIGNED, -1.0 Hz, 8 bit, stereo, audio data, getFrameSize() returns 2
          PCM_SIGNED, -1.0 Hz, 16 bit, mono, big-endian, audio data, getFrameSize()
      returns 2
          PCM_SIGNED, -1.0 Hz, 16 bit, mono, little-endian, audio data, getFrameSize()
      returns 2
          PCM_SIGNED, -1.0 Hz, 16 bit, stereo, big-endian, audio data, getFrameSize()
      returns 4
          PCM_SIGNED, -1.0 Hz, 16 bit, stereo, little-endian, audio data,
      getFrameSize() returns 4
      com.sun.media.sound.SimpleInputDevice@3c5982
      com.sun.media.sound.SimpleInputDevice@186fab
      com.sun.media.sound.SimpleInputDevice@4b7453
      com.sun.media.sound.SimpleInputDevice@421495
      com.sun.media.sound.SimpleInputDevice@55550d
      com.sun.media.sound.SimpleInputDevice@42ea3f
      com.sun.media.sound.SimpleOutputDevice@5f5897
        interface SourceDataLine supporting 32 audio formats
          PCM_SIGNED, 8000.0 Hz, 8 bit, mono, audio data, getFrameSize() returns 8
          PCM_UNSIGNED, 8000.0 Hz, 8 bit, mono, audio data, getFrameSize() returns 8
          PCM_SIGNED, 8000.0 Hz, 8 bit, stereo, audio data, getFrameSize() returns 16
          PCM_UNSIGNED, 8000.0 Hz, 8 bit, stereo, audio data, getFrameSize() returns
      16
          PCM_SIGNED, 8000.0 Hz, 16 bit, mono, little-endian, audio data,
      getFrameSize() returns 16
          PCM_SIGNED, 8000.0 Hz, 16 bit, mono, big-endian, audio data, getFrameSize()
      returns 16
          PCM_SIGNED, 8000.0 Hz, 16 bit, stereo, little-endian, audio data,
      getFrameSize() returns 32
          PCM_SIGNED, 8000.0 Hz, 16 bit, stereo, big-endian, audio data,
      getFrameSize() returns 32
          PCM_SIGNED, 11025.0 Hz, 8 bit, mono, audio data, getFrameSize() returns 8
          PCM_UNSIGNED, 11025.0 Hz, 8 bit, mono, audio data, getFrameSize() returns 8
          PCM_SIGNED, 11025.0 Hz, 8 bit, stereo, audio data, getFrameSize() returns 16
          PCM_UNSIGNED, 11025.0 Hz, 8 bit, stereo, audio data, getFrameSize() returns
      16
          PCM_SIGNED, 11025.0 Hz, 16 bit, mono, little-endian, audio data,
      getFrameSize() returns 16
          PCM_SIGNED, 11025.0 Hz, 16 bit, mono, big-endian, audio data, getFrameSize()
      returns 16
          PCM_SIGNED, 11025.0 Hz, 16 bit, stereo, little-endian, audio data,
      getFrameSize() returns 32
          PCM_SIGNED, 11025.0 Hz, 16 bit, stereo, big-endian, audio data,
      getFrameSize() returns 32
          PCM_SIGNED, 22050.0 Hz, 8 bit, mono, audio data, getFrameSize() returns 8
          PCM_UNSIGNED, 22050.0 Hz, 8 bit, mono, audio data, getFrameSize() returns 8
          PCM_SIGNED, 22050.0 Hz, 8 bit, stereo, audio data, getFrameSize() returns 16
          PCM_UNSIGNED, 22050.0 Hz, 8 bit, stereo, audio data, getFrameSize() returns
      16
          PCM_SIGNED, 22050.0 Hz, 16 bit, mono, little-endian, audio data,
      getFrameSize() returns 16
          PCM_SIGNED, 22050.0 Hz, 16 bit, mono, big-endian, audio data, getFrameSize()
      returns 16
          PCM_SIGNED, 22050.0 Hz, 16 bit, stereo, little-endian, audio data,
      getFrameSize() returns 32
          PCM_SIGNED, 22050.0 Hz, 16 bit, stereo, big-endian, audio data,
      getFrameSize() returns 32
          PCM_SIGNED, 44100.0 Hz, 8 bit, mono, audio data, getFrameSize() returns 8
          PCM_UNSIGNED, 44100.0 Hz, 8 bit, mono, audio data, getFrameSize() returns 8
          PCM_SIGNED, 44100.0 Hz, 8 bit, stereo, audio data, getFrameSize() returns 8
          PCM_UNSIGNED, 44100.0 Hz, 8 bit, stereo, audio data, getFrameSize() returns
      8
          PCM_SIGNED, 44100.0 Hz, 16 bit, mono, little-endian, audio data,
      getFrameSize() returns 16
          PCM_SIGNED, 44100.0 Hz, 16 bit, mono, big-endian, audio data, getFrameSize()
      returns 16
          PCM_SIGNED, 44100.0 Hz, 16 bit, stereo, little-endian, audio data,
      getFrameSize() returns 32
          PCM_SIGNED, 44100.0 Hz, 16 bit, stereo, big-endian, audio data,
      getFrameSize() returns 32


      All the reported framesizes for SimpleOutputDevice@5f5897 are clearly incorrect.
      The program seems to output framesizes in bits instead of bytes for this device.
      The returned values for HeadspaceMixer are correct, though.

      Yes, 1, 2 and 4 bytes are normal sampleframe sizes for
      8/16 bit samplestreams in mono or stereo, and the
      return values for the Headspace device are in this
      range as should be. But framesizes of 8, 16 or 32
      bytes, as returned for the SimpleOutputDevice, are
      *definitely* not normal. Remember, the contract of
      getFrameSize() is to return the number of *bytes* (not
      bits!) required for one sampleframe. Think about it: a
      32-byte frame for a 16-bit stereo stream would be a
      total waste of space, yet this is what the method
      returns for the SimpleOutputDevice! *Please* take
      another look at the output values I provided...

      My soundcard is a TBS Montego PCI Audio.
      (Review ID: 126331)
      ======================================================================

            fbomerssunw Florian Bomers (Inactive)
            bstrathesunw Bill Strathearn (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: