C# Неоднозначный вызов в DirectSound

Я пытаюсь использовать 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 и формата приводят к тому, что Visual Studio 2008 выдает следующую ошибку:

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

и

Вызов неоднозначен между следующими методами или свойствами: «Microsoft.DirectX.DirectSound.WaveFormat.WaveFormat()» и «Microsoft.DirectX.DirectSound.WaveFormet.WaveFormat()».

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

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

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

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

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

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

  • График
  • Microsoft.DirectX.DirectSound
  • Microsoft.DirectX.DirectInput
  • ПрезентацияЯдро
  • Презентация Framework
  • Услуга
  • Система
  • System.Core
  • Система.Данные
  • System.Data.DataSetExtensions
  • Система.Развертывание
  • System.Drawing
  • Система.Время выполнения.Сериализация
  • Система.ServiceModel
  • Система.Windows.Forms
  • System.Xml
  • System.Xml.Linq
  • UIAutomationProvider
  • WindowsBase
  • WindowsFormsIntegration

person Community    schedule 23.06.2009    source источник
comment
Я добавил в пост дополнительную информацию. Это странная проблема.   -  person JohnS    schedule 24.06.2009


Ответы (6)


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

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
person Community    schedule 02.09.2009
comment
Пройдет некоторое время, прежде чем я смогу проверить это, но как только я это сделаю, я опубликую свои результаты. Огромное спасибо! - person JohnS; 11.09.2009
comment
Спасибо! Игнорирование работает для меня ... однажды я научусь всегда компилировать вместо того, чтобы доверять проверке синтаксиса при вводе, я уже не раз обжигался этим. - person eselk; 08.06.2012

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


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

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

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

person Marc Gravell    schedule 23.06.2009
comment
Да, я проверил в папке ссылок. Насколько я могу судить, единственное, что содержит классы, это Microsoft.DirectX.DirectSound и ничего больше. Даже если я удалю другую ссылку DirectX (Microsoft.DirectX.DirectInput), она все равно не будет работать. Должен ли я публиковать все записи в моей папке ссылок? - person JohnS; 23.06.2009

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

person Henri    schedule 23.06.2009

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

person heavyd    schedule 23.06.2009
comment
Как узнать, откуда берутся две ссылки? Я даже не уверен, что это проблема, поскольку, когда я удаляю одну ссылку, которая, как я знаю, актуальна (Microsoft.DirectX.DirectSound), она жалуется на то, что вообще не может найти классы. - person JohnS; 25.06.2009
comment
Вы увидите повторяющиеся записи в папке ссылок. Какую версию Microsoft.DirectX.DirectSound вы используете? - person heavyd; 25.06.2009
comment
В папке «Мои ссылки» нет дубликатов. Это версия 1.0.2902.0 (из диалогового окна добавления ссылки). Он появился в DirectX SDK за март 2009 года. - person JohnS; 25.06.2009
comment
Что у вас есть в папке «Справочники»? Мне удалось начать новый проект в VS C# Express с SDK за март 2009 г., и похоже, что простое создание нового класса с учетом приведенного выше кода работает. Возможно, попробуйте это в изолированной среде и посмотрите, есть ли что-то в вашем проекте или на вашей машине. - person heavyd; 26.06.2009
comment
Я пробовал это на другой машине в лаборатории, в которой я работаю, с теми же результатами. Я обновил исходный пост со списком ссылок. - person JohnS; 29.06.2009

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

person Community    schedule 17.02.2010

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

person Community    schedule 17.03.2013