Вопрос

Я пытаюсь использовать DirectSound для захвата звука с микрофона.Вот мой код:

    using Microsoft.DirectX.DirectSound;
    public MicrophoneSensor()
    {
            CaptureBufferDescription micBufferDesc = new CaptureBufferDescription();
            WaveFormat format = new WaveFormat();
            format.SamplesPerSecond = 22000;
            format.Channels = 1;
            format.BitsPerSample = 8;
            format.AverageBytesPerSecond = 22000;
            format.BlockAlign = 1;

            micBufferDesc.Format = format;
            micBufferDesc.BufferBytes = 100000;
            micBufferDesc.ControlEffects = false;
            micBufferDesc.WaveMapped = true;

            micBuffer = new CaptureBuffer(micBufferDesc, microphone);
     }

Экземпляры переменных micBufferDesc и format приводят к тому, что Visual Studio 2008 выдает следующую ошибку:

Вызов неоднозначен между следующими методами или свойствами:'Microsoft.DirectX.DirectSound.CaptureBufferDescription.CaptureBufferDescription()' и 'Microsoft.DirectX.DirectSound.Описание CaptureBufferDescription.Функция CaptureBufferDescription()'

и

Вызов неоднозначен между следующими методами или свойствами:'Microsoft.DirectX.DirectSound.Формат волны.Формат волны()' и 'Microsoft.DirectX.DirectSound.Формат волны.Формат волны()'

Я перепробовал довольно много различных комбинаций указания пространства имен и использования инструкций, но безуспешно.

Я также проверил ссылки в обозревателе решений, и, насколько я могу судить, дубликатов нет.

Совершенно новый тестовый проект, содержащий только ссылку Microsoft.DirectX.DirectSound и ничего больше, по-прежнему выдает ту же ошибку.

Я также удалил и переустановил DirectX SDK (март 2009), а также DirectX SDK (ноябрь 2008).Все еще безуспешно.

Наконец, я попробовал новый проект на другом компьютере здесь, в лаборатории, и он по-прежнему не работает.

Вот ссылки, которые у меня есть:

  • График
  • Майкрософт.DirectX.DirectSound
  • Майкрософт.DirectX.Прямой ввод
  • Ядро презентации
  • Структура презентации
  • Обслуживание
  • Система
  • Система.Ядро
  • Система.Данные
  • Расширения System.Data.DataSet
  • Система.Развертывание
  • Система.Рисование
  • Система.Среда выполнения.Сериализация
  • Система.Модель обслуживания
  • Система.Windows.Формы
  • System.Xml
  • System.Xml.Linq Система.Xml.Linq
  • Поставщик пользовательского интерфейса
  • База окон
  • Интеграция WindowsFormsIntegration
Это было полезно?

Решение

У меня была такая же ошибка, это не двойная ссылка.Нажмите выполнить, и компилятор волшебным образом забудет об этом, или вы можете полностью прекратить раздражение следующим образом.

using System.Reflection;

// then instead of WaveFormat fmt = new WaveFormat()

ConstructorInfo constructor = typeof(WaveFormat).GetConstructor(Type.EmptyTypes);
WaveFormat fmt = (WaveFormat)constructor.Invoke(null);

// do the same for CaptureBufferDescription

Другие советы

Похоже, возможно, вы ссылаетесь на несколько версий сборки directx.Возможно, перепроверьте свои рекомендации.Если вы потребность тогда несколько версий extern alias может помочь - но это некрасиво.


В Visual Studio найдите "обозреватель решений" (обычно с правой стороны) - это дерево всего, что есть в вашем проекте.Одним из элементов в этом дереве являются "Ссылки".Это визуальное представление внешних библиотек dll, для использования которых настроен ваш код.

(существует много-много .NET dll - вам нужно сообщить каждому проекту, какие библиотеки DLL ему могут понадобиться)

Разверните этот узел и найдите 2 записи, похожие на directx.Если там являются во-вторых, избавьтесь от одного из них (в идеале от того, у которого более низкая версия).Затем попробуйте перестроиться.

вы включили две ссылки на разные версии сборки, содержащей эту функцию.Удалите одну из ссылок.

У вас может быть несколько ссылок на сборку DirectX.Проверьте свой проект в папке References.Ищите повторяющиеся записи, в частности ссылки на несколько версий microsoft.directx.directsound.dll .Если есть дубликаты, удалите один и повторите попытку.

Это распространенная проблема с DirectSound.Вы обнаружите также много-много других проблем ;) Помните, что в DS ничто не является тем, чем кажется.Когда буфер возвращает null, это, вероятно, происходит только потому, что "позиция чтения" - это просто указатель записи во внутренний буфер.Поэтому, когда вы запрашиваете указатели на чтение или запись, всегда вычисляйте хотя бы одну безопасную зону блока ;) и когда вы получаете позиции буфера из методов ds, используйте try cast, потому что это может выдавать случайные ошибки.

Принудительная компиляция вашего программного обеспечения в x86 или x64 вместо "Любого процессора" устранит проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top