Hi !
Featured games (90)
games approved by the League of Dukes
Games in Showcase (777)
Games in Android Showcase (231)
games submitted by our members
Games in WIP (856)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
    Home     Help   Search   Login   Register   
Pages: [1]
  ignore  |  Print  
  Looping an ogg vorbis file.  (Read 7270 times)
0 Members and 1 Guest are viewing this topic.
Offline Fnatte

Junior Newbie

« Posted 2008-02-27 21:06:06 »


I am currently working on a game which I would like to create a sound player for. This sound player should be able to load ogg vorbis files, loop them and fade them in and out. I've read the tutorial on which help tremendously with loading and playing but looping.. Is there an easy way of looping ogg vorbis files? Wav files are easily looped in openAL but wav files are too large for easy distribution.

Thanks in advance!

/ Kalle
Offline Ultraq

Junior Devvie

That's what she said

« Reply #1 - Posted 2008-02-28 06:10:25 »

I would've thought that applying the looping property - alSourcei(sourceID, AL_LOOPING, AL_TRUE) - would be enough, but it might not apply to a streaming.  However, reading the OpenAL programmer's guide states that "As long as there is always a new buffer to play in the queue, the source will continue to play."  With that knowledge, maybe it's just enough to find-out when you've queued the buffer from the end of the file, so that you start queuing buffers from the start of the file immediately after it.

Ultraq's Final MooCow
Bits and Pieces by Emanuel Rabina
Offline Fnatte

Junior Newbie

« Reply #2 - Posted 2008-02-28 09:27:57 »

Thanks for the answer!

No, the alSourcei(sourceID, AL_LOOPING, AL_TRUE) does not work, it throws an exception when I tried to do that.

Ok, that is roughly what I had in mind but I would have liked an easier way, like the statement above.. We are always looking for the easiest way, huh? Wink
I've looked at this solution to some extension, but the input streams (VorbisInputstream) returns false when calling isMarkSupported(). Can I reset (rewind) an VorbisStream or do I have to create new streams?

Here is how the streams are created. This is from the file on

public boolean initialize() {
   try {
       CachedUrlStream os = new CachedUrlStream(url);

       loStream = (LogicalOggStream) os.getLogicalStreams().iterator().next();
       vStream = new VorbisStream(loStream);
       vStreamHdr = vStream.getIdentificationHeader();

       audioFormat = new AudioFormat(
          (float) vStreamHdr.getSampleRate(),
          true, true);

       ais = new AudioInputStream(
          new VorbisInputStream(vStream), audioFormat, -1);
   } catch (Exception e) {
       return false;

   return true;
Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline Ultraq

Junior Devvie

That's what she said

« Reply #3 - Posted 2008-02-29 09:07:45 »

I don't know the j-ogg API that well, but from what you say and the little I've read, it would seem that yes, you'll have to get a new stream since resetting isn't supported by the VorbisInputStream.

[EDIT]: I was just thinking that maybe you could wrap the VorbisInputStream with an InputStream that does allow resetting, but the only ones that come to mind store the entire stream to memory.  Kinda defeats the purpose of streaming then.

Ultraq's Final MooCow
Bits and Pieces by Emanuel Rabina
Offline hejfelix

Junior Devvie

« Reply #4 - Posted 2008-06-11 16:42:32 »

What I did, was to decode the entire ogg file and then not use tha "alqueuebuffer" thing. Just make a normal buffer as you normally would with a wav file. When this is done, you will have fast access to your sample(music I presume) and you can use AL.AL_LOOP to loop it. This takes a while for big files(4-5mb ogg files), but its worth it so ou can squeeze out some extra FPS during gameplay.

I'm not gonna send you my code, cuz its dead ugly right now. But the thing I did was just to adjust the buffersize to match the filesize and then load it into a normal buffer. It's not hard to do, it requires some getting-to-know example 8, but you have that pegged apparently Smiley

If you end up with a beautiful solution please pm me or something. I'm tired of restructuring code Sad [/lazy]

PS: Does anyone else find the code extremely strange in example 8? All that returning booleans, its frustrating when you query for "if(initialized())..." then you are in fact doing it as you ask for it....I hate that very much!

<i8b4uUnderground> d-_-b
<BonyNoMore> how u make that inverted b?
<BonyNoMore> wait
<BonyNoMore> never mind
Pages: [1]
  ignore  |  Print  

hadezbladez (295 views)
2018-11-16 13:46:03

hadezbladez (164 views)
2018-11-16 13:41:33

hadezbladez (295 views)
2018-11-16 13:35:35

hadezbladez (75 views)
2018-11-16 13:32:03

EgonOlsen (2156 views)
2018-06-10 19:43:48

EgonOlsen (2183 views)
2018-06-10 19:43:44

EgonOlsen (1370 views)
2018-06-10 19:43:20

DesertCoockie (1987 views)
2018-05-13 18:23:11

nelsongames (1630 views)
2018-04-24 18:15:36

nelsongames (2278 views)
2018-04-24 18:14:32
Deployment and Packaging
by mudlee
2018-08-22 18:09:50

Java Gaming Resources
by gouessej
2018-08-22 08:19:41

Deployment and Packaging
by gouessej
2018-08-22 08:04:08

Deployment and Packaging
by gouessej
2018-08-22 08:03:45

Deployment and Packaging
by philfrei
2018-08-20 02:33:38

Deployment and Packaging
by philfrei
2018-08-20 02:29:55

Deployment and Packaging
by philfrei
2018-08-19 23:56:20

Deployment and Packaging
by philfrei
2018-08-19 23:54:46 is not responsible for the content posted by its members, including references to external websites, and other references that may or may not have a relation with our primarily gaming and game production oriented community. inquiries and complaints can be sent via email to the info‑account of the company managing the website of java‑
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines | Managed by Enhanced Four Valid XHTML 1.0! Valid CSS!