VolumeShaper ile genliği kontrol etme

Ses uygulamasında kararma, kararma, çapraz geçiş, kısma ve diğer kısa otomatik ses geçişleri yapmak için VolumeShaper kullanabilirsiniz. VolumeShaper sınıfı, Android 8.0 (API düzeyi 26) ve sonraki sürümlerde kullanılabilir.

AudioTrack veya MediaPlayer örneğinde createVolumeShaper() çağrısı yaparak bir VolumeShaper oluşturursunuz. VolumeShaper, yalnızca kendisini oluşturan AudioTrack veya MediaPlayer tarafından üretilen ses üzerinde hareket eder.

HacimShaper.Yapılandırması

VolumeShaper davranışı, VolumeShaper.Configuration ile tanımlanır. Yapılandırma;*hacim eğrisi, interpolatör türü ve süre belirtir.*

Hacim eğrisi

Hacim eğrisi, zaman içindeki genlik değişimini gösterir. Bir dizi kontrol noktasını tanımlayan bir çift kayan dizi (x[] ve y[]) ile tanımlanır. Her bir (x, y) çifti, sırasıyla zamanı ve hacmi temsil eder. Diziler eşit uzunlukta olmalı, en az 2 ve en fazla 16 değer içermelidir. (Maksimum eğri uzunluğu getMaximumCurvePoints() cinsinden tanımlanır.)

Zaman koordinatları [0,0, 1,0] aralığı üzerinden verilir. İlk zaman noktası 0,0, son zaman noktası 1,0 ve süreler de tekdüze şekilde artmalıdır.

Hacim koordinatları, [0,0, 1,0] aralığı üzerinden doğrusal ölçekte belirtilir.

İnterpolatör türü

Hacim eğrisi her zaman belirtilen denetim noktalarından geçer. Kontrol noktaları arasındaki değerler, yapılandırmanın interpolatör türüne göre bir çizgiyle türetilir. Mevcut VolumeShaper interpolatör türleri için dört sabit değer vardır:

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

Süre

[0,0, 1,0] aralığında belirtilen zaman koordinatları, milisaniye cinsinden belirttiğiniz bir süreye ölçeklenir. Bu, şekilleyici çalışırken ve eğriyi ses çıkışına uygularken ses eğrisinin gerçek uzunluğunu belirler.

VolumeShaper Kullanma

Yapılandırma oluşturma

VolumeShaper derlemeden önce VolumeShaper.Configuration örneği oluşturmanız gerekir. Bunu bir VolumeShaper.Configuration.Builder() kullanarak yapın:

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 şekillendiriciyi aynı anda başlatın. Bu şekilde, oynatma sessizce başlar ve ses en yüksek seviyeye ulaşır. Bu, bir sonraki bölümde açıklanmıştır.

VolumeShaper Çalıştırma

İlk denetim noktasının ses düzeyi, şekilleyicinin oluşturulmasıyla birlikte ses yoluna uygulanır ancak siz VolumeShaper.Operation.PLAY ile apply() yöntemini çağırana kadar şekilleyici eğri boyunca ilerlemez. Şekillendirici oluşturulduktan sonra, şekilleyiciyi başlatmak için ilk apply() çağrısının PLAY işlemini belirtmesi gerekir. Bu yöntem, eğriyi ilk denetim noktasından son kontrol noktasına doğru çalıştırır:

Kotlin

Shaper.apply(VolumeShaper.Transaction.PLAY)

Java

Shaper.apply(VolumeShaper.uygulamanızın.PLAY);

Şekillendirici çalışırken GERİ AL ve OYNATMA işlemlerini belirten alternatif apply() çağrıları yapabilirsiniz. Bu işlem, kontrol noktalarının okunma yönünü her defasında değiştirir.

Şekillendirici, sesi sürekli olarak ayarlar ve süresi dolana kadar tüm denetim noktalarından geçer. Bu durum, şekilleyici eğrideki son (OYNATMA işlemi için) veya ilk (TERS işlemi için) kontrol noktasına ulaştığında gerçekleşir.

