ออกแบบเพื่อลดเวลาในการตอบสนอง

ผู้ให้บริการสามารถใช้ฟีเจอร์หลัก 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() ได้ ปัจจุบันมีเพียงไคลเอ็นต์ต่อไปนี้เท่านั้นที่ทำเช่นนั้น

การติดตั้งใช้งาน 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 เป็นแนวคิดไคลเอ็นต์ -> เซิร์ฟเวอร์