การออกแบบเพื่อลดเวลาแฝง

การเปิดตัว Android 4.1 นำเสนอการเปลี่ยนแปลงเฟรมเวิร์กภายในสำหรับเส้นทางเอาต์พุตเสียง ที่มีเวลาแฝงต่ำลง มีการเปลี่ยนแปลง API ไคลเอ็นต์สาธารณะหรือ HAL API เพียงเล็กน้อย เอกสารนี้อธิบายการออกแบบเบื้องต้นซึ่งมีการพัฒนาอย่างต่อเนื่องเมื่อเวลาผ่านไป การมีความเข้าใจที่ดีเกี่ยวกับการออกแบบนี้ควรช่วยให้ผู้จำหน่ายอุปกรณ์ OEM และ SoC นำการออกแบบไปใช้ได้อย่างถูกต้องบนอุปกรณ์และชิปเซ็ตเฉพาะของตน บทความนี้ไม่ได้มีไว้สำหรับนักพัฒนาแอปพลิเคชัน

ติดตามการสร้าง

ไคลเอ็นต์สามารถเลือกตั้งค่าบิต AUDIO_OUTPUT_FLAG_FAST ในพารามิเตอร์ audio_output_flags_t ของตัวสร้าง AudioTrack C++ หรือ AudioTrack::set() ได้ ปัจจุบันลูกค้าเพียงรายเดียวที่ทำเช่นนั้นคือ:

การใช้งาน AudioTrack C++ จะตรวจสอบคำขอ AUDIO_OUTPUT_FLAG_FAST และอาจปฏิเสธคำขอในระดับไคลเอ็นต์ก็ได้ หากตัดสินใจส่งคำขอ ก็จะดำเนินการดังกล่าวโดยใช้บิต TRACK_FAST ของพารามิเตอร์ track_flags_t ของวิธีการจากโรงงาน IAudioTrack IAudioFlinger::createTrack()

เซิร์ฟเวอร์เสียง AudioFlinger ตรวจสอบคำขอ TRACK_FAST และอาจปฏิเสธคำขอในระดับเซิร์ฟเวอร์หรือไม่ก็ได้ โดยแจ้งให้ไคลเอ็นต์ทราบว่าคำขอได้รับการยอมรับหรือไม่ ผ่านบิต CBLK_FAST ของบล็อกควบคุมหน่วยความจำแบบแบ่งใช้

ปัจจัยที่ส่งผลต่อการตัดสินใจ ได้แก่ :

  • การมีอยู่ของเธรดมิกเซอร์ที่รวดเร็วสำหรับเอาต์พุตนี้ (ดูด้านล่าง)
  • ติดตามอัตราตัวอย่าง
  • การแสดงตนของเธรดไคลเอ็นต์เพื่อดำเนินการจัดการการเรียกกลับสำหรับแทร็กนี้
  • ติดตามขนาดบัฟเฟอร์
  • ช่องด่วนที่มีให้บริการ (ดูด้านล่าง)

หากคำขอของลูกค้าได้รับการยอมรับ จะเรียกว่า "ช่องทางด่วน" มิฉะนั้นจะเรียกว่า "แทร็กปกติ"

ด้ายมิกเซอร์

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

มิกเซอร์ที่รวดเร็ว

คุณสมบัติ

เธรดมิกเซอร์ที่รวดเร็วมีคุณสมบัติเหล่านี้:

  • การผสมมิกซ์ย่อยของมิกเซอร์ปกติและแทร็กด่วนไคลเอนต์สูงสุด 7 รายการ
  • การลดทอนต่อแทร็ก

คุณสมบัติที่ละเว้น:

  • การแปลงอัตราตัวอย่างต่อแทร็ก
  • เอฟเฟกต์ต่อแทร็ก
  • ต่อเอฟเฟกต์การผสม

ระยะเวลา

Fast Mixer จะทำงานเป็นระยะ โดยมีระยะเวลาที่แนะนำคือ 2-3 มิลลิวินาที (ms) หรือสูงกว่าเล็กน้อยที่ 5 ms หากจำเป็นเพื่อความเสถียรของกำหนดการ หมายเลขนี้ถูกเลือกเพื่อให้เวลาแฝงทั้งหมดอยู่ที่ 10 ms เมื่อพิจารณาถึงไปป์ไลน์บัฟเฟอร์ที่สมบูรณ์ ค่าที่น้อยกว่านั้นเป็นไปได้ แต่อาจส่งผลให้มีการใช้พลังงานเพิ่มขึ้นและโอกาสที่จะเกิดข้อผิดพลาด ขึ้นอยู่กับความสามารถในการคาดการณ์การกำหนดเวลาของ CPU ค่าที่มากขึ้นสามารถทำได้สูงสุด 20 ms แต่ส่งผลให้เวลาแฝงโดยรวมลดลง ดังนั้นควรหลีกเลี่ยง

