Pregunta

Estoy tratando de usar DirectSound para capturar el sonido de un micrófono. Aquí está mi 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);
     }

Las instancias de micBufferDesc y las variables de formato hacen que Visual Studio 2008 arroje el siguiente error:

  

La llamada es ambigua entre los siguientes métodos o propiedades:   'Microsoft.DirectX.DirectSound.CaptureBufferDescription.CaptureBufferDescription ()'   y   'Microsoft.DirectX.DirectSound.CaptureBufferDescription.CaptureBufferDescription ()'

     

y

     

La llamada es ambigua entre   siguientes métodos o propiedades:   'Microsoft.DirectX.DirectSound.WaveFormat.WaveFormat ()'   y   'Microsoft.DirectX.DirectSound.WaveFormet.WaveFormat ()'

He intentado varias combinaciones diferentes de indicar el espacio de nombres y usar declaraciones, pero no tuve suerte.

También he verificado las referencias en el explorador de soluciones y, por lo que puedo decir, no hay duplicados.

Un nuevo proyecto de prueba con solo la referencia Microsoft.DirectX.DirectSound y nada más arroja el mismo error.

También desinstalé y reinstalé el DirectX SDK (marzo de 2009) y el DirectX SDK (noviembre de 2008). Todavía no hay suerte.

Finalmente, he probado un nuevo proyecto en otra computadora aquí en el laboratorio y todavía no funciona.

Aquí están las referencias que tengo:

  • Gráfico
  • Microsoft.DirectX.DirectSound
  • Microsoft.DirectX.DirectInput
  • PresentationCore
  • PresentationFramework
  • Servicio
  • 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
¿Fue útil?

Solución

Tuve el mismo error, no es una referencia doble. Haga clic en ejecutar y el compilador lo olvida mágicamente, o puede detener la molestia por completo con lo siguiente.

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

Otros consejos

Parece que tal vez estás haciendo referencia a varias versiones del ensamblaje directx. Quizás revise sus referencias. Si necesita varias versiones, entonces extern alias puede ayudar, pero no es bonito.


En Visual Studio, busque el " explorador de soluciones " (comúnmente en el lado derecho): este es el árbol de todo en su proyecto. Uno de los elementos de este árbol son las "Referencias". Esta es una representación visual de los dlls externos para los que está configurado su código.

(hay muchos, muchos dlls .NET; debe decirle a cada proyecto qué dlls podría necesitar)

Expanda este nodo y busque 2 entradas que parezcan directx. Si hay dos, deshazte de uno de ellos (idealmente el que tiene la versión inferior). Luego intente y reconstruya.

ha incluido dos referencias a diferentes versiones del ensamblaje que contiene esa función. Elimine una de las referencias.

Puede tener múltiples referencias al ensamblaje DirectX. Verifique su proyecto, en la carpeta Referencias. Busque entradas duplicadas, específicamente referencias a versiones múltiples de microsoft.directx.directsound.dll. Si hay duplicados, elimine uno e intente nuevamente.

Este es un problema común con DirectSound. Encontrará también muchos otros problemas;) Recuerde que con DS nada es lo que parece. Cuando el búfer devuelve nulo, probablemente solo se deba a que " lea la posición " es solo el puntero de escritura del búfer interno. Entonces, cuando solicite punteros de lectura o escritura, calcule siempre al menos una zona segura de bloque;) y cuando obtenga posiciones de búfer de los métodos ds, use try cast porque puede arrojar errores aleatorios.

Fuerce su soft para compilar en x86 o x64 en lugar de 'Cualquier CPU' solucionará el problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top