Подтвердить что ты не робот

OpenAL - определить максимальные источники

Существует ли API, который позволяет вам определять максимальное количество "источников" OpenAL, разрешенных базовым звуковым оборудованием?

В Интернете я нашел 2 рекомендации:

  • продолжайте генерировать источники OpenAL, пока не получите ошибку. Тем не менее, в FreeSL (OpenAL wrapper) есть заметка о том, что это "очень плохо и может даже разбивать библиотеку".
  • Предположим, что у вас только 16; зачем кому-то понадобиться больше? (!)

Вторая рекомендация даже принята FreeSL.

Итак, существует ли общий API для определения количества одновременных "голосов"?

Спасибо за ваше время,

Билл

4b9b3361

Ответ 1

обновление:

Я не могу найти способ определить, какое максимальное количество источников поддерживает устройство, но я думаю, что нашел, как определить максимальный контекст (ALC_MONO_SOURCES). Из этого следует, что контекст поддерживает тот же номер, что и его родительское устройство.

//error checking omitted for brevity
ALCdevice* device = alcOpenDevice(NULL);
ALCcontext* context = alcCreateContext(device,NULL);
ALCint size;
alcGetIntegerv( device, ALC_ATTRIBUTES_SIZE, 1, &size);
std::vector<ALCint> attrs(size);
alcGetIntegerv( device, ALC_ALL_ATTRIBUTES, size, &attrs[0] );
for(size_t i=0; i<attrs.size(); ++i)
{
   if( attrs[i] == ALC_MONO_SOURCES )
   {
      std::cout << "max mono sources: " << attrs[i+1] << std::endl;
   }
}

Это возвращает 255 на Ubuntu 10.4, используя запасной драйвер OpenAL.


Длинный ответ очень любопытен...

Программные OpenAL-драйверы, как правило, допускают бесконечное количество источников. Ну, не совсем бесконечно, в конце концов вы в конечном итоге выйдете из CPU или RAM.

Большинство аппаратных OpenAL-драйверов поддерживают только столько источников, сколько аппаратное обеспечение имеет каналы. В настоящее время, по крайней мере, 16, возможно, 32 или более, но может быть целых 256. Возможно, есть звуковые карты, которые поддерживают больше, но 256 - это самый большой из всех, над чем я когда-либо смотрел.

В Windows DirectSound драйверы произвольно ограничены 31 (почему не 32?) источниками. DirectSound устарел, поэтому я не знаю, распространяется ли это на Vista и Windows 7.

iPhone поддерживает 32 источника.

Я видел один аппаратный драйвер, который был под управлением программного обеспечения. Это означает, что каждый источник будет снабжен аппаратным каналом, пока не закончится. Затем он будет смешивать некоторые звуки в программном обеспечении, прежде чем отправлять его с аппаратного обеспечения. Это дает лучшее из обоих миров, близких к бесконечным источникам, в то же время используя как можно больше аппаратного ускорения.

На практике, если вы используете драйвер на основе оборудования, просто продолжайте создавать их до тех пор, пока не завершится сбой alGenSources. Я слышал, что это не работает на iPhone. Там есть некоторые программные OpenAL-драйверы, которые будут аварийно завершены до того, как alGenSources завершится с ошибкой.

На самом деле должен быть API для проверки максимального количества источников и количества источников, которые ускоряются аппаратными средствами. Возможно, есть расширения.

Ответ 2

Количество источников, которые вы можете создать через alGenSources(), не имеет ничего общего с количеством источников, которым разрешено одновременно воспроизводить.

На iPad 4 (единственное устройство, которое я тестировал) максимальное количество голосов, которое вы можете играть одновременно, 32. Если вы попытаетесь воспроизвести 33-й звук, вы получите сообщение об ошибке alSourcePlay()

AL ERROR: -1 - AL_INVALID (общая ошибка)

И звук не воспроизводится. Но источник может существовать, он может перемещаться и иметь различные настройки, установленные для него. он просто не будет воспроизводиться, пока один из остальных 32 звуков воспроизведения не закончит игру.

Я успешно создал до 2048 источников на iPad 4, просто используя цикл. Это не значит, что я могу воспроизводить 2048 звуков одновременно.

Итак, мой ответ: проверить аппаратную платформу и код в максимальном одновременном SFX самостоятельно.

Ответ 3

вы можете запросить максимальный источник:

ALCint nummono, numstereo;
alcGetIntegerv(device, ALC_MONO_SOURCES, 1, &nummono);
alcGetIntegerv(device, ALC_STEREO_SOURCES, 1, &numstereo);

но это не стандартно или в спецификации openAL 1.1 (вероятно, будет добавлено в 1.2), некоторый драйвер (реализация openAL) может ответить на этот запрос, а некоторые нет, поэтому, если вам повезет, вы получите ответ, но если нет, нет другого решения, кроме как вызвать alGenSources(), пока он не вернет ошибку.

и вы должны заметить, что некоторые реализации ведут себя по-другому, AFAIK, например, на Apple iPhone, они могут создавать 256 исходных макс, но вы не можете одновременно воспроизводить 256 источников (ограничено до 64), поэтому максимальный источник не всегда одинаковый как максимальная параллельная игра.