تغییرات صوتی وب در m36

کریس ویلسون
Chris Wilson

تغییرات صوتی وب

در Google، ما استانداردها را دوست داریم. ما در مأموریتی هستیم که پلتفرم وب تعریف شده توسط استانداردها را بسازیم. یکی از زگیل‌های کوچکی که برای مدتی در آن وجود داشت، اجرای پیشوند وب کیت Web Audio API (به ویژه شی webkitAudioContext) و برخی از بیت‌های منسوخ شده Web Audio بود که ما همچنان از آنها پشتیبانی می‌کردیم.

در ابتدا برنامه ریزی شده بود که Chrome 36 پشتیبانی از پیشوند webkitAudioContext را حذف کند، زیرا ما شروع به پشتیبانی از شی بدون پیشوند AudioContext کرده بودیم. معلوم شد که این مشکل بیش از حد انتظار است، بنابراین Chrome 36 از هر دو بدون پیشوند و پیشوند پشتیبانی می کند - با این حال، حتی در webkitAudioContext که مجدداً معرفی شده است، چندین روش و ویژگی قدیمی مانند createGainNode و createJavaScriptNode حذف شده اند. به طور خلاصه، در Chrome 36 webkitAudioContext و AudioContext نام مستعار یکدیگر هستند. هیچ تفاوتی در عملکرد بین این دو وجود ندارد.

ما پس از Chrome 36، احتمالاً در چند نسخه، پشتیبانی از پیشوند را به طور کامل حذف خواهیم کرد. زمانی که تغییر قریب‌الوقوع باشد، در اینجا اعلامیه‌ای اعلام می‌کنیم و همچنان به تماس با نویسندگان برای تعمیر برنامه‌های صوتی وب آنها ادامه می‌دهیم.

چرا به جای بازگشت به اجرای قبلی، این کار را انجام دادیم؟ خوب، تا حدی، ما نسبت به حرکت خیلی به عقب خودداری کرده ایم. ما قبلاً آن APIها را حذف کرده‌ایم، و به‌عنوان یک اثر جانبی خوب برای این نام مستعار، برنامه‌ها می‌توانند به خوبی روی فایرفاکس کار کنند، که هرگز از یک شی پیشوند AudioContext (و کاملاً درست!) در پشتیبانی Web Audio خود که در ابتدا منتشر شد، پشتیبانی نکرد. پاییز گذشته

بقیه این به روز رسانی راهنمایی برای رفع مواردی که ممکن است به دلیل این تغییر در کد شما خراب شود، ارائه می دهد. نکته جالب در مورد رفع این مشکلات این است که کد شما به احتمال زیاد فقط در فایرفاکس نیز کار می کند! (من مدتها فکر می کردم که برنامه Vocoder من به دلیل اجرای فایرفاکس خراب شده است، اما یکی از این مشکلات بود!)

اگر فقط می‌خواهید راه‌اندازی کنید، ممکن است بخواهید نگاهی به کتابخانه میمون وصله‌ای که من برای برنامه‌هایی که در کدهای صوتی قدیمی وب نوشته شده‌اند بیاندازید - این می‌تواند به شما کمک کند تا با حداقل مقداری از زمان شروع به کار کنید. زمان، به عنوان نام مستعار اشیاء و روش های مناسب. در واقع، وصله‌هایی که کتابخانه فهرست می‌کند، راهنمای خوبی برای چیزهایی است که تغییر کرده‌اند.

اول از همه

هر ارجاعی به window.webkitAudioContext باید در عوض به window.AudioContext داده شود. اغلب، این مشکل با یک روش ساده رفع می شود:

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

اگر برنامه شما با چیزی مانند «متاسفانه، مرورگر شما از صدای وب پشتیبانی نمی‌کند» پاسخ می‌دهد. لطفا از کروم یا سافاری استفاده کنید." - به احتمال زیاد به طور صریح به دنبال webkitAudioContext است. توسعه دهنده بد! می توانستید ماه ها از فایرفاکس پشتیبانی کنید!

اما چند حذف کد ظریف‌تر دیگر وجود دارد که برخی از آنها کمتر واضح هستند.

  • ثابت های نوع 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() and setPeriodicWave()` تغییر نام داده اند.
  • AudioBufferSourceNode.looping به نفع .loop حذف شد
  • AudioContext.createBuffer(ArrayBuffer, boolean) برای رمزگشایی همزمان یک لکه از داده های صوتی رمزگذاری شده حذف شده است. تماس‌های همزمان که تکمیل آنها زمان زیادی می‌برد، عمل کدگذاری ضعیفی هستند. به جای آن از فراخوانی DecodeAudioData ناهمزمان استفاده کنید. این یکی از چالش برانگیزترین تغییرات است - شما باید در واقع جریان منطقی را تغییر دهید - اما تمرینی به مراتب بهتر است. احسان انگکاری از موزیلا یک مثال خوب از نحوه انجام این کار را در پست خود در مورد تبدیل به صدای وب استاندارد نوشت.

بسیاری از این موارد (مانند تغییر نام createGainNode و حذف رمزگشایی همزمان در createBuffer) بدیهی است که در کنسول ابزارهای توسعه دهنده به عنوان یک خطا نشان داده می شوند - اما برخی دیگر مانند این استفاده هستند:

MULTI_LINE_CODE_PLACEHOLDER_1

به هیچ وجه نمایش داده نمی شود و بی سر و صدا از کار می افتد (myFilterNode.BANDPASS اکنون به undefined تبدیل می شود، و تلاش برای تنظیم .type به undefined به سادگی هیچ اثری ایجاد نمی کند. اتفاقاً این همان چیزی بود که باعث شد Vocoder شکست می خورد.) به همین ترتیب، فقط فیلتر.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 من را بردارید و آن را در برنامه خود قرار دهید. هک صوتی مبارک!