Re-ordered SDL class to try and avoid OSX issues with _main.
This commit is contained in:
parent
e179ecc69d
commit
9c5498376c
@ -327,74 +327,22 @@ osg::Geometry* myCreateTexturedQuadGeometry(const osg::Vec3& pos,float width,flo
|
||||
class SDLAudioSink : public osg::AudioSink
|
||||
{
|
||||
public:
|
||||
|
||||
|
||||
SDLAudioSink(osg::AudioStream* audioStream):
|
||||
_playing(false),
|
||||
_audioStream(audioStream) {}
|
||||
|
||||
~SDLAudioSink()
|
||||
{
|
||||
if (_playing)
|
||||
{
|
||||
|
||||
SDL_PauseAudio(1);
|
||||
SDL_CloseAudio();
|
||||
~SDLAudioSink();
|
||||
|
||||
osg::notify(osg::NOTICE)<<"~SDLAudioSink() destructor, but still playing"<<std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
virtual void startPlaying()
|
||||
{
|
||||
_playing = true;
|
||||
osg::notify(osg::NOTICE)<<"SDLAudioSink()::startPlaying()"<<std::endl;
|
||||
|
||||
osg::notify(osg::NOTICE)<<" audioFrequency()="<<_audioStream->audioFrequency()<<std::endl;
|
||||
osg::notify(osg::NOTICE)<<" audioNbChannels()="<<_audioStream->audioNbChannels()<<std::endl;
|
||||
osg::notify(osg::NOTICE)<<" audioSampleFormat()="<<_audioStream->audioSampleFormat()<<std::endl;
|
||||
|
||||
SDL_AudioSpec specs = { 0 };
|
||||
SDL_AudioSpec wanted_specs = { 0 };
|
||||
|
||||
wanted_specs.freq = _audioStream->audioFrequency();
|
||||
wanted_specs.format = AUDIO_S16SYS;
|
||||
wanted_specs.channels = _audioStream->audioNbChannels();
|
||||
wanted_specs.silence = 0;
|
||||
wanted_specs.samples = 1024;
|
||||
wanted_specs.callback = soundReadCallback;
|
||||
wanted_specs.userdata = this;
|
||||
|
||||
if (SDL_OpenAudio(&wanted_specs, &specs) < 0)
|
||||
throw "SDL_OpenAudio() failed (" + std::string(SDL_GetError()) + ")";
|
||||
|
||||
SDL_PauseAudio(0);
|
||||
|
||||
}
|
||||
virtual void startPlaying();
|
||||
virtual bool playing() const { return _playing; }
|
||||
|
||||
static void soundReadCallback(void * user_data, uint8_t * data, int datalen);
|
||||
static void soundReadCallback(void * user_data, uint8_t * data, int datalen);
|
||||
|
||||
bool _playing;
|
||||
osg::observer_ptr<osg::AudioStream> _audioStream;
|
||||
};
|
||||
|
||||
|
||||
void SDLAudioSink::soundReadCallback(void * const user_data, Uint8 * const data, const int datalen)
|
||||
{
|
||||
SDLAudioSink * sink = reinterpret_cast<SDLAudioSink*>(user_data);
|
||||
osg::ref_ptr<osg::AudioStream> as = sink->_audioStream.get();
|
||||
if (as.valid())
|
||||
{
|
||||
as->consumeAudioBuffer(data, datalen);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(USE_SDL) && defined(__APPLE__)
|
||||
// SDL under OSX causes a link error with a unresolved _main symbol
|
||||
// so we have to add this dummy implementation to get round it.
|
||||
main() {}
|
||||
#endif
|
||||
|
||||
int main(int argc, char** argv)
|
||||
@ -653,3 +601,58 @@ int main(int argc, char** argv)
|
||||
}
|
||||
}
|
||||
|
||||
#if USE_SDL
|
||||
|
||||
#include "SDL.h"
|
||||
|
||||
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;
|
||||
osg::notify(osg::NOTICE)<<"SDLAudioSink()::startPlaying()"<<std::endl;
|
||||
|
||||
osg::notify(osg::NOTICE)<<" audioFrequency()="<<_audioStream->audioFrequency()<<std::endl;
|
||||
osg::notify(osg::NOTICE)<<" audioNbChannels()="<<_audioStream->audioNbChannels()<<std::endl;
|
||||
osg::notify(osg::NOTICE)<<" audioSampleFormat()="<<_audioStream->audioSampleFormat()<<std::endl;
|
||||
|
||||
SDL_AudioSpec specs = { 0 };
|
||||
SDL_AudioSpec wanted_specs = { 0 };
|
||||
|
||||
wanted_specs.freq = _audioStream->audioFrequency();
|
||||
wanted_specs.format = AUDIO_S16SYS;
|
||||
wanted_specs.channels = _audioStream->audioNbChannels();
|
||||
wanted_specs.silence = 0;
|
||||
wanted_specs.samples = 1024;
|
||||
wanted_specs.callback = soundReadCallback;
|
||||
wanted_specs.userdata = this;
|
||||
|
||||
if (SDL_OpenAudio(&wanted_specs, &specs) < 0)
|
||||
throw "SDL_OpenAudio() failed (" + std::string(SDL_GetError()) + ")";
|
||||
|
||||
SDL_PauseAudio(0);
|
||||
|
||||
}
|
||||
|
||||
void SDLAudioSink::soundReadCallback(void * const user_data, Uint8 * const data, const int datalen)
|
||||
{
|
||||
SDLAudioSink * sink = reinterpret_cast<SDLAudioSink*>(user_data);
|
||||
osg::ref_ptr<osg::AudioStream> as = sink->_audioStream.get();
|
||||
if (as.valid())
|
||||
{
|
||||
as->consumeAudioBuffer(data, datalen);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user