Sterowanie amplitudą za pomocą Volume shaper

Aby wykonać czynność, możesz użyć: VolumeShaper w aplikacji do odtwarzania dźwięku zanikania, zanikanie, przenikanie, wyciszanie i inne automatyczne woluminy przejścia. Klasa VolumeShaper jest dostępna w Androidzie 8.0 (poziom API 26) i później.

Tworzysz VolumeShaper, wywołując funkcję createVolumeShaper() w instancji AudioTrack lub MediaPlayer. VolumeShaper wykorzystuje wyłącznie dźwięk wygenerowany przez funkcję AudioTrack lub MediaPlayer który jest jego autorem.

VolumeSHA-Configurationr.

Działanie elementu VolumeShaper jest określone przez VolumeShaper.Configuration Konfiguracja określa parametr *krzywa głośności, typ interpolatora i czas trwania*.

Krzywa objętości

Krzywa objętości przedstawia zmianę amplitudy w czasie. Jest ona określana przez parę tablic zmiennoprzecinkowych, x[] i y[], które definiują serię punktów kontrolnych. Każda (x, y) reprezentuje odpowiednio czas i objętość. Tablice muszą mieć taką samą długość oraz zawierają od 2 do 16 wartości. (Maksymalna długość krzywej to zdefiniowane w zasadzie getMaximumCurvePoints()).

Współrzędne czasowe są podawane dla przedziału [0,0, 1,0]. Pierwszy raz punkt musi mieć wartość 0,0, ostatni musi mieć wartość 1,0, a czasy muszą być monotonicznie rośnie.

Współrzędne objętości są podawane za pomocą skali liniowej w danym przedziale czasu [0,0;1,0].

Typ interpolatora

Krzywa głośności zawsze przechodzi przez określone punkty sterujące. Wartości między punktami kontrolnymi są wysuwane przez krzywkę zgodnie z typu interpolatora konfiguracji. Dostępne są 4 stałe Typy interpolatora (VolumeShaper):

  • Kształtowanie woluminów.Konfiguracja.INTERPOLATOR_TYPE_STEP
  • Rozszerzenie woluminu.Konfiguracja.INTERPOLATOR_TYPE_LINEAR
  • Kształtowanie woluminów.Konfiguracja.INTERPOLATOR_TYPE_CUBIC
  • Kształtowanie woluminów.Konfiguracja.INTERPOLATOR_TYPE_CUBIC_MONOTONIC

Czas działania

Określone współrzędne czasowe z przedziału [0,0, 1,0] są skalowane do przez określony czas w milisekundach. Określa faktyczną długość w czas, gdy krzywa objętości jest uruchomiona, a krzywa jest stosowana do na wyjściu audio.

Korzystanie z narzędzia VolumeVolumer

Tworzenie konfiguracji

Przed utworzeniem 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 i szkicownik jednocześnie. Dzięki temu odtwarzanie zaczyna się od ciszy, a głośność narasta do pełnej głośności. Wyjaśnienie: przejdź do następnej sekcji.

Uruchamianie narzędzia VolumeVolumer

Mimo że poziom głośności pierwszego punktu kontrolnego jest stosowany do ścieżki audio po utworzeniu krzywej kształtera nie przesuwa się wzdłuż krzywej dopóki nie wywołasz metody apply() za pomocą VolumeShaper.Operation.PLAY. Po podczas tworzenia modelu kształtującego, pierwsze wywołanie funkcji apply() musi określać PLAY aby uruchomić modelowanie. Powoduje to uruchomienie krzywej od punktu początkowego do ostatnie punkty kontrolne:

Kotlin

kształtur.apply(Volume shaper.Operation.PLAY)

Java

kształtur.apply(Volume shaper.Operation.PLAY);

Gdy narzędzie do kształtu jest uruchomione, możesz wykonywać naprzemienne wywołania apply() określające ODTWARZANIE i ODTWARZANIE. Zmienia to kierunek odczytu punkty kontrolne za każdym razem.

