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