Şekillendiricinin süresi dolduğunda ses düzeyi, ilk veya son denetim noktası olabilecek son ayarda kalır. Geçerli ses seviyesi için dilediğiniz zaman VolumeShaper.getVolume() numaralı telefonu arayabilirsiniz.

Şekillendiricinin süresi dolduktan sonra, eğriyi ters yönde çalıştırmak için başka bir apply() çağrısı yapabilirsiniz. Örneğin, şekilleyici PLAY çalıştırılırken süresi dolduysa sonraki apply() değeri REVERSE olmalıdır. PLAY sona erdikten sonra PLAY veya REVERSE sona erdikten sonra REVERSE aramasının herhangi bir etkisi olmaz.

PLAY ve REVERSE işlemlerini alternatif olarak kullanmanız gerekir. Bir eğriyi ilk denetim noktasından son denetim noktasına doğru oynatıp ardından ilk denetim noktasından tekrar başlatmak mümkün değildir. Eğriyi kendi kopyasıyla değiştirmek için sonraki bölümde açıklanan replace() yöntemini kullanabilirsiniz. Bu işlem, şekilleyiciyi sıfırlar ve tekrar başlatmak için PLAY işlemini gerektirir.

Eğriyi değiştirme

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

Kotlin

val newConfig = VolumeShaper.Configuration.Builder()
 .setDuration(1000)
 .setCurve(floatArrayOf(0f, 0.5f), floatArrayOf(0f, 1f))
 .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
 PLAY.create.Builder()
.setCurve(floatArrayOf(0f, 0.5f)),

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.build.build.INTERPO)

Şekillendirici çalışırken replace() çağrısı yaptığınızda ses seviyesini değiştirmeyi durdurur ve mevcut değerinde kalır. Ardından şekilleyici yeni eğriyi ilk kontrol noktasından başlatmaya çalışır. Bu, işlem bağımsız değişkeninin, şekilleyicinin çağrıdan sonra çalışıp çalışmayacağını kontrol edeceği anlamına gelir. Yeni eğriyi hemen başlatmak için PLAY değerini belirtin. Şekillendiricinin yeni eğrideki ilk denetim noktasının ses düzeyinde duraklatılmış olarak kalması için REVERSE değerini belirtin. Şekillendiriciyi daha sonra apply(VolumeShaper.Operation.PLAY) ile başlatabilirsiniz.

replace() öğesini join = false ile çağırdığınızda şekilleyici, eğrisini ilk kontrol noktası tarafından belirtilen düzeyde başlatır. Bu, hacimde kesintiye neden olabilir. join = true ile replace() numaralı telefonu arayarak bunu önleyebilirsiniz. Bu işlem, yeni eğrinin ilk denetim noktasını şekillendiricinin geçerli düzeyine ayarlar ve yeni eğrinin göreli şeklini korumak için birinci ve sonuncu arasındaki tüm kontrol noktalarının hacmini ölçeklendirir (son denetim noktası değiştirilmez). Ölçeklendirme işlemi, şekilleyicinin yeni eğrisindeki denetim noktalarını kalıcı olarak değiştirir.

VolumeShaper'ı kaldırma

AudioTrack veya MediaPlayer yayınlandığında ya da artık kullanılmadığında sistem kapanır ve bir VolumeShaper çöp toplama işlemi yapar. Şekillendiricide close() yöntemini çağırarak onu hemen yok edebilirsiniz. Sistem, yaklaşık 20 ms. içinde şekillendiriciyi ses hattından kaldırır. Ses çalarken VolumeShaper öğesini kapatırken dikkatli olun. close() çağrısı yaptığınızda şekilleyicinin hacmi 1,0'dan azsa şekilleyicinin ses ölçeği 1,0 olarak değişir. Bu, hacimde ani bir artışa neden olabilir.