diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp index 5122b3a5a..041759683 100644 --- a/apps/openmw/mwsound/openal_output.cpp +++ b/apps/openmw/mwsound/openal_output.cpp @@ -441,12 +441,34 @@ void OpenAL_Output::init(const std::string &devname) try { ALCuint maxtotal = std::min(maxmono+maxstereo, 256); - for(size_t i = 0;i < maxtotal;i++) + if (maxtotal == 0) // workaround for broken implementations { - ALuint src = 0; - alGenSources(1, &src); - throwALerror(); - mFreeSources.push_back(src); + maxtotal = 256; + bool stop = false; + for(size_t i = 0;i < maxtotal && !stop;i++) // generate source until error returned + { + ALuint src = 0; + alGenSources(1, &src); + ALenum err = alGetError(); + if(err != AL_NO_ERROR) + { + stop = true; + } + else + { + mFreeSources.push_back(src); + } + } + } + else // normal case + { + for(size_t i = 0;i < maxtotal;i++) + { + ALuint src = 0; + alGenSources(1, &src); + throwALerror(); + mFreeSources.push_back(src); + } } } catch(std::exception &e)