C #: Unity3D и NAudio EnumerateAudioEndPoints генерирует исключение NullReferenceException - PullRequest
1 голос
/ 17 февраля 2012

Я пытаюсь использовать библиотеку NAudio в проекте Unity3D.При вызове MMDeviceEnumerator.EnumerateAudioEndPoints генерируется исключение NullReferenceException.Это не происходит в проекте Visual Studio, ориентированном на .NET 2.0.Сам перечислитель не равен нулю.Этот метод оборачивает вызов IMMDeviceEnumerator.EnumAudioEndpoints, который непосредственно вызывает это исключение (я переместил кучу кода из NAudio в мой проект Unity3D).

Единственное реальное отличие состоит в том, что он работает внутри Unity3Dигра, а не стандартное приложение Visual Studio.Что может быть причиной этого?Пожалуйста, помогите.

Обновление:

Мой код, который выбрасывает (вторая строка):

MMDeviceEnumerator enumerator = new MMDeviceEnumerator();
MMDeviceCollection collection = enumerator.EnumerateAudioEndPoints(DataFlow.All, DeviceState.All);

NA Аудио код, который выдает (вторая строка метода):

public MMDeviceCollection EnumerateAudioEndPoints(DataFlow dataFlow, DeviceState dwStateMask)
{
    IMMDeviceCollection result;
    Marshal.ThrowExceptionForHR(_realEnumerator.EnumAudioEndpoints(dataFlow, dwStateMask, out result));
    return new MMDeviceCollection(result);
}

Обновление x2:

В конструкторе для MMDeviceEnumerator в NAudio:

_realEnumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator;

Новый объект com не равен NULL, но при касте становится нулевым.Опять же, это работает в проекте Visual Studio, но не в Unity3D.Вот определения каждого (из источника NAudio):

[ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")]
class MMDeviceEnumeratorComObject
{
}

и

[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);
}

Я могу разместить другие объекты там, если это необходимо.Чего мне не хватает, так это того, что ядро ​​«почему» может измениться между Unity3D (также ориентированным на .NET 2.0) и Visual Studio.

...