Index: /OpenSceneGraph/trunk/include/osg/AudioStream
===================================================================
--- /OpenSceneGraph/trunk/include/osg/AudioStream (revision 10764)
+++ /OpenSceneGraph/trunk/include/osg/AudioStream (revision 10925)
@@ -27,5 +27,11 @@
     AudioSink();
 
-    virtual void startPlaying() = 0;
+    virtual const char * libraryName() const { return "osg"; }
+    virtual const char * className() const { return "AudioSinkInterface"; }
+
+    virtual void play() = 0;
+    virtual void pause()  = 0;
+    virtual void stop()  = 0;
+
     virtual bool playing() const = 0;
 
@@ -33,6 +39,4 @@
     virtual void setDelay(const double delay) { _delay = delay; }
 
-    virtual const char * libraryName() const { return "osgFFmpeg"; }
-    virtual const char * className() const { return "AudioSinkInterface"; }
 
 private:
Index: /OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.cpp (revision 10892)
+++ /OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.cpp (revision 10925)
@@ -92,8 +92,13 @@
 void FFmpegDecoderAudio::pause(bool pause)
 {
-    if(pause)
-        m_paused = true;
-    else
-        m_paused = false;
+    if (pause != m_paused)
+    {
+        m_paused = pause;
+        if (m_audio_sink.valid())
+        {
+            if (m_paused) m_audio_sink->pause();
+            else m_audio_sink->play();
+        }
+    }
 }
 
@@ -184,5 +189,5 @@
     {
         m_clocks.audioSetDelay(m_audio_sink->getDelay());
-        m_audio_sink->startPlaying();
+        m_audio_sink->play();
     }
     else
Index: /OpenSceneGraph/trunk/src/osgWrappers/osg/AudioStream.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgWrappers/osg/AudioStream.cpp (revision 9918)
+++ /OpenSceneGraph/trunk/src/osgWrappers/osg/AudioStream.cpp (revision 10925)
@@ -29,7 +29,27 @@
 	               "",
 	               "");
-	I_Method0(void, startPlaying,
+	I_Method0(const char *, libraryName,
+	          Properties::VIRTUAL,
+	          __C5_char_P1__libraryName,
+	          "return the name of the object's library. ",
+	          "Must be defined by derived classes. The OpenSceneGraph convention is that the namespace of a library is the same as the library name. ");
+	I_Method0(const char *, className,
+	          Properties::VIRTUAL,
+	          __C5_char_P1__className,
+	          "return the name of the object's class type. ",
+	          "Must be defined by derived classes. ");
+	I_Method0(void, play,
 	          Properties::PURE_VIRTUAL,
-	          __void__startPlaying,
+	          __void__play,
+	          "",
+	          "");
+	I_Method0(void, pause,
+	          Properties::PURE_VIRTUAL,
+	          __void__pause,
+	          "",
+	          "");
+	I_Method0(void, stop,
+	          Properties::PURE_VIRTUAL,
+	          __void__stop,
 	          "",
 	          "");
@@ -49,14 +69,4 @@
 	          "",
 	          "");
-	I_Method0(const char *, libraryName,
-	          Properties::VIRTUAL,
-	          __C5_char_P1__libraryName,
-	          "return the name of the object's library. ",
-	          "Must be defined by derived classes. The OpenSceneGraph convention is that the namespace of a library is the same as the library name. ");
-	I_Method0(const char *, className,
-	          Properties::VIRTUAL,
-	          __C5_char_P1__className,
-	          "return the name of the object's class type. ",
-	          "Must be defined by derived classes. ");
 	I_SimpleProperty(double, Delay, 
 	                 __double__getDelay, 
Index: /OpenSceneGraph/trunk/examples/osgmovie/osgmovie.cpp
===================================================================
--- /OpenSceneGraph/trunk/examples/osgmovie/osgmovie.cpp (revision 10809)
+++ /OpenSceneGraph/trunk/examples/osgmovie/osgmovie.cpp (revision 10925)
@@ -384,14 +384,19 @@
 
         SDLAudioSink(osg::AudioStream* audioStream):
-            _playing(false),
+            _started(false),
+            _paused(false),
             _audioStream(audioStream) {}
 
         ~SDLAudioSink();
 
-        virtual void startPlaying();
-        virtual bool playing() const { return _playing; }
-
-
-        bool                                _playing;
+        virtual void play();
+        virtual void pause();
+        virtual void stop();
+
+        virtual bool playing() const { return _started && !_paused; }
+
+
+        bool                                _started;
+        bool                                _paused;
         osg::observer_ptr<osg::AudioStream> _audioStream;
 };
@@ -671,17 +676,22 @@
 SDLAudioSink::~SDLAudioSink()
 {
-    if (_playing)
-    {
-
-        SDL_PauseAudio(1);
-        SDL_CloseAudio();
-
-        osg::notify(osg::NOTICE)<<"~SDLAudioSink() destructor, but still playing"<<std::endl;
-    }
-}
-
-void SDLAudioSink::startPlaying()
-{
-    _playing = true;
+    stop();
+}
+
+void SDLAudioSink::play()
+{
+    if (_started)
+    {
+        if (_paused)
+        {
+            SDL_PauseAudio(0);
+            _paused = false;
+        }
+        return;
+    }
+
+    _started = true;
+    _paused = false;
+
     osg::notify(osg::NOTICE)<<"SDLAudioSink()::startPlaying()"<<std::endl;
 
@@ -708,4 +718,23 @@
 }
 
+void SDLAudioSink::pause()
+{
+    if (_started)
+    {
+        SDL_PauseAudio(1);
+        _paused = true;
+    }
+}
+
+void SDLAudioSink::stop()
+{
+    if (_started)
+    {
+        if (!_paused) SDL_PauseAudio(1);
+        SDL_CloseAudio();
+
+        osg::notify(osg::NOTICE)<<"~SDLAudioSink() destructor, but still playing"<<std::endl;
+    }
+}
 
 #endif
