VolumeShaper ile genliği kontrol etme

Performans yapmak için ses uygulamasında VolumeShaper kullanabilirsiniz Kararma, kararma, çapraz geçiş, alçalma ve diğer kısa otomatik ses düzeyi oluşturabilirsiniz. VolumeShaper sınıfı, Android 8.0 (API düzeyi 26) sürümünde kullanılabilir. oluşturabilirsiniz.

Şu örneğin bir örneğinde createVolumeShaper() işlevini çağırarak bir VolumeShaper oluşturursunuz: AudioTrack veya MediaPlayer. İlgili içeriği oluşturmak için kullanılan VolumeShaper yalnızca AudioTrack veya MediaPlayer tarafından üretilen seste çalışır harekete geçti.

VolumeShaper.Yapılandırması

VolumeShaper davranışı şu şekilde tanımlanır: VolumeShaper.Configuration. Yapılandırma, *ses eğrisi, interpolator türü ve süre.*

Hacim eğrisi

Hacim eğrisi, zaman içinde genlik değişimini temsil eder. Bir çiftle tanımlanır bir dizi kontrol noktasını tanımlayan x[] ve y[] kayan dizileri. Her biri (x, y) çifti sırasıyla zamanı ve hacmi temsil eder. Dizilerin uzunluğu eşit olmalıdır ve en az 2, en fazla 16 değer içermelidir. (Maksimum eğri uzunluğu getMaximumCurvePoints() içinde tanımlanır.)

Zaman koordinatları, [0,0, 1,0] aralığı üzerinden verilir. İlk kez punto 0,0, son değer 1,0 ve saatler tekdüze olmalıdır. artıyor.

Hacim koordinatları, aralık üzerindeki doğrusal ölçekte belirtilir [0,0, 1,0] olarak değiştirildi.

İnterpolatör türü

Hacim eğrisi her zaman belirtilen kontrol noktalarından geçer. Değerler kontrol noktaları arasındaki kontrol noktalarına göre bir eğriyle türetilir belirleyicidir. Kullanılabilir VolumeShaper interpolator türü:

  • VolumeShaper.Yapılandırma.INTERPOLATOR_TYPE_STEP
  • VolumeShaper.Yapılandırma.INTERPOLATOR_TYPE_LINEAR
  • VolumeShaper.Yapılandırma.INTERPOLATOR_TYPE_CUBIC
  • VolumeShaper.Yapılandırma.INTERPOLATOR_TYPE_CUBIC_MONOTONIC

Süre

[0,0, 1,0] aralığında belirtilen zaman koordinatları milisaniye cinsinden belirttiğiniz süre. Bu, toplamda şekillendirici çalışırken ve eğriyi çembere uygularken hacim eğrisinin zamanı ses çıkışını kullanın.

VolumeShaper Kullanma

Yapılandırma oluşturma

Bir VolumeShaper derlemeden önce VolumeShaper.Configuration örneği oluşturmanız gerekir. Bunu bir 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})

Oynatmayı ve şekil oluşturucuyu aynı anda başlatın. Bu, oynatmanın ses sessizden başlar ve ses en üst düzeye çıkarılır. Bunun açıklaması ele alacağız.

VolumeShaper Çalıştırma

İlk kontrol noktasının ses düzeyi, ses yoluna uygulansa da Şekillendirici oluşturulduğunda, şekillendirici eğri boyunca ilerlemez siz VolumeShaper.Operation.PLAY ile apply() yöntemini çağırıncaya kadar. Şu tarihten sonra: şekillendirici oluşturuluyorsa, apply() ilk çağrısında PLAY belirtilmelidir işlemini başlatacağım. Bu, eğriyi ilkinden başlayıp son kontrol noktaları:

Kotlin

Shar.apply(VolumeShaper.Operation.PLAY)

Java

Shar.apply(VolumeShaper.Operation.PLAY);

Şekillendirici çalışırken, alternatif apply() çağrılarını belirten bir ileti oluşturabilirsiniz. REVERSE ve PLAY işlemleri. Bu, kontrol noktaları anlamına gelir.

Şekillendirici, ses düzeyini sürekli olarak ayarlar ve tüm kontrol noktalarından geçer. kullanım süresi dolana kadar bekleyin. Bu, şekil şekli sonuncuya ulaştığında gerçekleşir (PLAY için işlemi) veya ilk (GERİ ALMA işlemi için) denetim noktasını seçin.

