OpenAL no me abre el dispositivo elegido

Iniciado por Desiresportal, 8 Marzo 2019, 05:23 AM

0 Miembros y 1 Visitante están viendo este tema.

Desiresportal

Muy buenas a todos.

Estoy teniendo un problemilla tecnico con un programa (mas bien libreria) que estoy haciendo. Intento poder elegir los altavoces (o auriculares) por los que emito los sonidos.

OpenAL puede abrir el dispositivo de salida por defecto cuando se lo pido a él usando "alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER)". Sin embargo, cuando obtengo el nombre del dispositivo con WinAPI y se lo paso a OpenAL para que abra ese, no lo hace.

¿Porque? No lo sé. Solo sé que el dispositivo por defecto OpenAL dice llamarlo como "Generic Hardware".

Os pongo un codigo de ejemplo para que veais el proceso que sigo y me digais como hacer que OpenAL me saque el sonido por el dispositivo de salida que elija yo.



#include <windows.h>
#include <AL/al.h>
#include <AL/alc.h>
#include <iostream>
using namespace std;

int main() {
int speakerID = 0;

WAVEOUTCAPSA outCaps;
waveOutGetDevCaps(speakerID, &outCaps, sizeof(WAVEOUTCAPSA));

ALCdevice speaker = alcOpenDevice(outCaps.szPname);

if (speaker == NULL) {
cout << "No se ha podido abrir el dispositivo de salida indicado." << endl;
}

return 0;
}



Sé que la funcion "waveOutGetDevCaps()" me devuelve un nombre supuestamente valido porque es el mismo que me da un programa de karaoke.

Ademas, ya tengo desarrollada la parte del uso del microfono y funciona correctamente usando el mismo procedimiento pero con sus respectivas funciones.

¿Que hago mal? ¿Tengo que incluir alguna DLL para que el programa funcione correctamente? (Por ahora solo uso "OpenAL.dll" y "wrap_oal.dll".) ¿Estar usando un ordenador portatil puede ser un problema? (Lo digo por el uso de altavoces u auriculares.)

Un saludo y gracias de antemano.

BloodSharp

Cita de: Desiresportal en  8 Marzo 2019, 05:23 AMint speakerID = 0;

¿Que hago mal? ¿Tengo que incluir alguna DLL para que el programa funcione correctamente?

Cita de: msdn
MMRESULT waveOutGetDevCaps(
   UINT_PTR      uDeviceID,
   LPWAVEOUTCAPS pwoc,
   UINT          cbwoc
);

uDeviceID
Identifier of the waveform-audio output device. It can be either a device identifier or a handle of an open waveform-audio output device.

Calculo que necesitás primero un Id o handler válido aunque según la documentación permita cero, te recomendaría mejor buscar un handler distinto de cero...


B#



Desiresportal

¿Un handler valido? ¿Como obtengo eso?

¿Un poco de codigo de ayuda para entenderlo mejor?

En realidad uso el siguiente codigo para obtener la cantidad de dispositivos disponibles y uso un bucle por el cual obtengo los nombres de cada dispositivo.



int cantidad = waveOutGetNumDevices();
WAVEOUTCAPS tempOutCaps;
for (int a=0; a<cantidad; a++) {
waveOutGetDevCaps(a, &tempOutCaps, sizeof(WAVEOUTCAPS));
cout << "Nombre: " << tempOutCaps.szPname << endl;
}



Tambien puedo sacar las caracteristicas de cada dispositivo, pero me lo ahorro porque no me sirve de mucho para mis propositos.

(Todo el codigo que estoy poniendo es a modo de ejemplo y mantiene el orden de las operaciones realizadas. Mi codigo es mas extenso y por eso no me pongo a copiarlo a mano.)

Gracias.