التحكم في السعة باستخدام Volumeالشكل

يمكنك استخدام VolumeShaper في أحد التطبيقات الصوتية لإجراء اختفاء الصوت تدريجيًا واختفاء الصوت بعد ذلك وتجنب التداخل مع أصوات أخرى وإجراء إحالات ناجحة تلقائية قصيرة لمستوى الصوت. تتوفّر الفئة VolumeShaper في الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) والإصدارات الأحدث.

يمكنك إنشاء VolumeShaper من خلال استدعاء createVolumeShaper() على مثيل AudioTrack أو MediaPlayer. يعمل VolumeShaper فقط على المحتوى الصوتي الذي تم إنشاؤه من خلال AudioTrack أو MediaPlayer الذي تم إنشاؤه.

إعدادات 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

Shar.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))
 .setIntervolatorType(Volume(Volume.Configuration.INTERPOLATOR_TYPE_buildAR)
TRUE .PLAY_buildAR
من.setCurve(floatArrayOf(0f, 0.5f), floatArrayOf(0f, 1f))).

Java

VolumeShaper.Configuration newConfig =
 new VolumeShaper.Configuration.Builder()
 .setDuration(1000)
 .setCurve(new float[] {0.f, 0.5f}, new float[] {0.f, 1.f})
 .setInter أنّ مَعلمة join على نطاق (VolumeShaper.PLAY_build.INTERPO)

عند استدعاء replace() أثناء تشغيل أداة التشكيل، تتوقف عن تغيير الحجم وتظل على قيمتها الحالية. ثم يحاول المشكل بدء المنحنى الجديد من نقطة التحكم الأولى. هذا يعني أن وسيطة العملية تتحكم في ما إذا كان يتم تشغيل المشكل بعد الاستدعاء أم لا. حدِّد PLAY لبدء المنحنى الجديد فورًا، واختَر REVERSE لترك أداة الشكل متوقفة مؤقتًا عند مستوى صوت نقطة التحكم الأولى في المنحنى الجديد. يمكنك بدء أداة التشكيل لاحقًا باستخدام apply(VolumeShaper.Operation.PLAY).

عند استدعاء replace() باستخدام join = false، تبدأ المشكّلة منحنى الشكل عند المستوى الذي تحدّده نقطة التحكم الأولى. يمكن أن يؤدي ذلك إلى انقطاع في الصوت. يمكنك تجنُّب ذلك من خلال الاتصال برقم replace() على الرقم join = true. يؤدي ذلك إلى ضبط نقطة التحكم الأولى للمنحنى الجديد على المستوى الحالي للمشكل وتغيير حجم جميع نقاط التحكم بين الأول والأخير للحفاظ على الشكل النسبي للمنحنى الجديد (نقطة التحكم الأخيرة بدون تغيير). تؤدي عملية التحجيم إلى تغيير نقاط التحكم بشكل دائم في منحنى أداة التشكيل الجديد.

إزالة أداة تغيير الحجم

يتم إغلاق النظام وتجمع البيانات المهملة VolumeShaper عند إزالة AudioTrack أو MediaPlayer أو عند عدم استخدام الجهاز. يمكنك استدعاء الإجراء close() على أداة التشكيل لإتلافه على الفور. يزيل النظام المشكل من مسار الصوت في غضون 20 ملي ثانية تقريبًا. يُرجى توخّي الحذر عند إغلاق VolumeShaper أثناء تشغيل الصوت. إذا كان مستوى صوت أداة الشكل أقل من 1.0 عند استدعاء close()، سيتغير مقياس مستوى صوت أداة الشكل إلى 1.0. وقد يؤدي هذا إلى زيادة مفاجئة في الحجم.