Звуковая доза

Android 14 обеспечивает поддержку дозы звука в аудиосистеме и Audio HAL, постоянно отслеживая измерения дозы звука и выдавая предупреждения пользователям о вредных уровнях воздействия.

Звуковая доза – это измерение уровней звукового давления за определенный период времени. Контролируя дозу звука, мы можем помочь защитить пользователей от вредного воздействия чрезмерного или длительного воздействия звука, тем самым обеспечивая лучшую защиту органов слуха при использовании наушников на портативных устройствах Android и сводя к минимуму вероятность ухудшения слуха.

Новые стандарты для безопасных устройств прослушивания соответствуют нормативным требованиям по защите органов слуха в IEC62368-1, 3-е издание (требуется вход в систему) и EN50332-3 (доступ ограничен для подписчиков), которые вводят концепцию звуковой дозы.

Функция звуковой дозы позволяет OEM-производителям соблюдать новые правила безопасности слуха. Чтобы поддерживать звуковую дозу, OEM-производители должны соблюдать спецификации и правила интерфейса для всех настроек и сертификации. Настроенная OEM-реализация может обойти или изменить стандартную реализацию звуковой дозы AOSP. Однако настоятельно рекомендуется использовать реализацию AOSP.

Расчет дозы звука

Стандарты IEC62368-1 (3-е издание) и EN50332-3 повышают точность измерения звукового воздействия за счет расчета расчетной звуковой дозы (CSD). CSD рассчитывается путем интегрирования уровней мгновенного воздействия (MEL) с течением времени. Для расчета звуковой дозы поддерживается семидневное непрерывно меняющееся окно накопленных значений CSD.

В соответствии с разделом 10.6.3.2 стандарта IEC62368-1 3-го издания, если значение CSD достигает предела 100 %, система предупреждает пользователя об уровнях звука при каждом увеличении на 100 %. Если пользователь не подтверждает предупреждение, громкость снижается до заранее заданного значения источника энергии излучения класса 1 (RS1), указанного в таблице 39 стандарта IEC62368-1.

Как упоминалось в разделе 10.6.3.3 третьего издания IEC62368-1, наряду с предупреждениями о дозе звука система должна инициировать предупреждение на основе воздействия каждый раз, когда значение MEL превышает значение источника энергии излучения класса 2 (RS2), указанное в таблице 39 стандарта IEC62368. -1.

Для сертификации в соответствии с этими правилами и для того, чтобы значения CSD были более актуальными, система должна использовать точные выходные значения, воспринимаемые пользователями (например, выходные данные воспроизведения мультимедиа). Для расчета CSD важно использовать значения, близкие к фактическим уровням звукового давления, воздействию которого подвергается пользователь.

Архитектура

В зависимости от того, где захватываются кадры, характеристики оборудования и эффекты преобразователей могут влиять на уровень мощности визуализируемых кадров. Чтобы обеспечить точное измерение уровня выходного звукового давления, мы расширили HAL, чтобы получать значения MEL непосредственно от базового оборудования и учитывать возможные эффекты, которые применяются процессором цифровых сигналов (DSP) или свойствами динамиков, такими как импеданс, чувствительность, и частотная характеристика.

Если HAL не может предоставить значения MEL, в качестве резервного механизма звуковая платформа анализирует и вычисляет CSD. Эти вычисления в аудиоструктуре основаны на информации о визуализированном выходе, сообщаемой из HAL, и кадрах, которые отправляются в аудио DSP.

Sound Dose представляет два компонента: SoundDoseHelper и SoundDoseManager, как показано на рисунке 1:

sound_dose_arch

Рисунок 1. Архитектурные компоненты функции дозы звука.

ЗвукДозаПомощник

Класс SoundDoseHelper , который находится в процессе systemserver , является основной точкой сбора всех соответствующих данных о дозировании звука. Класс AudioService управляет классом SoundDoseHelper .

Класс SoundDoseHelper отвечает за следующее:

  • Обработка новой информации о дозировке
  • Значения постоянной звуковой дозы
  • Восстановление состояния в случае сбоя audioserver
  • Запуск уведомлений системного пользовательского интерфейса
  • Уменьшение громкости

SoundDoseManager

Класс SoundDoseManager , который находится в процессе audioserver и является частью класса AudioFlinger , собирает данные о дозе звука из HAL или вычисляет их внутри, в качестве резерва, на основе кадров, отправленных в HAL. Класс SoundDoseManager отправляет данные о дозе звука в класс SoundDoseHelper .

