การควบคุมแอมพลิจูดด้วย VolumeShaper

คุณใช้ VolumeShaper ในแอปเสียงเพื่อดำเนินการได้ เฟดอิน เฟดเอาต์ ครอสเฟด ลดเสียง และเวอร์ชันอัตโนมัติสั้นๆ อื่นๆ การเปลี่ยนแปลง คลาส VolumeShaper พร้อมใช้งานใน Android 8.0 (API ระดับ 26) และหลังจากนั้น

คุณสร้าง VolumeShaper โดยการเรียกใช้ createVolumeShaper() ในอินสแตนซ์ AudioTrack หรือ MediaPlayer VolumeShaper จะทำงานร่วมกับเสียงที่ AudioTrack หรือ MediaPlayer สร้างขึ้นเท่านั้น ที่สร้างมันขึ้นมา

VolumeShaper.Configuration

ลักษณะการทำงานของ VolumeShaper จะกำหนดโดย VolumeShaper.Configuration การกำหนดค่าจะระบุ *เส้นโค้งปริมาณ ประเภทตัวกำหนดช่วง และระยะเวลา*

เส้นโค้งปริมาณ

เส้นโค้งปริมาณแสดงถึงการเปลี่ยนแปลงของแอมพลิจูดเมื่อเวลาผ่านไป และกำหนดโดยคู่อุปกรณ์ ของอาร์เรย์จำนวนลอยตัว x[] และ y[] ที่กำหนดชุดของจุดควบคุม แต่ละรายการ (x, y) คู่หมายถึงเวลาและปริมาณตามลำดับ อาร์เรย์ต้องมีความยาวเท่ากัน และมีค่าอย่างน้อย 2 แต่ไม่เกิน 16 ค่า (ความยาวเส้นโค้งสูงสุดคือ มีคำจำกัดความใน getMaximumCurvePoints())

พิกัดเวลาจะอยู่ในช่วง [0.0, 1.0] ครั้งแรก จุดต้องเป็น 0.0 ค่าสุดท้ายต้องเป็น 1.0 และจำนวนครั้งต้องเป็นแบบเดี่ยว เพิ่มขึ้น

ระบุพิกัดปริมาตรเป็นสเกลเชิงเส้นในช่วง [0.0, 1.0]

ประเภทตัวแปลงสัญญาณ

เส้นโค้งระดับเสียงจะผ่านจุดควบคุมที่ระบุเสมอ ค่า ระหว่างจุดควบคุมที่ได้มาจากการหมุนตาม ประเภทตัวกำหนดช่วงของการกำหนดค่า มีค่าคงที่ 4 ค่า ประเภทตัวกำหนดอัตรา VolumeShaper ประเภท:

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

ระยะเวลา

พิกัดเวลาที่ระบุในช่วง [0.0, 1.0] ได้รับการปรับขนาดเป็น ระยะเวลาที่คุณระบุเป็นมิลลิวินาที ค่านี้ระบุความยาวจริงในรูปแบบ เวลาของเส้นโค้งปริมาตรเมื่อตัวควบคุมรูปร่างกำลังทำงานและใช้เส้นโค้ง เอาต์พุตเสียง

การใช้ VolumeShaper

กำลังสร้างการกำหนดค่า

คุณต้องสร้างอินสแตนซ์ของ VolumeShaper.Configuration ก่อนที่จะสร้าง VolumeShaper ดำเนินการนี้โดยใช้ 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})

เริ่มเล่นและ Shar พร้อมกัน วิธีนี้ช่วยให้มั่นใจว่าการเล่น จะเริ่มจากระดับเสียงเงียบและระดับเสียงจะเพิ่มระดับเสียงจนสุด ซึ่งอธิบายไว้ใน หัวข้อถัดไป

การเรียกใช้ VolumeShaper

แม้ว่าระดับเสียงของจุดควบคุมแรกจะมีผลกับเส้นทางเสียง ทันทีที่สร้างตัวควบคุมรูปร่าง เครื่องมือสร้างรูปร่างจะไม่คืบหน้าตามเส้นโค้ง จนกว่าคุณจะเรียกเมธอด apply() ด้วย VolumeShaper.Operation.PLAY หลัง การสร้างตัวควบคุมรูปแบบ การเรียกใช้ครั้งแรกของ apply() ต้องระบุ PLAY เพื่อเริ่มตัวควบคุมรูปร่าง ซึ่งเรียกใช้เส้นโค้งจากกราฟแรกถึง จุดควบคุมสุดท้าย:

Kotlin

Shar.apply(VolumeShaper.Operation.PLAY)

Java

Shar.apply(VolumeShaper.Operation.PLAY);

ขณะที่ Shaper กำลังทำงาน คุณสามารถออกการเรียก apply() สลับเพื่อระบุ การดำเนินการย้อนกลับและ PLAY การดำเนินการนี้จะเปลี่ยนทิศทางการอ่านออกของ จุดควบคุมได้ทุกครั้ง

ตัวควบคุมรูปร่างจะปรับระดับเสียงอย่างต่อเนื่องและผ่านจุดควบคุมทั้งหมด จนกว่าข้อเสนอจะหมดอายุ ซึ่งจะเกิดขึ้นเมื่อเครื่องมือรูปร่างถึงจุดสุดท้าย (สำหรับ PLAY ) หรือจุดควบคุมแรก (สำหรับการดำเนินการย้อนกลับ) ในเส้นโค้ง

เมื่อตัวควบคุมตัวกรองหมดอายุ ระดับเสียงจะยังคงอยู่ตามการตั้งค่าล่าสุด ซึ่งอาจเป็น จุดควบคุมแรกหรือจุดควบคุมสุดท้าย คุณสามารถโทรหา VolumeShaper.getVolume() เป็นเวลา ระดับเสียงในปัจจุบันได้ทุกเมื่อ

