OpenAL - определить максимальные источники - PullRequest
18 голосов
/ 20 мая 2010

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

Поиск в интернете нашел 2 рекомендации:

  • продолжайте генерировать исходные коды OpenAL, пока не получите ошибку. Однако во FreeSL (обертке OpenAL) есть примечание о том, что это «очень плохо и может даже вызвать сбой библиотеки»
  • предположим, у вас есть только 16; зачем кому-то еще требовать больше? (!)

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

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

Спасибо за потраченное время,

Bill

Ответы [ 3 ]

11 голосов
/ 08 июля 2010

Обновление:

Я не могу найти способ определить, какое максимальное количество источников поддерживает устройство, но я думаю, что нашел способ определения максимального количества поддерживаемых контекстом (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 обычно допускают неограниченное количество источников. Ну, на самом деле не бесконечно, в конце концов вы будете максимально использовать либо процессор, либо RAM.

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

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

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

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

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

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

8 голосов
/ 16 октября 2013

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

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

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

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

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

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

4 голосов
/ 29 июля 2010

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

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), поэтому максимальный источник не всегда одинаков вещь как максимальная одновременная игра.

...