Điều khiển độ lớn bằng VolumeShaper

Bạn có thể dùng VolumeShaper trong ứng dụng âm thanh để biểu diễn hiệu ứng rõ dần, mờ dần, làm mờ dần, giảm độ sáng và các âm lượng tự động ngắn khác chuyển đổi. Lớp VolumeShaper có trong Android 8.0 (API cấp 26) và sau đó.

Bạn tạo VolumeShaper bằng cách gọi createVolumeShaper() trên một thực thể của AudioTrack hoặc MediaPlayer. Chiến lược phát hành đĩa đơn VolumeShaper chỉ hoạt động đối với âm thanh do AudioTrack hoặc MediaPlayer tạo ra đã tạo ra nó.

Cấu hình VolumeShaper.

Hành vi của VolumeShaper được xác định bằng VolumeShaper.Configuration Cấu hình chỉ định một *đường cong thể tích, loại bộ nội suy thời lượng.*

Đường cong thể tích

Đường cong thể tích biểu thị sự thay đổi biên độ theo thời gian. Mật khẩu này được xác định theo một cặp gồm các mảng dấu phẩy động, x[] và y[] xác định một loạt các điểm điều khiển. Mỗi (x, y) cặp đại diện cho thời gian và thể tích tương ứng. Các mảng phải có độ dài bằng nhau và chứa ít nhất 2 và không quá 16 giá trị. (Độ dài tối đa của đường cong là được xác định trong getMaximumCurvePoints().)

Các toạ độ thời gian được cho trong khoảng [0,0, 1,0]. Lần đầu tiên điểm phải là 0.0, điểm cuối cùng phải là 1.0 và thời gian phải là đơn điệu tăng lên.

Toạ độ thể tích được chỉ định theo thang đo tuyến tính trong khoảng [0,0, 1,0].

Loại bộ nội suy

Đường cong âm lượng luôn đi qua các điểm điều khiển được chỉ định. Giá trị giữa các điểm điều khiển được lấy từ một đường spline theo loại bộ nội suy của cấu hình. Có bốn hằng số cho giá trị VolumeShaper loại bộ nội suy:

  • VolumeShaper.Configuration.INTERPOLATOR_TYPE_STEP
  • VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR
  • VolumeShaper.Configuration.INTERPOLATOR_TYPE_CUBIC
  • VolumeShaper.Configuration.INTERPOLATOR_TYPE_CUBIC_MONOTONIC

Thời lượng

Các toạ độ thời gian được chỉ định trong khoảng [0.0, 1.0] được chia tỷ lệ theo tỷ lệ mà bạn chỉ định bằng mili giây. Điều này xác định thời lượng thực tế theo thời gian của đường cong thể tích khi bộ tạo hình đang chạy và áp dụng đường cong cho đầu ra âm thanh.

Sử dụng VolumeShaper

Tạo cấu hình

Trước khi tạo VolumeShaper, bạn phải tạo một thực thể của VolumeShaper.Configuration. Thực hiện việc này bằng cách sử dụng 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})

Bắt đầu phát và trình tạo hình cùng một lúc. Điều này đảm bảo rằng việc phát lại bắt đầu từ khoảng lặng và âm lượng tăng lên mức âm lượng tối đa. Điều này được giải thích trong phần tiếp theo.

Chạy VolumeShaper

Mặc dù mức âm lượng của điểm điều khiển đầu tiên được áp dụng cho đường dẫn âm thanh ngay sau khi tạo hình, trình tạo hình sẽ không di chuyển dọc theo đường cong cho đến khi bạn gọi phương thức apply() bằng VolumeShaper.Operation.PLAY. Sau khi tạo trình tạo hình dạng, lệnh gọi đầu tiên của apply() phải chỉ định PLAY để khởi động trình tạo hình. Công cụ này chạy đường cong từ điểm đầu tiên đến điểm điều khiển cuối cùng:

Kotlin

shaper.apply(VolumeShaper.Operation.PLAY)

Java

shaper.apply(volumeShaper.Operation.PLAY);

Trong khi trình tạo hình đang chạy, bạn có thể thực hiện lệnh gọi apply() xen kẽ, chỉ định Thao tác NGỪNG và PHÁT. Thao tác này sẽ thay đổi hướng đọc to của điểm điều khiển.

Công cụ tạo hình liên tục điều chỉnh âm lượng và đi qua tất cả các điểm điều khiển cho đến khi ưu đãi hết hạn. Điều này xảy ra khi trình tạo hình đạt đến cuối cùng (đối với PLAY vận hành) hoặc điểm điều khiển đầu tiên (đối với thao tác từ bỏ) trên đường cong.

