Web Audio में हुए बदलाव
Google में, हम स्टैंडर्ड को बहुत अहमियत देते हैं. हमारा मकसद, स्टैंडर्ड के हिसाब से वेब प्लैटफ़ॉर्म बनाना है. कुछ समय से, Web Audio API (खास तौर पर webkitAudioContext ऑब्जेक्ट) को webkit- प्रीफ़िक्स के साथ लागू करने की सुविधा, एक छोटी सी समस्या रही है. साथ ही, Web Audio के कुछ ऐसे हिस्से हैं जिन्हें बंद कर दिया गया है, लेकिन हमने इनका इस्तेमाल जारी रखा है.
मूल रूप से, यह तय किया गया था कि Chrome 36 में, प्रीफ़िक्स वाले webkitAudioContext के लिए सहायता हटा दी जाएगी. इसकी वजह यह थी कि हमने प्रीफ़िक्स के बिना AudioContext ऑब्जेक्ट के साथ काम करना शुरू कर दिया था. यह काम उम्मीद से ज़्यादा मुश्किल साबित हुआ. इसलिए, Chrome 36 में बिना प्रीफ़िक्स वाले और प्रीफ़िक्स वाले, दोनों वर्शन काम करते हैं. हालांकि, फिर से पेश किए गए webkitAudioContext में, createGainNode और createJavaScriptNode जैसे कई लेगसी तरीके और एट्रिब्यूट हटा दिए गए हैं. कम शब्दों में, Chrome 36 में webkitAudioContext और AudioContext, एक-दूसरे के दूसरे नाम हैं. दोनों के काम करने के तरीके में कोई अंतर नहीं है.
हम Chrome 36 के बाद, प्रीफ़िक्स के लिए पूरी तरह से सहायता हटा देंगे. ऐसा कुछ रिलीज़ में हो सकता है. जब यह बदलाव लागू हो जाएगा, तब हम इस बारे में यहां सूचना देंगे. साथ ही, हम लेखकों से संपर्क करके उनके वेब ऑडियो ऐप्लिकेशन ठीक करने में मदद कर रहे हैं.
हमने पुराने तरीके को वापस लाने के बजाय, ऐसा क्यों किया है? हमने पहले ही उन एपीआई को हटा दिया है. इस बदलाव का एक अच्छा असर यह भी हुआ है कि ऐप्लिकेशन, Firefox पर बेहतर तरीके से काम कर सकते हैं. Firefox ने पिछले साल की शुरुआत में रिलीज़ की गई वेब ऑडियो की सुविधा में, पहले से मौजूद AudioContext ऑब्जेक्ट का इस्तेमाल कभी नहीं किया है.
इस अपडेट के बाकी हिस्से में, उन समस्याओं को ठीक करने के बारे में बताया गया है जो इस बदलाव की वजह से आपके कोड में हो सकती हैं. इन समस्याओं को ठीक करने की सबसे अच्छी बात यह है कि आपका कोड, Firefox में भी काम कर सकता है! (मुझे लंबे समय से लगता था कि Firefox के लागू होने की वजह से, मेरा वॉकोडर ऐप्लिकेशन काम नहीं कर रहा है. हालांकि, यह इनमें से एक समस्या थी!)
अगर आपको सिर्फ़ इसे इस्तेमाल करना है, तो मंकी-पैच लाइब्रेरी देखें. मैंने इसे उन ऐप्लिकेशन के लिए लिखा था जो पुराने वेब ऑडियो कोड में लिखे गए थे. इससे आपको कम से कम समय में इसे इस्तेमाल करने में मदद मिल सकती है, क्योंकि यह ऑब्जेक्ट और तरीकों को सही तरीके से बदल देगा. असल में, लाइब्रेरी में मौजूद पैच, बदलावों के बारे में अच्छी जानकारी देते हैं.
सबसे पहले
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() and
setPeriodicWave()` कर दिया गया है.AudioBufferSourceNode.looping
को हटाकर,.loop
को जोड़ा गयाAudioContext.createBuffer(ArrayBuffer, boolean)
को हटा दिया गया है. सिंक्रोनस कॉल को पूरा होने में ज़्यादा समय लगता है. यह कोडिंग का गलत तरीका है. इसके बजाय, एसिंक्रोनस decodeAudioData कॉल का इस्तेमाल करें. यह सबसे मुश्किल बदलावों में से एक है. आपको लॉजिक फ़्लो में बदलाव करना होगा. हालांकि, यह सबसे सही तरीका है. Mozilla के एहसान अंगारी ने स्टैंडर्ड वेब ऑडियो में बदलने के बारे में अपनी पोस्ट में, ऐसा करने का एक अच्छा उदाहरण दिया है.
इनमें से कई बदलाव, डेवलपर टूल कंसोल में गड़बड़ी के तौर पर दिखेंगे. जैसे, createGainNode का नाम बदलना और createBuffer में सिंक्रोनस डिकोडिंग की सुविधा हटाना. हालांकि, कुछ अन्य बदलावों को गड़बड़ी के तौर पर नहीं दिखाया जाएगा. जैसे:
MULTI_LINE_CODE_PLACEHOLDER_1
नहीं दिखेगा और चुपचाप काम नहीं करेगा (myFilterNode.BANDPASS अब 'तय नहीं है' पर सेट हो जाएगा और .type को 'तय नहीं है' पर सेट करने की कोशिश से कोई असर नहीं पड़ेगा. वैसे, इस वजह से वॉकोडर काम नहीं कर रहा था.) इसी तरह, किसी नंबर को filter.type असाइन करने पर भी यह काम करता है:
myFilterNode.type = 2;
हालांकि, अब आपको स्ट्रिंग एन्यूमेरेशन का इस्तेमाल करना होगा:
myFilterNode.type = “bandpass”;
इसलिए, आपको अपने कोड में इन शब्दों के लिए grep का इस्तेमाल करना पड़ सकता है:
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
(हां, इसमें कई गलत नतीजे मिलेंगे - लेकिन ऊपर दिए गए आखिरी उदाहरण को पकड़ने का यही एक तरीका है!)
अगर आपको जल्दी से काम शुरू करना है, तो मेरी monkeypatch webkitAudioContext लाइब्रेरी की कॉपी लें और उसे अपने ऐप्लिकेशन में शामिल करें. ऑडियो हैकिंग का आनंद लें!