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

يمكنك استخدام 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. يمكن أن يؤدي هذا إلى حدوث زيادة في الحجم.