Work on making OpenAL a compile-time option.
ENABLE_SOUND=0 now works when configuring SimGear, and libSimGearScene can be linked without OpenAL. However, more testing of FlightGear in this mode is needed before it's officially supported!
This commit is contained in:
parent
fd27e7bd43
commit
24d2431522
@ -177,6 +177,7 @@ else()
|
||||
|
||||
if (ENABLE_SOUND)
|
||||
find_package(OpenAL REQUIRED)
|
||||
message(STATUS "Sound support: ENABLED")
|
||||
endif(ENABLE_SOUND)
|
||||
|
||||
find_package(OpenSceneGraph 3.0.0 REQUIRED osgText osgSim osgDB osgParticle osgGA osgUtil)
|
||||
|
@ -21,7 +21,7 @@ set(SOURCES
|
||||
|
||||
simgear_scene_component(sound sound "${SOURCES}" "${HEADERS}")
|
||||
|
||||
if(ENABLE_TESTS)
|
||||
if(ENABLE_TESTS AND ENABLE_SOUND)
|
||||
|
||||
if (SIMGEAR_SHARED)
|
||||
set(SOUND_TEST_LIBS SimGearScene)
|
||||
@ -45,4 +45,4 @@ create_test(openal_test1)
|
||||
create_test(openal_test2)
|
||||
create_test(openal_test3)
|
||||
create_test(openal_test4)
|
||||
endif(ENABLE_TESTS)
|
||||
endif()
|
||||
|
@ -284,13 +284,14 @@ ALvoid* loadWAVFromFile(const SGPath& path, ALenum& format, ALsizei& size, ALflo
|
||||
|
||||
ALuint createBufferFromFile(const SGPath& path)
|
||||
{
|
||||
ALuint buffer = -1;
|
||||
#ifdef ENABLE_SOUND
|
||||
ALenum format;
|
||||
ALsizei size;
|
||||
ALfloat sampleFrequency;
|
||||
ALvoid* data = loadWAVFromFile(path, format, size, sampleFrequency);
|
||||
assert(data);
|
||||
|
||||
ALuint buffer;
|
||||
alGenBuffers(1, &buffer);
|
||||
if (alGetError() != AL_NO_ERROR) {
|
||||
free(data);
|
||||
@ -303,7 +304,7 @@ ALuint createBufferFromFile(const SGPath& path)
|
||||
free(data);
|
||||
throw sg_io_exception("OpenAL setting buffer data failed", sg_location(path.str()));
|
||||
}
|
||||
|
||||
#endif
|
||||
return buffer;
|
||||
}
|
||||
|
||||
|
@ -148,8 +148,9 @@ SGSoundMgr::~SGSoundMgr() {
|
||||
}
|
||||
|
||||
// initialize the sound manager
|
||||
void SGSoundMgr::init() {
|
||||
|
||||
void SGSoundMgr::init()
|
||||
{
|
||||
#ifdef ENABLE_SOUND
|
||||
if (is_working())
|
||||
{
|
||||
SG_LOG( SG_SOUND, SG_ALERT, "Oops, OpenAL sound manager is already initialized." );
|
||||
@ -247,10 +248,12 @@ void SGSoundMgr::init() {
|
||||
if (d->_free_sources.empty()) {
|
||||
SG_LOG(SG_SOUND, SG_ALERT, "Unable to grab any OpenAL sources!");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void SGSoundMgr::reinit()
|
||||
{
|
||||
#ifndef ENABLE_SOUND
|
||||
bool was_active = _active;
|
||||
|
||||
if (was_active)
|
||||
@ -263,9 +266,12 @@ void SGSoundMgr::reinit()
|
||||
|
||||
if (was_active)
|
||||
resume();
|
||||
#endif
|
||||
}
|
||||
|
||||
void SGSoundMgr::activate() {
|
||||
void SGSoundMgr::activate()
|
||||
{
|
||||
#ifdef ENABLE_SOUND
|
||||
if ( is_working() ) {
|
||||
_active = true;
|
||||
|
||||
@ -276,11 +282,13 @@ void SGSoundMgr::activate() {
|
||||
sgrp->activate();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// stop the sound manager
|
||||
void SGSoundMgr::stop() {
|
||||
|
||||
void SGSoundMgr::stop()
|
||||
{
|
||||
#ifdef ENABLE_SOUND
|
||||
// first stop all sample groups
|
||||
sample_group_map_iterator sample_grp_current = d->_sample_groups.begin();
|
||||
sample_group_map_iterator sample_grp_end = d->_sample_groups.end();
|
||||
@ -319,9 +327,12 @@ void SGSoundMgr::stop() {
|
||||
_renderer = "unknown";
|
||||
_vendor = "unknown";
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void SGSoundMgr::suspend() {
|
||||
void SGSoundMgr::suspend()
|
||||
{
|
||||
#ifdef ENABLE_SOUND
|
||||
if (is_working()) {
|
||||
sample_group_map_iterator sample_grp_current = d->_sample_groups.begin();
|
||||
sample_group_map_iterator sample_grp_end = d->_sample_groups.end();
|
||||
@ -331,9 +342,12 @@ void SGSoundMgr::suspend() {
|
||||
}
|
||||
_active = false;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void SGSoundMgr::resume() {
|
||||
void SGSoundMgr::resume()
|
||||
{
|
||||
#ifdef ENABLE_SOUND
|
||||
if (is_working()) {
|
||||
sample_group_map_iterator sample_grp_current = d->_sample_groups.begin();
|
||||
sample_group_map_iterator sample_grp_end = d->_sample_groups.end();
|
||||
@ -343,10 +357,13 @@ void SGSoundMgr::resume() {
|
||||
}
|
||||
_active = true;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// run the audio scheduler
|
||||
void SGSoundMgr::update( double dt ) {
|
||||
void SGSoundMgr::update( double dt )
|
||||
{
|
||||
#ifdef ENABLE_SOUND
|
||||
if (_active) {
|
||||
alcSuspendContext(d->_context);
|
||||
|
||||
@ -389,6 +406,7 @@ if (isNaN(_velocity.data())) printf("NaN in listener velocity\n");
|
||||
|
||||
alcProcessContext(d->_context);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// add a sample group, return true if successful
|
||||
@ -486,6 +504,7 @@ void SGSoundMgr::release_source( unsigned int source )
|
||||
|
||||
it = std::find(d->_sources_in_use.begin(), d->_sources_in_use.end(), source);
|
||||
if ( it != d->_sources_in_use.end() ) {
|
||||
#ifdef ENABLE_SOUND
|
||||
ALint result;
|
||||
|
||||
alGetSourcei( source, AL_SOURCE_STATE, &result );
|
||||
@ -495,6 +514,7 @@ void SGSoundMgr::release_source( unsigned int source )
|
||||
|
||||
alSourcei( source, AL_BUFFER, 0 ); // detach the associated buffer
|
||||
testForALError("release_source");
|
||||
#endif
|
||||
d->_free_sources.push_back( source );
|
||||
d->_sources_in_use.erase( it );
|
||||
}
|
||||
@ -503,7 +523,7 @@ void SGSoundMgr::release_source( unsigned int source )
|
||||
unsigned int SGSoundMgr::request_buffer(SGSoundSample *sample)
|
||||
{
|
||||
ALuint buffer = NO_BUFFER;
|
||||
|
||||
#ifdef ENABLE_SOUND
|
||||
if ( !sample->is_valid_buffer() ) {
|
||||
// sample was not yet loaded or removed again
|
||||
string sample_name = sample->get_sample_name();
|
||||
@ -562,7 +582,7 @@ unsigned int SGSoundMgr::request_buffer(SGSoundSample *sample)
|
||||
else {
|
||||
buffer = sample->get_buffer();
|
||||
}
|
||||
|
||||
#endif
|
||||
return buffer;
|
||||
}
|
||||
|
||||
@ -580,8 +600,10 @@ void SGSoundMgr::release_buffer(SGSoundSample *sample)
|
||||
sample->no_valid_buffer();
|
||||
buffer_it->second.refctr--;
|
||||
if (buffer_it->second.refctr == 0) {
|
||||
#ifdef ENABLE_SOUND
|
||||
ALuint buffer = buffer_it->second.id;
|
||||
alDeleteBuffers(1, &buffer);
|
||||
#endif
|
||||
d->_buffers.erase( buffer_it );
|
||||
testForALError("release buffer");
|
||||
}
|
||||
@ -623,6 +645,7 @@ bool SGSoundMgr::load(const string &samplepath, void **dbuf, int *fmt,
|
||||
vector<const char*> SGSoundMgr::get_available_devices()
|
||||
{
|
||||
vector<const char*> devices;
|
||||
#ifdef ENABLE_SOUND
|
||||
const ALCchar *s;
|
||||
|
||||
if (alcIsExtensionPresent(NULL, "ALC_enumerate_all_EXT") == AL_TRUE) {
|
||||
@ -642,7 +665,7 @@ vector<const char*> SGSoundMgr::get_available_devices()
|
||||
}
|
||||
devices.push_back(ptr);
|
||||
}
|
||||
|
||||
#endif
|
||||
return devices;
|
||||
}
|
||||
|
||||
@ -659,17 +682,20 @@ bool SGSoundMgr::testForError(void *p, string s)
|
||||
|
||||
bool SGSoundMgr::testForALError(string s)
|
||||
{
|
||||
#ifdef ENABLE_SOUND
|
||||
ALenum error = alGetError();
|
||||
if (error != AL_NO_ERROR) {
|
||||
SG_LOG( SG_SOUND, SG_ALERT, "AL Error (sound manager): "
|
||||
<< alGetString(error) << " at " << s);
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SGSoundMgr::testForALCError(string s)
|
||||
{
|
||||
#ifdef ENABLE_SOUND
|
||||
ALCenum error;
|
||||
error = alcGetError(d->_device);
|
||||
if (error != ALC_NO_ERROR) {
|
||||
@ -678,6 +704,7 @@ bool SGSoundMgr::testForALCError(string s)
|
||||
<< s);
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user