C#: Unity3D y NAudio EnumerateAudioEndPoints lanzan NullReferenceException
– UnityAssets3Free
bienvenido , soy jorge y aqui os traigo
esta pregunta
Estoy tratando de usar la biblioteca NAudio en un proyecto de Unity3D. Al llamar a MMDeviceEnumerator.EnumerateAudioEndPoints, se lanza una NullReferenceException. Esto no ocurre en un proyecto de Visual Studio destinado a .NET 2.0. El enumerador en sí no es nulo. Este método implica una llamada a IMMDeviceEnumerator.EnumAudioEndpoints, que es lo que genera directamente esta excepción (trasladé un montón de código de NAudio a mi proyecto Unity3D).
La única diferencia real aquí es que se ejecuta dentro de un juego Unity3D en lugar de una aplicación estándar de Visual Studio. ¿Qué podría estar causando esto? Por favor ayuda.
Actualizar:
Mi código que arroja (segunda línea):
MMDeviceEnumerator enumerator = new MMDeviceEnumerator();
MMDeviceCollection collection = enumerator.EnumerateAudioEndPoints(DataFlow.All, DeviceState.All);
Código NAudio que se inicia (segunda línea del método):
public MMDeviceCollection EnumerateAudioEndPoints(DataFlow dataFlow, DeviceState dwStateMask)
IMMDeviceCollection result;
Marshal.ThrowExceptionForHR(_realEnumerator.EnumAudioEndpoints(dataFlow, dwStateMask, out result));
return new MMDeviceCollection(result);
Actualización x2:
En el constructor de MMDeviceEnumerator en NAudio:
_realEnumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator;
El nuevo objeto con no es nulo, pero al convertirlo se vuelve nulo. Nuevamente, esto funciona en un proyecto de Visual Studio, pero no en Unity3D. Aquí están las definiciones de cada uno (de la fuente NAudio):
[ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")]
class MMDeviceEnumeratorComObject
y
[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDeviceEnumerator
int EnumAudioEndpoints(DataFlow dataFlow, DeviceState stateMask,
out IMMDeviceCollection devices);
int GetDefaultAudioEndpoint(DataFlow dataFlow, Role role, out IMMDevice endpoint);
int GetDevice(string id, out IMMDevice deviceName);
int RegisterEndpointNotificationCallback(IMMNotificationClient client);
int UnregisterEndpointNotificationCallback(IMMNotificationClient client);
Puedo publicar los otros objetos allí si es necesario. Lo que me estoy perdiendo es probablemente el principal «por qué» que cambiaría algo entre Unity3D (también dirigido a .NET 2.0) y Visual Studio.
0
nota: si aun no se resuelve tu pregunta por favor dejar un comentario y pronto lo podremos de nuevo , muchas gracias
eso es todo,espero que te funcione