OSDN Git Service

[added] Put back Sound#stop().
authornathan.sweet <nathan.sweet@6c4fd544-2939-11df-bb46-9574ba5d0bfa>
Wed, 9 Mar 2011 22:50:55 +0000 (22:50 +0000)
committernathan.sweet <nathan.sweet@6c4fd544-2939-11df-bb46-9574ba5d0bfa>
Wed, 9 Mar 2011 22:50:55 +0000 (22:50 +0000)
[fixed] For OpenAL, now properly disconnect the Sound buffer from the stream before deleting the buffer.

backends/gdx-openal/src/com/badlogic/gdx/backends/openal/OpenALAudio.java
backends/gdx-openal/src/com/badlogic/gdx/backends/openal/OpenALMusic.java
backends/gdx-openal/src/com/badlogic/gdx/backends/openal/OpenALSound.java
gdx/src/com/badlogic/gdx/audio/Sound.java

index 681f6f2..03a24ea 100644 (file)
@@ -116,6 +116,8 @@ public class OpenALAudio implements Audio {
                        int state = alGetSourcei(streamID, AL_SOURCE_STATE);\r
                        if (state != AL_PLAYING && state != AL_PAUSED) {\r
                                if (isMusic) idleStreams.removeIndex(i);\r
+                               alSourceStop(streamID);\r
+                               alSourcei(streamID, AL_BUFFER, 0);\r
                                return streamID;\r
                        }\r
                }\r
@@ -126,6 +128,20 @@ public class OpenALAudio implements Audio {
                idleStreams.add(streamID);\r
        }\r
 \r
+       void freeBuffer (int bufferID) {\r
+               for (int i = 0, n = idleStreams.size; i < n; i++) {\r
+                       int streamID = idleStreams.get(i);\r
+                       if (alGetSourcei(streamID, AL_BUFFER) == bufferID) alSourcei(streamID, AL_BUFFER, 0);\r
+               }\r
+       }\r
+\r
+       void stopStreamsWithBuffer (int bufferID) {\r
+               for (int i = 0, n = idleStreams.size; i < n; i++) {\r
+                       int streamID = idleStreams.get(i);\r
+                       if (alGetSourcei(streamID, AL_BUFFER) == bufferID) alSourceStop(streamID);\r
+               }\r
+       }\r
+\r
        public void update () {\r
                for (int i = 0; i < music.size; i++)\r
                        music.items[i].update();\r
index 1c5f842..763d9e1 100644 (file)
@@ -66,8 +66,6 @@ public abstract class OpenALMusic implements Music {
                if (streamID == -1) {\r
                        streamID = audio.obtainStream(true);\r
                        if (streamID == -1) return;\r
-                       alSourceStop(streamID);\r
-                       alSourcei(streamID, AL_BUFFER, 0);\r
                        alSourcei(streamID, AL_LOOPING, AL_FALSE);\r
                        alSourcef(streamID, AL_GAIN, volume);\r
                        for (int i = 0; i < bufferCount; i++)\r
index 90471e2..56463a7 100644 (file)
@@ -53,8 +53,6 @@ public class OpenALSound implements Sound {
        public void play (float volume) {\r
                int streamID = audio.obtainStream(false);\r
                if (streamID == -1) return;\r
-               alSourceStop(streamID);\r
-               alSourcei(streamID, AL_BUFFER, 0);\r
                alSourcei(streamID, AL_BUFFER, bufferID);\r
                alSourcei(streamID, AL_LOOPING, AL_FALSE);\r
                alSourcef(streamID, AL_GAIN, volume);\r
@@ -64,15 +62,18 @@ public class OpenALSound implements Sound {
        public void loop () {\r
                int streamID = audio.obtainStream(false);\r
                if (streamID == -1) return;\r
-               alSourceStop(streamID);\r
-               alSourcei(streamID, AL_BUFFER, 0);\r
                alSourcei(streamID, AL_BUFFER, bufferID);\r
                alSourcei(streamID, AL_LOOPING, AL_TRUE);\r
                alSourcePlay(streamID);\r
        }\r
 \r
+       public void stop () {\r
+               audio.stopStreamsWithBuffer(bufferID);\r
+       }\r
+\r
        public void dispose () {\r
                if (bufferID == -1) return;\r
+               audio.freeBuffer(bufferID);\r
                alDeleteBuffers(bufferID);\r
                bufferID = -1;\r
        }\r
index 7db3ecb..84a3123 100644 (file)
@@ -43,6 +43,11 @@ public interface Sound extends Disposable {
        public void play (float volume);\r
 \r
        /**\r
+        * Stops playing all instances of this sound.\r
+        */\r
+       public void stop ();\r
+\r
+       /**\r
         * Releases all the resources.\r
         */\r
        public void dispose ();\r