Sterowanie amplitudą za pomocą Volume shaper

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.