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

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

การสร้างแทร็ก

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

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

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

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

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

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

ชุดข้อความของมิกเซอร์

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

มิกเซอร์แบบเร็ว

ฟีเจอร์

เทรดเดอร์มัลติเพลเยอร์แบบรวดเร็วมีฟีเจอร์ต่อไปนี้

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

ฟีเจอร์ที่ละเว้น

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

จุด

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

การตั้งเวลา

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

จะมีการบล็อก

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

ความสัมพันธ์กับคอมโพเนนต์อื่นๆ

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

มิกเซอร์แบบเร็วจะรับคําสั่งจากมิกเซอร์แบบปกติผ่านคิวสถานะ

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

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

มิกเซอร์แบบปกติ

ฟีเจอร์

ฟีเจอร์ทั้งหมดเปิดใช้แล้ว

  • แทร็กสูงสุด 32 แทร็ก
  • การลดระดับต่อแทร็ก
  • การแปลงอัตราการสุ่มตัวอย่างต่อแทร็ก
  • การประมวลผลเอฟเฟกต์

จุด

ระบบจะคํานวณระยะเวลาเป็นจำนวนเต็มที่มากกว่าหรือเท่ากับ 20 มิลลิวินาทีซึ่งคูณกับระยะเวลาของมิกเซอร์แบบเร็วเป็นครั้งแรก

การตั้งเวลา

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

จะมีการบล็อก

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

ความสัมพันธ์กับคอมโพเนนต์อื่นๆ

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

Sink ของมิกเซอร์ปกติคือไปป์ที่บล็อกไปยังแทร็ก 0 ของมิกเซอร์ที่เร็ว

ธง

AUDIO_OUTPUT_FLAG_FAST bit คือคำใบ้ เราไม่รับประกันว่าคำขอจะได้รับการดำเนินการ

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

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