Re: [sdljava-users] Problem with SDLMixer
Status: Beta
Brought to you by:
ivan_ganza
From: Robert S. <the...@gm...> - 2005-01-23 05:20:15
|
Hi. Ivan Z. Ganza wrote: > Sweet! Thank you very much for the patch. I have integrated this > code. That is a really nice way to do it. I was wracking my brain > for an elegant solution. Well, one could make sure that the small buffers are really filled to their maximum before another one is allocated. If the ReadableByteChannel delivers a megabyte in chunks of 100 bytes then each small buffer wastes ~900 byte. This is not so nice but I think this can be fixed. > > Its been tested and the changes are committed to CVS. I made one > small change which was to call order(ByteOrder.nativeOrder()) on the > byte buffers. I think this is required in the case when the buffers > might be accessed from the C code. I think we need some PPC-style hardware to test this. AFAIK the byteorder is only neccessary if Java would do non-byte sized accesses. Since ReadableByteChannel processes only bytes it should be ok. > > BTW: let me know if you want dev access. Or feel free to keep > sending me patches as you have them. > Thank you, but I think I have not enough time to contribute regularly (nor the knowledge about the Swig/SDL trickery). I keep sending patches to you instead. Now that sdljava's mixer library found its way into our game this may happen more often :-) If you are interested in seeing (or better hearing) your binding at work try the latest JNLP of our game which is on the download page of our project page: freefodder.dev.java.net (the unstable link). Please read the last paragraph of the latest announcement which describes how to set the sound output to SDLMixer (or wait some days/weeks until I fixed the launcher app). Btw: Could you add a version API? It would be nice to retrieve SDL's version and the version of the binding itself programmatically. cu Robert Btw2: You may want to install a Wiki on your project page. I have seen that some statements are outdated (requirement for Java1.5 and SDLMixer 1.2.*5*) and I know that updating the website is extremely boring and timeconsuming. :-) > Also finally I have moved the location of BufferUtils to > src/sdljava/util; it used to be in just "src" which was the wrong place. > > Thanks again! > -Ivan/ > > Robert Schuster wrote: > >> Great! That was the problem. >> >> Along with that I fixed the problem with the loading of URLs from the >> net (or arbitrary slow locations). The problem with your >> implementation was that you asserted that InputStream.available() >> returns the complete size of the stream. However available() returns >> only the amount of bytes that can be read without blocking. >> >> I fixed BufferUtil.readInputStream() in the following way: >> I am reading the parts of the stream into separate ByteBuffers until >> the stream is really finished. Afterwards I merge the buffers into >> one big buffer and return that. >> The implementation uses Channel.newChannel() to retrieve a >> ReadableByteChannel which allows a ByteBuffer for its read() method. >> The behavior of this method is otherwise the same as >> InputStream.read(). The important bit is that -1 is returned when the >> end of the stream is reached. >> >> I have attached the patch to this mail. Tell me if the list daemon >> rips it away to send it to you directly. >> >> If you are using BeanShell try this snippet as a proof of concept: >> >> import sdljava.*; >> import sdljava.mixer.*; >> SDLMain.init(SDLMain.SDL_INIT_AUDIO); >> SDLMixer.openAudio(44100, SDLMixer.AUDIO_S16SYS, 2, 4096); >> imc = SDLMixer.loadWAV(new >> URL("http://www.barbneal.com/wav/lucy/lucy01.wav")); >> SDLMixer.playChannel(0, imc, 0); >> >> However you can add type information and make that a real Java class, >> too. :-) >> >> cu >> Robert >> >> Btw: Thanks again for reviving the Java binding for SDL. sdljava is >> the first library that allows me to do portable sound output in Java >> without having to sacrifice other useful Java API (like resource >> loading system which is essential for JNLP!). >> >> Ivan Z. Ganza wrote: >> >>> Make sure you have at least SDL Mixer 1.2.6 as the Mix_LoadMUS_RW >>> was added for 1.2.6. Its strange though that you were able to >>> compile if this function wasn't present. >>> >>> BTW I've found that loading over the network doesn't work, filebased >>> urls are fine though. I need to find an example of the proper way >>> to load a byte stream from a URL.... >>> >>> Let me know if this helped. >>> -Ivan/ >>> >>> Robert Schuster wrote: >>> >>>> Hi, >>>> I wanted to try the new URL based loading of WAV file and was >>>> stopped by this: >>>> >>>> java.lang.UnsatisfiedLinkError: >>>> /home/rob/tmp/lwtest/libsdljava_mixer.so: >>>> /home/rob/tmp/lwtest/libsdljava_mixer.so: undefined symbol: >>>> Mix_LoadMUS_RW >>>> at java.lang.ClassLoader$NativeLibrary.load(Native Method) >>>> at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1586) >>>> at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1511) >>>> at java.lang.Runtime.loadLibrary0(Runtime.java:788) >>>> at java.lang.System.loadLibrary(System.java:834) >>>> at sdljava.mixer.SDLMixer.<clinit>(SDLMixer.java:1184) >>>> >>>> I took sdljava from CVS (01.22.05) and compiled all files (using >>>> Blackdown 1.4.2 for GNU/Linux). >>>> >>>> cu >>>> Robert >>>> >>>> >>>> ------------------------------------------------------- >>>> This SF.Net email is sponsored by: IntelliVIEW -- Interactive >>>> Reporting >>>> Tool for open source databases. Create drag-&-drop reports. Save time >>>> by over 75%! Publish reports on the web. Export to DOC, XLS, RTF, etc. >>>> Download a FREE copy at http://www.intelliview.com/go/osdn_nl >>>> _______________________________________________ >>>> sdljava-users mailing list >>>> sdl...@li... >>>> https://lists.sourceforge.net/lists/listinfo/sdljava-users >>> >>> >>> >>> >>> >>> >>> >>> ------------------------------------------------------- >>> This SF.Net email is sponsored by: IntelliVIEW -- Interactive Reporting >>> Tool for open source databases. Create drag-&-drop reports. Save time >>> by over 75%! Publish reports on the web. Export to DOC, XLS, RTF, etc. >>> Download a FREE copy at http://www.intelliview.com/go/osdn_nl >>> _______________________________________________ >>> sdljava-users mailing list >>> sdl...@li... >>> https://lists.sourceforge.net/lists/listinfo/sdljava-users >>> >>> >> ------------------------------------------------------------------------ >> >> Index: src/util/BufferUtil.java >> =================================================================== >> RCS file: /cvsroot/sdljava/sdljava/src/util/BufferUtil.java,v >> retrieving revision 1.2 >> diff -u -r1.2 BufferUtil.java >> --- src/util/BufferUtil.java 7 Jan 2005 03:11:49 -0000 1.2 >> +++ src/util/BufferUtil.java 22 Jan 2005 22:20:40 -0000 >> @@ -7,15 +7,23 @@ >> import java.net.URLConnection; >> import java.net.MalformedURLException; >> import java.nio.ByteBuffer; >> +import java.nio.channels.Channels; >> +import java.nio.channels.ReadableByteChannel; >> +import java.util.Iterator; >> +import java.util.List; >> +import java.util.LinkedList; >> >> /** >> * Some usefull methods for reading URLs or streams and returning the >> data as Direct Buffers >> * >> - * @author Ivan Z. Ganza >> + * @author Ivan Z. Ganza >> + * @author Robert Schuster >> * @version $Id: BufferUtil.java,v 1.2 2005/01/07 03:11:49 ivan_ganza >> Exp $ >> */ >> public class BufferUtil { >> >> + private static final int BUFFER_SIZE = 1024; >> + >> /** >> * Tries to open the given URL, get its input stream, returns the >> data in a <I><B>direct</I></B> ByteBuffer >> * >> @@ -48,14 +56,48 @@ >> * @exception IOException if an error occurs >> */ >> public static ByteBuffer readInputStream(InputStream in) throws >> IOException { >> - int avail = in.available(); >> - byte buf[] = new byte[avail]; >> + /* Converts the InputStream into a channels which allows >> + * us to read into a ByteBuffer. >> + */ >> + ReadableByteChannel ch = Channels.newChannel(in); >> + >> + // Creates a list that stores the intermediate buffers. >> + List list = new LinkedList(); >> >> - int read = in.read(buf); >> - if (read != avail) throw new IOException("needed to read: " + >> avail + " bytes, but actually read: " + read); >> + // A variable storing the accumulated size of the data. >> + int sum = 0, read = 0; >> >> - ByteBuffer byteBuffer = ByteBuffer.allocateDirect(buf.length); >> - byteBuffer.put(buf); >> - return byteBuffer; >> - } >> -} >> \ No newline at end of file >> + /* Reads all the bytes from the channel and stores them >> + * in various buffer objects. >> + */ >> + do { >> + ByteBuffer b = ByteBuffer.allocateDirect(BUFFER_SIZE); >> + read = ch.read(b); >> + >> + if(read > 0) { >> + b.flip(); // make ready for reading later >> + list.add(b); >> + sum += read; >> + } >> + } while(read != -1); >> + >> + /* If there is only one buffer used we do not >> + * need to merge the data. >> + */ >> + if(list.size() == 1) { >> + return (ByteBuffer) list.get(0); >> + } >> + >> + ByteBuffer bb = ByteBuffer.allocateDirect(sum); >> + >> + /* Merges all buffers into the Buffer bb */ >> + Iterator ite = list.iterator(); >> + while(ite.hasNext()){ >> + bb.put((ByteBuffer) ite.next()); >> + } >> + >> + list.clear(); >> + >> + return bb; >> + } >> +} >> >> > > > > ------------------------------------------------------- > This SF.Net email is sponsored by: IntelliVIEW -- Interactive Reporting > Tool for open source databases. Create drag-&-drop reports. Save time > by over 75%! Publish reports on the web. Export to DOC, XLS, RTF, etc. > Download a FREE copy at http://www.intelliview.com/go/osdn_nl > _______________________________________________ > sdljava-users mailing list > sdl...@li... > https://lists.sourceforge.net/lists/listinfo/sdljava-users > > |