تغييرات Web Audio في الإصدار m36

كريس ويلسون
"كريس ويلسون"

تغييرات Web Audio

في Google، نحب المعايير. ونحن في سعينا إلى إنشاء منصة ويب محددة وفقًا للمعايير. كان أحد المشاكل البسيطة التي تظهر على ذلك لفترة من الوقت هو تنفيذ واجهة برمجة التطبيقات Web Audio API (لا سيما كائن webkitAudioContext)، وبعض أجزاء Web Audio التي تم إيقافها نهائيًا والتي واصلنا دعمها.

كان من المخطَّط في الأصل أنّ متصفّح Chrome 36 سيزيل التوافق مع webkitaudioContext السابقة، بما أنّنا بدأنا في إتاحة كائن AudioContext غير المسبَق. تبيّن أنّ هذه الميزة أكثر إزعاجًا مما كان متوقّعًا، لذلك يتيح Chrome 36 استخدام كل من البادئات وغير المسبوقة، ومع ذلك، حتى في واجهة webkitAudioContext التي أُعيد تقديمها، تمت إزالة العديد من الطرق والسمات القديمة، مثل createGainNode وcreateJavaScriptNode. باختصار، في الإصدار 36 من Chrome webkit AudioContext و AudioContext هما اسمان مستعاران لبعضهما البعض، وليس هناك فرق في الوظائف بين الاثنين.

سنزيل دعم البادئة نهائيًا بعد إصدار Chrome 36، على الأرجح في إصدارين. سنُعلن عن ذلك هنا عندما يكون التغيير قريبًا، ونواصل التواصل مع المؤلفين لإصلاح تطبيقات Web Audio.

ما سبب تنفيذ ذلك بدلاً من العودة إلى التنفيذ السابق؟ جزء من ذلك، فقد كنّا مترددين في الانتقال إلى الوراء أكثر من اللازم، فقد أزلنا واجهات برمجة التطبيقات تلك من قبل، وكتأثير جانبي جميل لهذا الاسم المستعار، يمكن أن تعمل التطبيقات بشكل جيد على متصفح Firefox، الذي لم يدعم أبدًا كائن AudioContext المُسبق (وكما هو صحيح تمامًا!) في دعم Web Audio الذي تم إصداره في البداية في الخريف الماضي.

يوفر الجزء المتبقي من هذا التحديث دليلاً لإصلاح الأشياء التي ربما تتعطل في الرمز بسبب هذا التغيير. إن الشيء العظيم في إصلاح هذه المشكلات هو أنه من المحتمل جدًا أن تعمل التعليمات البرمجية الخاصة بك في متصفح Firefox أيضًا! (اعتقدت لفترة طويلة أن تطبيق Vocoder قد تعطّل بسبب تنفيذ Firefox، ولكن تبيّن أنّ إحدى هذه المشاكل كانت واحدة من هذه المشاكل.)

إذا كنت ترغب فقط في التجهيز والتشغيل، قد ترغب في إلقاء نظرة على مكتبة قرد-patch التي كتبتها للتطبيقات التي تمت كتابتها في رمز Web Audio القديم - يمكن أن يساعدك ذلك في الحصول على اسم مستعار وتشغيله في أقل قدر من الوقت بشكل مناسب، لأنه في الواقع، تعد التصحيحات التي تسردها المكتبة دليلاً جيدًا للأشياء التي تغيرت.

أولاً وقبل كل شيء

يجب ربط أي إشارات إلى window.webkitAudioContext بـ window.AudioContext بدلاً من ذلك. في أغلب الأحيان، يتم إصلاح هذه المشكلة ببساطة:

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

إذا كان تطبيقك يستجيب بعبارة مثل "لا يتوافق متصفحك مع Web Audio. يُرجى استخدام Chrome أو Safari."، لأنّه من المرجّح أنّه يبحث بشكل صريح عن webkitAudioContext. مطور سيئ! ربما كنت تدعم Firefox لعدة أشهر!

ومع ذلك، هناك بعض عمليات إزالة الرموز الأخرى الأكثر دقة، وقد يكون بعضها أقل وضوحًا.

  • إنّ ثوابت النوع العددي BiquadFilter للسمة .type (التي أصبحت الآن سلسلة) لم تعُد تظهر في الكائن 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()`.
  • تمت إزالة AudioBufferSourceNode.looping لصالح .loop
  • تمت إزالة AudioContext.createBuffer(ArrayBuffer, boolean) لفك ترميز كائن ثنائي كبير من البيانات الصوتية المرمّزة بشكل متزامن. تعتبر المكالمات المتزامنة التي تستغرق وقتًا طويلاً حتى يتم إكمالها تمارين ترميز سيئة، ويجب استخدام استدعاء فك ترميز AudioData غير المتزامن. وهذا أحد أكثر التغييرات صعوبة - تحتاج في الواقع إلى تغيير التدفق المنطقي - ولكن ممارسة أفضل بكثير. كتبت "إحسان أنغكاري" من 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 (نعم، سيتضمّن التقرير الكثير من النتائج الموجبة الخاطئة، ولكنّها الطريقة الوحيدة للتعرّف على المثال الأخير أعلاه.)

مرة أخرى، إذا كنت في عجلة من أمرك وتريد الاستعداد لبدء العمل، ما عليك سوى الحصول على نسخة من مكتبة webkit AudioContext التابعة لي وتضمينها في تطبيقك. نتمنّى لك تجربة ممتعة في اختراق الملفات الصوتية.