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