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, 3-е издание, наряду с предупреждениями о звуковой дозе система должна инициировать предупреждение на основе экспозиции каждый раз, когда значение MEL превышает значение источника энергии излучения класса 2 (RS2) таблицы 39 стандарта IEC62368-1.
Для сертификации в соответствии с этими нормами и повышения релевантности значений CSD система должна использовать точные выходные значения, воспринимаемые пользователями (например, выходные данные воспроизведения медиафайлов). Важно, чтобы при расчёте CSD использовались значения, близкие к фактическим уровням звукового давления, воздействию которых подвергается пользователь.
Архитектура
В зависимости от того, где записываются кадры, характеристики оборудования и эффекты преобразователей могут влиять на уровень мощности визуализированных кадров. Для точного измерения уровня выходного звукового давления мы расширили HAL, чтобы получать значения MEL непосредственно с базового оборудования и учитывать возможные эффекты, возникающие со стороны цифрового сигнального процессора (DSP) или свойств динамика, таких как импеданс, чувствительность и частотная характеристика.
Если HAL не может предоставить значения MEL, в качестве резервного механизма аудиофреймворк анализирует и вычисляет CSD. Этот расчет в аудиофреймворке основан на информации о визуализированном выходе, полученной от HAL, и кадрах, отправляемых в аудиопроцессор DSP.
Sound Dose вводит два компонента, SoundDoseHelper
и SoundDoseManager,
как показано на рисунке 1:
Рисунок 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)
. При необходимости 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 Sound Dose , предлагающий интерфейс 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 HAL, они могут использовать автономный 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);
}
Поддержка звуковой дозы 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).
Рисунок 2. Включение расчета дозы звука (логика добавлена в Android 14-QPR1).
Проверка
При реализации интерфейса HAL для измерения дозы звука производители оригинального оборудования должны выполнить проверку с использованием тестовых случаев VTS, определенных VtsHalAudioCoreTargetTest
для реализации IModule AIDL Audio HAL или VtsHalSoundDoseFactoryTargetTest
для реализации автономной дозы звука AIDL HAL.