Độ sáng

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 cường độ âm thanh, chúng tôi có thể giúp bảo vệ người dùng khỏi các tác động 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ừ đó bảo vệ thính giác tốt hơn khi sử dụng tai nghe trên các 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 quy định về việc 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ỉ dành cho người đăng ký), trong đó 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. Phương thức triển khai OEM tuỳ chỉnh có thể bỏ qua hoặc sửa đổi phương thức triển khai mặc định của AOSP (Dự án nguồn mở Android) về cường độ âm thanh. Tuy nhiên, bạn nên sử dụng phương thức triển khai AOSP.

Tính toán cường độ â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 được 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 đ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 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. Việc 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 hình được gửi đến DSP âm thanh.

Sound dose giới thiệu hai thành phần là SoundDoseHelperSoundDoseManager, như trong Hình 1:

sound_dose_arch

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 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 MelProcessorMelAggregator 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 một 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ư trong mã mẫu sau đây:

@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ó.

Trên Android 14, tính năng tính toán cường độ âm thanh sẽ 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 â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 trong config.xml có được đặt thành true 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 trong config.xml vào true. Đối với các thiết bị hỗ trợ giải mã tải xuống và không triển khai giao diện HAL liều âm thanh, config_safe_sound_dosage_enabled không được đặt 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 các giá trị CSD không chính xác và các vấn đề về chứng nhận đối với các 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ế 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.

enable_csd

Hình 2. Cho phép tính toán cườ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 cường độ âm thanh, 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 để triển khai IModule AIDL Audio HAL hoặc bằng cách VtsHalSoundDoseFactoryTargetTest triển khai AIDL HAL với liều âm thanh độc lập.