Android 14 รองรับปริมาณเสียงในเฟรมเวิร์กเสียงและ Audio HAL โดยการตรวจสอบการวัดปริมาณเสียงอย่างต่อเนื่องและออกคำเตือนให้ผู้ใช้ทราบเกี่ยวกับระดับการสัมผัสที่อาจทำให้เกิดอันตราย
ปริมาณเสียงคือการวัดระดับความดันเสียงในช่วงเวลาหนึ่ง การตรวจสอบปริมาณเสียงช่วยให้เราปกป้องผู้ใช้จากผลกระทบที่เกิดจากเสียงที่ดังเกินไปหรือเป็นเวลานานได้ จึงช่วยปกป้องการได้ยินได้ดียิ่งขึ้นเมื่อใช้หูฟังในอุปกรณ์ Android แบบพกพาและลดโอกาสที่การได้ยินจะบกพร่อง
มาตรฐานใหม่สำหรับอุปกรณ์การฟังอย่างปลอดภัยเป็นไปตามข้อกำหนดด้านกฎระเบียบในการปกป้องการได้ยินใน IEC62368-1 ฉบับที่ 3 (ต้องเข้าสู่ระบบ) และ EN50332-3 (การเข้าถึงจํากัดไว้สำหรับผู้สมัครใช้บริการเท่านั้น) ซึ่งนําเสนอแนวคิดเกี่ยวกับปริมาณเสียง
ฟังก์ชันปริมาณเสียงช่วยให้ OEM ปฏิบัติตามกฎระเบียบด้านความปลอดภัยการได้ยินใหม่ หากต้องการรองรับปริมาณเสียง OEM จะต้องปฏิบัติตามข้อกำหนดและกฎระเบียบของอินเทอร์เฟซสำหรับการปรับแต่งและการรับรองทั้งหมด การใช้งาน OEM ที่กําหนดเองสามารถข้ามหรือแก้ไขการใช้งานปริมาณเสียงเริ่มต้นของ AOSP ได้ อย่างไรก็ตาม เราขอแนะนําอย่างยิ่งให้ใช้การติดตั้งใช้งาน AOSP
การคำนวณปริมาณเสียง
มาตรฐานใน IEC62368-1 ฉบับที่ 3 และ EN50332-3 เพิ่มความแม่นยำในการวัดการสัมผัสกับเสียงด้วยการคำนวณปริมาณเสียงที่คำนวณแล้ว (CSD) CSD จะคำนวณโดยการรวมระดับการสัมผัสเป็นระยะเวลาสั้นๆ (MEL) เมื่อเวลาผ่านไป ระบบจะเก็บค่า CSD ที่สะสมไว้อย่างต่อเนื่องเป็นเวลา 7 วันเพื่อใช้คำนวณปริมาณเสียง
ตามส่วนที่ 10.6.3.2 ของ IEC62368-1 ฉบับที่ 3 หากค่า CSD สูงถึงขีดจำกัด 100% ระบบจะแจ้งเตือนผู้ใช้เกี่ยวกับระดับเสียงเมื่อเพิ่มขึ้น 100% แต่ละครั้ง หากผู้ใช้ไม่ยอมรับคำเตือน ระบบจะลดระดับเสียงลงเป็นค่าแหล่งพลังงานแผ่รังสีระดับ 1 (RS1) ที่กําหนดไว้ล่วงหน้าในตาราง 39 ของ IEC62368-1
ตามที่ระบุไว้ในส่วนที่ 10.6.3.3 ของ IEC62368-1 ฉบับที่ 3 นอกเหนือจากคำเตือนเกี่ยวกับปริมาณเสียงแล้ว ระบบต้องเริ่มคำเตือนตามการสัมผัสทุกครั้งที่ค่า MEL สูงกว่าค่าแหล่งพลังงานแผ่รังสีระดับ 2 (RS2) ของตารางที่ 39 ใน IEC62368-1
ระบบต้องใช้ค่าเอาต์พุตที่ถูกต้องตามที่ผู้ใช้รับรู้ (เช่น เอาต์พุตการเล่นสื่อ) เพื่อให้ได้รับการรับรองตามกฎระเบียบเหล่านี้และเพื่อให้ค่า CSD มีความเกี่ยวข้องมากขึ้น การคำนวณ CSD ต้องใช้ค่าที่ใกล้เคียงกับระดับความดันเสียงจริงที่ผู้ใช้ได้รับ
สถาปัตยกรรม
ลักษณะและผลของฮาร์ดแวร์ของตัวแปลงสัญญาณอาจส่งผลต่อระดับพลังงานของเฟรมที่ผ่านการจัดการแสดงผล ทั้งนี้ขึ้นอยู่กับตำแหน่งที่จับเฟรม เราได้ขยาย HAL เพื่อรับค่า MEL จากฮาร์ดแวร์ที่เกี่ยวข้องโดยตรงและพิจารณาถึงผลที่อาจเกิดขึ้นจากโปรเซสเซอร์สัญญาณดิจิทัล (DSP) หรือคุณสมบัติของลำโพง เช่น อิมพีแดนซ์ ความไว และการตอบสนองความถี่ เพื่อให้การวัดระดับความดันเสียงที่ออกมามีความแม่นยำ
หาก HAL ไม่สามารถระบุค่า MEL เฟรมเวิร์กเสียงจะวิเคราะห์และคำนวณ CSD เป็นกลไกสำรอง การคํานวณในเฟรมเวิร์กเสียงนี้ขึ้นอยู่กับข้อมูลเกี่ยวกับเอาต์พุตที่ผ่านการจัดการแสดงผลซึ่งรายงานจาก HAL และเฟรมที่ส่งไปยัง DSP เสียง
ปริมาณเสียงประกอบด้วย 2 องค์ประกอบ ได้แก่ SoundDoseHelper
และ SoundDoseManager,
ดังที่แสดงในรูปที่ 1
รูปที่ 1 องค์ประกอบเชิงสถาปัตยกรรมของฟีเจอร์ปริมาณเสียง
SoundDoseHelper
คลาส SoundDoseHelper
ซึ่งอยู่ในกระบวนการ systemserver
คือจุดรวบรวมหลักสำหรับข้อมูลปริมาณเสียงที่เกี่ยวข้องทั้งหมด ชั้นเรียน AudioService
จัดการชั้นเรียน SoundDoseHelper
ชั้นเรียน SoundDoseHelper
มีหน้าที่รับผิดชอบในเรื่องต่อไปนี้
- การจัดการข้อมูลการให้ยาใหม่
- การเก็บค่าปริมาณเสียงไว้
- สถานะการกู้คืนในกรณีที่
audioserver
ขัดข้อง - การทริกเกอร์การแจ้งเตือน UI ของระบบ
- การลดระดับเสียง
SoundDoseManager
คลาส SoundDoseManager
ซึ่งอยู่ในกระบวนการ audioserver
และเป็นส่วนหนึ่งของคลาส AudioFlinger
จะรวบรวมข้อมูลปริมาณเสียงจาก HAL หรือคํานวณข้อมูลดังกล่าวภายในเป็นทางเลือกสําหรับเฟรมที่ส่งไปยัง HAL ชั้นเรียน SoundDoseManager
จะส่งข้อมูลปริมาณเสียงไปยังชั้นเรียน SoundDoseHelper
MelProcessor และ MelAggregator
หาก HAL ระบุค่า MEL ไม่ได้ ระบบจะใช้ยูทิลิตี MelProcessor
และ MelAggregator
ใน libaudioutils
สำหรับการคํานวณปริมาณเสียงภายใน
ในคลาส MelProcessor
การคํานวณหลักจะดําเนินการกับบัฟเฟอร์ที่มีตัวอย่างเสียงโดยการเรียกใช้ MelProcessor::process(const void* buffer, size_t bytes)
OEM สามารถใช้ MelProcessor
ในการใช้งาน HAL ได้หากจำเป็น
คลาส MelAggregator
รับค่า MEL จากพอร์ตเสียงต่างๆ และคำนวณค่า CSD ด้วยกรอบเวลาแบบเลื่อน 7 วัน เมธอด MelAggregator::aggregateAndAddNewMelRecord_l(MelRecord mel)
จะดำเนินการตามตรรกะ ระบบจะส่งผลลัพธ์ไปยังชั้นเรียน SoundDoseManager
เพื่อใช้ในการสื่อสารกับ AudioService
การใช้งาน
ระบบเลิกใช้งานส่วนขยายอินเทอร์เฟซ HIDL ตั้งแต่ Android 14 เป็นต้นไป ดังนั้นอินเทอร์เฟซ HAL ใหม่สำหรับการดึงค่า MEL ที่คำนวณแล้วและออกคำเตือนเกี่ยวกับปริมาณแสงที่มีชื่อว่า ISoundDose
จึงได้รับการกำหนดให้เป็นส่วนหนึ่งของ AIDL Audio HAL อย่างไรก็ตาม สำหรับนักพัฒนาซอฟต์แวร์ที่ต้องการเวลาเพิ่มเติมในการผสานรวม AIDL Audio HAL เรามี AIDL HAL สำหรับปริมาณเสียงแบบสแตนด์อโลนซึ่งมีอินเทอร์เฟซ ISoundDoseFactory
เราจะเลิกใช้งานฟีเจอร์นี้ในอนาคต
วิธีการ HAL สำหรับการสนับสนุนปริมาณเสียงแสดงอยู่ในตัวอย่างโค้ดต่อไปนี้
/**
* This interface provides functions related to sound exposure control required for compliance to
* EN/IEC 62368-1 3rd edition. Implementing this interface is mandatory for devices for which
* compliance to this standard is mandated and implementing audio offload decoding or other direct
* playback paths where volume control happens below the audio HAL.
*/
@VintfStability
interface ISoundDose {
/**
* Max value in dBA used for momentary exposure warnings as defined by IEC62368-1
* 3rd edition. This value represents the default RS2 upper bound.
*/
const int DEFAULT_MAX_RS2 = 100;
/** Min value of the RS2 threshold in dBA as defined by IEC62368-1 3rd edition. */
const int MIN_RS2 = 80;
/**
* Sets the RS2 upper bound used for momentary exposure warnings. Default value is
* DEFAULT_MAX_RS2 as specified in IEC62368-1 3rd edition.
*
* @param rs2ValueDbA custom RS2 upper bound to use
* @throws EX_ILLEGAL_ARGUMENT if rs2ValueDbA is greater than DEFAULT_MAX_RS2 or lower
* than MIN_RS2
*/
void setOutputRs2UpperBound(float rs2ValueDbA);
/**
* Gets the RS2 upper bound used for momentary exposure warnings.
*
* @return the RS2 upper bound in dBA
*/
float getOutputRs2UpperBound();
/**
* Registers the HAL callback for sound dose computation. If sound dose is supported
* the MEL values and exposure notifications will be received through this callback
* only. The internal framework MEL computation will be disabled.
* It is not possible to unregister the callback. The HAL is responsible to provide
* the MEL values throughout its lifecycle.
*
* @param callback to use when new updates are available for sound dose
*/
void registerSoundDoseCallback(in IHalSoundDoseCallback callback);
@VintfStability
oneway interface IHalSoundDoseCallback {
/**
* Called whenever the current MEL value exceeds the set RS2 upper bound.
*
* @param currentDbA the current MEL value which exceeds the RS2 upper bound
* @param audioDevice the audio device where the MEL exposure warning was recorded
*/
void onMomentaryExposureWarning(float currentDbA, in AudioDevice audioDevice);
@VintfStability
parcelable MelRecord {
/**
* Array of continuously recorded MEL values >= MIN_RS2 (1 per second).
* First value in the array was recorded at 'timestamp'.
*/
float[] melValues;
/**
* Corresponds to the time in seconds, as reported by CLOCK_MONOTONIC, when
* the first MEL entry in melValues was recorded. The timestamp values have
* to be consistent throughout all audio ports, equal timestamp values will
* be aggregated.
*/
long timestamp;
}
/**
* Provides a MelRecord containing continuous MEL values sorted by timestamp.
* Note that all the MEL values originate from the audio device specified by audioDevice.
* In case values from multiple devices need to be reported, the caller should execute
* this callback once for every device.
*
* @param melRecord contains the MEL values used for CSD
* @param audioDevice the audio device where the MEL values were recorded
*/
void onNewMelValues(in MelRecord melRecord, in AudioDevice audioDevice);
}
}
อินเทอร์เฟซ HAL ใหม่ใช้การเรียกกลับเพื่อแจ้งเฟรมเวิร์กเกี่ยวกับการสัมผัสแสงชั่วขณะและให้ค่า MEL เมื่อใดก็ตามที่ระดับเอาต์พุตเกิน RS1 เมื่อติดตั้งใช้งานอินเทอร์เฟซเหล่านี้แล้ว เฟรมเวิร์กจะใช้อินเทอร์เฟซดังกล่าวในการรายงาน CSD หากไม่มีการใช้งานการเรียกกลับนี้ ระบบจะใช้การใช้งานสำรองใน AudioFlinger
เพื่อคํานวณค่า CSD โดยประมาณ
การรองรับ AIDL แบบสแตนด์อโลนของ Sound Dose
ในระหว่างนี้ OEM สามารถใช้ AIDL API แบบสแตนด์อโลน ISoundDoseFactory
เป็นวิธีแก้ปัญหา ISoundDoseFactory
ใช้อินเทอร์เฟซ ISoundDose
ตามที่แสดงในตัวอย่างโค้ดต่อไปนี้
@VintfStability
interface ISoundDoseFactory {
/**
* Retrieve the sound dose interface for a given audio HAL module name.
*
* If a device must comply to IEC62368-1 3rd edition audio safety requirements and is
* implementing audio offload decoding or other direct playback paths where volume control
* happens below the audio HAL, it must return an instance of the ISoundDose interface.
* The same instance must be returned during the lifetime of the HAL module.
* If the HAL module does not support sound dose, null must be returned, without throwing
* any errors.
*
* @param module for which we trigger sound dose updates.
* @return An instance of the ISoundDose interface implementation.
* @throws EX_ILLEGAL_STATE If there was an error creating an instance.
*/
@nullable ISoundDose getSoundDose(in @utf8InCpp String module);
}
Sound dose รองรับ AIDL Audio HAL
ระบบจะรองรับอินเทอร์เฟซปริมาณเสียงในระยะยาวโดยเป็นส่วนหนึ่งของ AIDL Audio HAL โดยการขยายอินเทอร์เฟซ IModule
ดังที่แสดงในตัวอย่างโค้ดต่อไปนี้
@VintfStability
interface IModule {
…
/**
* Retrieve the sound dose interface.
*
* If a device must comply to IEC62368-1 3rd edition audio safety requirements and is
* implementing audio offload decoding or other direct playback paths where volume control
* happens below the audio HAL, it must return an instance of the ISoundDose interface.
* The same instance must be returned during the lifetime of the HAL module.
* If the HAL module does not support sound dose, null must be returned, without throwing
* any errors.
*
* @return An instance of the ISoundDose interface implementation.
* @throws EX_ILLEGAL_STATE If there was an error creating an instance.
*/
@nullable ISoundDose getSoundDose();
}
ฟีเจอร์นี้เป็นการใช้กฎระเบียบใหม่ตามที่อธิบายไว้ใน IEC62368-1 ฉบับที่ 3 และ EN50332-3 จึงไม่มี API ที่แสดงต่อภายนอก
OEM สามารถรับรองอุปกรณ์ของตนได้โดยใช้อินเทอร์เฟซ HAL ใหม่และระบุข้อมูล MEL ที่ถูกต้องสำหรับ CSD ไปยังเฟรมเวิร์กเสียง (แนะนำ) หรือระบุการใช้งานปริมาณเสียงที่กำหนดเอง
เปิดใช้การคำนวณปริมาณเสียง
โดยค่าเริ่มต้น AOSP รองรับตรรกะด้านความปลอดภัยของการได้ยินที่ช่วยให้มั่นใจได้ว่าได้รับการรับรองตามมาตรฐาน EN50332-2 และ IEC62368-1 10.6.5 ที่มีอยู่
ใน Android 14 ระบบจะปิดใช้การคำนวณปริมาณเสียงโดยค่าเริ่มต้น
ใช้หลักเกณฑ์ต่อไปนี้เพื่อเปิดใช้การคำนวณปริมาณเสียงโดยเริ่มจาก Android 14-QPR1
หากประเทศของคุณบังคับใช้กฎระเบียบเกี่ยวกับปริมาณเสียง ให้ตรวจสอบว่า
config_safe_media_volume_enabled
ในconfig.xml
มีการตั้งค่าเป็นtrue
หรือไม่ผู้ให้บริการต้องวางซ้อนธงใน
config.xml
บนtrue
เพื่อให้เป็นไปตามข้อกำหนด EN50332-3 และ IEC62368-1 10.6.3config_safe_sound_dosage_enabled
สำหรับอุปกรณ์ที่รองรับการถอดรหัสแบบออฟโหลดและไม่ได้ใช้อินเทอร์เฟซ HAL ของปริมาณเสียง ต้องไม่ตั้งค่าconfig_safe_sound_dosage_enabled
เป็นtrue
ในกรณีเช่นนี้ การตั้งค่าconfig_safe_sound_dosage_enabled
เป็นtrue
อาจทําให้ค่า CSD ไม่ถูกต้องและเกิดปัญหาการรับรองมาตรฐานการได้ยินเสียง
กราฟการตัดสินใจต่อไปนี้อธิบายตรรกะที่ใช้พิจารณาว่าจะคำนวณ CSD หรือระดับความปลอดภัยในการได้ยินเดิม (ใช้งานก่อน Android 14) หรือไม่ โดยอิงตามข้อจำกัดของประเทศและค่าของ Flag
รูปที่ 2 เปิดใช้การคำนวณปริมาณเสียง (เพิ่มตรรกะใน Android 14-QPR1)
การตรวจสอบความถูกต้อง
เมื่อติดตั้งใช้งานอินเทอร์เฟซ HAL สำหรับปริมาณเสียง OEM ต้องตรวจสอบกับกรณีทดสอบ VTS ที่ระบุโดย VtsHalAudioCoreTargetTest
สำหรับการติดตั้งใช้งาน IModule AIDL Audio HAL หรือโดย VtsHalSoundDoseFactoryTargetTest
สำหรับการติดตั้งใช้งาน AIDL HAL ปริมาณเสียงแบบสแตนด์อโลน