Перечисление всех устройств в открытом AL не работаетC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Перечисление всех устройств в открытом AL не работает

Сообщение Anonymous »

Я нашел несколько примеров, в которых утверждается, что они перечисляют все устройства вывода звука с помощью openAL, однако я могу заставить их отображать только текущее выбранное устройство в OSX (Yosemite, Maverick). Я использую Mac и имею звуковую карту по умолчанию (встроенный выход), а также устройство для трансляции и некоторые звуковые устройства.
Примечание: в Windows перечислены все устройства.
Я ожидаю
s = (char *)alcGetString(NULL, ALC_ALL_DEVICES_SPECIFIER);

чтобы перечислить хотя бы карту по умолчанию и звуковые устройства. Он ничего не возвращает.
s = (char *)alcGetString(NULL, ALC_DEVICE_SPECIFIER);

возвращает выбранное в данный момент устройство.
Может быть, есть какая-то проблема с виртуальными устройствами? однако, если выбрать soundflower в настройках Mac в качестве вывода по умолчанию, сначала он появится вместо «Встроенного вывода». Мы также попробовали использовать внешний ЦАП и получили такое же поведение.
list of all available output devices: Built-in Output
list of all available input devices: Built-in Microphone
default output device: Built-in Output
default input device: Built-in Microphone
...

Вот код:
#ifdef __APPLE__
# include
# include
#else
# include
# include
# include
#endif

#ifndef AL_VERSION_1_1
# ifdef __APPLE__
# include
# include
#else
# include
# include
# endif
#endif

#include
#include
#include
#include

using std::string;

#ifndef ALC_ALL_DEVICES_SPECIFIER
# define ALC_ALL_DEVICES_SPECIFIER 0x1013
#endif

#define MAX_DATA 16
static const int indentation = 4;
static const int maxmimumWidth = 79;

void printExtensions (const char *, char, const char *);
void displayDevices(const char *, const char *);
char *getDeviceName(int, char **);
void testForError(void *, const string&);
void testForALCError(ALCdevice *);

int main(int argc, char **argv)
{
ALCint data[MAX_DATA];
ALCdevice *device = NULL;
ALCcontext *context = NULL;
ALenum error;
char *s;

if (alcIsExtensionPresent(NULL, "ALC_enumeration_EXT") == AL_TRUE)
{
if (alcIsExtensionPresent(NULL, "ALC_enumerate_all_EXT") == AL_FALSE)
s = (char *)alcGetString(NULL, ALC_DEVICE_SPECIFIER);
else
s = (char *)alcGetString(NULL, ALC_ALL_DEVICES_SPECIFIER);
displayDevices("output", s);

s = (char *)alcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER);
displayDevices("input", s);
}

s = getDeviceName(argc, argv);
device = alcOpenDevice(s);
testForError(device, "Audio device not available.");

context = alcCreateContext(device, NULL);
testForError(context, "Unable to create a valid context.");

alcMakeContextCurrent(context);
testForALCError(device);

s = (char *)alcGetString(device, ALC_DEFAULT_DEVICE_SPECIFIER);
printf("default output device: %s\n", s);
testForALCError(device);

error = alcIsExtensionPresent(device, "ALC_EXT_capture");
if (error)
{
s = (char *)alcGetString(device, ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER);
printf("default input device: %s\n", s);
testForALCError(device);
}
printf("capture support: %s\n", (error) ? "yes" : "no");

alcGetIntegerv(device, ALC_FREQUENCY, 1, data);
printf("mixer frequency: %u hz\n", data[0]);
testForALCError(device);

alcGetIntegerv(device, ALC_REFRESH, 1, data+1);
printf("refresh rate : %u hz\n", data[0]/data[1]);
testForALCError(device);

data[0] = 0;
alcGetIntegerv(device, ALC_MONO_SOURCES, 1, data);
error = alcGetError(device);
if (error == AL_NONE) {
printf("supported sources; mono: %u, ", data[0]);

data[0] = 0;
alcGetIntegerv(device, ALC_STEREO_SOURCES, 1, data);
printf("stereo: %u\n", data[0]);
testForALCError(device);
}

printf("ALC version: ");
alcGetIntegerv(device, ALC_MAJOR_VERSION, 1, data);
printf("%i.", *data);
alcGetIntegerv(device, ALC_MINOR_VERSION, 1, data);
printf("%i\n", *data);
testForALCError(device);

s = (char *)alcGetString(device, ALC_EXTENSIONS);
printExtensions ("ALC extensions", ' ', s);
testForALCError(device);

s = (char *)alGetString(AL_VENDOR);
error = alGetError();
if ((error = alGetError()) != AL_NO_ERROR)
printf("Error #%x: %s\n", error, alGetString(error));
else
printf("OpenAL vendor string: %s\n", s);

s = (char *)alGetString(AL_RENDERER);
if ((error = alGetError()) != AL_NO_ERROR)
printf("Error #%x: %s\n", error, alGetString(error));
else
printf("OpenAL renderer string: %s\n", s);

s = (char *)alGetString(AL_VERSION);
if ((error = alGetError()) != AL_NO_ERROR)
printf("Error #%x: %s\n", error, alGetString(error));
else if (!s)
printf("Querying AL_VERSION returned NULL pointer!\n");
else
printf("OpenAL version string: %s\n", s);

s = (char *)alGetString(AL_EXTENSIONS);
printExtensions ("OpenAL extensions", ' ', s);
testForALCError(device);

/* alut testing mechanism */
context = alcGetCurrentContext();
if (context == NULL)
{
printf("Error: no current context\n");
}
else
{
if (alGetError () != AL_NO_ERROR)
{
printf("Alert: AL error on entry\n");
}
else
{
if (alcGetError (alcGetContextsDevice (context)) != ALC_NO_ERROR)
{
printf("Alert: ALC error on entry\n");
}
}
}
/* end of alut test */

if (alcMakeContextCurrent(NULL) == 0)
printf("alcMakeContextCurrent failed.\n");

device = alcGetContextsDevice(context);
alcDestroyContext(context);
testForALCError(device);

if (alcCloseDevice(device) == 0)
printf("alcCloseDevice failed.\n");

return 0;
}

/* -------------------------------------------------------------------------- */

void
printChar (int c, int *width)
{
putchar (c);
*width = (c == '\n') ? 0 : (*width + 1);
}

void
indent (int *width)
{
int i;
for (i = 0; i < indentation; i++)
{
printChar (' ', width);
}
}

void
printExtensions (const char *header, char separator, const char *extensions)
{
int width = 0, start = 0, end = 0;

printf ("%s:\n", header);
if (extensions == NULL || extensions[0] == '\0')
{
return;
}

indent (&width);
while (1)
{
if (extensions[end] == separator || extensions[end] == '\0')
{
if (width + end - start + 2 > maxmimumWidth)
{
printChar ('\n', &width);
indent (&width);
}
while (start < end)
{
printChar (extensions[start], &width);
start++;
}
if (extensions[end] == '\0')
{
break;
}
start++;
end++;
if (extensions[end] == '\0')
{
break;
}
printChar (',', &width);
printChar (' ', &width);
}
end++;
}
printChar ('\n', &width);
}

char *
getCommandLineOption(int argc, char **argv, const string& option)
{
int slen = option.size();
char *rv = 0;
int i;

for (i=0; i

Подробнее здесь: https://stackoverflow.com/questions/289 ... s-not-work
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»