liều lượng âm thanh

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ề mức độ tiếp xúc có hại.

Liều âm thanh là thước đo mức á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 tác hại của việc tiếp xúc với âm thanh quá mức hoặc kéo dài, từ đó mang lại 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ơ khiếm thính.

Các tiêu chuẩn mới dành cho thiết bị nghe an toàn tuân thủ các yêu cầu 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 (quyền truy cập giới hạn cho người đăng ký), trong đó đưa ra khái niệm về liều lượng âm thanh.

Chức năng đo liều âm thanh cho phép các OEM tuân theo các quy định mới về an toàn thính giác. Để hỗ trợ liều lượng âm thanh, OEM phải tuân theo các thông số kỹ thuật và quy định về giao diện đối với tất cả các tùy chỉnh và chứng nhận. Việc triển khai OEM tùy chỉnh có thể bỏ qua hoặc sửa đổi việc triển khai liều âm thanh mặc định của AOSP. Tuy nhiên, việc sử dụng triển khai AOSP rất được khuyến khích.

Tính toán liều lượng âm thanh

Các tiêu chuẩn trong IEC62368-1 phiên bản thứ 3 và EN50332-3 tăng độ chính xác của việc đo mức tiếp xúc âm thanh bằng cách tính toán liều âm thanh được tính toán (CSD). CSD được tính bằng cách tích hợp các mức phơi nhiễm nhất thời (MEL) theo thời gian. Khoảng thời gian bảy ngày liên tục của các giá trị CSD tích lũy được duy trì để tính toán liều âm thanh.

Theo mục 10.6.3.2 của IEC62368-1 phiên bản thứ 3, nếu giá trị CSD đạt giới hạn 100%, hệ thống sẽ cảnh báo người dùng về mức âm thanh mỗi lần 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ị loại 1 (RS1) của nguồn năng lượng bức xạ đượ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 ấn bản thứ 3, cùng với cảnh báo 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 của IEC62368 -1.

Để được chứng nhận theo các quy định này và để làm cho 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 lại phương tiện). Điều quan trọng là 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.

Ngành kiến ​​​​trúc

Tùy thuộc vào vị trí khung hình được ghi lại, đặ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 công suất của khung hình được hiển thị. Để có phép đo mức áp suất âm thanh đầu ra chính xác, chúng tôi đã mở rộng HAL để lấy các giá trị MEL trực tiếp từ phần cứng bên dưới và tính đến các hiệu ứng có thể được bộ xử lý tín hiệu số (DSP) hoặc thuộc tính loa áp dụng, 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, làm cơ chế dự phòng, thì khung âm thanh sẽ phân tích và tính toán CSD. Tính toán này trong khung âm thanh dựa trên thông tin về đầu ra được kết xuất được báo cáo từ HAL và các khung được gửi đến DSP âm thanh.

Liều âm thanh giới thiệu hai thành phần, SoundDoseHelperSoundDoseManager, như trong Hình 1:

sound_dose_arch

Hình 1. Các thành phần kiến ​​trúc của đặc tính liều âm.

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 định lượng â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 điều sau:

  • Xử lý thông tin liều lượng mới
  • Duy trì giá trị liều â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 giao diện người dùng hệ thống
  • Giảm âm lượng

Trình quản lý SoundDose

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 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 đượ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 MelProcessorMelAggregator trong libaudioutils sẽ được sử dụng để tính toán liều âm thanh bên trong.

Trong lớp MelProcessor , tính toán chính được thực hiện trên bộ đệm có mẫu âm thanh bằng cách gọi MelProcessor::process(const void* buffer, size_t bytes) . Cá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ừ các cổng âm thanh khác nhau và tính toán giá trị CSD trong khoảng thời gian bảy 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 để liên lạc với AudioService .

Thực hiện

Các tiện ích mở rộng giao diện HIDL không còn được dùng kể từ Android 14, do đó, 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 nhiễm, 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ó AIDL HAL âm thanh độc lập , cung cấp giao diện ISoundDoseFactory . Điều này sẽ không được dùng nữa trong tương lai.

Các phương pháp HAL để hỗ trợ liều âm thanh được thể hiện trong mẫu mã 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ề mức độ tiếp xúc tạm 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ẽ sử dụng chúng để báo cáo CSD. Nếu không triển khai lệnh gọi lại này, việc triển khai dự phòng trên AudioFlinger sẽ được sử dụng để tính toán ước tính giá trị CSD.

Hỗ trợ AIDL độc lập về 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 ISoundDoseFactory API AIDL độc lập như một giải pháp thay thế. ISoundDoseFactory sử dụng giao diện ISoundDose , như trong mẫu 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ợ liều âm thanh AIDL Audio HAL

Giao diện liều âm thanh được hỗ trợ lâu dài như một phần của AIDL Audio HAL bằng cách mở rộng giao diện IModule , như minh họa trong mẫu mã 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à sự triển khai quy định mới được mô tả trong IEC62368-1 phiên bản thứ 3 và EN50332-3, do đó 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 họ 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 (được khuyến nghị) hoặc bằng cách cung cấp triển khai liều âm thanh tùy chỉnh.

Kích hoạt tính toán liều lượng âm thanh

Theo mặc định, AOSP hỗ trợ logic an toàn thính giác để đảm bảo chứng nhận với 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 lượng âm thanh bị tắt theo mặc định.

Hãy sử dụng các nguyên tắc sau để bật tính toán liều lượng âm thanh bắt đầu bằng Android 14-QPR1.

  • Nếu các quy định về liều lượng âm thanh được thực thi ở quốc gia của bạn, hãy kiểm tra xem config_safe_media_volume_enabled trong config.xml có được đặt thành true .

  • Để tuân thủ EN50332-3 và IEC62368-1 10.6.3, nhà cung cấp phải phủ cờ config_safe_sound_dosage_enabled trong config.xml thành true . Đố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 , không được đặt config_safe_sound_dosage_enabled thành true . Trong những trường hợp như vậy, việc đặt config_safe_sound_dosage_enabled thành true có thể dẫn đến 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 thính giác an toàn.

Biểu đồ quyết định sau đây mô tả logic xác định xem liệu CSD hoặc mức an toàn thính giác cũ (được triển khai trước Android 14) có được tính toán hay không, dựa trên các giới hạn quốc gia và giá trị của cờ.

enable_csd

Hình 2. Kích hoạt tính toán liều lượng âm thanh (logic được thêm vào Android 14-QPR1).

Thẩm định

Khi triển khai giao diện HAL cho liều âm thanh, OEM phải xác thực dựa trên các trường hợp thử nghiệm VTS được xác định bởi VtsHalAudioCoreTargetTest để triển khai IModule AIDL Audio HAL hoặc bởi VtsHalSoundDoseFactoryTargetTest để triển khai AIDL HAL liều âm thanh độc lập.