Dosis suara

Android 14 memberikan dukungan untuk dosis suara dalam kerangka audio dan Audio HAL dengan terus memantau pengukuran dosis suara dan mengeluarkan peringatan kepada pengguna tentang tingkat paparan yang merusak.

Dosis suara adalah pengukuran tingkat tekanan suara selama periode waktu tertentu. Dengan memantau dosis suara, kami dapat membantu melindungi pengguna dari efek buruk paparan suara yang berlebihan atau berkepanjangan, sehingga menawarkan perlindungan pendengaran yang lebih baik saat menggunakan headphone di perangkat Android portabel dan meminimalkan kemungkinan gangguan pendengaran.

Standar baru untuk perangkat mendengarkan yang aman sesuai dengan persyaratan peraturan untuk perlindungan pendengaran di IEC62368-1 edisi ke-3 (memerlukan login) dan EN50332-3 (akses terbatas untuk pelanggan), yang memperkenalkan konsep dosis suara.

Fungsi dosis suara memungkinkan OEM mengikuti peraturan keselamatan pendengaran yang baru. Untuk mendukung dosis suara, OEM harus mengikuti spesifikasi antarmuka dan peraturan untuk semua penyesuaian dan sertifikasi. Implementasi OEM yang disesuaikan dapat melewati atau memodifikasi implementasi dosis suara default AOSP. Namun menggunakan implementasi AOSP sangat disarankan.

Perhitungan dosis suara

Standar dalam IEC62368-1 edisi ke-3 dan EN50332-3 meningkatkan akurasi pengukuran paparan suara dengan menghitung dosis suara terhitung (CSD). CSD dihitung dengan mengintegrasikan tingkat paparan sesaat (MEL) dari waktu ke waktu. Jendela akumulasi nilai CSD yang terus bergulir selama tujuh hari dipertahankan untuk penghitungan dosis suara.

Sesuai dengan bagian 10.6.3.2 IEC62368-1 edisi ke-3, jika nilai CSD mencapai batas 100%, sistem akan memperingatkan pengguna tentang tingkat suara pada setiap peningkatan 100%. Jika pengguna tidak menyetujui peringatan tersebut, volume akan turun ke nilai sumber energi radiasi kelas 1 (RS1) yang telah ditentukan sebelumnya pada Tabel 39 dari IEC62368-1.

Sebagaimana disebutkan dalam bagian 10.6.3.3 dari IEC62368-1 edisi ke-3, bersama dengan peringatan dosis suara, sistem harus memulai peringatan berbasis paparan setiap kali nilai MEL melebihi nilai sumber energi radiasi kelas 2 (RS2) pada Tabel 39 dari IEC62368 -1.

Untuk sertifikasi dengan peraturan ini dan untuk membuat nilai-nilai CSD lebih relevan, sistem harus menggunakan nilai keluaran yang akurat seperti yang dirasakan oleh pengguna (seperti keluaran pemutaran media). Penting bagi komputasi CSD untuk menggunakan nilai yang mendekati tingkat tekanan suara sebenarnya yang terpapar pada pengguna.

Arsitektur

Tergantung di mana frame diambil, karakteristik perangkat keras dan efek transduser dapat mempengaruhi tingkat daya frame yang dirender. Untuk mendapatkan pengukuran tingkat tekanan suara keluaran yang tepat, kami memperluas HAL untuk mendapatkan nilai MEL langsung dari perangkat keras yang mendasarinya dan memperhitungkan kemungkinan efek yang diterapkan oleh prosesor sinyal digital (DSP) atau properti speaker, seperti impedansi, sensitivitas, dan respons frekuensi.

Jika HAL tidak dapat memberikan nilai MEL, sebagai mekanisme fallback, kerangka audio menganalisis dan menghitung CSD. Perhitungan dalam kerangka audio ini didasarkan pada informasi tentang keluaran yang diberikan yang dilaporkan dari HAL, dan bingkai yang dikirim ke DSP audio.

Dosis suara memperkenalkan dua komponen, SoundDoseHelper dan SoundDoseManager, seperti yang ditunjukkan pada Gambar 1:

sound_dose_arch

Gambar 1. Komponen arsitektur fitur dosis suara.

Pembantu Dosis Suara

Kelas SoundDoseHelper , yang berada dalam proses systemserver , adalah titik pengumpulan utama untuk semua data takaran suara yang relevan. Kelas AudioService mengelola kelas SoundDoseHelper .

Kelas SoundDoseHelper bertanggung jawab untuk hal berikut:

  • Menangani informasi dosis baru
  • Nilai dosis suara yang bertahan
  • Memulihkan status jika terjadi kerusakan audioserver
  • Memicu notifikasi UI Sistem
  • Menurunkan volume

Manajer Dosis Suara

Kelas SoundDoseManager , yang berada dalam proses audioserver dan merupakan bagian dari kelas AudioFlinger , mengumpulkan data dosis suara dari HAL atau menghitungnya secara internal, sebagai cadangan, dari frame yang dikirim ke HAL. Kelas SoundDoseManager mengirimkan data dosis suara ke kelas SoundDoseHelper .

