m36 में वेब ऑडियो में बदलाव

क्रिस विल्सन
क्रिस विल्सन

वेब ऑडियो में बदलाव

Google में हम मानक पसंद करते हैं. हमारा मिशन, स्टैंडर्ड के हिसाब से बना वेब प्लैटफ़ॉर्म बनाना है. इस पर कुछ समय के लिए लागू एक छोटा सा मस्सा, Web Audio API (खास तौर पर webkitAudioContext ऑब्जेक्ट) को लागू करना है. इसके अलावा, Web Audio के ऐसे कुछ अब काम भी हैं जो अब भी काम कर रहे हैं.

मूल रूप से योजना बनाई गई थी कि Chrome 36, प्रीफ़िक्स वाले webkitAudioContext के लिए काम न करे. ऐसा इसलिए, क्योंकि हमने बिना प्रीफ़िक्स वाले AudioContext ऑब्जेक्ट के साथ काम करना शुरू कर दिया था. यह उम्मीद से ज़्यादा मुश्किल था. इसलिए, Chrome 36, बिना उपसर्ग और प्रीफ़िक्स वाले, दोनों वर्शन पर काम करता है. हालांकि, नए वेबकिटऑडियो कॉन्टेक्स्ट में भी, कई लेगसी तरीके और एट्रिब्यूट, जैसे कि createGainNode और createJavaScriptNode को हटा दिया गया है. कम शब्दों में कहें, तो Chrome 36 में webkitAudioContext और AudioContext एक-दूसरे के उपनाम हैं. इन दोनों की सुविधाओं में कोई अंतर नहीं है.

हम Chrome 36 के बाद, शायद कुछ रिलीज़ में प्रीफ़िक्स के लिए काम करना बंद कर देंगे. जब बदलाव लागू होने वाला होगा, तब हम आपको इसकी सूचना यहां देंगे. साथ ही, हम वेब ऑडियो ऐप्लिकेशन से जुड़ी समस्याओं को ठीक करने के लिए, लेखकों से लगातार संपर्क कर रहे हैं.

पिछले तरीके को लागू करने के बजाय, हमने ऐसा क्यों किया? कुछ हद तक, हम बहुत पीछे जाने को लेकर अनिश्चित रहे हैं; हमने उन API को पहले ही निकाल दिया है और इस उपनाम के अच्छे दुष्प्रभाव के रूप में, ऐप्लिकेशन Firefox पर अच्छी तरह से काम कर सकते हैं, जिसने पिछले शरद ऋतु में अपने वेब ऑडियो समर्थन में पहले कभी भी किसी उपसर्ग ऑडियोकॉन्टेक्स्ट ऑब्जेक्ट (और काफ़ी सही है!) का समर्थन नहीं किया था.

इस अपडेट के बाकी हिस्से में, उन समस्याओं को ठीक करने का तरीका बताया गया है जो इस बदलाव की वजह से, आपके कोड में गड़बड़ी हो सकती हैं. इन समस्याओं को ठीक करने के बारे में सबसे अच्छी बात यह है कि शायद आपका कोड Firefox में भी काम करेगा! (मैंने लंबे समय तक सोचा था कि Firefox लागू करने की वजह से मेरा Vocoder ऐप्लिकेशन काम नहीं कर रहा है, लेकिन बाद में यह इनमें से एक समस्या बन गई!)

अगर आपको अब भी काम करना है, तो एक बंदर-पैच लाइब्रेरी, जो पुराने वेब ऑडियो कोड पर लिखे गए ऐप्लिकेशन के लिए लिखी गई थी पर एक नज़र डालें - इससे आपको कम से कम समय में काम शुरू करने और उसे चलाने में मदद मिलेगी. यह ऑब्जेक्ट और तरीकों को सही तरीके से उपनाम करेगा. वाकई, लाइब्रेरी में दिए गए पैच, इन बदलावों को समझने के लिए एक अच्छा तरीका है.

पहला और सबसे अहम

window.webkitAudioContext का कोई भी रेफ़रंस, window.AudioContext को दिया जाना चाहिए. अक्सर, इस समस्या को हल करने के लिए ये तरीके अपनाएं:

window.AudioContext = window.AudioContext || window.webkitAudioContext;

अगर आपका ऐप्लिकेशन जवाब दे रहा है, तो “माफ़ करें, आपके ब्राउज़र पर वेब ऑडियो काम नहीं करता. कृपया Chrome या Safari इस्तेमाल करें.” - ऐसा हो सकता है कि यह साफ़ तौर पर webkitAudioContext के बारे में जानकारी ढूंढ रहा हो. खराब डेवलपर! आप महीनों से Firefox का समर्थन कर सकते हैं!

