ผู้ให้บริการสามารถใช้ฟีเจอร์หลัก 2 อย่างเพื่อลดเวลาในการตอบสนองของเสียงได้ ดังนี้
- FAST Mixer ใน AudioFlinger: ฟีเจอร์นี้เปิดตัวใน Android 4.1 และรองรับ แอปที่ใช้ Java AudioTrack และ AAudio FAST Mixer มีการเปลี่ยนแปลง API ไคลเอ็นต์สาธารณะหรือ HAL API น้อยที่สุด
- MMAP ของ AAudio: ฟีเจอร์นี้เปิดตัวใน Android 8.1 และช่วยให้แอปดั้งเดิมมีเวลาในการตอบสนองที่ต่ำยิ่งขึ้นผ่าน AAudio ดูข้อมูลเพิ่มเติมได้ที่ AAudio และ MMAP
หน้านี้อธิบายการออกแบบเวลาในการตอบสนองของเสียงในระยะแรก ซึ่งมีการพัฒนาอย่างต่อเนื่องเมื่อเวลาผ่านไป การทำความเข้าใจการออกแบบนี้อย่างถ่องแท้เป็นสิ่งสำคัญสำหรับ OEM ของอุปกรณ์และผู้ให้บริการ SoC เพื่อให้มั่นใจว่ามีการติดตั้งใช้งานอย่างถูกต้องในอุปกรณ์และชิปเซ็ตที่เฉพาะเจาะจง หน้านี้ไม่ได้มีไว้สำหรับนักพัฒนาแอป
การสร้างแทร็ก
ไคลเอ็นต์สามารถตั้งค่าบิต AUDIO_OUTPUT_FLAG_FAST
ในพารามิเตอร์
audio_output_flags_t
ของตัวสร้าง AudioTrack C++ หรือ
AudioTrack::set()
ได้ ปัจจุบันมีเพียงไคลเอ็นต์ต่อไปนี้เท่านั้นที่ทำเช่นนั้น
- เสียงดั้งเดิมของ Android ที่อิงตาม OpenSL ES หรือ AAudio
android.media.SoundPool
android.media.ToneGenerator
การติดตั้งใช้งาน AudioTrack C++ จะตรวจสอบAUDIO_OUTPUT_FLAG_FAST
คำขอและอาจปฏิเสธคำขอที่ระดับไคลเอ็นต์ได้ หากตัดสินใจส่งต่อคำขอ ก็จะดำเนินการโดยใช้บิต TRACK_FAST
ของพารามิเตอร์ track_flags_t
ของเมธอด IAudioTrack
Factory
IAudioFlinger::createTrack()
เซิร์ฟเวอร์เสียง AudioFlinger จะตรวจสอบTRACK_FAST
คำขอและอาจปฏิเสธคำขอที่ระดับเซิร์ฟเวอร์ (ไม่บังคับ)
โดยจะแจ้งให้ไคลเอ็นต์ทราบ
ว่ายอมรับคำขอหรือไม่ผ่านบิต CBLK_FAST
ของ
บล็อกควบคุมหน่วยความจำที่ใช้ร่วมกัน
ปัจจัยที่มีผลต่อการตัดสินใจ ได้แก่
- มีเธรดมิกเซอร์ด่วนสำหรับเอาต์พุตนี้ (ดูด้านล่าง)
- อัตราการสุ่มตัวอย่างของแทร็ก
- มีเธรดไคลเอ็นต์เพื่อเรียกใช้ตัวแฮนเดิลการเรียกกลับสำหรับแทร็กนี้
- ขนาดบัฟเฟอร์ของแทร็ก
- สล็อต Fast Track ที่พร้อมให้บริการ (ดูด้านล่าง)
หากคำขอของลูกค้าได้รับการยอมรับ เราจะเรียกว่าการติดตามอย่างรวดเร็ว ไม่เช่นนั้นจะเรียกว่าแทร็กปกติ
ชุดข้อความของ Mixer
เมื่อ AudioFlinger สร้างเธรดมิกเซอร์ปกติ ระบบจะตัดสินใจ ว่าจะสร้างเธรดมิกเซอร์แบบเร็วด้วยหรือไม่ ทั้งมิกเซอร์ปกติและมิกเซอร์แบบเร็วไม่ได้เชื่อมโยงกับแทร็กใดแทร็กหนึ่ง แต่เชื่อมโยงกับชุดแทร็ก โดยจะมีมิกเซอร์ปกติ เสมอ เธรดมิกเซอร์แบบเร็ว หากมี จะอยู่ภายใต้เธรดมิกเซอร์ปกติและทำงานภายใต้การควบคุมของเธรดมิกเซอร์ปกติ
Fast Mixer
ฟีเจอร์
เธรดมิกเซอร์แบบรวดเร็วมีฟีเจอร์ดังนี้
- การมิกซ์เสียงย่อยของมิกเซอร์ปกติและแทร็กด่วนของไคลเอ็นต์สูงสุด 7 แทร็ก
- การลดทอนต่อแทร็ก
ฟีเจอร์ที่ไม่มี
- การแปลงอัตราการสุ่มตัวอย่างต่อแทร็ก
- เอฟเฟกต์ต่อแทร็ก
- เอฟเฟกต์ต่อมิกซ์
จุด
มิกเซอร์แบบเร็วจะทำงานเป็นระยะๆ โดยมีระยะเวลาที่แนะนำคือ 2-3 มิลลิวินาที หรืออาจใช้ระยะเวลาที่สูงขึ้นเล็กน้อยที่ 5 มิลลิวินาทีหากจำเป็นต่อการจัดเวลาให้เสถียร เราเลือกตัวเลขนี้เพื่อให้เวลาแฝงทั้งหมดอยู่ในลำดับที่ 10 มิลลิวินาทีเมื่อพิจารณาถึงไปป์ไลน์บัฟเฟอร์ที่สมบูรณ์ ค่าที่น้อยกว่านี้ก็เป็นไปได้ แต่อาจส่งผลให้การใช้พลังงานเพิ่มขึ้น และมีโอกาสเกิดข้อบกพร่องมากขึ้น ทั้งนี้ขึ้นอยู่กับการคาดการณ์การจัดกำหนดการ CPU ค่าที่มากกว่านี้ก็เป็นไปได้ สูงสุด 20 มิลลิวินาที แต่จะส่งผลให้เวลาในการตอบสนองทั้งหมดลดลง จึงควรหลีกเลี่ยง
การตั้งเวลา
มิกเซอร์แบบเร็วจะทำงานที่SCHED_FIFO
ลำดับความสำคัญที่สูงขึ้น โดยใช้เวลา CPU น้อยมาก แต่ต้องทำงานบ่อยๆ และมีการสั่นไหวในการจัดกำหนดการต่ำ
ความผันผวน
แสดงถึงความแปรปรวนของเวลาวงจร ซึ่งเป็นความแตกต่างระหว่าง
เวลาวงจรจริงกับเวลาวงจรที่คาดไว้
การเล่นช้าเกินไปจะทำให้เกิดข้อบกพร่องเนื่องจากข้อมูลไม่เพียงพอ การวิ่งเร็วเกินไป
จะทำให้เกิดข้อบกพร่องเนื่องจากการดึงข้อมูลจากแทร็กที่เร็ว
ก่อนที่แทร็กจะให้ข้อมูล
จะมีการบล็อก
โดยปกติแล้ว เธรดมิกเซอร์แบบเร็วจะไม่บล็อก ยกเว้นที่ HAL
write()
การบล็อกอื่นๆ ที่เกิดขึ้นภายในมิกเซอร์ด่วนถือเป็นข้อบกพร่อง
โดยเฉพาะอย่างยิ่งจะหลีกเลี่ยงการใช้ Mutex
แต่จะใช้อัลกอริทึมที่ไม่บล็อก
(หรือที่เรียกว่าอัลกอริทึมแบบไม่ต้องล็อก) แทน
ดูข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อนี้ได้ที่หลีกเลี่ยงการกลับลำดับความสำคัญ
ความสัมพันธ์กับคอมโพเนนต์อื่นๆ
โดยมิกเซอร์แบบรวดเร็วจะมีการโต้ตอบกับลูกค้าโดยตรงน้อยมาก โดยเฉพาะอย่างยิ่ง ไม่เห็นการดำเนินการระดับ Binder แต่จะเข้าถึงบล็อกควบคุมหน่วยความจำที่แชร์ของไคลเอ็นต์
มิกเซอร์ด่วนจะรับคำสั่งจากมิกเซอร์ปกติผ่านคิวสถานะ
นอกเหนือจากการดึงข้อมูลแทร็กแล้ว การโต้ตอบกับไคลเอ็นต์จะผ่านมิกเซอร์ปกติ
ซิงก์หลักของ Fast Mixer คือ HAL เสียง
มิกเซอร์ปกติ
ฟีเจอร์
เปิดใช้ฟีเจอร์ทั้งหมดแล้ว
- สูงสุด 32 แทร็ก
- การลดทอนต่อแทร็ก
- การแปลงอัตราการสุ่มตัวอย่างต่อแทร็ก
- การประมวลผลเอฟเฟกต์
จุด
โดยระยะเวลาจะคำนวณเป็นจำนวนเท่าแรกของ ระยะเวลาของมิกเซอร์แบบเร็วที่ >= 20 มิลลิวินาที
การตั้งเวลา
มิกเซอร์ปกติจะทำงานที่SCHED_OTHER
ลำดับความสำคัญที่สูงขึ้น
จะมีการบล็อก
มิกเซอร์ปกติได้รับอนุญาตให้บล็อก และมักจะบล็อกที่ Mutexes ต่างๆ รวมถึงที่ไปป์บล็อกเพื่อเขียนมิกซ์ย่อย
ความสัมพันธ์กับคอมโพเนนต์อื่นๆ
มิกเซอร์ปกติจะโต้ตอบกับโลกภายนอกอย่างกว้างขวาง รวมถึงเธรด Binder, Audio Policy Manager, เธรด Fast Mixer และแทร็กไคลเอ็นต์
โดยปกติแล้ว Sink ของมิกเซอร์ปกติจะเป็นท่อที่บล็อกแทร็ก 0 ของมิกเซอร์ที่รวดเร็ว
ธง
AUDIO_OUTPUT_FLAG_FAST
บิตคือคำใบ้ เราไม่รับประกันว่า
คำขอจะได้รับการดำเนินการ
AUDIO_OUTPUT_FLAG_FAST
เป็นแนวคิดระดับลูกค้า โดยจะไม่ปรากฏในเซิร์ฟเวอร์
TRACK_FAST
เป็นแนวคิดไคลเอ็นต์ -> เซิร์ฟเวอร์