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

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

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

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

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

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

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

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

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

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

Архитектура

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

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

Функция Sound Dos включает два компонента: 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. Без реализации этих функций обратного вызова используется резервная реализация в AudioFlinger для расчета оценок значений CSD.

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

Пока производители оборудования не смогут интегрировать функцию дозирования звука в аудиоинтерфейс AIDL, они могут использовать автономный API AIDL 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);
}

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

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