Pergunta

Eu estou tentando usar DirectSound para capturar o som de um microfone. Aqui está o meu código:

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

As instâncias das variáveis ??micBufferDesc e formato causar Visual Studio 2008 para lançar o seguinte erro:

A chamada é ambígua entre os seguintes métodos ou propriedades: 'Microsoft.DirectX.DirectSound.CaptureBufferDescription.CaptureBufferDescription ()' e 'Microsoft.DirectX.DirectSound.CaptureBufferDescription.CaptureBufferDescription ()'

e

A chamada é ambígua entre o seguindo métodos ou propriedades: 'Microsoft.DirectX.DirectSound.WaveFormat.WaveFormat ()' e 'Microsoft.DirectX.DirectSound.WaveFormet.WaveFormat ()'

Eu tentei algumas combinações bastante diferente de afirmar o namespace e usando instruções, mas sem sorte.

Eu também verificou as referências no explorador solução e, tanto quanto eu posso dizer não há duplicatas.

Um projeto de teste nova marca com apenas a referência Microsoft.DirectX.DirectSound e nada mais ainda lança o mesmo erro.

Eu também tenho desinstalado e reinstalado o DirectX SDK (Março de 2009), bem como o DirectX SDK (novembro de 2008). Ainda sem sorte.

Finalmente, eu tentei um novo projeto em outro computador aqui no laboratório e ele ainda não funciona.

Aqui estão as referências que eu tenho:

  • Gráfico
  • Microsoft.DirectX.DirectSound
  • Microsoft.DirectX.DirectInput
  • PresentationCore
  • PresentationFramework
  • Serviço
  • Sistema
  • System.Core
  • System.Data
  • System.Data.DataSetExtensions
  • System.Deployment
  • System.Drawing
  • System.Runtime.Serialization
  • System.ServiceModel
  • System.Windows.Forms
  • System.Xml
  • System.Xml.Linq
  • UIAutomationProvider
  • WindowsBase
  • WindowsFormsIntegration
Foi útil?

Solução

Eu tive o mesmo erro, não é uma dupla referência. Clique executar eo compilador magicamente esquece-lo, ou você pode parar o aborrecimento completamente com o seguinte.

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

Outras dicas

Parece que talvez você está fazendo referência várias versões do conjunto do DirectX. Talvez verifique suas referências. Se você necessidade várias versões, então extern alias pode ajudar -. Mas não é bonito


No Visual Studio, olhar para o "Solution Explorer" (comumente no lado direito) - esta é a árvore de tudo em seu projeto. Um dos itens desta árvore é "Referências". Esta é uma representação visual das DLLs externos que seu código está configurado para fazer uso.

(há muitas, muitas dlls .NET - você precisa dizer a cada projeto que DLLs pode precisar)

Expanda este nó, e olhar para 2 entradas que se parecem com DirectX. Se houver são dois, se livrar de um deles (o ideal é aquele com a versão menor). Em seguida, tentar reconstruir.

você incluiu duas referências a diferentes versões do assembly que contém essa função. Retirar uma das referências.

Você pode ter várias referências ao DirectX montagem. Verifique se o seu projecto, na pasta de referências. Procure entradas duplicadas, especificamente referências a versão múltiplo de microsoft.directx.directsound.dll. Se houver duplicatas remover um e tente novamente.

Este é um problema comum com DirectSound. Você vai encontrar também muitos outros problemas;) Lembre-se que com a DS nada é o que parece. Quando nulo buffer de retorno provavelmente causam apenas porque "posição de leitura" é apenas interna ponteiro buffer de gravação. Então, quando você perguntar a ler ou ponteiros de escrita calcular hair zona segura pelo menos um bloco;) e quando você chegar tampão posições de métodos ds usar tentativa elenco porque ele pode jogar erros aleatórios.

Força sua suave para compilar em x86 ou x64 em vez de 'Qualquer CPU' vai resolver o problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top