मैं प्रत्यक्ष ध्वनि वातावरण में बफर अंडररन स्थिति का पता लगाना चाहता हूं।

मैं दो ध्वनि बफर (प्राथमिक और माध्यमिक) का उपयोग करता हूं। कभी-कभी (जब सर्वर डेटा देता है) मैं सेकेंडरी साउंड बफर में डेटा पोस्ट करने के लिए IDirectSoundBuffer इंटरफ़ेस की lock विधि को कॉल करता हूं। यदि सर्वर से डेटा आने का समय नहीं है, तो ध्वनि बफर बफर की शुरुआत से फिर से खेलना शुरू कर देता है (और इसे तब तक दोहराएं जब तक कि मैं बफर को नया डेटा नहीं भेजता)। हो सकता है कि यह ध्वज DSBPLAY_LOOPING है, लेकिन जैसा कि मैंने पढ़ा (और इसका परीक्षण किया), इस ध्वज के बिना प्राथमिक बफर नहीं बनाया जा सकता है (Play विधि में त्रुटि थी)।

मैं खेलने की स्थिति प्राप्त करने की कोशिश करता हूं, लेकिन GetStatus विधि हमेशा एक ही स्थिति लौटाती है, यहां तक ​​कि कोई नया डेटा नहीं है और खिलाड़ी पुराने डेटा को दोहराता है।

तो, मैं बफर अंडररन स्थिति का पता कैसे लगा सकता हूं (जब खेलने के लिए कोई नया डेटा नहीं है और सभी पुराना डेटा खेला जाता है)?

अग्रिम में धन्यवाद।

0
Vasilii 26 पद 2018, 18:24

1 उत्तर

सबसे बढ़िया उत्तर

IDirectSoundBuffer8::GetCurrentPosition वास्तव में एकमात्र तरीका है जिससे आप यह निर्धारित कर सकते हैं कि यह कहां से चल रहा है, लेकिन यह केवल Windows Vista या बाद के सिस्टम पर भी विश्वसनीय है जो DSBCAPS_TRUEPLAYPOSITION की रिपोर्ट करते हैं।

ध्यान देने योग्य कुछ बातें:

  • DirectSound 'विरासत' है, जिसका अर्थ है कि इस पर सक्रिय रूप से काम नहीं किया गया है, प्रचारित नहीं किया गया है, या सीधे उम्र में परीक्षण नहीं किया गया है। पिछले नमूने नवंबर 2007 में भी अब एंड-ऑफ-लाइफ DirectX SDK में भेज दिए गए थे। 8 से पहले DirectSound के संस्करण x64 मूल अनुप्रयोगों के लिए समर्थित नहीं हैं, और DirectSound 8 हेडर/लिब्स विंडोज एसडीके में विंडोज के रूप में हैं एसडीके 7. यह एआरएम पर विंडोज, या विंडोज स्टोर ऐप या यूनिवर्सल विंडोज ऐप के लिए समर्थित नहीं है। DirectSound के लिए प्रलेखन केवल विरासत DirectX SDK में ऑफ़लाइन पाया जा सकता है और Microsoft डॉक्स पर नहीं है - ड्राइवर लेखकों के लिए अभी भी केवल DirectSound सामग्री ऑनलाइन है।

  • डायरेक्टसाउंड विंडोज के आधुनिक संस्करणों पर भी 'एमुलेटेड' है, इसलिए इसके बारे में वास्तव में कुछ भी 'डायरेक्ट' नहीं है। प्राथमिक बफर वास्तव में सीधे ऑडियो हार्डवेयर से जुड़ा नहीं है या मिश्रण के लिए बिल्कुल भी उपयोग नहीं किया जाता है, इसलिए यह द्वितीयक बफर की तरह एक और सॉफ्टवेयर बफर है। यह प्राथमिक बफ़र्स की विरासत प्रतिबंधों का अनुकरण करता है जो विंडोज 9x/एमई में वापस लागू होते हैं, लेकिन यह अन्यथा बहुत कुछ नहीं करता है।

  • विंडोज विस्टा से शुरू होकर, LOC_HARDWARE बफ़र्स अब बिल्कुल भी समर्थित नहीं हैं। Windows Vista ने मल्टी-चैनल LOC_SOFTWARE बफ़र्स के लिए समर्थन जोड़ा, जो कि Windows XP पर केवल LOC_HARDWARE बफ़र्स के रूप में उपलब्ध थे।

  • Windows Vista से प्रारंभ होकर, DirectSound के माध्यम से प्रभाव (ID3L, EAX, आदि) समर्थित नहीं हैं।

TL;DR: नए अनुप्रयोगों में DirectSound का उपयोग न करें। यह अभी भी पुराने सॉफ़्टवेयर और गेम के लिए ही समर्थित है।

तो, अगर डायरेक्टसाउंड नहीं है तो डेवलपर को क्या उपयोग करना चाहिए?

(1) विंडोज कोर ऑडियो (WASAPI) एक अच्छा विकल्प है यदि आप एक ज्ञात डेटा दर और प्रारूप में ध्वनि डेटा प्रदान कर सकते हैं। यदि आपको किसी रीयल-टाइम मिश्रण या स्रोत-दर रूपांतरण की आवश्यकता है, तो आपको इसे स्वयं करना होगा-या- आप इसे करने के लिए कई मौजूदा तृतीय पक्ष ऑडियो पुस्तकालयों में से एक का उपयोग कर सकते हैं जो WASAPI को अंतिम परिणाम भी भेजता है। देखें Microsoft डॉक्स

(२) यदि आप रीयल-टाइम मिश्रण, स्रोत-दर रूपांतरण, और सॉफ़्टवेयर-आधारित डीएसपी प्रभाव करना चाहते हैं तो एक्सऑडियो संस्करण २ एक अच्छा विकल्प है। यह विंडोज 8 के रूप में ऑपरेटिंग सिस्टम में शामिल है, लेकिन विंडोज 7 का समर्थन करने के लिए आपको कुछ विरासत वितरण और एसडीके का उपयोग करना होगा। देखें Microoft डॉक्स और यह ब्लॉग

WASPI और XAudio दोनों डेटा सबमिशन के लिए लूपिंग बफर के बजाय 'ऑडियो पैकेट' मॉडल का उपयोग करते हैं। जब तक कोई पैकेट प्रसंस्करण के लिए लंबित है, तब तक आप अंडर-रन नहीं होंगे।

0
Chuck Walbourn 14 जिंदा 2019, 21:33