Войти
ПрограммированиеФорумЗвук

OpenAL выбор устройства

#0
14:28, 24 дек. 2006

В системе установлено 2 звуковые карты. Но я никак не могу найти способ выбирать на какую звуковуху выводить звук (для какой из карт инициализировать контекст). В документации на эту тему сплошная вода. alcGetString(NULL, ALC_DEVICE_SPECIFIER) перечисляет поддерживаемые способы воспроизведения (Hardware, Software) устройства которое выбирается самой библиотекой OpenAl (библиотеке конечно лучше знать на какую звуковуху мне надо выводить звук =[ ). Интиресно что для захвата звука проблем с перечислением и выбором физических устройств нет (alcGetString(NULL,ALC_CAPTURE_DEVICE_SPECIFIER) возвращает список физических устройст захвата установленных в системе).


#1
16:55, 24 дек. 2006

August

смотри SDK, пример enumerate называется...

#2
18:03, 24 дек. 2006

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

#3
1:21, 25 дек. 2006

Хорошо, но должно ведь быть какоето решение. Как мне создать контекст вывода для того устройства (физического) которое мне надо, а не для того которое выберет за меня библиотека OpenAL? Судя по всему я не первый человек который сталкивается с подобным. Решение просто не может не существовать, иначе подобное обстоятельство можно расценить как грубейшую недоработку...

#4
9:21, 25 дек. 2006

Перечислить устройства не проблема например так:

   // Получения списка устройств
   def_dev  = p->alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER);
   dev_list = p->alcGetString(NULL, ALC_DEVICE_SPECIFIER);

   // запомним устройство по умолчанию
   if(def_dev)
   {
      wsprintf(p->Device[p->Devices++].Name,"%s",def_dev);
      // Перечисление устройств
      if(p->alcIsExtensionPresent(NULL, "ALC_ENUMERATION_EXT") == AL_TRUE && dev_list)
      {
         // Обработка списка устройств воспроизведения
       for(i = 0; i < 32; i++)
         {
            // если устройство не является устройством по умолчанию, то добавим в список
         if(strcmp(dev_list, def_dev) != 0)
               wsprintf(p->Device[p->Devices++].Name,"%s",dev_list);
         
            // переход на следующее устройство
            dev_list = dev_list + strlen(dev_list) + 1;
            if(dev_list[0] == 0)
               break;
       }
      }
   }
Правда перечисление работает только в версии OpenAL 1.1

установить нужное устройство например так:

      // Открытие устройства воспроизведения по умолчанию
      if(stricmp(p->Device[d].Name,"Default device") == 0)
         dev = p->alcOpenDevice(NULL);
      else
         dev = p->alcOpenDevice(p->Device[d].Name);

А вобще, по моему скромному мнению, OpenAL если бы за ним не стояла Creative весьма и весьма слабый интерфейс.

#5
11:36, 25 дек. 2006

Спасибо, но это не то решение которое мне надо. Предидущий код производит перечисление поддерживаемых интерфейсов воспроизведения звука (для Hardware это DirectSound3d, для Software это просто DirectSound или waveOut) но не физических устройств (звуковых карт) установленных в системе. Хотя все равно странно, почему такойже метод, но только для выбора устройства захвата (запись звука с карты), отрабатывает именно так как надо. Возможно я чтото упускаю из виду ...

#6
12:06, 25 дек. 2006

Увы, перечисление физических устройств - это для OpenAL задача непосильная, поверьте, я долго бился над схожей проблемой, но решения так и не нашел. Видимо сказывается что интерфейс готовили к системам где только 1 (!) звуковая карта. Что до записи звука то я думаю что там решили просто 1 карта 1 устройство записи, хотя не факт, например что мешает самому написать OpenAL  и не снабдить его несколькими системами записи звука, например Wave, Direct, ASIO...

#7
13:15, 25 дек. 2006

Время =) (точнее его отсутсвие =\ )
Основные характеристики по которым я выбирал библиотеку - мультиплатформенность, открытые исходники, максимальная гибкость. OpenAL всеже действительно в большей степени предназначен для игровых разработок. Для мультимедийных приложений эта библиотека на самый лучший выбор. Покачто нашел альтернативу в виде библиотеки PortAudio.

#8
14:28, 25 дек. 2006

Да я полностью согласен, OpenAL это для игр, причем что забавно, на сегодняшний момент только через него можно добраться до технологии XRAM, хотя конечно это не самая навороченная вещь, но все же потенциал у этой технологии, опять же по моим прикидкам, очень высокий. И насколько я понял в директ эту технологию не пустили, дабы популяризировать OpenAL. Касательно мультимедиа приложений, то тут я считаю все нужно писать самому, потому как там часто очень специфичные задачи. 

Прошло более 1 года
#9
23:11, 10 июля 2008

Чисто аппаратные устройства перечислить нельзя, но можно ведь перебрать все устройства вывода - тоесть все звуковые карты, и обычно для каждой с них это hardware and softwar. Как работать со строками, сравнивать их думаю вы знаете, значит алгоритм нахождения повторяющихся звуковых карт в перечисленных устройствах организовать сможете.
Отличный пример устройств есть в SDK. У кого нету, вот держите, мой:
 
const ALchar* pDeviceNames = NULL;
int index=0;

pDeviceNames=alcGetString(NULL,ALC_ALL_DEVICES_SPECIFIER);
while(pDeviceNames&&*pDeviceNames)
{ControlForm->SoundUnitList->Items->Strings[index]=pDeviceNames;
  index++;
  pDeviceNames+=strlen(pDeviceNames)+1;
}

У меня 2 звуковые и вот такой результат кода:

Generic Hardware on Sound Blaster Live! 24-bit
Generic Software on Sound Blaster Live! 24-bit
Generic Software on Realtek HD Audio output
Generic Hardware on Realtek HD Audio output

ПрограммированиеФорумЗвук

Тема в архиве.