เครื่องเสียง

ไอคอน Android Audio HAL

เลเยอร์นามธรรมฮาร์ดแวร์เสียง (HAL) ของ Android เชื่อมต่อ API เฟรมเวิร์กเฉพาะเสียงระดับสูงใน android.media กับไดรเวอร์เสียงและฮาร์ดแวร์พื้นฐาน ส่วนนี้ประกอบด้วยคำแนะนำในการใช้งานและเคล็ดลับในการปรับปรุงประสิทธิภาพ

สถาปัตยกรรมเสียงของ Android กำหนดวิธีการใช้งานฟังก์ชันเสียง และชี้ไปที่ซอร์สโค้ดที่เกี่ยวข้องซึ่งเกี่ยวข้องกับการใช้งาน

สถาปัตยกรรมเสียง

รูปที่ 1. สถาปัตยกรรมเสียง Android

กรอบงานการสมัคร
กรอบงานแอปพลิเคชันประกอบด้วยรหัสแอป ซึ่งใช้ android.media APIs เพื่อโต้ตอบกับฮาร์ดแวร์เสียง ภายในโค้ดนี้เรียกใช้คลาสกาว JNI ที่เกี่ยวข้องเพื่อเข้าถึงโค้ดเนทีฟที่โต้ตอบกับฮาร์ดแวร์เสียง
JNI
รหัส JNI ที่เชื่อมโยงกับ android.media เรียกโค้ดเนทีฟระดับล่างเพื่อเข้าถึงฮาร์ดแวร์เสียง JNI ตั้งอยู่ใน frameworks/base/core/jni/ และ frameworks/base/media/jni
เฟรมเวิร์กดั้งเดิม
เฟรมเวิร์กเนทีฟให้เนทีฟเทียบเท่ากับแพ็คเกจ android.media โดยเรียกพร็อกซี Binder IPC เพื่อเข้าถึงบริการเสียงเฉพาะของเซิร์ฟเวอร์สื่อ โค้ดเฟรมเวิร์กดั้งเดิมอยู่ใน frameworks/av/media/libmedia
สารยึดเกาะ IPC
พร็อกซี Binder IPC ช่วยอำนวยความสะดวกในการสื่อสารเหนือขอบเขตของกระบวนการ พร็อกซี่จะอยู่ใน frameworks/av/media/libmedia และเริ่มต้นด้วยตัวอักษร "I"
เซิร์ฟเวอร์สื่อ
เซิร์ฟเวอร์สื่อประกอบด้วยบริการเสียง ซึ่งเป็นรหัสจริงที่โต้ตอบกับการใช้งาน HAL ของคุณ เซิร์ฟเวอร์สื่ออยู่ใน frameworks/av/services/audioflinger
ฮาล
HAL กำหนดอินเทอร์เฟซมาตรฐานที่บริการเสียงเรียกใช้และคุณต้องปรับใช้เพื่อให้ฮาร์ดแวร์เสียงของคุณทำงานได้อย่างถูกต้อง สำหรับรายละเอียดเพิ่มเติม โปรดดู อินเทอร์เฟซเสียง HAL และความคิดเห็นในไฟล์ *.hal ของไดเรกทอรีเวอร์ชัน HAL ที่เกี่ยวข้อง
โปรแกรมควบคุมเคอร์เนล
ไดรเวอร์เสียงโต้ตอบกับฮาร์ดแวร์และการใช้งาน HAL ของคุณ คุณสามารถใช้ Advanced Linux Sound Architecture (ALSA), Open Sound System (OSS) หรือไดรเวอร์ที่กำหนดเองได้ (HAL เป็นแบบไม่เชื่อเรื่องพระเจ้า)

หมายเหตุ : หากคุณใช้ ALSA เราขอแนะนำ external/tinyalsa สำหรับส่วนผู้ใช้ของไดรเวอร์เนื่องจากการให้สิทธิ์ใช้งานที่เข้ากันได้ (ไลบรารีโหมดผู้ใช้มาตรฐานคือ GPL-licensed)

เสียงเนทีฟของ Android ที่ใช้ Open SL ES (ไม่แสดง)
API นี้เปิดเผยโดยเป็นส่วนหนึ่งของ Android NDK และอยู่ในระดับสถาปัตยกรรมเดียวกับ android.media