Khi trình tạo hình hết hạn, âm lượng vẫn ở mức cài đặt gần đây nhất, có thể là điểm điều khiển đầu tiên hoặc điểm điều khiển cuối cùng. Bạn có thể gọi VolumeShaper.getVolume() cho mức âm lượng hiện tại bất cứ lúc nào.

Sau khi trình tạo hình hết hạn, bạn có thể thực hiện một lệnh gọi apply() khác để chạy đường cong theo hướng ngược lại. Ví dụ: nếu trình tạo hình hết hạn trong khi đang chạy PLAY, apply() tiếp theo phải là REVERSE. Gọi PLAY sau khi PLAY có đã hết hạn hoặc REVERSE sau khi REVERSE đã hết hạn không có hiệu lực.

Bạn phải thay thế các toán tử PLAYREVERSE. Không có cách nào để phát từ điểm điều khiển đầu tiên đến điểm điều khiển cuối cùng rồi khởi động lại từ điểm điểm điều khiển đầu tiên. Bạn có thể sử dụng phương thức replace(), được mô tả trong phần tiếp theo để thay thế đường cong bằng bản sao của chính đường cong đó. Thao tác này sẽ đặt lại trình tạo hình, yêu cầu thao tác PLAY để khởi động lại.

Thay đổi đường cong

Sử dụng phương thức replace() để thay đổi đường cong của VolumeShaper. Phương thức này sử dụng cấu hình, thao tác và tham số kết hợp. Bạn có thể gọi replace() bất cứ lúc nào, trong khi trình tạo hình đang chạy hoặc sau khi hết hạn:

Kotlin

val newConfig = VolumeShaper.Configuration.Builder()
        .setDuration(1000)
        .setCurve(floatArrayOf(0f, 0,5f), floatArrayOf(0f, 1f))
        .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
        Hàm .build()
kết hợp val = true
shaper.thay thế(newConfig; VolumeShaper.Operation.PLAY, kết hợp)

Java

VolumeShaper.Configuration newConfig =
  VolumeShaper.Configuration.Builder() mới
    .setDuration(1000)
    .setCurve(new float[] {0.f, 0.5f}, new float[] {0.f, 1.f})
    .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
    .build();
boolean kết hợp = đúng;
shaper.thay thế(newConfig, VolumeShaper.Operation.PLAY, kết hợp);

Khi bạn gọi replace() trong khi trình tạo hình đang chạy, trình tạo này sẽ ngừng thay đổi âm lượng và giữ nguyên giá trị hiện tại. Sau đó, trình tạo hình cố gắng bắt đầu phiên bản mới từ điểm điều khiển đầu tiên. Điều này có nghĩa là đối số của toán tử kiểm soát việc trình tạo hình có chạy sau lệnh gọi hay không. Chỉ định PLAY để ngay lập tức bắt đầu đường cong mới, chỉ định REVERSE để tạm dừng trình tạo hình tại thể tích của điểm điều khiển đầu tiên trong đường cong mới. Bạn có thể khởi động trình tạo hình sau này với apply(VolumeShaper.Operation.PLAY).

Khi bạn gọi replace() bằng join = false, trình tạo hình sẽ bắt đầu đường cong tại cấp độ do điểm điều khiển đầu tiên chỉ định. Điều này có thể gây gián đoạn trong phần âm lượng. Bạn có thể tránh điều này bằng cách gọi replace() bằng join = true. Thao tác này sẽ đặt điểm điều khiển đầu tiên của đường cong mới thành mức hiện tại của trình định hình và chia tỷ lệ thể tích của tất cả các điểm điều khiển giữa để duy trì hình dạng tương đối của đường cong mới (điểm điều khiển cuối cùng là không thay đổi). Thao tác điều chỉnh tỷ lệ sẽ thay đổi vĩnh viễn các điểm điều khiển trong đường cong mới của người tạo hình.

Xoá VolumeShaper

Hệ thống đóng lại và rác sẽ thu thập VolumeShaper khi hệ thống AudioTrack hoặc MediaPlayer đã được phát hành hoặc không còn được sử dụng. Bạn có thể gọi phương thức close() vào một chiếc máy quét để phá huỷ nó ngay lập tức. Hệ thống sẽ xoá bộ tạo hình khỏi đường dẫn âm thanh trong khoảng 20 mili giây. Hãy cẩn thận khi đóng VolumeShaper trong khi âm thanh đang phát. Nếu trình tạo hình có âm lượng nhỏ hơn 1,0 khi bạn gọi close(), tỷ lệ âm lượng của trình tạo hình sẽ thay đổi thành 1.0. Điều này có thể khiến sự cố số lượng.