Skip to content
Advertisement

Read OGG as stream of samples for LWJGL 3 OpenAL

I’m making a game with LWJGL 3, and for the first time I’m learning about the OpenAL library. I’m going to have to include long audio files, and I have decided that OGG will be used for the audio, since music would otherwise take up a lot of space.

What I don’t know, though, is anything about how to get the audio data out of the OGG and put them into the OpenAL buffers, which need a ShortBuffer of signed short PCM samples.

I’ve already been trying to look for answers, but everything I find seems to be outdated or irrelevant to my case.

So to summarize: I have OGG files and I need to be able to load them to OpenAL buffers. Also the ability to stream from the files is obviously a must (in this case, read the files one chunk at a time into a double buffer), since music is involved.

Example:

ShortBuffer samples = readOggSamplesToBuffer(someInputStream);

int bufferId = AL10.alGenBuffers();
// OpenAL wants the samples as signed short
AL10.alBufferData(bufferId, AL10.AL_FORMAT_MONO16, samples, 44100);

Where the function readOggSamplesToBuffer would be something like this:

private ShortBuffer readOggSamplesToBuffer(InputStream in) {
    // This theoretical class is what I need – something that
    // can read the data from the OGG file.
    OggReader reader = new OggReader(in);

    // Very simplified example
    ShortBuffer buffer = BufferUtils.createShortBuffer(reader.getSampleCount());
    buffer.put(reader.samplesAsShortArray());
    return buffer;
}

Advertisement

Answer

The STBVorbis class can read Ogg Vorbis files. For streaming you probably want to use

STBVorbis.stb_vorbis_open_filename
STBVorbis.stb_vorbis_get_info 
STBVorbis.stb_vorbis_get_samples_short_interleaved
Advertisement