Możesz użyć VolumeShaper
w aplikacji audio, aby stosować wyciszanie, zanikanie, przenikanie, wyciszanie i inne krótkie automatyczne przełączanie głośności. Klasa VolumeShaper
jest dostępna na urządzeniach z Androidem 8.0 (poziom interfejsu API 26) i nowszymi wersjami.
VolumeShaper
możesz utworzyć, wywołując createVolumeShaper()
w instancji AudioTrack
lub MediaPlayer
. Element VolumeShaper
wykorzystuje tylko ścieżkę dźwiękową wyprodukowaną przez ścieżkę audio lub odtwarzacz MediaPlayer, który ją utworzył.
Konfiguracja woluminu
Działanie obiektu VolumeShaper
jest definiowane przez jego VolumeShaper.Configuration
. Konfiguracja określa: *krzywą głośności, typ interpolatora oraz czas trwania*.
Krzywa głośności
Krzywa głośności przedstawia zmianę amplitudy na przestrzeni czasu. Jest ona definiowana przez parę tablic zmiennoprzecinkowych: x[] i y[], które definiują serię punktów kontrolnych. Każda para (x, y)
reprezentuje odpowiednio czas i objętość. Tablice muszą mieć równą długość i zawierać od 2 do 16 wartości. Maksymalna długość krzywej jest określona w getMaximumCurvePoints()
.
Współrzędne czasowe są podane dla przedziału [0,0; 1,0]. Pierwszy punkt czasowy musi mieć wartość 0,0, ostatni – 1,0, a czasy muszą rosnąć monotonicznie.
Współrzędne woluminu są określone w skali liniowej na przestrzeni czasu [0,0; 1,0].
Typ interpolatora
Krzywa głośności zawsze przechodzi przez określone punkty kontrolne. Wartości między punktami kontrolnymi są dzielone za pomocą krzywej zgodnie z typem interpolatora konfiguracji. W przypadku dostępnych typów interpolatora VolumeShaper
dostępne są 4 stałe:
- Narzędzie do kształtowania woluminu.Konfiguracja.INTERPOLATOR_TYPE_STEP
- Narzędzie do kształtowania woluminu.Konfiguracja.INTERPOLATOR_TYPE_LINEAR
- Narzędzie do kształtowania woluminu.Konfiguracja.INTERPOLATOR_TYPE_CUBIC
- Kształt woluminu.Konfiguracja.INTERPOLATOR_TYPE_CUBIC_MONOTONIC
Czas działania
Podane współrzędne czasu w przedziale [0,0, 1,0] są skalowane do czasu określonego w milisekundach. Określa faktyczną długość krzywej głośności w czasie, gdy działa narzędzie do kształtu i stosuje krzywą do wyjścia audio.
Korzystanie z narzędzia Volume shaper
Tworzenie konfiguracji
Przed skompilowaniem obiektu VolumeShaper
musisz utworzyć instancję VolumeShaper.Configuration
. Zrób to za pomocą 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})
Rozpocznij odtwarzanie jednocześnie z kształtem. Dzięki temu odtwarzanie rozpocznie się od wyciszenia, a głośność zostanie dostosowana do maksymalnej głośności. Zostało to wyjaśnione w następnej sekcji.
Uruchamianie narzędzia Volume kształtu
Choć poziom głośności pierwszego punktu kontrolnego jest stosowany do ścieżki audio zaraz po utworzeniu narzędzia do kształtowania, narzędzie to nie porusza się po krzywej, dopóki nie wywołasz metody apply()
za pomocą funkcji VolumeShaper.Operation.PLAY
. Po utworzeniu kształtu pierwsze wywołanie metody apply()
musi określać operację PLAY
, aby ją uruchomić. Przebiega to krzywą od pierwszego do ostatniego punktu kontrolnego:
Kotlin
shaper.apply(Volume shaper.Operation.PLAY)
Java
shaper.apply(Volume shaper.Operation.PLAY);
Podczas działania kształtu możesz wysyłać naprzemienne wywołania apply()
, określając operacje REVERSE i PLAY. Zmienia to za każdym razem kierunek odczytu punktów kontrolnych.
Narzędzie do kształtowania stale reguluje głośność i przechodzi przez wszystkie punkty kontrolne aż do wygaszenia. Dzieje się tak, gdy kształtator dotrze do ostatniego (w przypadku operacji odtwarzania) lub pierwszego (w przypadku operacji cofania) punktu kontrolnego na krzywej.
Gdy model straci ważność, głośność pozostaje na ostatnim ustawieniu, które może być pierwszym lub ostatnim punktem kontrolnym. W każdej chwili możesz zadzwonić pod numer VolumeShaper.getVolume()
, aby sprawdzić bieżący poziom głośności.
Gdy kształt straci ważność, możesz wykonać kolejne wywołanie apply()
, aby uruchomić krzywą w przeciwnym kierunku. Jeśli np. narzędzie do kształtującego wygasło podczas uruchamiania funkcji PLAY
, następna wartość apply()
musi mieć wartość REVERSE
. Wywołanie PLAY
po wygaśnięciu PLAY
lub REVERSE
po wygaśnięciu REVERSE
nie daje żadnego efektu.
Musisz wykonać alternatywne operacje PLAY
i REVERSE
. Nie można odtworzyć krzywej od pierwszego do ostatniego punktu kontrolnego, a następnie ponownie uruchomić ją od pierwszego punktu kontrolnego. Aby zastąpić krzywą swoją kopią, możesz użyć metody replace()
opisanej w następnej sekcji. Resetuje narzędzie do kształtowania, które wymaga ponownego uruchomienia operacji PLAY
.
Zmiana krzywej
Aby zmienić krzywą VolumeShaper
, użyj metody replace()
. Ta metoda wymaga konfiguracji, operacji i parametru łączenia. Metodę replace()
możesz wywołać w dowolnym momencie, gdy działa kształt lub po jego wygaśnięciu:
Kotlin
Wartość newConfig = Volume shaper.Configuration.Builder() .setDuration(1000) .setCurve(floatArrayOf(0f, 0.5f), floatArrayOf(0f, 1f)) .setInterpolatorType(Volume shaper.Configuration.INTERPOLATOR_TYPE_LINEAR) .build() pervalcall.
Java
VolumePattern
Gdy wywołujesz replace()
, gdy działa narzędzie, zatrzymuje się zmiana głośności i pozostaje przy swojej obecnej wartości. Następnie kształtuje nową krzywą
od pierwszego punktu kontrolnego. Oznacza to, że argument operacji określa, czy narzędzie kształtujące ma działać po wywołaniu. Wpisz PLAY
, aby natychmiast rozpocząć nową krzywą, lub REVERSE
, aby pozostawić narzędzie do kształtowania wstrzymane przy głośności pierwszego punktu kontrolnego w nowej krzywej. Kształt można zacząć
później, używając apply(VolumeShaper.Operation.PLAY)
.
Gdy wywołasz funkcję replace()
z funkcją join = false
, narzędzie do kształtowania rozpoczyna swoją krzywą na poziomie określonym przez swój pierwszy punkt kontrolny. Może to spowodować
nieciągłość objętości. Możesz tego uniknąć, dzwoniąc pod numer replace()
w firmie join = true
.
Powoduje to ustawienie pierwszego punktu kontrolnego nowej krzywej na bieżący poziom kształtu i skalowanie głośności wszystkich punktów kontrolnych między pierwszym a ostatnim, aby zachować względny kształt nowej krzywej (ostatni punkt kontrolny pozostaje bez zmian). Operacja skalowania trwale zmienia punkty kontrolne w nowej krzywej shapera.
Usuwanie modułu Volume shape
System zamyka się i czyszczące zbiera dane VolumeShaper
, gdy AudioTrack
lub MediaPlayer
zostanie zwolniony lub nie będzie już używany. Możesz wywołać metodę close()
w kształtującym, aby ją natychmiast zniszczyć. System usuwa narzędzie do kształtowania z oprogramowania audio w ciągu około 20 ms. Zachowaj ostrożność podczas zamykania VolumeShaper
podczas odtwarzania dźwięku. Jeśli po wywołaniu funkcji close()
funkcja kształtu ma głośność mniejszą niż 1,0 jego skala zmienia się na 1,0. Może to spowodować nagłe
zwiększenie głośności.