}
}
+ _device = device;
ALCcontext *context = alcCreateContext(device, NULL);
+ testForALCError("context creation.");
if ( testForError(context, "Unable to create a valid context.") ) {
alcCloseDevice (device);
return;
_vendor = (const char *)alGetString(AL_VENDOR);
_renderer = (const char *)alGetString(AL_RENDERER);
- if ( _vendor != "OpenAL Community" ||
+ if ( (_vendor != "OpenAL Community" && _vendor != "Apple Computer Inc.") ||
(_renderer != "Software" && _renderer != "OpenAL Sample Implementation")
)
{
ALfloat freqf;
data = alutLoadMemoryFromFile(samplepath.c_str(), &format, &size, &freqf );
freq = (ALsizei)freqf;
- if (data == NULL) {
- int error = alutGetError();
+ int error = alutGetError();
+ if (data == NULL || error != ALUT_ERROR_NO_ERROR) {
string msg = "Failed to load wav file: ";
- msg.append(alutGetErrorString(error));
+ msg.append(alutGetErrorString(error));
throw sg_io_exception(msg.c_str(), sg_location(samplepath));
return false;
}
ALenum error = alGetError();
if ( error != AL_NO_ERROR ) {
string msg = "Failed to load wav file: ";
- msg.append(alGetString(error));
+ const ALchar *errorString = alGetString(error);
+ if (errorString) {
+ msg.append(errorString);
+ } else {
+ // alGetString returns NULL when an unexpected or OS specific error
+ // occurs: e.g. -43 on Mac when file is not found.
+ // In this case, alGetString() sets 'Invalid Enum' error, so
+ // showing with the original error number is helpful.
+ stringstream ss;
+ ss << alGetString(alGetError()) << "(" << error << ")";
+ msg.append(ss.str());
+ }
throw sg_io_exception(msg.c_str(), sg_location(samplepath));
return false;
}