تغييرات في Web Audio
نحن في Google نحب المعايير. نحن في مهمة لإنشاء منصة الويب التي تحدّدها المعايير. ومن المشاكل الصغيرة التي واجهناها لبعض الوقت هي التنفيذ الذي يتضمن البادئة webkit لواجهة برمجة تطبيقات Web Audio (لا سيما عنصر webkitAudioContext)، وبعض الأجزاء المتوقّفة نهائيًا من Web Audio التي واصلت Google دعمها.
كان من المخطّط في الأصل أن يزيل الإصدار 36 من Chrome إمكانية استخدام webkitAudioContext المزوّد ببادئة، لأنّنا بدأنا بتوفير العنصر AudioContext غير المزوّد ببادئة. تبيّن أنّ هذا الإجراء أكثر صعوبة مما كان متوقّعًا، لذا يتيح الإصدار 36 من Chrome استخدام البادئة وغير البادئة معًا. ومع ذلك، حتى في webkitAudioContext الذي تمت إعادة تقديمه، تمت إزالة العديد من الطرق والسمات القديمة، مثل createGainNode وcreateJavaScriptNode. باختصار، في الإصدار 36 من Chrome، webkitAudioContext وAudioContext هما اسمان بديلان لبعضهما، ولا فرق في الوظائف بينهما.
سنزيل إمكانية استخدام البادئة بالكامل بعد الإصدار 36 من Chrome، وربما في بضعة إصدارات. سنُعلِن هنا عن هذا التغيير عندما يصبح وشيكًا، وسنواصل التواصل مع المؤلّفين لحلّ مشاكل تطبيقات Web Audio.
لماذا فعلنا ذلك بدلاً من العودة إلى التنفيذ السابق؟ لقد ترددنا في إزالة واجهات برمجة التطبيقات هذه، ولكننا سبق أن أزلنا هذه الواجهات، ونتيجةً لذلك، يمكن للتطبيقات العمل بشكل جيد على Firefox الذي لم يسبق له استخدام عنصر AudioContext مسبوقًا (وهو أمر صائب أيضًا) في ميزة Web Audio التي تم إصدارها في الخريف الماضي.
يقدّم الجزء المتبقّي من هذا التحديث دليلاً لحلّ المشاكل التي قد تحدث في الرمز البرمجي بسبب هذا التغيير. إنّ حلّ هذه المشاكل رائع لأنّه من المرجّح أن تعمل رمزك البرمجية في Firefox أيضًا. (كنت أعتقد لفترة طويلة أنّ تطبيق Vocoder لا يعمل بسبب مشكلة في Firefox، ولكن تبيّن أنّه إحدى هذه المشاكل).
إذا كنت تريد فقط بدء استخدام المكتبة، ننصحك بإلقاء نظرة على مكتبة monkey-patch التي كتبتها للتطبيقات التي تم إنشاؤها باستخدام رمز Web Audio القديم. يمكن أن تساعدك هذه المكتبة في بدء استخدامها في أقصر وقت ممكن، لأنّها ستضيف أسماء بديلة للعناصر والطُرق بشكل مناسب. في الواقع، إنّ الرموز البرمجية التي تسردها المكتبة هي دليل جيد للعناصر التي تم تغييرها.
أولاً وقبل كل شيء
يجب الإشارة إلى window.AudioContext
بدلاً من window.webkitAudioContext
في أيّ مراجع. غالبًا ما يتم حلّ هذه المشكلة من خلال إجراء بسيط:
window.AudioContext = window.AudioContext || window.webkitAudioContext;
إذا كان تطبيقك يستجيب برسالة مثل "لا يتيح متصفحك ميزة Web Audio"، يُرجى استخدام Chrome أو Safari"، من المرجّح أن يكون البحث عن webkitAudioContext
بشكل صريح. مطوّر سيئ من الممكن أن تكون قد استخدمت Firefox لعدة أشهر.
ولكن هناك بعض عمليات إزالة الرموز البرمجية الأخرى الأكثر دقة، والتي قد يكون بعضها أقل وضوحًا.
- لم تعُد ثوابت النوع المُدرَجة في BiquadFilter للسمة
.type
(التي أصبحت الآن سلسلة) تظهر في عنصرBiquadFilterNode
، ولا نسمح باستخدامها في سمة.type
. وبالتالي، لن تستخدم.LOWPASS
(أو 0) بعد الآن، بل ستضبطه على "منخفضة التردد". - بالإضافة إلى ذلك، أصبحت سمة
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 مثالاً رائعًا على كيفية إجراء ذلك في مشاركته حول التحويل إلى Web Audio العادي.
من الواضح أنّ العديد من هذه التغييرات (مثل إعادة تسمية 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
(نعم، سيؤدي ذلك إلى ظهور الكثير من النتائج الإيجابية الخاطئة، ولكنّها الطريقة الوحيدة لرصد المثال الأخير أعلاه).
مرة أخرى، إذا كنت في عجلة من أمرك وتريد بدء التشغيل، ما عليك سوى الحصول على نسخة من مكتبة webkitAudioContext في monkeypatch وإدراجها في تطبيقك. مع أطيب التحيّات،