C # Неоднозначный вызов в DirectSound - PullRequest
1 голос
/ 23 июня 2009

Я пытаюсь использовать 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.WaveFormat.WaveFormat ()' а также 'Microsoft.DirectX.DirectSound.WaveFormet.WaveFormat ()

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

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

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

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

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

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

  • Graph
  • Microsoft.DirectX.DirectSound
  • Microsoft.DirectX.DirectInput
  • PresentationCore
  • PresentationFramework
  • Услуги
  • System
  • System.Core
  • System.Data.DataSetExtensions
  • System.Deployment
  • System.Drawing
  • System.Runtime.Serialization
  • 1053 * System.ServiceModel *
  • System.Windows.Forms
  • System.Xml
  • System.Xml.Linq
  • UIAutomationProvider
  • WindowsBase
  • WindowsFormsIntegration

Ответы [ 6 ]

2 голосов
/ 02 сентября 2009

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

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
1 голос
/ 23 июня 2009

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


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

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

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

0 голосов
/ 17 марта 2013

Принудительно скомпилируйте ваш софт в x86 или x64 вместо 'Any CPU', чтобы решить проблему.

0 голосов
/ 17 февраля 2010

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

0 голосов
/ 23 июня 2009

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

0 голосов
/ 23 июня 2009

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

...