หลังจากตัวควบคุมรูปแบบหมดอายุ คุณสามารถเรียกใช้ apply() อีกครั้งเพื่อเรียกใช้เส้นโค้งได้ ในทิศทางตรงกันข้าม ตัวอย่างเช่น หากตัวควบคุมรูปร่างหมดอายุขณะวิ่ง PLAY apply() ถัดไปต้องเป็น REVERSE กำลังจะโทรหา PLAY หลังจาก PLAY มี หมดอายุ หรือ REVERSE หลังจาก REVERSE หมดอายุ จะไม่มีผล

คุณต้องเลือกวิธีดำเนินการ PLAY และ REVERSE แทน ไม่มีวิธีเล่น โค้งจากจุดควบคุมแรกจนถึงจุดควบคุมสุดท้าย แล้วเริ่มอีกครั้งจาก จุดควบคุมแรก คุณสามารถใช้เมธอด replace() ตามที่อธิบายไว้ใน เพื่อแทนที่เส้นโค้งด้วยสำเนาของตัวมันเอง ซึ่งจะเป็นการรีเซ็ตเครื่องมือรูปร่าง กำหนดให้มีการดำเนินการ PLAY เพื่อเริ่มต้นอีกครั้ง

การเปลี่ยนเส้นโค้ง

ใช้เมธอด replace() เพื่อเปลี่ยนเส้นโค้งของ VolumeShaper วิธีนี้ใช้เวลา การกำหนดค่า การดำเนินการ และพารามิเตอร์การรวม คุณสามารถเรียกใช้ replace() ได้ทุกเมื่อ ขณะที่ตัวควบคุมรูปร่างกำลังทำงานหรือหลังจากหมดอายุ:

Kotlin

val newConfig = VolumeShaper.Configuration.Builder()
        .setDuration(1,000)
        .setCurve(FloodArrayOf(0f, 0.5f), FloatArrayOf(0f, 1f))
        .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
        .build()
การเข้าร่วมแบบ Val = จริง
Shar.replace(newConfig, VolumeShaper.Operation.PLAY, เข้าร่วม)

Java

VolumeShaper.Configuration newConfig =
  VolumeShaper.Configuration.Builder() ใหม่
    .setDuration(1,000)
    .setCurve(new Float[] {0.f, 0.5f}, Float ใหม่[] {0.f, 1.f})
    .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
    .build();
boolean Join = true;

Shar.replace(newConfig, VolumeShaper.Operation.PLAY, เข้าร่วม);

เมื่อคุณเรียก replace() ขณะที่ตัวควบคุมรูปร่างกำลังทำงาน อุปกรณ์จะหยุดเปลี่ยน และยังคงอยู่ที่ค่าปัจจุบัน จากนั้นเครื่องมือรูปร่างจะพยายามเริ่มต้น เส้นโค้งจากจุดควบคุมแรก ซึ่งหมายความว่าอาร์กิวเมนต์การดำเนินการ จะควบคุมว่าเครื่องมือรูปร่างจะทำงานหลังจากการประชุมหรือไม่ ระบุ PLAY ถึง เริ่มต้นเส้นโค้งใหม่ทันที ระบุ REVERSE เพื่อออกจากตัวควบคุมรูปร่างหยุดชั่วคราวที่ ปริมาตรของจุดควบคุมแรกในเส้นโค้งใหม่ คุณเริ่มตัวควบคุมรูปร่างได้ ภายหลังด้วย apply(VolumeShaper.Operation.PLAY)

เมื่อเรียก replace() ด้วย join = false ตัวสร้างรูปร่างจะเริ่มเส้นโค้งที่ ระดับที่ระบุโดยจุดควบคุมแรก ซึ่งอาจทำให้เล่นได้ไม่ต่อเนื่อง ระดับเสียง คุณหลีกเลี่ยงปัญหานี้ได้โดยโทรหา replace() ด้วยหมายเลข join = true ค่านี้จะกำหนดจุดควบคุมแรกของเส้นโค้งใหม่เป็นระดับปัจจุบันของ Shaper และปรับขนาดระดับเสียงของจุดควบคุมทั้งหมดระหว่างจุดแรกและ สุดท้าย เพื่อรักษารูปร่างสัมพัทธ์ของเส้นโค้งใหม่ (จุดควบคุมสุดท้ายคือ (ไม่เปลี่ยนแปลง) การดำเนินการปรับขนาดจะเปลี่ยนจุดควบคุมอย่างถาวรใน เส้นโค้งใหม่ของเครื่องมือรูปร่าง

การนำ VolumeShaper ออก

ระบบจะปิดและขยะเก็บรวบรวม VolumeShaper เมื่อ AudioTrack หรือ MediaPlayer ได้รับการปล่อยแล้วหรือไม่ได้ใช้งานแล้ว คุณสามารถเรียกใช้เมธอด close() บนเชปเปอร์เพื่อทำลายในทันที ระบบจะนำตัวควบคุมออกจาก ไปป์ไลน์เสียงภายในเวลาประมาณ 20 มิลลิวินาที โปรดระมัดระวังเมื่อปิด VolumeShaper ขณะที่เสียงกำลังเล่น หากเครื่องมือสร้างมีระดับเสียงน้อยกว่า 1.0 เมื่อคุณเรียกใช้ close() ระดับเสียงของตัวควบคุมรูปแบบจะเปลี่ยนเป็น 1.0 ซึ่งอาจทำให้เหตุการณ์ ปริมาณที่เพิ่มขึ้น