हालांकि, कुछ अन्य कोड भी हैं, जिन्हें आसानी से हटाया जा सकता है. इनमें से कुछ कोड को समझना मुश्किल होता है.

  • .type एट्रिब्यूट (जो अब एक स्ट्रिंग है) के लिए BiquadFilter की वैल्यू वाले टाइप कॉन्सटेंट अब BiquadFilterNode ऑब्जेक्ट पर नहीं दिखते. साथ ही, हम .type एट्रिब्यूट पर उनकी सुविधा नहीं देते. अब .LOWPASS (या 0) का इस्तेमाल नहीं किया जाता - आपने इसे “lowpass” पर सेट किया है.
  • साथ ही, Oscillator.type एट्रिब्यूट अब एक तरह की स्ट्रिंग है, जिसकी गिनती अब की गई है - अब आपको .SAWTOOTH की ज़रूरत नहीं है.
  • PannerNode.type भी अब एक स्ट्रिंग है जिसकी गिनती की गई है.
  • PannerNode.distanceModel भी अब एक स्ट्रिंग है जिसकी गिनती की गई है.
  • createGainNode का नाम बदलकर createGain किया गया
  • createDelayNode का नाम बदलकर createDelay किया गया
  • createJavaScriptNode का नाम बदलकर createScriptProcessor किया गया
  • AudioBufferSourceNode.noteOn() को अब start() से बदल दिया गया है
  • AudioBufferSourceNode.noteGrainOn() को भी अब start() से बदल दिया गया है
  • AudioBufferSourceNode.noteOff() का नाम बदलकर stop() कर दिया गया है
  • OscillatorNode.noteOn() का नाम बदलकर start() कर दिया गया है
  • OscillatorNode.noteOff() का नाम बदलकर stop() कर दिया गया है
  • AudioParam.setTargetValueAtTime() का नाम बदलकर setTargetAtTime() कर दिया गया है
  • AudioContext.createWaveTable() और OscillatorNode.setWaveTable() का नाम अब createPeriodicWave() andsetPeriodicWave()` कर दिया गया है.
  • .loop के पक्ष में AudioBufferSourceNode.looping को हटा दिया गया
  • कोड में बदले गए ऑडियो डेटा के ब्लॉब को सिंक करने के लिए, AudioContext.createBuffer(ArrayBuffer, boolean) को हटा दिया गया है. जिन सिंक्रोनस कॉल को पूरा होने में ज़्यादा समय लगता है वे कोडिंग के खराब तरीके हैं. इसके बजाय, एसिंक्रोनस decodeAudioData कॉल का इस्तेमाल करें. यह ज़्यादा मुश्किल बदलावों में से एक है - असल में आपको लॉजिक फ़्लो को बदलना होगा. हालांकि, यह काफ़ी बेहतर तरीका है. Mozilla के एहसान अंगकारी ने स्टैंडर्ड वेब ऑडियो में बदलने की अपनी पोस्ट में, इसे करने के तरीके का एक अच्छा उदाहरण लिखा है.

इनमें से कई (जैसे createGainNode का नाम बदलना और createBuffer में सिंक करने वाली डिकोडिंग को हटाना) साफ़ तौर पर, डेवलपर टूल कंसोल में एक गड़बड़ी के तौर पर दिखेंगी - हालांकि, कुछ अन्य चीज़ों को भी इस तरह इस्तेमाल किया जा सकता है:

MULTI_LINE_CODE_PLACEHOLDER_1

बिलकुल नहीं दिखेगा और चुपचाप फ़ेल हो जाएगा (myFilterNode.BANDPASS अब तय नहीं होगा. साथ ही, .type को अपरिभाषित पर सेट करने की कोशिश से कोई असर नहीं होगा. वैसे, इसी वजह से वोकोडर काम नहीं कर रहा था.) इसी तरह, सिर्फ़ काम करने में इस्तेमाल होने वाले नंबर को Filter.type असाइन करना:

myFilterNode.type = 2;

हालांकि, अब आपको स्ट्रिंग की गिनती का इस्तेमाल करना होगा:

myFilterNode.type = “bandpass”;

इसलिए, शायद आप इन शब्दों के लिए अपना कोड छोटा करना चाहें:

  • webkitAudioContext
  • .LOWPASS
  • .HIGHPASS
  • .BANDPASS
  • .LOWSHELF
  • .HIGHSHELF
  • .PEAKING
  • .NOTCH
  • .ALLPASS
  • .SINE
  • .SQUARE
  • .SAWTOOTH
  • .TRIANGLE
  • .noteOn
  • .noteGrainOn
  • .noteOff
  • .setWaveTable
  • .createWaveTable
  • .looping
  • .EQUALPOWER
  • .HRTF
  • .LINEAR
  • .INVERSE
  • .EXPONENTIAL
  • createGainNode
  • createDelayNode
  • .type (हां, इसमें कई गलत बातें होंगी, लेकिन ऊपर दिए गए आखिरी उदाहरण को जानने का यही एक तरीका है!)

एक बार और, अगर आप जल्दी में हैं और गतिविधि करना चाहते हैं, तो मेरी कैनरीपैच webkitAudioContext लाइब्रेरी की एक कॉपी लें और उसे अपने ऐप्लिकेशन में शामिल कर लें. ऑडियो हैकिंग के लिए शुभकामनाएं!