Show
Ignore:
Timestamp:
03/04/09 11:41:21 (5 years ago)
Author:
shuber
Message:

merging from trunk using

svn merge -r 9847:9851 http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk

Location:
OpenSceneGraph/branches/osg-cocoa-dev
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/branches/osg-cocoa-dev

    • Property svn:mergeinfo changed from /OpenSceneGraph/trunk:9838-9843 to /OpenSceneGraph/trunk:9838-9843,9848-9851
  • OpenSceneGraph/branches/osg-cocoa-dev/examples/osgmovie/osgmovie.cpp

    r9705 r9853  
    321321} 
    322322 
     323#if USE_SDL 
     324 
     325#include "SDL.h" 
     326 
     327class SDLAudioSink : public osg::AudioSink 
     328{ 
     329    public: 
     330     
     331        SDLAudioSink(osg::AudioStream* audioStream): 
     332            _playing(false), 
     333            _audioStream(audioStream) {} 
     334         
     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         
     347        virtual void startPlaying() 
     348        { 
     349            _playing = true;  
     350            osg::notify(osg::NOTICE)<<"SDLAudioSink()::startPlaying()"<<std::endl; 
     351 
     352            osg::notify(osg::NOTICE)<<"  audioFrequency()="<<_audioStream->audioFrequency()<<std::endl; 
     353            osg::notify(osg::NOTICE)<<"  audioNbChannels()="<<_audioStream->audioNbChannels()<<std::endl; 
     354            osg::notify(osg::NOTICE)<<"  audioSampleFormat()="<<_audioStream->audioSampleFormat()<<std::endl; 
     355 
     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 
     372        } 
     373        virtual bool playing() const { return _playing; } 
     374 
     375        static void soundReadCallback(void * user_data, uint8_t * data, int datalen); 
     376 
     377        bool                                _playing; 
     378        osg::observer_ptr<osg::AudioStream> _audioStream; 
     379}; 
     380 
     381 
     382void SDLAudioSink::soundReadCallback(void * const user_data, Uint8 * const data, const int datalen) 
     383{ 
     384    SDLAudioSink * sink = reinterpret_cast<SDLAudioSink*>(user_data); 
     385    osg::ref_ptr<osg::AudioStream> as = sink->_audioStream.get(); 
     386    if (as.valid()) 
     387    {             
     388        as->consumeAudioBuffer(data, datalen); 
     389    } 
     390} 
     391 
     392#endif 
     393 
    323394int main(int argc, char** argv) 
    324395{ 
     
    426497 
    427498    bool xyPlane = fullscreen; 
     499     
     500    bool useAudioSink = false; 
     501    while(arguments.read("--audio")) { useAudioSink = true; } 
    428502 
    429503    for(int i=1;i<arguments.argc();++i) 
     
    433507            osg::Image* image = osgDB::readImageFile(arguments[i]); 
    434508            osg::ImageStream* imagestream = dynamic_cast<osg::ImageStream*>(image); 
    435             if (imagestream) imagestream->play(); 
     509            if (imagestream)  
     510            { 
     511                osg::ImageStream::AudioStreams& audioStreams = imagestream->getAudioStreams(); 
     512                if (useAudioSink && !audioStreams.empty()) 
     513                { 
     514                    osg::AudioStream* audioStream = audioStreams[0].get(); 
     515                    osg::notify(osg::NOTICE)<<"AudioStream read ["<<audioStream->getName()<<"]"<<std::endl; 
     516#if USE_SDL 
     517                    audioStream->setAudioSink(new SDLAudioSink(audioStream)); 
     518#endif 
     519                } 
     520 
     521 
     522                imagestream->play(); 
     523            } 
    436524 
    437525            if (image)