Kształtarka stale reguluje głośność i przechodzi przez wszystkie punkty kontrolne aż wygasa. Dzieje się tak, gdy kształtująca dobiega końca (w przypadku PLAY lub pierwszym (w przypadku operacji ODWRÓĆ) punkt kontrolny na krzywej.

Po wygaśnięciu narzędzia kształtujące głośność pozostanie na ostatnim ustawieniu, które może być pierwszy lub ostatni punkt kontrolny. Możesz zadzwonić pod numer VolumeShaper.getVolume() za aktualnego poziomu głośności.

Po wygaśnięciu krzywej możesz uruchomić kolejne wywołanie apply(), aby uruchomić krzywą w przeciwnym kierunku. Na przykład jeśli kształter wygasł w trakcie działania PLAY, następny apply() musi mieć wartość REVERSE. Dzwonię pod PLAY po PLAY wygasła lub REVERSE po upływie REVERSE nie ma skutku.

Musisz naprzemienne operacje PLAY i REVERSE. Nie ma możliwości odtworzenia od pierwszego do ostatniego punktu kontrolnego, a następnie ponownie ją uruchom pierwszego punktu kontrolnego. Możesz użyć metody replace() opisanej w następnej sekcji aby zastąpić krzywą swoją kopią. Resetuje kształt, wymaga wykonania operacji PLAY do ponownego uruchomienia.

Zmiana krzywej

Aby zmienić krzywą VolumeShaper, użyj metody replace(). Ta metoda wymaga konfiguracji, operacji i parametru złączenia. Możesz wywołać funkcję replace() w dowolnym momencie, gdy narzędzie kształtujące jest uruchomione lub po jego wygaśnięciu:

Kotlin

wartość newConfig = Volume shaper.Configuration.Builder()
        .setDuration(1000)
        .setCurve(floattablicaOf(0f; 0.5f); floattablicaOf(0f; 1f))
        .setInterpolatorType(VolumeStatusr.Configuration.INTERPOLATOR_TYPE_LINEAR)
        .build()
złączenie wartości = prawda
kształtr.replace(newConfig, Volume shaper.Operation.PLAY, Join)

Java

Volume Conditionr.Configuration newConfig =
  nowy model VolumeVolumer.Configuration.Builder()
    .setDuration(1000)
    .setCurve(new float[] {0.f, 0.5f}, nowa liczba zmiennoprzecinkowa[] {0.f, 1.f})
    .setInterpolatorType(VolumeStatusr.Configuration.INTERPOLATOR_TYPE_LINEAR)
    .build();
boolean Join = true;
kształtr.replace(newConfig, Volume shaper.Operation.PLAY, Join);

Gdy wywołasz funkcję replace(), gdy narzędzie do kształtowania zostanie uruchomione, przestaje zmieniać przy obecnej wartości. Następnie maszyna do kształtowania spróbuje uruchomić nowy, od pierwszego punktu kontrolnego. Oznacza to, że argument operacji decyduje o tym, czy narzędzie kształtujące ma działać po zakończeniu rozmowy. Podaj wartość PLAY do natychmiast rozpocznij nową krzywą, wpisz REVERSE, aby kształtować kontrolkę wstrzymaną na objętość pierwszego punktu kontrolnego na nowej krzywej. Możesz włączyć modelowanie później w apply(VolumeShaper.Operation.PLAY).

Gdy wywołasz funkcję replace() za pomocą funkcji join = false, krzywa kształtująca się od momentu do poziomu określonego przez jego pierwszy punkt kontrolny. Może to powodować brak ciągłości w głośności. Możesz tego uniknąć, dzwoniąc do firmy replace() pod numer join = true. Pierwszy punkt kontrolny nowej krzywej zostanie ustawiony na bieżący poziom krzywej kształtowania i skaluje głośność wszystkich punktów kontrolnych między pierwszym aby zachować względny kształt nowej krzywej (ostatni punkt kontrolny to bez zmian). Operacja skalowania trwale zmienia punkty kontrolne w nowej krzywej kształtującego.

Usuwanie obiektu VolumeVolumer

System zostanie zamknięty, a klasa VolumeShaper odbędzie się w ramach czyszczenia pamięci, gdy jej stan: AudioTrack lub Usługa MediaPlayer została wycofana lub nie jest już używana. Możesz wywołać metodę close() na szpilce, aby natychmiast ją zniszczyć. System usuwa szlifierkę z potok audio w ciągu około 20 ms. Zachowaj ostrożność, zamykając VolumeShaper podczas odtwarzania dźwięku. Jeśli kształter ma głośność niższą niż 1,0 podczas połączenia close(), skala głośności narzędzia do kształtowania zmieni się na 1,0. Może to spowodować nagłe głośniej.