2009-06-23 2 views
1

DirectSoundを使用してマイクからサウンドを取得しようとしています。ここに私のコードは次のとおりです。C#DirectSoundでの曖昧な呼び出し

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

micBufferDescのインスタンス化とフォーマット変数は次のエラーをスローするには、Visual Studio 2008のを引き起こす:

The call is ambiguous between the following methods or properties: 'Microsoft.DirectX.DirectSound.CaptureBufferDescription.CaptureBufferDescription()' and 'Microsoft.DirectX.DirectSound.CaptureBufferDescription.CaptureBufferDescription()'

and

The call is ambiguous between the following methods or properties: 'Microsoft.DirectX.DirectSound.WaveFormat.WaveFormat()' and 'Microsoft.DirectX.DirectSound.WaveFormet.WaveFormat()'

私は名前空間を明記のかなりの数の異なる組み合わせを試してみたし、ステートメントを使うが運がない。

また、ソリューションエクスプローラの参照を確認して、重複がないことを確認できます。

Microsoft.DirectX.DirectSound参照のみを使用した新しいテストプロジェクトで、それ以外は同じエラーをスローしません。

また、DirectX SDK(2009年3月)とDirectX SDK(2008年11月)をアンインストールして再インストールしました。まだ運がありません。

最後に、研究所の別のコンピュータで新しいプロジェクトを試しましたが、まだ動作しません。

  • グラフ
  • Microsoft.DirectX.DirectSound
  • Microsoft.DirectX.DirectInput
  • PresentationCore
  • PresentationFramework
  • サービス
  • システム:ここで

    は、私が持っている参照です

  • System.Core
  • System.Data
  • System.Data.DataSetExtensions
  • System.Deployment
  • System.Drawing
  • System.Runtime.Serialization
  • System.ServiceModel
  • システム。 Windows.Forms
  • System.Xml
  • System.Xml.Linq
  • UIAutomationProvider
  • WindowsBase
  • WindowsFormsIntegration
+0

私はポストにいくつかの情報を追加しました。これは奇妙な問題です。 – JohnS

答えて

2

私は同じエラーがありましたが、それはダブルリファレンスではありません。実行をクリックすると、コンパイラは魔法のようにそれを忘れてしまいます。

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 
+0

これを試すにはしばらく時間がかかりますが、すぐに結果を投稿します。 ありがとうございました! – JohnS

+0

ありがとう!私にとっては無視されます。ある日、 "あなたがタイプした"構文チェックを信頼する代わりに、いつもコンパイルすることを学びます。 – eselk

1

それは多分あなたはDirectXのアセンブリの複数のバージョンを参照しているように聞こえます。おそらくあなたの参照を再確認してください。 に複数のバージョンのが必要な場合は、extern aliasが役立つかもしれませんが、それほど美味しくありません。


「ソリューションエクスプローラ」(通常は右側)を探します。これはプロジェクト内のすべてのツリーです。このツリーのアイテムの1つが「参考文献」です。これは、コードが使用するように構成されている外部DLLを視覚的に表したものです。

(多くの、多くの.NETのDLLがある - あなたはそれが必要な場合がありますDLLを何各プロジェクトを伝える必要があります)

このノードを展開し、DirectXのように見える2つのエントリを探します。 の場合は、そのうちの1つ(理想的には低いバージョンのもの)を取り除きます。その後、再構築してください。

+0

ええ、参照フォルダでチェックしました。クラスが含まれていることを私が知る限り、唯一のものはMicrosoft.DirectX.DirectSoundで、それ以外は何もありません。私が他のDirectXリファレンス(Microsoft.DirectX.DirectInput)を削除しても、それはまだ動作しません。私は私の参照フォルダにすべてのエントリを投稿する必要がありますか? – JohnS

+0

うーん....あなたは私をそこに連れて来... –

+0

それは大丈夫です。助けてくれてありがとう! – JohnS

0

この機能を含むさまざまなバージョンのアセンブリへの参照が2つ含まれています。参照の1つを削除します。

0

DirectXアセンブリへの参照が複数ある場合があります。 Referencesフォルダのプロジェクトを確認してください。重複するエントリ、特に複数のバージョンのmicrosoft.directx.directsound.dllへの参照を探します。重複がある場合は削除し、もう一度やり直してください。

+0

2つの参照がどこから来たのかをどのように伝えますか?私はこれが問題であるとは確信していません。私が知っている1つのリファレンスを削除すると、関連するクラス(Microsoft.DirectX.DirectSound)は、クラスをまったく見つけることができないという不満があります。 – JohnS

+0

参照フォルダに重複したエントリが表示されます。どのバージョンのMicrosoft.DirectX.DirectSoundを使用していますか? – heavyd

+0

Referencesフォルダに重複はありません。バージョン1.0.2902.0(参照の追加ダイアログから)です。 2009年3月のDirectX SDKに含まれています。 – JohnS

0

これはDirectSoundによくある問題です。他にもたくさんの問題がたくさんあります; DSには何も見えません。バッファがnullを返すときは、おそらく「読み込み位置」が内部バッファの書き込みポインタにすぎないためです。したがって、少なくとも1つのブロックセーフゾーンを計算するポインタを読み書きするように指示すると、dsメソッドからバッファ位置を取得すると、ランダムなエラーが発生する可能性があるのでtryキャストを使用します。

0

「任意のCPU」ではなくx86またはx64でソフトをコンパイルすると問題が解決されます。

関連する問題