Android 14 brinda soporte para dosis de sonido en el marco de audio y Audio HAL al monitorear continuamente las mediciones de dosis de sonido y emitir advertencias a los usuarios sobre niveles de exposición dañinos.
La dosis de sonido es una medida de los niveles de presión sonora durante un período de tiempo. Al monitorear la dosis de sonido, podemos ayudar a proteger a los usuarios de los efectos dañinos de una exposición excesiva o prolongada al sonido, ofreciendo así una mejor protección auditiva cuando usan auriculares en dispositivos Android portátiles y minimizando la posibilidad de sufrir una discapacidad auditiva.
Los nuevos estándares para dispositivos de escucha seguros cumplen con los requisitos reglamentarios para protección auditiva en IEC62368-1 3.ª edición (requiere inicio de sesión) y EN50332-3 (acceso limitado a suscriptores), que introducen el concepto de dosis de sonido.
La función de dosis de sonido permite a los fabricantes de equipos originales seguir las nuevas normas de seguridad auditiva. Para admitir la dosis de sonido, los OEM deben seguir las especificaciones y regulaciones de la interfaz para todas las personalizaciones y certificaciones. Una implementación OEM personalizada puede omitir o modificar la implementación predeterminada de dosis de sonido de AOSP. Sin embargo, se recomienda encarecidamente utilizar la implementación de AOSP.
Cálculo de dosis de sonido.
Los estándares IEC62368-1, tercera edición y EN50332-3 aumentan la precisión de la medición de la exposición al sonido al calcular la dosis de sonido calculada (CSD). La CSD se calcula integrando los niveles de exposición momentánea (MEL) a lo largo del tiempo. Se mantiene una ventana continua de siete días de valores CSD acumulados para el cálculo de la dosis de sonido.
De acuerdo con la sección 10.6.3.2 de IEC62368-1 3.ª edición, si el valor de CSD alcanza el límite del 100%, el sistema alerta al usuario sobre los niveles de sonido en cada aumento del 100%. Si el usuario no reconoce la advertencia, el volumen disminuye al valor predefinido de fuente de energía de radiación clase 1 (RS1) de la Tabla 39 de IEC62368-1.
Como se menciona en la sección 10.6.3.3 de IEC62368-1, tercera edición, junto con las advertencias de dosis de sonido, el sistema debe iniciar una advertencia basada en la exposición cada vez que el valor MEL excede el valor de la fuente de energía de radiación clase 2 (RS2) de la Tabla 39 de IEC62368. -1.
Para obtener la certificación con estas regulaciones y hacer que los valores CSD sean más relevantes, el sistema debe utilizar valores de salida precisos tal como los perciben los usuarios (como la salida de reproducción multimedia). Es importante para el cálculo de CSD utilizar valores cercanos a los niveles reales de presión sonora a los que está expuesto el usuario.
Arquitectura
Dependiendo de dónde se capturen los fotogramas, las características del hardware y los efectos de los transductores pueden influir en el nivel de potencia de los fotogramas renderizados. Para tener una medición precisa del nivel de presión del sonido de salida, ampliamos el HAL para obtener los valores MEL directamente del hardware subyacente y tener en cuenta los posibles efectos que aplica el procesador de señal digital (DSP) o las propiedades de los altavoces, como la impedancia, la sensibilidad, y respuesta de frecuencia.
Si HAL no puede proporcionar valores MEL, como mecanismo alternativo, el marco de audio analiza y calcula CSD. Este cálculo en el marco de audio se basa en la información sobre la salida renderizada reportada por HAL y los fotogramas que se envían al DSP de audio.
Sound Dose presenta dos componentes, SoundDoseHelper
y SoundDoseManager,
como se muestra en la Figura 1:
Figura 1. Componentes arquitectónicos de la función de dosis de sonido.
Ayudante de dosis de sonido
La clase SoundDoseHelper
, que reside en el proceso systemserver
, es el principal punto de recopilación de todos los datos relevantes de dosificación de sonido. La clase AudioService
gestiona la clase SoundDoseHelper
.
La clase SoundDoseHelper
es responsable de lo siguiente:
- Manejo de nueva información de dosificación
- Valores de dosis de sonido persistente
- Recuperando el estado en caso de falla
audioserver
- Activación de notificaciones de la interfaz de usuario del sistema
- Bajar el volumen
Administrador de dosis de sonido
La clase SoundDoseManager
, que reside en el proceso audioserver
y es parte de la clase AudioFlinger
, recopila los datos de dosis de sonido del HAL o los calcula internamente, como respaldo, a partir de las tramas enviadas al HAL. La clase SoundDoseManager
envía los datos de dosis de sonido a la clase SoundDoseHelper
.
MelProcessor y MelAggregator
Si HAL no puede proporcionar valores MEL, las utilidades MelProcessor
y MelAggregator
en libaudioutils
se utilizan para el cálculo interno de la dosis de sonido.
En la clase MelProcessor
, el cálculo principal se realiza en un búfer con muestras de audio llamando MelProcessor::process(const void* buffer, size_t bytes)
. Los OEM pueden utilizar MelProcessor
en su implementación HAL si es necesario.
La clase MelAggregator
recibe los valores MEL de diferentes puertos de audio y calcula el valor CSD con una ventana móvil de siete días. El método MelAggregator::aggregateAndAddNewMelRecord_l(MelRecord mel)
ejecuta la lógica. Los resultados se envían a la clase SoundDoseManager
para comunicarse con AudioService
.
Implementación
Las extensiones de interfaz HIDL están obsoletas a partir de Android 14, por lo que la nueva interfaz HAL para recuperar valores MEL calculados y emitir advertencias de exposición, denominada ISoundDose
, se define como parte de AIDL Audio HAL . Sin embargo, para los implementadores que necesitan más tiempo para integrar AIDL Audio HAL, tenemos una dosis de sonido independiente AIDL HAL , que ofrece la interfaz ISoundDoseFactory
. Esto quedará obsoleto en el futuro.
Los métodos HAL para el soporte de dosis de sonido se muestran en el siguiente código de ejemplo:
/**
* 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);
}
}
La nueva interfaz HAL implementa devoluciones de llamada que informan al marco sobre la exposición momentánea y proporciona valores MEL cada vez que el nivel de salida excede RS1. Cuando se implementan estas interfaces, el marco las utiliza para los informes CSD. Sin esta implementación de devolución de llamada, se utiliza una implementación alternativa en AudioFlinger
para calcular estimaciones de los valores de CSD.
Soporte AIDL independiente de dosis de sonido
Hasta que los OEM puedan integrar la dosis de sonido en el HAL de audio AIDL, pueden utilizar la API AIDL independiente ISoundDoseFactory
como solución alternativa. ISoundDoseFactory
utiliza la interfaz ISoundDose
, como se muestra en el siguiente ejemplo de código:
@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);
}
Dosis de sonido AIDL Audio HAL soporte
La interfaz de dosis de sonido se admite a largo plazo como parte de AIDL Audio HAL ampliando la interfaz IModule
, como se muestra en el siguiente ejemplo de código:
@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();
}
Esta característica es una implementación de una nueva regulación descrita en IEC62368-1, tercera edición y EN50332-3, por lo que no hay API externas.
Los OEM pueden certificar sus dispositivos implementando las nuevas interfaces HAL y proporcionando datos MEL precisos para CSD al marco de audio (recomendado), o proporcionando una implementación de dosis de sonido personalizada.
Habilitar el cálculo de la dosis de sonido.
De forma predeterminada, AOSP admite la lógica de seguridad auditiva que garantiza la certificación con los estándares EN50332-2 e IEC62368-1 10.6.5 existentes.
En Android 14, el cálculo de la dosis de sonido está deshabilitado de forma predeterminada.
Utilice las siguientes pautas para habilitar el cálculo de la dosis de sonido a partir de Android 14-QPR1.
Si en su país se aplican las regulaciones de dosis de sonido, verifique si
config_safe_media_volume_enabled
enconfig.xml
está configurado entrue
.Para cumplir con EN50332-3 e IEC62368-1 10.6.3, los proveedores deben superponer el indicador
config_safe_sound_dosage_enabled
enconfig.xml
true
. Para dispositivos que admiten decodificación de descarga y no implementan las interfaces HAL de dosis de sonido ,config_safe_sound_dosage_enabled
no debe configurarse entrue
. En tales casos, configurarconfig_safe_sound_dosage_enabled
entrue
puede generar valores CSD inexactos y problemas de certificación para los estándares auditivos de seguridad.
El siguiente gráfico de decisión describe la lógica que determina si, según las restricciones del país y los valores de las banderas, se calculan el CSD o los niveles de seguridad auditiva heredados (implementados antes de Android 14).
Figura 2. Habilite el cálculo de la dosis de sonido (la lógica se agrega en Android 14-QPR1).
Validación
Al implementar la interfaz HAL para dosis de sonido, los OEM deben validar con los casos de prueba VTS definidos por VtsHalAudioCoreTargetTest
para la implementación de IModule AIDL Audio HAL, o por VtsHalSoundDoseFactoryTargetTest
para la implementación independiente de dosis de sonido AIDL HAL.