MelProcessor и MelAggregator

Если HAL не может предоставить значения MEL, для внутреннего расчета дозы звука используются утилиты MelProcessor и MelAggregator в libaudioutils .

В классе MelProcessor основные вычисления выполняются в буфере с аудиосэмплами путем вызова MelProcessor::process(const void* buffer, size_t bytes) . При необходимости OEM-производители могут использовать MelProcessor в своей реализации HAL.

Класс MelAggregator получает значения MEL от разных аудиопортов и вычисляет значение CSD с скользящим интервалом в семь дней. Метод MelAggregator::aggregateAndAddNewMelRecord_l(MelRecord mel) выполняет логику. Результаты отправляются в класс SoundDoseManager для связи с AudioService .

Выполнение

Расширения интерфейса HIDL устарели, начиная с Android 14, поэтому новый интерфейс HAL для получения вычисленных значений MEL и выдачи предупреждений о воздействии, называемый ISoundDose , определен как часть AIDL Audio HAL . Однако для разработчиков, которым требуется больше времени для интеграции AIDL Audio HAL, у нас есть отдельная звуковая доза AIDL HAL , которая предлагает интерфейс ISoundDoseFactory . В будущем это будет устарело.

Методы HAL для поддержки звуковой дозы показаны в следующем примере кода:

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

Новый интерфейс HAL реализует обратные вызовы , которые информируют платформу о мгновенном воздействии и предоставляют значения MEL всякий раз, когда выходной уровень превышает RS1. Когда эти интерфейсы реализованы, платформа использует их для отчетов CSD. Без этой реализации обратного вызова для расчета оценок значений CSD используется резервная реализация AudioFlinger .

Автономная поддержка звуковой дозы AIDL

Пока OEM-производители не смогут интегрировать дозу звука в AIDL audio HAL, они могут использовать автономный AIDL API ISoundDoseFactory в качестве обходного пути. ISoundDoseFactory использует интерфейс ISoundDose , как показано в следующем примере кода:

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

Звуковая доза AIDL Audio Поддержка HAL

Интерфейс звуковой дозы поддерживается в долгосрочной перспективе как часть AIDL Audio HAL путем расширения интерфейса IModule , как показано в следующем примере кода:

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

Эта функция является реализацией нового регламента, описанного в третьем издании IEC62368-1 и EN50332-3, поэтому внешние API-интерфейсы отсутствуют.

OEM-производители могут сертифицировать свои устройства, внедрив новые интерфейсы HAL и предоставив точные данные MEL для CSD в аудиоинфраструктуру (рекомендуется) или предоставив собственную реализацию дозы звука.

Включить расчет звуковой дозы

По умолчанию AOSP поддерживает логику безопасности слуха, которая обеспечивает сертификацию по существующим стандартам EN50332-2 и IEC62368-1 10.6.5.

В Android 14 расчет дозы звука отключен по умолчанию.

Используйте следующие рекомендации, чтобы включить расчет дозы звука , начиная с Android 14-QPR1.

  • Если в вашей стране действуют правила дозы звукового излучения, проверьте, установлено ли для config_safe_media_volume_enabled в config.xml значение true .

  • Чтобы соответствовать стандартам EN50332-3 и IEC62368-1 10.6.3, поставщики должны установить для флага config_safe_sound_dosage_enabled в config.xml значение true . Для устройств, которые поддерживают декодирование с разгрузкой и не реализуют интерфейсы HAL звуковой дозы , config_safe_sound_dosage_enabled не должно быть установлено значение true . В таких случаях установка для config_safe_sound_dosage_enabled значения true может привести к неточным значениям CSD и проблемам с сертификацией стандартов безопасного слуха.

На следующем графике решений описана логика, которая определяет, рассчитываются ли на основе ограничений страны и значений флагов либо CSD, либо устаревшие уровни безопасности слуха (реализованные до Android 14).

enable_csd

Рисунок 2. Включить расчет дозы звука (логика добавлена ​​в Android 14-QPR1).

Валидация

При реализации интерфейса HAL для звуковой дозы OEM-производители должны проверить соответствие тестовым примерам VTS, определенным VtsHalAudioCoreTargetTest для реализации IModule AIDL Audio HAL или VtsHalSoundDoseFactoryTargetTest для реализации автономной звуковой дозы AIDL HAL.