Domanda

Sto cercando di utilizzare DirectSound per acquisire l'audio da un microfono. Ecco il mio codice:

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

Le istanze di micBufferDesc e le variabili di formato fanno sì che Visual Studio 2008 generi il seguente errore:

  

La chiamata è ambigua tra i seguenti metodi o proprietà:   'Microsoft.DirectX.DirectSound.CaptureBufferDescription.CaptureBufferDescription ()'   e   'Microsoft.DirectX.DirectSound.CaptureBufferDescription.CaptureBufferDescription ()'

     

e

     

La chiamata è ambigua tra il   seguenti metodi o proprietà:   'Microsoft.DirectX.DirectSound.WaveFormat.WaveFormat ()'   e   'Microsoft.DirectX.DirectSound.WaveFormet.WaveFormat ()'

Ho provato diverse combinazioni di affermare lo spazio dei nomi e usare dichiarazioni ma senza fortuna.

Ho anche controllato i riferimenti in Esplora soluzioni e per quanto ne so non ci sono duplicati.

Un nuovissimo progetto di test con solo il riferimento Microsoft.DirectX.DirectSound e nient'altro genera ancora lo stesso errore.

Ho anche disinstallato e reinstallato DirectX SDK (marzo 2009) e DirectX SDK (novembre 2008). Ancora niente fortuna.

Alla fine, ho provato un nuovo progetto su un altro computer qui in laboratorio e ancora non funziona.

Ecco i riferimenti che ho:

  • Grafico
  • Microsoft.DirectX.DirectSound
  • Microsoft.DirectX.DirectInput
  • PresentationCore
  • PresentationFramework
  • servizio
  • 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
È stato utile?

Soluzione

Ho avuto lo stesso errore, non è un doppio riferimento. Fai clic su Esegui e il compilatore lo dimentica magicamente, oppure puoi interrompere completamente il fastidio con quanto segue.

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

Altri suggerimenti

Sembra che forse stai facendo riferimento a più versioni dell'assembly directx. Forse ricontrolla i tuoi riferimenti. Se hai bisogno di più versioni, allora alias esterno può essere d'aiuto, ma non è carino.


In Visual Studio, cerca " Esplora soluzioni " (comunemente sul lato destro): questo è l'albero di tutto nel tuo progetto. Uno degli elementi in questo albero è il "Riferimenti". Questa è una rappresentazione visiva delle DLL esterne che il tuo codice è configurato per utilizzare.

(ci sono molte, molte DLL .NET - devi dire ad ogni progetto di quali DLL potrebbe aver bisogno)

Espandi questo nodo e cerca 2 voci che sembrano directx. Se sono due, eliminane uno (idealmente quello con la versione inferiore). Quindi prova a ricostruire.

hai incluso due riferimenti a diverse versioni dell'assembly che contiene quella funzione. Rimuovi uno dei riferimenti.

Potresti avere più riferimenti all'assembly DirectX. Controlla il tuo progetto, nella cartella Riferimenti. Cercare voci duplicate, in particolare riferimenti a più versioni di microsoft.directx.directsound.dll. Se sono presenti duplicati, rimuoverne uno e riprovare.

Questo è un problema comune con DirectSound. Troverai anche molti altri problemi;) Ricorda che con DS nulla è quello che sembra. Quando il buffer restituisce null, probabilmente causa solo perché "posizione di lettura" è solo un puntatore di scrittura del buffer interno. Quindi, quando chiedi ai puntatori di lettura o scrittura di calcolare sempre almeno una zona sicura di blocco;) e quando ottieni posizioni di buffer dai metodi ds usa prova il cast perché può generare errori casuali.

Forza la compilazione del software in x86 o x64 invece di "Qualsiasi CPU" risolverà il problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top