Show
Ignore:
Timestamp:
03/03/09 18:37:48 (6 years ago)
Author:
robert
Message:

Added SDL audio support for reading from ffmpeg movies

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/examples/osgmovie/osgmovie.cpp

    r9847 r9849  
    321321} 
    322322 
    323 class CustomAudioSink : public osg::AudioSink 
     323#if USE_SDL 
     324 
     325#include "SDL.h" 
     326 
     327class SDLAudioSink : public osg::AudioSink 
    324328{ 
    325329    public: 
    326330     
    327         CustomAudioSink(osg::AudioStream* audioStream): 
     331        SDLAudioSink(osg::AudioStream* audioStream): 
    328332            _playing(false), 
    329333            _audioStream(audioStream) {} 
    330334         
     335        ~SDLAudioSink() 
     336        {         
     337            if (_playing) 
     338            { 
     339 
     340                SDL_PauseAudio(1); 
     341                SDL_CloseAudio(); 
     342 
     343                osg::notify(osg::NOTICE)<<"~SDLAudioSink() destructor, but still playing"<<std::endl; 
     344            } 
     345        } 
     346         
    331347        virtual void startPlaying() 
    332348        { 
    333349            _playing = true;  
    334             osg::notify(osg::NOTICE)<<"CustomAudioSink()::startPlaying()"<<std::endl; 
     350            osg::notify(osg::NOTICE)<<"SDLAudioSink()::startPlaying()"<<std::endl; 
    335351             
    336352            osg::notify(osg::NOTICE)<<"  audioFrequency()="<<_audioStream->audioFrequency()<<std::endl; 
     
    338354            osg::notify(osg::NOTICE)<<"  audioSampleFormat()="<<_audioStream->audioSampleFormat()<<std::endl; 
    339355             
     356            SDL_AudioSpec specs = { 0 }; 
     357            SDL_AudioSpec wanted_specs = { 0 }; 
     358 
     359            wanted_specs.freq = _audioStream->audioFrequency(); 
     360            wanted_specs.format = AUDIO_S16SYS; 
     361            wanted_specs.channels = _audioStream->audioNbChannels(); 
     362            wanted_specs.silence = 0; 
     363            wanted_specs.samples = 1024; 
     364            wanted_specs.callback = soundReadCallback; 
     365            wanted_specs.userdata = this; 
     366 
     367            if (SDL_OpenAudio(&wanted_specs, &specs) < 0) 
     368                    throw "SDL_OpenAudio() failed (" + std::string(SDL_GetError()) + ")"; 
     369 
     370            SDL_PauseAudio(0); 
     371 
    340372        } 
    341373        virtual bool playing() const { return _playing; } 
     374 
     375        static void soundReadCallback(void * user_data, uint8_t * data, int datalen); 
    342376 
    343377        bool                                _playing; 
    344378        osg::observer_ptr<osg::AudioStream> _audioStream; 
    345379}; 
     380 
     381 
     382void SDLAudioSink::soundReadCallback(void * const user_data, Uint8 * const data, const int datalen) 
     383{ 
     384    osg::notify(osg::NOTICE)<<"SDLAudioSink::soundReadCallback"<<std::endl; 
     385 
     386        SDLAudioSink * sink = reinterpret_cast<SDLAudioSink*>(user_data); 
     387        osg::ref_ptr<osg::AudioStream> as = sink->_audioStream.get(); 
     388        if (as.valid()) 
     389        {             
     390            as->consumeAudioBuffer(data, datalen); 
     391        } 
     392} 
     393 
     394#endif 
    346395 
    347396int main(int argc, char** argv) 
     
    451500    bool xyPlane = fullscreen; 
    452501     
    453     bool useOpenALAudio = false; 
    454     while(arguments.read("--OpenAL")) { useOpenALAudio = true; } 
     502    bool useAudioSink = false; 
     503    while(arguments.read("--audio")) { useAudioSink = true; } 
    455504 
    456505    for(int i=1;i<arguments.argc();++i) 
     
    463512            { 
    464513                osg::ImageStream::AudioStreams& audioStreams = imagestream->getAudioStreams(); 
    465                 if (useOpenALAudio && !audioStreams.empty()) 
     514                if (useAudioSink && !audioStreams.empty()) 
    466515                { 
    467516                    osg::AudioStream* audioStream = audioStreams[0].get(); 
    468517                    osg::notify(osg::NOTICE)<<"AudioStream read ["<<audioStream->getName()<<"]"<<std::endl; 
    469                     audioStream->setAudioSink(new CustomAudioSink(audioStream)); 
     518#if USE_SDL 
     519                    audioStream->setAudioSink(new SDLAudioSink(audioStream)); 
     520#endif 
    470521                } 
    471522