我正在尝试使用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抛出以下错误:
以下方法或属性之间的调用不明确: 'Microsoft.DirectX.DirectSound.CaptureBufferDescription.CaptureBufferDescription()' 和 'Microsoft.DirectX.DirectSound.CaptureBufferDescription.CaptureBufferDescription()'
和
电话之间的暧昧不明确 以下方法或属性: 'Microsoft.DirectX.DirectSound.WaveFormat.WaveFormat()' 和 'Microsoft.DirectX.DirectSound.WaveFormet.WaveFormat()'
我已经尝试了很多不同的组合来说明命名空间和使用语句,但没有运气。
我还检查了解决方案资源管理器中的引用,据我所知,没有重复项。
一个全新的测试项目,只有Microsoft.DirectX.DirectSound参考,没有别的东西仍然会抛出同样的错误。
我还卸载并重新安装了DirectX SDK(2009年3月)以及DirectX SDK(2008年11月)。仍然没有运气。
最后,我在实验室的另一台计算机上尝试了一个新项目,它仍然无效。
以下是我的参考资料:
答案 0 :(得分: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
答案 1 :(得分:1)
听起来好像你正在引用directx程序集的多个版本。也许仔细检查你的参考文献。如果您需要多个版本,那么extern alias
可能有所帮助 - 但它并不漂亮。
在Visual Studio中,查找“解决方案资源管理器”(通常位于右侧) - 这是项目中所有内容的树。这棵树中的一个项目是“参考文献”。这是您的代码配置使用的外部dll的直观表示。
(有很多很多.NET dll - 你需要告诉每个项目它可能需要什么样的dll)
展开此节点,查找两个看起来像directx的条目。如果 两个,则删除其中一个(理想情况下是较低版本的那个)。然后尝试重建。
答案 2 :(得分:0)
您已经包含了对包含该函数的程序集的不同版本的两个引用。删除其中一个参考文献。
答案 3 :(得分:0)
您可能有多个DirectX程序集的引用。检查项目,在References文件夹中。查找重复条目,特别是对多个版本的microsoft.directx.directsound.dll的引用。如果有重复项,请删除一个并重试。
答案 4 :(得分:0)
这是DirectSound的常见问题。您还会发现许多其他问题;)请记住,DS没有什么是它的样子。当缓冲区返回null时,它可能只是因为“读取位置”只是内部缓冲区写指针。因此,当您要求读取或写入指针时,计算至少一个块安全区域;)当您从ds方法获得缓冲区位置时,请使用try cast,因为它可能会抛出随机错误。
答案 5 :(得分:0)
强制你的软件在x86或x64中编译而不是'任何CPU'将解决问题。