Доза звука

В Android 14 поддерживается измерение звукового воздействия в аудиофреймворке и Audio HAL. Система постоянно отслеживает уровень звукового воздействия и предупреждает пользователей о его опасности.

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

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

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

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

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

В соответствии с разделом 10.6.3.2 стандарта IEC62368-1 (третье издание), если значение 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, и фреймах, отправленных на аудиопроцессор.

Доза звука состоит из двух компонентов: SoundDoseHelper и SoundDoseManager, (см. рис. 1).

sound_dose_arch

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

SoundDoseHelper

Класс 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). При необходимости производители оригинального оборудования могут использовать 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 для дозы звука

Пока производители не могут интегрировать дозу звука в 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);
}

Поддержка HAL звуковой дозы AIDL Audio

Интерфейс дозы звука поддерживается в долгосрочной перспективе как часть 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 (3-е издание) и EN50332-3, поэтому внешние API не используются.

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

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

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

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

Чтобы включить расчет дозы звука, следуйте инструкциям ниже. Эта функция доступна на устройствах с Android 14 QPR1 и более поздних версий.

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

  • Чтобы соответствовать требованиям 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 для дозы звука производители оригинального оборудования должны проверять его на соответствие тестовым случаям VTS, определенным VtsHalAudioCoreTargetTest для реализации IModule AIDL Audio HAL или VtsHalSoundDoseFactoryTargetTest для реализации автономного AIDL HAL дозы звука.