يمكنك استخدام VolumeShaper
في تطبيق صوتي لأداء
التلاشي للداخل، والتلاشي التدريجي، والتلاشي المتقاطع، والتخطي، وغير ذلك من الصوت الآلي القصير
الانتقالات. تتوفّر الفئة VolumeShaper
في الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات).
ولاحقًا.
يمكنك إنشاء VolumeShaper
من خلال استدعاء createVolumeShaper()
على مثيل
AudioTrack
أو MediaPlayer
. تشير رسالة الأشكال البيانية
تعمل ميزة "VolumeShaper
" فقط على المحتوى الصوتي الذي يتم إنتاجه من خلال "المقطع الصوتي" أو "مشغّل الوسائط".
التي أنشأها.
إعدادات VolumeShaper.
يتمّ تحديد سلوك VolumeShaper
من خلال
VolumeShaper.Configuration
تحدد التهيئة
*منحنى الحجم ونوع أداة التعديل والمدة*
منحنى الحجم
يمثل منحنى الحجم تغيُّر السعة بمرور الوقت. ويُحدد من خلال زوج
الصفائف العائمة، x[] وy[] التي تحدد سلسلة من نقاط التحكم. كل (س، ص)
يمثلان الوقت والحجم على التوالي. يجب أن تكون الصفائف متساوية في الطول
وتحتوي على قيمتين على الأقل و16 قيمة على الأكثر. (أقصى طول للمنحنى هو
محدّدة في getMaximumCurvePoints()
).
يتم تقديم الإحداثيات الزمنية على الفاصل الزمني [0.0، 1.0]. المرة الأولى يجب أن تساوي النقطة 0.0، وأن تكون الأخيرة 1.0، وأن تكون الأوقات رتيبة متزايد.
يتم تحديد إحداثيات الحجم بمقياس خطي على مدى الفاصل الزمني [0.0، 1.0].
نوع أداة التعديل
ويمر منحنى الحجم دائمًا عبر نقاط التحكم المحددة. القيم
بين نقاط التحكم يتم استنتاجها من خلال خط مائل وفقًا
نوع أداة تحميل البيانات في التكوين. هناك أربعة ثوابت للقيم المتاحة
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()
:
Kotlin
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
لبدء تشغيل أداة الشكل. يعمل هذا على تشغيل المنحنى من أول
نقاط التحكم الأخيرة:
Kotlin
shaper.apply(VolumeShaper.Operation.PLAY)
Java
Shar.apply(VolumeShaper.Operation.PLAY);
أثناء تشغيل أداة الشكل، يمكنك إصدار استدعاءات apply()
بالتناوب لتحديد
عمليات PLAY و"عكس" يؤدي هذا إلى تغيير اتجاه قراءة
بنقاط تحكم في كل مرة.
يضبط شكل الجهاز مستوى الصوت باستمرار ويمر عبر جميع نقاط التحكم. إلى أن تنتهي صلاحيتها. يحدث هذا عندما يصل شكل الشكل إلى آخر عنصر (في PLAY العملية) أو نقطة التحكم الأولى (لعملية العكس) في المنحنى.
عند انتهاء صلاحية أداة الشكل، يظل مستوى الصوت عند آخر إعداد، والذي ربما
نقطة التحكم الأولى أو الأخيرة. يمكنك الاتصال بـ VolumeShaper.getVolume()
لمدة
بمستوى الصوت الحالي في أي وقت.
بعد انتهاء صلاحية شكل الشكل، يمكنك إصدار طلب apply()
آخر لتشغيل المنحنى.
في الاتجاه المعاكس. على سبيل المثال، إذا انتهت صلاحية أداة الشكل أثناء التشغيل
PLAY
، يجب أن تكون قيمة apply()
التالية REVERSE
. يستغرق الاتصال برقم PLAY
بعد PLAY
أو REVERSE
بعد انتهاء صلاحية REVERSE
لا يكون هناك أي تأثير.
يجب تبديل عمليتَي PLAY
وREVERSE
. لا توجد طريقة لتشغيل
من نقطة التحكم الأولى إلى الأخيرة ثم إعادة تشغيله مرة أخرى
نقطة التحكم الأولى. يمكنك استخدام طريقة replace()
الموضحة في الفقرة التالية.
لاستبدال المنحنى بنسخة من نفسه. يؤدي هذا إلى إعادة تعيين الشكل،
يتطلّب تشغيل PLAY
لإعادة تشغيله.
تغيير المنحنى
استخدِم الطريقة replace()
لتغيير منحنى VolumeShaper
. تستغرق هذه الطريقة
تهيئة وعملية ومعلمة join. يمكنك الاتصال
replace()
في أي وقت، أثناء تشغيل أداة الشكل أو بعد انتهاء صلاحيتها:
Kotlin
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 Shar.replace(newConfig, VolumeShaper.Operation.PLAY, join)
Java
VolumeShaper.Configuration newConfig = الإصدار الجديد من 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; Shar.replace(newConfig, VolumeShaper.Operation.PLAY, join);
عند طلب replace()
أثناء تشغيل الشكل، يتوقف تغيير
الحجم ويظل في قيمته الحالية. ثم يحاول المشكل بدء واجهة
المنحنى من نقطة التحكم الأولى. هذا يعني أن وسيطة العملية
للتحكم في ما إذا كان الشكل يعمل بعد الاتصال أم لا. تحديد PLAY
إلى
بدء المنحنى الجديد على الفور، ثم تحديد REVERSE
لترك شكل الشكل متوقفًا مؤقتًا عند
حجم أول نقطة تحكم في المنحنى الجديد. يمكنك بدء أداة الشكل
لاحقًا مع apply(VolumeShaper.Operation.PLAY)
.
عند استدعاء الدالة replace()
باستخدام join = false
، يبدأ شكل الشكل منحنى عند
المستوى المحدد بواسطة أول نقطة تحكم له. يمكن أن يؤدي هذا إلى انقطاع البث
مستوى الصوت. يمكنك تجنُّب ذلك عن طريق الاتصال بـ replace()
باستخدام join = true
.
يؤدي ذلك إلى ضبط نقطة التحكم الأولى في المنحنى الجديد على المستوى الحالي
أداة الشكل وتقيس حجم جميع نقاط التحكم بين العمودين
وأخيرًا للحفاظ على الشكل النسبي للمنحنى الجديد (تتمثل آخر نقطة تحكم في
بدون تغيير). تغير عملية التحجيم بشكل دائم نقاط التحكم في
المنحنى الجديد للشكل.
إزالة VolumeShaper
عندما يغلق النظام ويجمع البيانات غير المرغوب فيها VolumeShaper
عند ضبط AudioTrack
أو
تم إصدار MediaPlayer
أو لم يعُد قيد الاستخدام. يمكنك استدعاء الطريقة close()
على شكل لتدميره على الفور. يقوم النظام بإزالة الشكل من
مسار الصوت خلال 20 ملي ثانية تقريبًا. يُرجى توخّي الحذر عند إغلاق VolumeShaper
أثناء تشغيل الصوت إذا كان مستوى صوت أداة الشكل أقل من 1.0 عند الاتصال
close()
، سيتم تغيير مقياس مستوى صوت أداة الشكل إلى 1.0. يمكن أن يؤدي هذا إلى حدوث
زيادة في الحجم.