Question

J'essaie d'utiliser DirectSound pour capturer le son d'un microphone. Voici mon code:

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

Les instanciations des variables micBufferDesc et format entraînent l'erreur suivante dans Visual Studio 2008:

  

L'appel est ambigu entre les méthodes ou propriétés suivantes:   'Microsoft.DirectX.DirectSound.CaptureBufferDescription.CaptureBufferDescription ()'   et   'Microsoft.DirectX.DirectSound.CaptureBufferDescription.CaptureBufferDescription ()'

     

et

     

L'appel est ambigu entre le   méthodes ou propriétés suivantes:   'Microsoft.DirectX.DirectSound.WaveFormat.WaveFormat ()'   et   'Microsoft.DirectX.DirectSound.WaveFormet.WaveFormat ()'

J'ai essayé plusieurs combinaisons différentes d'affirmation de l'espace de nom et d'utilisation d'instructions, mais sans succès.

J'ai également vérifié les références dans l'explorateur de solutions et, autant que je sache, il n'y a pas de doublons.

Un tout nouveau projet de test avec uniquement la référence Microsoft.DirectX.DirectSound et aucune autre erreur ne génère la même erreur.

J'ai également désinstallé et réinstallé le SDK DirectX (mars 2009) ainsi que le SDK DirectX (novembre 2008). Toujours pas de chance.

Enfin, j'ai essayé un nouveau projet sur un autre ordinateur, ici dans le laboratoire, et cela ne fonctionne toujours pas.

Voici les références que j'ai:

  • Graphique
  • Microsoft.DirectX.DirectSound
  • Microsoft.DirectX.DirectInput
  • PresentationCore
  • PresentationFramework
  • Service
  • Système
  • 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
Était-ce utile?

La solution

J'ai eu la même erreur, ce n'est pas une double référence. Cliquez sur Exécuter et le compilateur l’oublie comme par magie, ou vous pouvez arrêter complètement la gêne avec ce qui suit.

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

Autres conseils

On dirait que vous faites peut-être référence à plusieurs versions de l’assemblage directx. Peut-être vérifiez-vous vos références. Si vous avez besoin de plusieurs versions, alors alias externe peut vous aider, mais ce n'est pas beau.

Dans Visual Studio, recherchez "l'explorateur de solutions". (généralement sur le côté droit) - c'est l'arbre de tout dans votre projet. L'un des éléments de cet arbre est le "Références". Ceci est une représentation visuelle des DLL externes que votre code est configuré pour utiliser.

(il existe de très nombreuses DLL .NET - vous devez indiquer à chaque projet le type de dll dont il pourrait avoir besoin)

Développez ce nœud et recherchez 2 entrées qui ressemblent à directx. S'il y a deux deux, supprimez l'un d'entre eux (idéalement celui de la version inférieure). Ensuite, essayez de reconstruire.

vous avez inclus deux références à différentes versions de l'assemblage contenant cette fonction. Supprimez une des références.

Vous pouvez avoir plusieurs références à l’assemblage DirectX. Vérifiez votre projet dans le dossier Références. Recherchez les entrées en double, en particulier les références à plusieurs versions de microsoft.directx.directsound.dll. S'il y a des doublons, supprimez-en un et réessayez.

Il s'agit d'un problème courant avec DirectSound. Vous trouverez également beaucoup d'autres problèmes;) N'oubliez pas qu'avec DS, rien n'est ce à quoi il ressemble. Lorsque la mémoire tampon renvoie la valeur null, cela est probablement uniquement dû au fait que la "position de lecture" est est juste le pointeur d'écriture du tampon interne. Ainsi, lorsque vous demandez à lire ou à écrire, les pointeurs calculent toujours au moins une zone de sécurité de bloc;) et lorsque vous obtenez les positions de mémoire tampon à partir des méthodes ds, utilisez try cast, car elle peut générer des erreurs aléatoires.

Forcer votre logiciel à compiler en x86 ou x64 au lieu de "Tout processeur" résoudra le problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top