Dose sonora

Android 14 fornisce supporto per la dose sonora nel framework audio e nell'HAL audio monitorando continuamente le misurazioni della dose sonora e inviando avvisi agli utenti sui livelli di esposizione dannosi.

La dose sonora è una misurazione dei livelli di pressione sonora in un periodo di tempo. Monitorando la dose sonora, possiamo aiutare a proteggere gli utenti dagli effetti dannosi di un'esposizione sonora eccessiva o prolungata, offrendo così una migliore protezione dell'udito quando si utilizzano le cuffie su dispositivi Android portatili e riducendo al minimo la possibilità di problemi all'udito.

I nuovi standard per i dispositivi di ascolto sicuro sono conformi ai requisiti normativi per la protezione dell'udito in IEC62368-1 3a edizione (richiede login) e EN50332-3 (accesso limitato agli abbonati), che introducono il concetto di dose sonora.

La funzione di dose del suono consente agli OEM di seguire le nuove norme sulla sicurezza dell'udito. Per supportare la dose sonora, gli OEM devono seguire le specifiche e le normative di interfaccia per tutte le personalizzazioni e certificazioni. Un'implementazione OEM personalizzata può ignorare o modificare l'implementazione predefinita AOSP della dose sonora. Tuttavia, si consiglia vivamente di utilizzare l'implementazione AOSP.

Calcolo della dose sonora

Gli standard IEC62368-1 3a edizione e EN50332-3 aumentano la precisione della misurazione dell'esposizione sonora calcolando la dose sonora calcolata (CSD). La CSD viene calcolata integrando i livelli di esposizione momentanea (MEL) nel tempo. Per il calcolo della dose sonora viene mantenuta una finestra continua di sette giorni di valori CSD accumulati.

In conformità con la sezione 10.6.3.2 della terza edizione IEC62368-1, se il valore CSD raggiunge il limite del 100%, il sistema avvisa l'utente sui livelli sonori ad ogni aumento del 100%. Se l'utente non riconosce l'avviso, il volume si abbassa al valore predefinito della sorgente di energia radiante classe 1 (RS1) della Tabella 39 della norma IEC62368-1.

Come menzionato nella sezione 10.6.3.3 della terza edizione di IEC62368-1, insieme agli avvisi sulla dose sonora, il sistema deve avviare un avviso basato sull'esposizione ogni volta che il valore MEL supera il valore della sorgente di energia radiante classe 2 (RS2) della Tabella 39 di IEC62368 -1.

