سؤال

أحاول استخدام 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.directound.captureBufferDescription.captureBufferDescription ()")

و

المكالمة غامضة بين الأساليب أو الخصائص التالية:microsoft.directx.directsound.waveformat.waveformat () "و" microsoft.directx.directOnd.waveformet.waveformat () "

لقد جربت عددًا لا بأس به من المجموعات المختلفة لتحديد مساحة الاسم واستخدام البيانات ولكن لم يحالفني الحظ.

لقد قمت أيضًا بالتحقق من المراجع في مستكشف الحلول وبقدر ما أستطيع أن أقول أنه لا توجد تكرارات.

مشروع اختباري جديد تمامًا يحتوي فقط على مرجع Microsoft.DirectX.DirectSound ولا شيء آخر لا يزال يلقي نفس الخطأ.

لقد قمت أيضًا بإلغاء تثبيت DirectX SDK وإعادة تثبيته (مارس 2009) بالإضافة إلى DirectX SDK (نوفمبر 2008).لا يوجد حتى الآن الحظ.

أخيرًا، لقد قمت بتجربة مشروع جديد على كمبيوتر آخر هنا في المعمل وما زال لا يعمل.

وهذه هي المراجع التي لدي:

  • رسم بياني
  • مايكروسوفت.DirectX.DirectSound
  • Microsoft.DirectX.DirectInput
  • PresentationCore
  • إطار العرض التقديمي
  • خدمة
  • نظام
  • System.Core
  • بيانات النظام
  • System.Data.DataSetExtensions
  • System.Deployment
  • النظام.الرسم
  • System.Runtime.Serialization
  • System.ServiceModel
  • System.Windows.Forms
  • System.Xml
  • System.Xml.Linq
  • UIAutomationProvider
  • WindowsBase
  • WindowsFormsIntegration
هل كانت مفيدة؟

المحلول

كان لدي نفس الخطأ، فهو ليس مرجعًا مزدوجًا.انقر فوق "تشغيل" وسينسى ذلك المترجم بطريقة سحرية، أو يمكنك إيقاف الإزعاج تمامًا من خلال ما يلي.

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

نصائح أخرى

يبدو أنك ربما تشير إلى إصدارات متعددة من تجميع directx.ربما تحقق جيدًا من مراجعك.اذا أنت يحتاج إصدارات متعددة، ثم extern alias قد يساعد - لكنه ليس جميلاً.


في Visual Studio، ابحث عن "مستكشف الحلول" (عادة على الجانب الأيمن) - وهذا هو شجرة كل شيء في مشروعك.أحد العناصر الموجودة في هذه الشجرة هو "المراجع".هذا تمثيل مرئي لملفات dll الخارجية التي تم تكوين التعليمات البرمجية الخاصة بك للاستفادة منها.

(هناك العديد والعديد من ملفات .NET - تحتاج إلى إخبار كل مشروع بملفات dll التي قد يحتاجها)

قم بتوسيع هذه العقدة، وابحث عن إدخالين يشبهان Directx.إن كان هناك نكون اثنان، تخلص من أحدهما (من الأفضل أن يكون الإصدار الأقل).ثم حاول إعادة البناء.

لقد قمت بتضمين مرجعين لإصدارات مختلفة من التجميع الذي يحتوي على تلك الوظيفة.إزالة أحد المراجع.

قد يكون لديك مراجع متعددة لتجميع DirectX.تحقق من مشروعك في مجلد المراجع.ابحث عن الإدخالات المكررة، خاصة تلك التي تشير إلى إصدارات متعددة من microsoft.directx.directsound.dll.إذا كان هناك تكرارات، قم بإزالة إحداها وحاول مرة أخرى.

هذه مشكلة شائعة في DirectSound.ستجد أيضًا العديد من المشكلات الأخرى ;) تذكر أنه مع DS لا يوجد شيء كما يبدو.عندما يعود المخزن المؤقت فارغًا، فمن المحتمل أن يكون السبب فقط لأن "موضع القراءة" هو مجرد مؤشر كتابة للمخزن المؤقت الداخلي.لذلك عندما تطلب مؤشرات القراءة أو الكتابة، قم بحساب منطقة آمنة واحدة على الأقل لكتلة واحدة على الأقل؛) وعندما تحصل على مواضع مخزن مؤقت من أساليب ds، استخدم محاولة الإرسال لأنها يمكن أن تؤدي إلى أخطاء عشوائية.

إن إجبار برنامجك على التحويل البرمجي إلى x86 أو x64 بدلاً من "Any CPU" سيؤدي إلى حل المشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top