Android 14 hỗ trợ liều lượng âm thanh trong khung âm thanh và HAL âm thanh bằng cách liên tục theo dõi các phép đo liều lượng âm thanh và đưa ra cảnh báo cho người dùng về mức độ tiếp xúc gây hại.
Liều lượng âm thanh là mức đo áp suất âm thanh trong một khoảng thời gian. Bằng cách theo dõi liều lượng âm thanh, chúng tôi có thể giúp bảo vệ người dùng khỏi những tác động gây hại của việc tiếp xúc với âm thanh quá mức hoặc trong thời gian dài, nhờ đó mang đến khả năng bảo vệ thính giác tốt hơn khi sử dụng tai nghe trên thiết bị Android di động và giảm thiểu nguy cơ suy giảm thính lực.
Các tiêu chuẩn mới về thiết bị nghe an toàn tuân thủ các yêu cầu theo quy định về bảo vệ thính giác trong IEC62368-1 phiên bản thứ 3 (yêu cầu đăng nhập) và EN50332-3 (chỉ người đăng ký mới có quyền truy cập), trong đó giới thiệu khái niệm về liều lượng âm thanh.
Hàm liều lượng âm thanh giúp các OEM tuân thủ các quy định mới về an toàn thính giác. Để hỗ trợ liều lượng âm thanh, các OEM phải tuân thủ quy định và thông số kỹ thuật về giao diện cho mọi hoạt động tuỳ chỉnh và chứng nhận. Một quy trình triển khai tuỳ chỉnh của OEM có thể bỏ qua hoặc sửa đổi quy trình triển khai liều lượng âm thanh mặc định của AOSP. Tuy nhiên, bạn nên sử dụng phương thức triển khai AOSP.
Cách tính liều lượng âm thanh
Các tiêu chuẩn trong phiên bản thứ 3 của IEC62368-1 và EN50332-3 giúp tăng độ chính xác của việc đo mức độ tiếp xúc với âm thanh bằng cách tính toán liều lượng âm thanh đã tính (CSD). CSD được tính bằng cách tích hợp các mức độ phơi nhiễm tức thời (MEL) theo thời gian. Một khoảng thời gian 7 ngày liên tục được duy trì để tính toán liều lượng âm thanh.
Theo mục 10.6.3.2 của phiên bản thứ 3 của tiêu chuẩn IEC62368-1, nếu giá trị CSD đạt đến giới hạn 100%, hệ thống sẽ cảnh báo cho người dùng về mức âm thanh khi giá trị này tăng thêm 100%. Nếu người dùng không xác nhận cảnh báo, âm lượng sẽ giảm xuống giá trị nguồn năng lượng bức xạ loại 1 (RS1) được xác định trước trong Bảng 39 của IEC62368-1.
Như đã đề cập trong phần 10.6.3.3 của IEC62368-1 phiên bản thứ 3, cùng với cảnh báo về liều lượng âm thanh, hệ thống phải đưa ra cảnh báo dựa trên mức độ tiếp xúc mỗi khi giá trị MEL vượt quá giá trị nguồn năng lượng bức xạ loại 2 (RS2) của Bảng 39 trong IEC62368-1.
Để được chứng nhận theo các quy định này và để các giá trị CSD phù hợp hơn, hệ thống phải sử dụng các giá trị đầu ra chính xác theo cảm nhận của người dùng (chẳng hạn như đầu ra phát nội dung nghe nhìn). Điều quan trọng là quá trình tính toán CSD phải sử dụng các giá trị gần với mức áp suất âm thanh thực tế mà người dùng tiếp xúc.
Kiến trúc
Tuỳ thuộc vào vị trí chụp khung hình, đặc điểm phần cứng và hiệu ứng của các bộ chuyển đổi có thể ảnh hưởng đến mức công suất của khung hình được kết xuất. Để đo lường chính xác mức áp suất âm thanh đầu ra, chúng tôi đã mở rộng HAL để lấy các giá trị MEL trực tiếp từ phần cứng cơ bản và tính đến những hiệu ứng có thể được áp dụng bởi bộ xử lý tín hiệu số (DSP) hoặc các thuộc tính của loa, chẳng hạn như trở kháng, độ nhạy và đáp ứng tần số.
Nếu HAL không thể cung cấp các giá trị MEL, thì theo cơ chế dự phòng, khung âm thanh sẽ phân tích và tính toán CSD. Phép tính này trong khung âm thanh dựa trên thông tin về đầu ra được kết xuất do HAL báo cáo và các khung hình được gửi đến DSP âm thanh.
Liều lượng âm thanh giới thiệu 2 thành phần, SoundDoseHelper
và SoundDoseManager,
như minh hoạ trong Hình 1:
Hình 1. Các thành phần cấu trúc của tính năng liều lượng âm thanh.
SoundDoseHelper
Lớp SoundDoseHelper
(nằm trong quy trình systemserver
) là điểm thu thập chính cho tất cả dữ liệu liên quan đến liều lượng âm thanh. Lớp AudioService
quản lý lớp SoundDoseHelper
.
Lớp SoundDoseHelper
chịu trách nhiệm về những việc sau:
- Xử lý thông tin về liều lượng mới
- Lưu giữ các giá trị liều lượng âm thanh
- Khôi phục trạng thái trong trường hợp
audioserver
gặp sự cố - Kích hoạt thông báo của Giao diện người dùng hệ thống
- Giảm âm lượng
SoundDoseManager
Lớp SoundDoseManager
nằm trong quy trình audioserver
và là một phần của lớp AudioFlinger
, thu thập dữ liệu về liều lượng âm thanh từ HAL hoặc tính toán dữ liệu đó nội bộ, dưới dạng dự phòng, từ các khung hình được gửi đến HAL. Lớp SoundDoseManager
gửi dữ liệu liều lượng âm thanh đến lớp SoundDoseHelper
.
MelProcessor và MelAggregator
Nếu HAL không thể cung cấp các giá trị MEL, thì các tiện ích MelProcessor
và MelAggregator
trong libaudioutils
sẽ được dùng để tính toán liều lượng âm thanh nội bộ.
Trong lớp MelProcessor
, quá trình tính toán chính được thực hiện trên một vùng đệm có các mẫu âm thanh bằng cách gọi MelProcessor::process(const void* buffer, size_t bytes)
.
Nếu cần, OEM có thể sử dụng MelProcessor
trong quá trình triển khai HAL.
Lớp MelAggregator
nhận các giá trị MEL từ nhiều cổng âm thanh và tính toán giá trị CSD trong khoảng thời gian 7 ngày. Phương thức MelAggregator::aggregateAndAddNewMelRecord_l(MelRecord mel)
thực thi logic. Kết quả được gửi đến lớp SoundDoseManager
để giao tiếp với AudioService
.
Triển khai
Các tiện ích giao diện HIDL không được dùng nữa kể từ Android 14, vì vậy, giao diện HAL mới để truy xuất các giá trị MEL đã tính và đưa ra cảnh báo về độ phơi sáng, có tên là ISoundDose
, được xác định là một phần của HAL âm thanh AIDL. Tuy nhiên, đối với những người triển khai cần thêm thời gian để tích hợp AIDL Audio HAL, chúng tôi có HAL AIDL liều lượng âm thanh độc lập, cung cấp giao diện ISoundDoseFactory
. Tính năng này sẽ không được dùng nữa trong tương lai.
Các phương thức HAL để hỗ trợ liều lượng âm thanh được minh hoạ trong đoạn mã mẫu sau:
/**
* 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);
}
}
Giao diện HAL mới triển khai các lệnh gọi lại thông báo cho khung về độ phơi sáng tức thời và cung cấp các giá trị MEL bất cứ khi nào mức đầu ra vượt quá RS1. Khi các giao diện này được triển khai, khung sẽ dùng chúng để báo cáo CSD. Nếu không có hoạt động triển khai lệnh gọi lại này, thì một hoạt động triển khai dự phòng trên AudioFlinger
sẽ được dùng để tính toán các giá trị CSD ước tính.
Hỗ trợ AIDL độc lập cho liều lượng âm thanh
Cho đến khi các OEM có thể tích hợp liều lượng âm thanh trong HAL âm thanh AIDL, họ có thể sử dụng API AIDL độc lập ISoundDoseFactory
làm giải pháp thay thế. ISoundDoseFactory
sử dụng giao diện ISoundDose
, như minh hoạ trong đoạn mã sau:
@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);
}
Hỗ trợ HAL âm thanh AIDL về liều lượng âm thanh
Giao diện liều lượng âm thanh được hỗ trợ lâu dài trong AIDL Audio HAL bằng cách mở rộng giao diện IModule
, như minh hoạ trong mã mẫu sau:
@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();
}
Tính năng này là một cách triển khai quy định mới được mô tả trong IEC62368-1 phiên bản thứ 3 và EN50332-3, vì vậy không có API hướng ra bên ngoài.
Các OEM có thể chứng nhận thiết bị của mình bằng cách triển khai các giao diện HAL mới và cung cấp dữ liệu MEL chính xác cho CSD cho khung âm thanh (nên dùng) hoặc bằng cách cung cấp một cách triển khai liều lượng âm thanh tuỳ chỉnh.
Bật tính năng tính toán liều lượng âm thanh
Theo mặc định, AOSP hỗ trợ logic an toàn cho thính giác để đảm bảo chứng nhận theo các tiêu chuẩn hiện hành EN50332-2 và IEC62368-1 10.6.5.
Trong Android 14, tính năng tính toán liều lượng âm thanh bị tắt theo mặc định.
Hãy làm theo các nguyên tắc sau để bật tính năng tính toán liều lượng âm thanh bắt đầu từ Android 14-QPR1.
Nếu quốc gia của bạn thực thi các quy định về liều lượng âm thanh, hãy kiểm tra xem
config_safe_media_volume_enabled
trongconfig.xml
có được đặt thànhtrue
hay không.Để tuân thủ EN50332-3 và IEC62368-1 10.6.3, nhà cung cấp phải phủ cờ
config_safe_sound_dosage_enabled
trongconfig.xml
thànhtrue
. Đối với những thiết bị hỗ trợ giải mã tải xuống và không triển khai các giao diện HAL về liều lượng âm thanh, bạn không được đặtconfig_safe_sound_dosage_enabled
thànhtrue
. Trong những trường hợp như vậy, việc đặtconfig_safe_sound_dosage_enabled
thànhtrue
có thể dẫn đến các giá trị CSD không chính xác và các vấn đề về chứng nhận đối với tiêu chuẩn an toàn về thính giác.
Biểu đồ quyết định sau đây mô tả logic xác định xem dựa trên các quy định hạn chế về quốc gia và giá trị của cờ, CSD hay các mức độ an toàn thính giác cũ (được triển khai trước Android 14) sẽ được tính toán.
Hình 2. Bật tính năng tính toán liều lượng âm thanh (logic được thêm vào Android 14-QPR1).
Xác nhận kết quả
Khi triển khai giao diện HAL cho liều lượng âm thanh, các OEM phải xác thực dựa trên các trường hợp kiểm thử VTS do VtsHalAudioCoreTargetTest
xác định cho việc triển khai IModule AIDL Audio HAL hoặc do VtsHalSoundDoseFactoryTargetTest
xác định cho việc triển khai AIDL HAL liều lượng âm thanh độc lập.