Độ sáng

Android 14 hỗ trợ mức â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 cường độ â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à chỉ số đo 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 gây hại của tiếp xúc với âm thanh quá nhiều hoặc kéo dài, nhờ đó bảo vệ thính giác tốt hơn khi dùng tai nghe trên thiết bị Android di động và giảm thiểu khả năng suy giảm thính lực.

Những tiêu chuẩn mới về thiết bị nghe an toàn tuân theo quy định yêu cầu 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 chỉ giới hạn ở người đăng ký), giới thiệu khái niệm về cường độ âm thanh.

Chức năng liều âm thanh cho phép OEM tuân thủ các quy định mới về an toàn thính giác. Người nhận hỗ trợ liều âm thanh, OEM phải tuân thủ quy định và thông số kỹ thuật về giao diện đối với tất cả các danh mục tuỳ chỉnh và chứng chỉ. Triển khai OEM tuỳ chỉnh có thể bỏ qua hoặc sửa đổi cách 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 (Dự án nguồn mở Android).

Tính toán cường độ âm thanh

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

Theo mục 10.6.3.2 của IEC62368-1 thứ 3 nếu giá trị CSD đạt đến giới hạn 100%, hệ thống thông báo cho 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 giảm xuống mức bức xạ định sẵn giá trị nguồn năng lượng cấp 1 (RS1) của 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 âm thanh hệ thống phải bắt đầu cảnh báo dựa trên mức chịu tiếng ồn mỗi khi Giá trị MEL vượt quá giá trị nguồn năng lượng bức xạ cấp 2 (RS2) của Bảng 39 của IEC62368-1.

Để chứng nhận tuân thủ các quy định này và tăng giá trị của CSD phù hợp, thì 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 đa phương tiện). Điều quan trọng là việc tính toán CSD 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 bị lộ.

Kiến trúc

Tuỳ thuộc vào nơi khung hình được chụp, đặ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 kết xuất. Để có một phép đo mức áp suất âm thanh đầu ra chính xác, chúng tôi đã mở rộng HAL để có các giá trị MEL trực tiếp từ phần cứng cơ bản và tính đến khả năng các hiệu ứng được áp dụng bởi bộ xử lý tín hiệu kỹ thuật số (DSP) hoặc loa như trở kháng, độ nhạy và đáp ứng tần số.

Nếu HAL không thể cung cấp giá trị MEL (như một cơ chế dự phòng) thì âm thanh khung sẽ phân tích và tính toán CSD. 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.

Mức độ âm thanh giới thiệu 2 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 tính năng cường độ âm thanh.

Trình trợ giúp SoundDoseHelper

Lớp SoundDoseHelper nằm trong quy trình systemserver điểm thu thập chính cho tất cả dữ liệu định lượng âm thanh có liên quan. AudioService lớp sẽ 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
  • Duy trì các giá trị về cường độ âm thanh
  • Khôi phục trạng thái trong trường hợp xảy ra 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à thuộc AudioFlinger thu thập dữ liệu cường độ âm thanh từ HAL hoặc tính toán 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 về cường độ âm thanh vào lớp SoundDoseHelper.

MelProcessor và MelAggregator

Nếu HAL không thể cung cấp giá trị MEL, thì MelProcessorMelAggregator phần mềm tiện ích ở libaudioutils được dùng để tính toán cườ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 vùng đệm có mẫu âm thanh bằng cách gọi MelProcessor::process(const void* buffer, size_t bytes). OEM có thể sử dụng MelProcessor trong quá trình triển khai HAL (Lớp trừu tượng phần cứng) nếu cần.

Lớp MelAggregator nhận các giá trị MEL từ nhiều cổng âm thanh và tính giá trị CSD trong khoảng thời gian luân phiên là 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 cho giao tiếp với AudioService.

Triển khai

Kể từ Android 14, các tiện ích giao diện HIDL sẽ không được dùng nữa nên giao diện HAL mới để truy xuất các giá trị MEL đã tính toán và cấp độ phơi sáng cảnh báo, có tên ISoundDose, được xác định là một phần của HAL Âm thanh AIDL. Tuy nhiên, dành cho những người triển khai cần thêm thời gian để tích hợp lớp trừu tượng phần cứng (HAL) cho âm thanh AIDL, chúng tôi có AIDL HAL dạng âm thanh độc lập, cung cấp ISoundDoseFactory. Đây sẽ là không được dùng nữa trong tương lai.

Các phương pháp HAL để hỗ trợ cường độ âm thanh được thể hiện trong mã sau mẫu:

/**
 * 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 giúp hệ thống thông báo về phơi nhiễm 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 này 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, phương thức triển khai dự phòng trên AudioFlinger được dùng để tính toán giá trị ước tính của CSD.

Hỗ trợ AIDL độc lập có cường độ âm thanh

Cho đến khi OEM có thể tích hợp cường độ âm thanh vào HAL âm thanh AIDL, họ có thể sử dụng API AIDL độc lập ISoundDoseFactory để khắc phục vấn đề này. ISoundDoseFactory sử dụng giao diện ISoundDose, như minh hoạ 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ợ lớp trừu tượng phần cứng (HAL) cho âm thanh AIDL cường độ âm thanh

Giao diện cường âm thanh được hỗ trợ lâu dài như một phần của AIDL Audio HAL (Lớp trừu tượng phần cứng) mở rộng giao diện IModule, như 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à hoạt động 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 ngoài.

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 cung cấp cách triển khai liều âm thanh tuỳ chỉnh.

Bật tính năng tính toán cường độ âm thanh

Theo mặc định, AOSP hỗ trợ logic an toàn về thính giác để đảm bảo việc chứng nhận dựa trên 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 bị tắt theo mặc định.

Làm theo các nguyên tắc sau để bật tính năng tính toán cường độ âm thanh kể từ Android 14-QPR1.

  • Nếu các quy định về cườ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 đặt thành true.

  • Để tuân thủ EN50332-3 và IEC62368-1 10.6.3, nhà cung cấp phải sử dụng lớp phủ cờ config_safe_sound_dosage_enabledconfig.xml đến true. Đối với các thiết bị hỗ trợ giải mã giảm tải nhưng không triển khai giao diện HAL có cường độ â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 CSD không chính xác các vấn đề về chứng nhận và giá trị liên quan đến 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 liệu, dựa trên các quy định hạn chế theo quốc gia và giá trị của cờ, hoặc là CSD hoặc phiên bản cũ các mức độ an toàn về thính giác (triển khai trước Android 14) được tính toán.

enable_csd

Hình 2. Cho phép tính toán cường độ âm thanh (logic được thêm vào trong Android 14-QPR1).

Xác nhận kết quả

Khi triển khai giao diện HAL để đo lường cường độ âm thanh, OEM phải xác thực dựa trên các trường hợp kiểm tra VTS do VtsHalAudioCoreTargetTest xác định để triển khai lớp trừu tượng phần cứng (HAL) cho âm thanh IModule AIDL hoặc bằng cách VtsHalSoundDoseFactoryTargetTest để triển khai AIDL HAL với liều âm thanh độc lập.