การจัดตารางเวลา

มิกเซอร์ที่รวดเร็วทำงานที่ลำดับความสำคัญ SCHED_FIFO ที่ยกระดับ ต้องการเวลา CPU น้อยมาก แต่ต้องทำงานบ่อยครั้งและมีความกระวนกระวายใจในการกำหนดตารางเวลาต่ำ ความกระวนกระวายใจ แสดงถึงความแปรผันของรอบเวลา: คือความแตกต่างระหว่างรอบเวลาจริงกับรอบเวลาที่คาดไว้ การวิ่งช้าเกินไปจะส่งผลให้เกิดข้อผิดพลาดเนื่องจากการวิ่งต่ำกว่า การวิ่งเร็วเกินไปจะส่งผลให้เกิดข้อผิดพลาดเนื่องจากการดึงจากแทร็กด่วนก่อนที่แทร็กจะให้ข้อมูล

การปิดกั้น

ตามหลักการแล้วเธรดตัวผสมที่รวดเร็วจะไม่บล็อก ยกเว้นที่ HAL write() การบล็อกครั้งอื่นๆ ภายในมิกเซอร์ด่วนถือเป็นจุดบกพร่อง โดยเฉพาะอย่างยิ่ง หลีกเลี่ยง mutexes แต่จะใช้ อัลกอริธึมที่ไม่ปิดกั้น (หรือที่เรียกว่าอัลกอริธึมที่ไม่มีการล็อค) แทน โปรดดู การหลีกเลี่ยงการกลับลำดับความสำคัญ สำหรับข้อมูลเพิ่มเติมในหัวข้อนี้

ความสัมพันธ์กับองค์ประกอบอื่นๆ

Fast Mixer มีการโต้ตอบโดยตรงกับลูกค้าเพียงเล็กน้อย โดยเฉพาะอย่างยิ่ง ไม่เห็นการดำเนินการระดับ Binder แต่จะเข้าถึงบล็อกการควบคุมหน่วยความจำแบบแบ่งใช้ของไคลเอ็นต์

มิกเซอร์ที่รวดเร็วได้รับคำสั่งจากมิกเซอร์ปกติผ่านคิวสถานะ

นอกเหนือจากการดึงข้อมูลแทร็กแล้ว การโต้ตอบกับไคลเอนต์ก็ทำผ่านมิกเซอร์ปกติ

ซิงก์หลักของมิกเซอร์เร็วคือเสียง HAL

มิกเซอร์ธรรมดา

คุณสมบัติ

เปิดใช้งานคุณสมบัติทั้งหมดแล้ว:

  • มากถึง 32 แทร็ก
  • การลดทอนต่อแทร็ก
  • การแปลงอัตราตัวอย่างต่อแทร็ก
  • การประมวลผลเอฟเฟกต์

ระยะเวลา

คาบถูกคำนวณให้เป็นผลคูณอินทิกรัลแรกของคาบมิกเซอร์เร็วนั่นคือ >= 20 ms

การจัดตารางเวลา

มิกเซอร์ปกติทำงานที่ลำดับความสำคัญ SCHED_OTHER ระดับสูง

การปิดกั้น

มิกเซอร์ปกติได้รับอนุญาตให้บล็อก และมักจะทำเช่นนั้นที่ mutexes ต่างๆ เช่นเดียวกับที่ไปป์ที่ปิดกั้นเพื่อเขียนมิกซ์ย่อย

ความสัมพันธ์กับองค์ประกอบอื่นๆ

มิกเซอร์ปกติโต้ตอบกับโลกภายนอกอย่างกว้างขวาง รวมถึง Binder Thread, ตัวจัดการนโยบายเสียง, Fast Mixer Thread และแทร็กไคลเอ็นต์

อ่างล้างจานของเครื่องผสมแบบปกติจะเป็นท่อปิดกั้นไปยังแทร็กของเครื่องผสมแบบเร็ว 0

ธง

บิต AUDIO_OUTPUT_FLAG_FAST เป็นเพียงคำใบ้ ไม่มีการรับประกันว่าคำขอจะได้รับการตอบสนอง

AUDIO_OUTPUT_FLAG_FAST เป็นแนวคิดระดับไคลเอนต์ มันไม่ปรากฏในเซิร์ฟเวอร์

TRACK_FAST เป็นไคลเอนต์ -> แนวคิดเซิร์ฟเวอร์