Şekillendiricinin süresi dolduğunda, ses düzeyi son ayarda kalır. Bu değer, kontrol noktası olabilir. VolumeShaper.getVolume() numaralı telefonu arayabilirsiniz: mevcut ses düzeyini istediğiniz zaman değiştirebilirsiniz.

Şekillendiricinin süresi dolduktan sonra, eğriyi çalıştırmak için başka bir apply() çağrısı yayınlayabilirsiniz yönde görüyorum. Örneğin, şekillendiricinin süresi çalışırken PLAY, sonraki apply() REVERSE olmalıdır. PLAY şu süre geçtikten sonra PLAY aranacak: süresi dolduktan sonra veya REVERSE süresi dolduktan sonra REVERSE ürününün herhangi bir etkisi olmaz.

PLAY ve REVERSE işlemlerini değiştirmeniz gerekir. Burada hiçbir şekilde öncekinden son kontrol noktalarına kadar eğimli olup daha sonra ilk denetim noktasıdır. Sonraki adımda açıklanan replace() yöntemini kullanabilirsiniz bölümünde, eğriyi kendisinin bir kopyasıyla değiştirin. Bu, şekillendiriciyi sıfırlar. PLAY işleminin yeniden başlatılması gerekiyor.

Eğriyi değiştirme

VolumeShaper eğrisini değiştirmek için replace() yöntemini kullanın. Bu yöntem bir yapılandırma, işlem ve birleştirme parametresidir. Örneğin, replace() yöntemini istediğiniz zaman değiştirebilirsiniz: Şekillendirici çalışırken veya süresi dolduktan sonra:

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 = doğru
Shar.replace(newConfig, VolumeShaper.Operation.PLAY, birleştirme)

Java

VolumeShaper.Configuration newConfig =
  yeni VolumeShaper.Configuration.Builder()
    .setDuration(1000)
    .setCurve(yeni kayan noktalı[] {0.f, 0.5f}, yeni kayan nokta[] {0.f, 1.f})
    .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
    .build();
boolejoin = true;
Shar.replace(newConfig, VolumeShaper.Operation.PLAY, join);

Şekillendirici çalışırken replace() işlevini çağırdığınızda, ve şu anki değerinde kalır. Ardından şekillendirici, yeni yapıya başlamaya çalışır. eğrisini oluşturabilirsiniz. Yani, işlem bağımsız değişkeni Şekillendiricinin çağrıdan sonra çalışıp çalışmayacağını kontrol eder. Şunu belirtmek için PLAY değerini belirtin: yeni eğriyi hemen başlatın, şekillendiriciyi duraklatılmış durumda bırakmak için REVERSE değerini belirtin yeni eğrideki ilk kontrol noktasının hacmi. Şekillendiriciyi oluşturmaya başlayabilirsiniz daha sonra apply(VolumeShaper.Operation.PLAY) ile devam edin.

join = false ile replace() çağrısı yaptığınızda, şekillendiricinin eğrisinin başlangıç noktası: ilk kontrol noktası tarafından belirtilen seviye. Bu durum, verilerin kesilmesine ses düzeyinde kontrol edin. join = true üzerinden replace() numaralı telefonu arayarak bu durumdan kaçınabilirsiniz. Bu, yeni eğrinin ilk kontrol noktasını kontrol noktalarının hacmini olarak ölçeklendirir. Yeni eğrinin göreceli şeklini korumak için son kontrol noktası (son kontrol noktası değiştirilebilir. Ölçeklendirme işlemi, yeni eğrisi üzerinde çalışıyorum.

VolumeShaper'ı Kaldırma

AudioTrack veya şu durumlarda sistem kapatılır ve atık VolumeShaper toplanır: MediaPlayer yayınlandı veya artık kullanılmıyor. close() yöntemini çağırabilirsiniz hemen imha etmeye çalışır. Sistem, şekil oluşturucuyu ses ardışık düzenine yaklaşık 20 ms. VolumeShaper öğesini kapatırken dikkatli olun yardımcı olur. Aradığınızda şekillendiricinin sesi 1,0'dan azsa close(), şekillendiricinin ses ölçeği 1,0 olarak değişir. Bu durum aniden yardımcı olabilir.