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