Added virtual pause() method into osg::AudioSink to support pausing of a movie thread and it's associated audio.

Updated osgmovie plugin to use the pause support.
This commit is contained in:
Robert Osfield
2010-01-07 14:35:17 +00:00
parent 47af634399
commit 5d9bf9f4d5
4 changed files with 82 additions and 34 deletions

View File

@@ -383,16 +383,21 @@ class SDLAudioSink : public osg::AudioSink
public:
SDLAudioSink(osg::AudioStream* audioStream):
_playing(false),
_started(false),
_paused(false),
_audioStream(audioStream) {}
~SDLAudioSink();
virtual void startPlaying();
virtual bool playing() const { return _playing; }
virtual void play();
virtual void pause();
virtual void stop();
virtual bool playing() const { return _started && !_paused; }
bool _playing;
bool _started;
bool _paused;
osg::observer_ptr<osg::AudioStream> _audioStream;
};
@@ -670,19 +675,24 @@ static void soundReadCallback(void * user_data, uint8_t * data, int datalen)
SDLAudioSink::~SDLAudioSink()
{
if (_playing)
{
SDL_PauseAudio(1);
SDL_CloseAudio();
osg::notify(osg::NOTICE)<<"~SDLAudioSink() destructor, but still playing"<<std::endl;
}
stop();
}
void SDLAudioSink::startPlaying()
void SDLAudioSink::play()
{
_playing = true;
if (_started)
{
if (_paused)
{
SDL_PauseAudio(0);
_paused = false;
}
return;
}
_started = true;
_paused = false;
osg::notify(osg::NOTICE)<<"SDLAudioSink()::startPlaying()"<<std::endl;
osg::notify(osg::NOTICE)<<" audioFrequency()="<<_audioStream->audioFrequency()<<std::endl;
@@ -707,6 +717,25 @@ void SDLAudioSink::startPlaying()
}
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