MelProcessor dan MelAggregator

Jika HAL tidak dapat memberikan nilai MEL, utilitas MelProcessor dan MelAggregator di libaudioutils digunakan untuk penghitungan dosis suara internal.

Di kelas MelProcessor , komputasi utama dilakukan pada buffer dengan sampel audio dengan memanggil MelProcessor::process(const void* buffer, size_t bytes) . OEM dapat menggunakan MelProcessor dalam implementasi HAL mereka jika diperlukan.

Kelas MelAggregator menerima nilai MEL dari port audio yang berbeda dan menghitung nilai CSD dengan jangka waktu tujuh hari. Metode MelAggregator::aggregateAndAddNewMelRecord_l(MelRecord mel) mengeksekusi logika. Hasilnya dikirim ke kelas SoundDoseManager untuk komunikasi dengan AudioService .

Penerapan

Ekstensi antarmuka HIDL tidak digunakan lagi mulai Android 14, sehingga antarmuka HAL baru untuk mengambil nilai MEL yang dihitung dan mengeluarkan peringatan paparan, bernama ISoundDose , didefinisikan sebagai bagian dari AIDL Audio HAL . Namun, bagi pelaksana yang memerlukan lebih banyak waktu untuk mengintegrasikan AIDL Audio HAL, kami memiliki AIDL HAL dosis suara mandiri , yang menawarkan antarmuka ISoundDoseFactory . Ini tidak akan digunakan lagi di masa depan.

Metode HAL untuk dukungan dosis suara ditunjukkan dalam contoh kode berikut:

/**
 * 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);
    }
}

Antarmuka HAL baru mengimplementasikan callback yang menginformasikan kerangka kerja tentang paparan sesaat dan memberikan nilai MEL setiap kali tingkat keluaran melebihi RS1. Ketika antarmuka ini diimplementasikan, kerangka kerja menggunakannya untuk pelaporan CSD. Tanpa implementasi callback ini, implementasi fallback pada AudioFlinger digunakan untuk menghitung estimasi nilai CSD.

Dukungan AIDL mandiri dosis suara

Hingga OEM dapat mengintegrasikan dosis suara dalam audio HAL AIDL, mereka dapat menggunakan AIDL API ISoundDoseFactory mandiri sebagai solusinya. ISoundDoseFactory menggunakan antarmuka ISoundDose , seperti yang ditunjukkan dalam contoh kode berikut:

@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);
}

Dukungan AIDL Audio HAL dosis suara

Antarmuka dosis suara didukung jangka panjang sebagai bagian dari AIDL Audio HAL dengan memperluas antarmuka IModule , seperti yang ditunjukkan dalam contoh kode berikut:

@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();
}

Fitur ini merupakan implementasi peraturan baru yang dijelaskan dalam IEC62368-1 edisi ke-3 dan EN50332-3, sehingga tidak ada API yang berhubungan dengan eksternal.

OEM dapat mensertifikasi perangkat mereka dengan menerapkan antarmuka HAL baru dan menyediakan data MEL yang akurat untuk CSD ke kerangka audio (disarankan), atau dengan menyediakan penerapan dosis suara khusus.

Aktifkan perhitungan dosis suara

Secara default, AOSP mendukung logika keselamatan pendengaran yang memastikan sertifikasi dengan standar EN50332-2 dan IEC62368-1 10.6.5 yang ada.

Di Android 14, penghitungan dosis suara dinonaktifkan secara default.

Gunakan panduan berikut untuk mengaktifkan penghitungan dosis suara yang dimulai dengan Android 14-QPR1.

  • Jika peraturan dosis yang tepat diberlakukan di negara Anda, periksa apakah config_safe_media_volume_enabled di config.xml disetel ke true .

  • Agar sesuai dengan EN50332-3 dan IEC62368-1 10.6.3, vendor harus melapisi tanda config_safe_sound_dosage_enabled di config.xml menjadi true . Untuk perangkat yang mendukung decoding offload dan tidak mengimplementasikan antarmuka HAL dosis suara , config_safe_sound_dosage_enabled tidak boleh disetel ke true . Dalam kasus seperti ini, menyetel config_safe_sound_dosage_enabled ke true dapat menyebabkan nilai CSD yang tidak akurat dan masalah sertifikasi untuk standar keselamatan pendengaran.

Grafik keputusan berikut menjelaskan logika yang menentukan apakah, berdasarkan batasan negara dan nilai bendera, CSD atau tingkat keamanan pendengaran lama (yang diterapkan sebelum Android 14) dihitung.

enable_csd

Gambar 2. Mengaktifkan penghitungan dosis suara (logikanya ditambahkan di Android 14-QPR1).

Validasi

Saat mengimplementasikan antarmuka HAL untuk dosis suara, OEM harus memvalidasi terhadap kasus uji VTS yang ditentukan oleh VtsHalAudioCoreTargetTest untuk implementasi IModule AIDL Audio HAL, atau dengan VtsHalSoundDoseFactoryTargetTest untuk implementasi AIDL HAL dosis suara mandiri.