سؤال

أقوم بتطوير تطبيق من بين أمور أخرى، تعدد جميع أجهزة إدخال المدخلات (باستخدام SetupAPI) ثم لكل جهاز صوت، يسرد جميع خطوط الصوت الإدخال (باستخدام winmm.dll).

في الأساس، والطريقة التي أعاني منها هي الحصول على مسار الجهاز من جهاز الصوت ثم استخدام waveInMessage لمقارنة مسار جهاز خط الصوت.

الآن، أريد أن أكون قادرا على فعل الشيء نفسه مع خط الصوت الافتراضي ل Windows [InputWAVE_MAPPER).

المشكلة هي أن استخدام waveInGetDevCaps بالنسبة WAVE_MAPPER إرجاع "Microsoft Sound Mapper"، واستخدام waveInMessage مع DRV_QUERYDEVICEINTERFACE إرجاع سلسلة فارغة.

أي اقتراحات حول كيفية معرفة الجهاز الذي يتم تعيين Microsoft Mapper إليه؟

هل كانت مفيدة؟

المحلول 3

يرجى تصحيح لي إذا كنت مخطئا، لكنني أراقب بعض مقاطع الفيديو من مؤتمرات Microsoft الماضية على تطوير الصوت. على آخر واحد من لاري أوسترمان، يذكر ميزات الصوت الجديدة في [أعتقد] ويندوز 7 أن فريقه يعمل على.

كانت واحدة من الميزات [الاسم هو تفسيري] "جهاز مبادلة ساخنة الجهاز". دعنا نقول أن تطبيقك يلعب باستخدام نقطة النهاية "تشغيل الصوت في Windows الافتراضي"، وأنه في هذه اللحظة هو مجموعة من سماعات رأس USB. فجأة قمت بفصل سماعات الرأس. ما يصل إلى Windows 7، سوف يتعطل طلبك [إذا لم توقع ذلك من سيناريو الاختبار]. في نظام التشغيل Windows 7 [وإليك هوك إلى الموضوع الأصلي]، إذا كنت تستخدم جهاز التشغيل الافتراضي Windows، فسيظل Windows بأمان ويتبع تلقائيا على تيار الإخراج إلى الافتراضي الجديد، والذي قد يكون مكبرات الصوت.

ما أحاول الوصول إليه، هو أنني أحاول أن أحصل على جهاز Wave_Mapper في فئة حيث ليس من المفترض أن تكون. ربما، يجب التعامل مع النماذج المفاهيمية، الموجي_Mapper على الرغم من وجود نفس القدرة على مدخلات وإخراج دفق الصوت، كاستثناء.

سأحاول أن أكون أكثر ملموسة. في طلبي، لدي قائمة بالأجهزة الصوتية، وكان كل جهاز صوتي لديه قائمة من خطوط الصوت. تحتوي الأجهزة الصوتية على خصائص مثل VID و PID يمكن اكتشافها بسهولة من خلال Setupapi ويمكن أن تكون مرتبطة بخطوط الصوت عبر موجة Winmm's WaveinMessage. Wave_Mapper لا يتبع هذا المنطق وكنت أحاول جعله يفعل.

لذلك بدلا من محاولة ربط WAVE_MAPPER مع جهاز الصوت الأساسي الخاص بها، سأتعامل معها فقط كما هو: جهاز الصوت الافتراضي.

نصائح أخرى

يتم تعيين الجهاز الذي يتم تعيين Wave_Mapper لتعتمد على المعلمات التي تم تمريرها إلى WavenOpen. من الوثائق:

Wave_Mapper - تقوم الوظيفة بتحديد جهاز إدخال صوت موجي-الصوت قادر على التسجيل في التنسيق المحدد.

هذا يعني أنه لا يمكنك التحقق من خصائص الجهاز دون فتحه فعليا. بمجرد فتحه، يجب أن تكون قادرا على الحصول على معرف الجهاز الفعلي مع waveInGetID.

حسنا، لقد وجدت بشكل صحيح أن أكون أسهل بكثير ومع إكس بي أقل بكثير إلى Vista غير موثق عن الشذوذ غير الموثق (و أقل بكثير من الشذوذ غير الموثق بشكل عام).

ولكن ربما الطريقة الوحيدة التي ستعمل بها هي تعداد جميع الأجهزة الأخرى ومعرفة أي واحد يطابق Wave_Mapper One.

بصراحة على الرغم من ... استخدم DirectSound أو، إذا كنت قادرا على القيام Vista و Win 7 فقط، استخدم API الصوت الأساسي. Winmm هو API القديم وتم كسره بشكل جميل عند تقديمه لأول مرة ...

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