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

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

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

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

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

Так, есть ли общий API для определения количества одновременной поддерживаемой "речи"?

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

Счет

18
задан Bill Kotsias 20 May 2010 в 07:56
поделиться

2 ответа

update:

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

На Ubuntu 10.4 с использованием стокового драйвера OpenAL это возвращает 255.


Длинный ответ...

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

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

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

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

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

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

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

11
ответ дан 30 November 2019 в 08:43
поделиться

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

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

4
ответ дан 30 November 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: