تغییرات صوتی وب
در 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 من را بردارید و آن را در برنامه خود قرار دهید. هک صوتی مبارک!