Per la certificazione con queste normative e per rendere i valori CSD più rilevanti, il sistema deve utilizzare valori di output accurati percepiti dagli utenti (come l'output di riproduzione multimediale). È importante che il calcolo CSD utilizzi valori vicini ai livelli effettivi di pressione sonora a cui è esposto l'utente.

Architettura

A seconda di dove vengono catturati i fotogrammi, le caratteristiche hardware e gli effetti dei trasduttori possono influenzare il livello di potenza dei fotogrammi renderizzati. Per avere una misurazione precisa del livello di pressione sonora in uscita, abbiamo esteso l'HAL per ottenere i valori MEL direttamente dall'hardware sottostante e tenere conto dei possibili effetti applicati dal processore di segnale digitale (DSP) o dalle proprietà degli altoparlanti, come impedenza, sensibilità, e risposta in frequenza.

Se l'HAL non può fornire valori MEL, come meccanismo di fallback, il framework audio analizza e calcola CSD. Questo calcolo nel framework audio si basa sulle informazioni sull'output renderizzato riportato da HAL e sui frame inviati al DSP audio.

Sounddose introduce due componenti, SoundDoseHelper e SoundDoseManager, come mostrato nella Figura 1:

sound_dose_arch

Figura 1. Componenti architettonici della funzione di dose sonora.

SoundDoseHelper

La classe SoundDoseHelper , che risiede nel processo systemserver , è il principale punto di raccolta di tutti i dati rilevanti sul dosaggio del suono. La classe AudioService gestisce la classe SoundDoseHelper .

La classe SoundDoseHelper è responsabile di quanto segue:

  • Gestione delle nuove informazioni sul dosaggio
  • Valori di dose sonora persistenti
  • Ripristino dello stato in caso di crash audioserver
  • Attivazione delle notifiche dell'interfaccia utente del sistema
  • Abbassamento del volume

SoundDoseManager

La classe SoundDoseManager , che risiede nel processo audioserver e fa parte della classe AudioFlinger , raccoglie i dati sulla dose sonora dall'HAL o li calcola internamente, come fallback, dai frame inviati all'HAL. La classe SoundDoseManager invia i dati sulla dose sonora alla classe SoundDoseHelper .

MelProcessor e MelAggregator

Se l'HAL non può fornire valori MEL, le utilità MelProcessor e MelAggregator in libaudioutils vengono utilizzate per il calcolo della dose sonora interna.

Nella classe MelProcessor , il calcolo principale viene eseguito su un buffer con campioni audio chiamando MelProcessor::process(const void* buffer, size_t bytes) . Gli OEM possono utilizzare MelProcessor nella loro implementazione HAL, se necessario.

La classe MelAggregator riceve i valori MEL da diverse porte audio e calcola il valore CSD con una finestra mobile di sette giorni. Il metodo MelAggregator::aggregateAndAddNewMelRecord_l(MelRecord mel) esegue la logica. I risultati vengono inviati alla classe SoundDoseManager per la comunicazione con AudioService .

Implementazione

Le estensioni dell'interfaccia HIDL sono deprecate a partire da Android 14, quindi la nuova interfaccia HAL per il recupero dei valori MEL calcolati e l'emissione di avvisi di esposizione, denominata ISoundDose , è definita come parte di AIDL Audio HAL . Tuttavia, per gli implementatori che hanno bisogno di più tempo per integrare AIDL Audio HAL, abbiamo un AIDL HAL di dose sonora autonomo , che offre l'interfaccia ISoundDoseFactory . Questo verrà deprecato in futuro.

I metodi HAL per il supporto della dose sonora sono mostrati nel seguente esempio di codice:

/**
 * 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 nuova interfaccia HAL implementa callback che informano il framework sull'esposizione momentanea e fornisce valori MEL ogni volta che il livello di output supera RS1. Quando queste interfacce vengono implementate, il framework le utilizza per la rendicontazione dei CSD. Senza questa implementazione di callback, viene utilizzata un'implementazione di fallback su AudioFlinger per calcolare le stime dei valori CSD.

Supporto AIDL autonomo per dose sonora

Fino a quando gli OEM non potranno integrare la dose sonora nell'HAL audio AIDL, potranno utilizzare l'API AIDL standalone ISoundDoseFactory come soluzione alternativa. ISoundDoseFactory utilizza l'interfaccia ISoundDose , come mostrato nel seguente esempio di codice:

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

Dose sonora AIDL Supporto audio HAL

L'interfaccia della dose sonora è supportata a lungo termine come parte dell'HAL AIDL Audio estendendo l'interfaccia IModule , come mostrato nel seguente esempio di codice:

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

Questa funzionalità è un'implementazione di un nuovo regolamento descritto in IEC62368-1 3a edizione e EN50332-3, quindi non sono presenti API rivolte all'esterno.

Gli OEM possono certificare i propri dispositivi implementando le nuove interfacce HAL e fornendo dati MEL accurati per CSD al framework audio (consigliato) o fornendo un'implementazione personalizzata della dose sonora.

Abilita il calcolo della dose sonora

Per impostazione predefinita, AOSP supporta la logica di sicurezza dell'udito che garantisce la certificazione con gli standard EN50332-2 e IEC62368-1 10.6.5 esistenti.

In Android 14, il calcolo della dose sonora è disabilitato per impostazione predefinita.

Utilizzare le seguenti linee guida per abilitare il calcolo della dose sonora a partire da Android 14-QPR1.

  • Se nel tuo Paese vengono applicate le normative sulla dose sonora, controlla se config_safe_media_volume_enabled in config.xml è impostato su true .

  • Per essere conformi a EN50332-3 e IEC62368-1 10.6.3, i fornitori devono sovrapporre il flag config_safe_sound_dosage_enabled in config.xml a true . Per i dispositivi che supportano la decodifica dell'offload e non implementano le interfacce HAL sound dose , config_safe_sound_dosage_enabled non deve essere impostato su true . In questi casi, l'impostazione config_safe_sound_dosage_enabled su true può portare a valori CSD imprecisi e problemi di certificazione per gli standard di sicurezza acustica.

Il seguente grafico decisionale descrive la logica che determina se, in base alle restrizioni nazionali e ai valori dei flag, vengono calcolati il ​​CSD o i livelli di sicurezza uditiva legacy (implementati prima di Android 14).

enable_csd

Figura 2. Abilita il calcolo della dose sonora (la logica è stata aggiunta in Android 14-QPR1).

Validazione

Quando si implementa l'interfaccia HAL per la dose sonora, gli OEM devono eseguire la convalida rispetto ai test case VTS definiti da VtsHalAudioCoreTargetTest per l'implementazione IModule AIDL Audio HAL o da VtsHalSoundDoseFactoryTargetTest per l'implementazione standalone AIDL HAL della dose sonora.