میتوانید از VolumeShaper
در یک برنامه صوتی برای اجرای محو کردن، محو کردن، محو کردن متقاطع، داک کردن و دیگر انتقالهای خودکار کوتاه صدا استفاده کنید. کلاس VolumeShaper
در اندروید 8.0 (سطح API 26) و بالاتر موجود است.
شما با فراخوانی createVolumeShaper()
در یک نمونه از AudioTrack
یا MediaPlayer
یک VolumeShaper
ایجاد می کنید. VolumeShaper
فقط روی صدای تولید شده توسط AudioTrack یا MediaPlayer که آن را ایجاد کرده است عمل می کند.
VolumeShaper.Configuration
رفتار VolumeShaper
با VolumeShaper.Configuration
آن تعریف می شود. این پیکربندی یک *منحنی حجم، نوع interpolator و مدت زمان را مشخص می کند.
منحنی حجم
منحنی حجم نشان دهنده تغییر دامنه در طول زمان است. توسط یک جفت آرایه شناور، x[] و y[] که مجموعه ای از نقاط کنترل را تعریف می کنند، تعریف می شود. هر جفت (x, y) به ترتیب زمان و حجم را نشان می دهد. آرایه ها باید دارای طول مساوی بوده و دارای حداقل 2 و حداکثر 16 مقدار باشند. (حداکثر طول منحنی در getMaximumCurvePoints()
تعریف شده است.)
مختصات زمانی در بازه [0.0، 1.0] داده می شود. اولین نقطه زمانی باید 0.0، آخرین آن باید 1.0 باشد و زمان ها باید به طور یکنواخت افزایش یابد.
مختصات حجم در مقیاس خطی در بازه [0.0، 1.0] مشخص می شود.
نوع درون یاب
منحنی حجم همیشه از نقاط کنترل مشخص شده عبور می کند. مقادیر بین نقاط کنترل با توجه به نوع درون یابی پیکربندی توسط یک spline به دست می آید. چهار ثابت برای انواع درونیابی VolumeShaper
موجود است:
- VolumeShaper.Configuration.INTERPOLATOR_TYPE_STEP
- VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR
- VolumeShaper.Configuration.INTERPOLATOR_TYPE_CUBIC
- VolumeShaper.Configuration.INTERPOLATOR_TYPE_CUBIC_MONOTONIC
مدت زمان
مختصات زمانی مشخص شده در بازه [0.0، 1.0] به مدت زمانی که شما بر حسب میلی ثانیه تعیین می کنید، مقیاس می شوند. این طول واقعی منحنی حجم صدا را در زمانی که شکل دهنده در حال اجرا است و منحنی را روی خروجی صدا اعمال می کند، تعیین می کند.
با استفاده از VolumeShaper
ایجاد یک پیکربندی
قبل از ساختن یک VolumeShaper
، باید یک نمونه از VolumeShaper.Configuration
ایجاد کنید. این کار را با استفاده از VolumeShaper.Configuration.Builder()
انجام دهید:
کاتلین
val config: VolumeShaper.Configuration = VolumeShaper.Configuration.Builder() .setDuration(3000) .setCurve(floatArrayOf(0f, 1f), floatArrayOf(0f, 1f)) .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR) .build()
Java
VolumeShaper.Configuration config = new VolumeShaper.Configuration.Builder() .setDuration(3000) .setCurve(new float[] {0.f, 1.f}, new float[] {0.f, 1.f}) .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR) .build();
With no arguments the VolumeShaper.Configuration.Builder
constructor returns a
builder that creates a configuration with default settings:
INTERPOLATOR_TYPE_CUBIC, a one second duration, and no curve. You must add a
curve to the builder before calling build()
.
The framework provides constants for configurations with pre-built curves, each with one second duration:
VolumeShaper.Configuration.LINEAR_RAMP
VolumeShaper.Configuration.CUBIC_RAMP
VolumeShaper.Configuration.SINE_RAMP
VolumeShaper.Configuration.SCURVE_RAMP
Creating a VolumeShaper
To create a VolumeShaper
, call createVolumeShaper()
on an instance of the
appropriate class, passing in a VolumeShaper.Configuration
:
Kotlin
volumeShaper = myMediaPlayer.createVolumeShaper(config) volumeShaper = myAudioTrack.createVolumeShaper(config)
Java
volumeShaper = myMediaPlayer.createVolumeShaper(config); volumeShaper = myAudioTrack.createVolumeShaper(config);
A single track or media player can have many shapers attached to it, and you can
control each shaper separately. The outputs of all the shapers on a track or
player are multiplied together. A VolumeShaper
cannot be shared between
AudioTracks
or MediaPlayers
, but you can use the same configuration in calls
to createVolumeShaper
to build identical shapers on multiple AudioTracks
or
MediaPlayers
.
When you create the shaper, its first control point (at t = 0) is applied to the
audio stream. If the initial volume is not 1.0 and your app is playing material
at create time, your audio might have an abrupt change in volume. Best practice
is to start playing audio from silence and use a VolumeShaper
to implement a
fade-in when playback starts. Create a VolumeShaper
that starts at 0 volume
and fades up. For example:
setCurve(new float[] {0.f, 1.f}, new float[] {0.f, 1.f})
پخش و شکل دهنده را همزمان شروع کنید. این تضمین میکند که پخش از حالت بیصدا شروع میشود و میزان صدا به میزان کامل افزایش مییابد. در بخش بعدی توضیح داده شده است.
اجرای VolumeShaper
اگرچه سطح صدا اولین نقطه کنترلی به محض ایجاد شکل دهنده به مسیر صوتی اعمال می شود، شکل دهنده در طول منحنی پیشرفت نمی کند تا زمانی که متد apply()
را با VolumeShaper.Operation.PLAY
فراخوانی کنید. پس از ایجاد شکلدهنده، اولین فراخوانی apply()
باید عملیات PLAY
برای شروع شکلدهنده مشخص کند. این منحنی را از اولین تا آخرین نقاط کنترل اجرا می کند:
کاتلین
shaper.apply(VolumeShaper.Operation.PLAY)
Java
shaper.apply(VolumeShaper.Operation.PLAY);
هنگامی که شکل دهنده در حال اجرا است، می توانید فراخوانی های متناوب apply()
را صادر کنید که عملیات REVERSE و PLAY را مشخص می کند. این امر هر بار جهت بازخوانی نقاط کنترل را تغییر می دهد.
شکل دهنده به طور مداوم صدا را تنظیم می کند و از تمام نقاط کنترل عبور می کند تا زمانی که منقضی شود . این زمانی اتفاق می افتد که شکل دهنده به آخرین (برای عملیات PLAY) یا اولین (برای عملکرد REVERSE) نقطه کنترل در منحنی برسد.
هنگامی که شکل دهنده منقضی می شود، صدا در آخرین تنظیم باقی می ماند که ممکن است اولین یا آخرین نقطه کنترل باشد. میتوانید در هر زمان VolumeShaper.getVolume()
را برای سطح حجم فعلی فراخوانی کنید.
پس از انقضای شکلدهنده، میتوانید apply()
aply را برای اجرای منحنی در جهت مخالف صادر کنید. به عنوان مثال، اگر شکل دهنده در حین اجرای PLAY
منقضی شده باشد، apply()
بعدی باید REVERSE
باشد. فراخوانی PLAY
پس از انقضای PLAY
، یا REVERSE
پس از انقضای REVERSE
هیچ تاثیری ندارد.
باید عملیات PLAY
و REVERSE
را جایگزین کنید. هیچ راهی برای پخش یک منحنی از اولین تا آخرین نقطه کنترل و سپس راه اندازی مجدد آن از اولین نقطه کنترل وجود ندارد. برای جایگزینی منحنی با یک کپی از خودش، میتوانید از متد replace()
که در بخش بعدی توضیح داده شد استفاده کنید. این شکلدهنده را بازنشانی میکند و برای شروع دوباره به عملیات PLAY
نیاز دارد.
تغییر منحنی
از متد replace()
برای تغییر منحنی VolumeShaper
استفاده کنید. این روش یک پیکربندی، یک عملیات و یک پارامتر اتصال را می گیرد. شما می توانید متد replace()
در هر زمانی که شکل دهنده در حال اجرا است یا پس از انقضای آن فراخوانی کنید:
کاتلین
val newConfig = VolumeShaper.Configuration.Builder() .setDuration(1000) .setCurve(floatArrayOf(0f, 0.5f), floatArrayOf(0f, 1f)) .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR) .build() val join = true shaper.replace(newConfig, VolumeShaper.Operation.PLAY, join)
Java
VolumeShaper.Configuration newConfig = new VolumeShaper.Configuration.Builder() .setDuration(1000) .setCurve(new float[] {0.f, 0.5f}, new float[] {0.f, 1.f}) .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR) .build(); boolean join = true; shaper.replace(newConfig, VolumeShaper.Operation.PLAY, join);
هنگامی که در حالی که شکل دهنده در حال اجرا است، replace()
می خوانید، تغییر صدا را متوقف می کند و در مقدار فعلی خود باقی می ماند. سپس شکل دهنده سعی می کند منحنی جدید را از اولین نقطه کنترل شروع کند. این بدان معنی است که آرگومان عملیات کنترل می کند که شکل دهنده پس از فراخوانی اجرا شود یا خیر. PLAY
برای شروع فوری منحنی جدید مشخص کنید، REVERSE
را مشخص کنید تا شکل دهنده در حجم اولین نقطه کنترل در منحنی جدید متوقف شود. می توانید شکل دهنده را بعداً با apply(VolumeShaper.Operation.PLAY)
شروع کنید.
هنگامی که replace()
با join = false
فراخوانی می کنید، شکل دهنده منحنی خود را در سطح مشخص شده توسط اولین نقطه کنترل خود شروع می کند. این می تواند باعث ناپیوستگی در صدا شود. می توانید با فراخوانی replace()
با join = true
از این امر جلوگیری کنید. این اولین نقطه کنترل منحنی جدید را روی سطح فعلی شکل دهنده تنظیم می کند و حجم تمام نقاط کنترل بین اولین و آخرین را برای حفظ شکل نسبی منحنی جدید مقیاس می کند (آخرین نقطه کنترل بدون تغییر است). عملیات مقیاس بندی نقاط کنترل را در منحنی جدید شکل دهنده به طور دائم تغییر می دهد.
حذف VolumeShaper
هنگامی که AudioTrack
یا MediaPlayer
منتشر می شود یا دیگر استفاده نمی شود، سیستم بسته می شود و زباله ها VolumeShaper
را جمع آوری می کنند. می توانید متد close()
روی شکل دهنده فراخوانی کنید تا بلافاصله آن را از بین ببرید. این سیستم شکل دهنده را از خط لوله صدا در حدود 20 میلی ثانیه حذف می کند. هنگام پخش صدا هنگام بستن VolumeShaper
مراقب باشید. اگر هنگام فراخوانی close()
ولوم شکل دهنده کمتر از 1.0 باشد، مقیاس حجم شکل دهنده به 1.0 تغییر می کند. این می تواند باعث افزایش ناگهانی حجم شود.