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.