Chiamata ambigua C # in DirectSound
-
06-07-2019 - |
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 ??li>
- System.Data.DataSetExtensions
- System.Deployment
- System.Drawing
- System.Runtime.Serialization
- System.ServiceModel
- System.Windows.Forms
- System.Xml
- System.Xml.Linq
- UIAutomationProvider
- WindowsBase
- WindowsFormsIntegration
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.