Dawka dźwiękowa

Android 14 zapewnia obsługę dawki dźwięku w środowisku audio i Audio HAL, stale monitorując pomiary dawki dźwięku i wysyłając ostrzeżenia użytkownikom o szkodliwych poziomach narażenia.

Dawka dźwiękowa to miara poziomu ciśnienia akustycznego w pewnym okresie czasu. Monitorując dawkę dźwięku, możemy pomóc chronić użytkowników przed szkodliwymi skutkami nadmiernego lub długotrwałego narażenia na dźwięk, zapewniając w ten sposób lepszą ochronę słuchu podczas korzystania ze słuchawek na przenośnych urządzeniach z systemem Android i minimalizując ryzyko uszkodzenia słuchu.

Nowe standardy dotyczące bezpiecznych urządzeń słuchowych są zgodne z wymaganiami regulacyjnymi dotyczącymi ochrony słuchu zawartymi w IEC62368-1, wydanie 3 (wymaga logowania) i EN50332-3 (dostęp ograniczony dla abonentów), które wprowadzają pojęcie dawki dźwięku.

Funkcja dawki dźwięku umożliwia producentom OEM przestrzeganie nowych przepisów dotyczących bezpieczeństwa słuchu. Aby zapewnić dawkę dźwięku, producenci OEM muszą przestrzegać specyfikacji interfejsu i przepisów w przypadku wszystkich dostosowań i certyfikatów. Dostosowana implementacja OEM może ominąć lub zmodyfikować domyślną implementację dawki dźwięku AOSP. Jednakże zdecydowanie zalecane jest korzystanie z implementacji AOSP.

Obliczanie dawki dźwięku

Normy zawarte w trzeciej edycji IEC62368-1 i EN50332-3 zwiększają dokładność pomiaru narażenia na dźwięk poprzez obliczenie obliczonej dawki dźwięku (CSD). CSD oblicza się poprzez całkowanie chwilowych poziomów ekspozycji (MEL) w czasie. Do obliczenia dawki dźwięku utrzymuje się siedmiodniowe, stale zmieniające się okno skumulowanych wartości CSD.

Zgodnie z sekcją 10.6.3.2 normy IEC62368-1, wydanie 3, jeśli wartość CSD osiągnie limit 100%, system ostrzega użytkownika o poziomie dźwięku przy każdym wzroście o 100%. Jeżeli użytkownik nie potwierdzi ostrzeżenia, głośność zostanie obniżona do wstępnie zdefiniowanej wartości źródła energii promieniowania klasy 1 (RS1) podanej w Tabeli 39 normy IEC62368-1.

Jak wspomniano w sekcji 10.6.3.3 normy IEC62368-1, wydanie trzecie, wraz z ostrzeżeniami dotyczącymi dawki dźwięku, system musi inicjować ostrzeżenie w oparciu o narażenie za każdym razem, gdy wartość MEL przekracza wartość źródła energii promieniowania klasy 2 (RS2) z tabeli 39 normy IEC62368 -1.

Aby uzyskać certyfikat zgodności z tymi przepisami i zwiększyć przydatność wartości CSD, system musi używać dokładnych wartości wyjściowych postrzeganych przez użytkowników (takich jak dane wyjściowe odtwarzania multimediów). Ważne jest, aby w obliczeniach CSD stosować wartości zbliżone do rzeczywistych poziomów ciśnienia akustycznego, na które narażony jest użytkownik.

Architektura

W zależności od tego, gdzie klatki są przechwytywane, charakterystyka sprzętu i efekty przetworników mogą wpływać na poziom mocy renderowanych klatek. Aby uzyskać precyzyjny pomiar poziomu wyjściowego ciśnienia akustycznego, rozszerzyliśmy HAL, aby uzyskać wartości MEL bezpośrednio z podstawowego sprzętu i uwzględnić możliwe efekty stosowane przez cyfrowy procesor sygnałowy (DSP) lub właściwości głośników, takie jak impedancja, czułość, i charakterystykę częstotliwościową.

Jeśli warstwa HAL nie jest w stanie zapewnić wartości MEL, w ramach mechanizmu awaryjnego struktura audio analizuje i oblicza CSD. Te obliczenia w środowisku audio opierają się na informacjach o renderowanym wyjściu raportowanym z HAL i ramkach wysyłanych do procesora DSP audio.

Dawka dźwięku wprowadza dwa komponenty, SoundDoseHelper i SoundDoseManager, jak pokazano na rysunku 1:

sound_dose_arch

Rysunek 1. Elementy architektoniczne funkcji dawki dźwięku.

Pomocnik dawki dźwięku

Klasa SoundDoseHelper , która znajduje się w procesie systemserver , jest głównym punktem gromadzenia wszystkich istotnych danych dotyczących dozowania. Klasa AudioService zarządza klasą SoundDoseHelper .

Klasa SoundDoseHelper odpowiada za:

  • Obsługa nowych informacji o dawkowaniu
  • Stałe wartości dawki dźwięku
  • Przywracanie stanu w przypadku awarii audioserver
  • Wyzwalanie powiadomień interfejsu użytkownika systemu
  • Obniżenie głośności

Menedżer dawki dźwięku

Klasa SoundDoseManager , która działa w procesie audioserver i jest częścią klasy AudioFlinger , zbiera dane o dawce dźwięku z warstwy HAL lub oblicza je wewnętrznie, jako rezerwę, na podstawie ramek wysyłanych do warstwy HAL. Klasa SoundDoseManager wysyła dane dotyczące dawki dźwięku do klasy SoundDoseHelper .

MelProcessor i MelAggregator

Jeśli warstwa HAL nie może zapewnić wartości MEL, do obliczenia wewnętrznej dawki dźwięku używane są narzędzia MelProcessor i MelAggregator z libaudioutils .

W klasie MelProcessor główne obliczenia są wykonywane na buforze z próbkami audio poprzez wywołanie MelProcessor::process(const void* buffer, size_t bytes) . W razie potrzeby producenci OEM mogą używać MelProcessor w swojej implementacji HAL.

Klasa MelAggregator odbiera wartości MEL z różnych portów audio i oblicza wartość CSD w oknie kroczącym wynoszącym siedem dni. Metoda MelAggregator::aggregateAndAddNewMelRecord_l(MelRecord mel) wykonuje logikę. Wyniki przesyłane są do klasy SoundDoseManager w celu komunikacji z AudioService .

Realizacja

Rozszerzenia interfejsu HIDL są przestarzałe, począwszy od Androida 14, dlatego nowy interfejs HAL do pobierania obliczonych wartości MEL i wystawiania ostrzeżeń o narażeniu, nazwany ISoundDose , jest zdefiniowany jako część AIDL Audio HAL . Jednakże dla realizatorów, którzy potrzebują więcej czasu na integrację AIDL Audio HAL, mamy samodzielną dawkę dźwięku AIDL HAL , która oferuje interfejs ISoundDoseFactory . W przyszłości zostanie to wycofane.

Metody HAL do wspomagania dawki dźwięku przedstawiono w następującym przykładzie kodu:

/**
 * 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);
    }
}

Nowy interfejs HAL implementuje wywołania zwrotne , które informują platformę o chwilowym narażeniu i dostarczają wartości MEL za każdym razem, gdy poziom wyjściowy przekracza RS1. Po zaimplementowaniu tych interfejsów struktura wykorzystuje je do raportowania CSD. Bez tej implementacji wywołania zwrotnego do obliczenia szacunkowych wartości CSD używana jest implementacja awaryjna w AudioFlinger .

Samodzielna obsługa AIDL w dawce dźwiękowej

Dopóki producenci OEM nie będą mogli zintegrować dawki dźwięku z warstwą audio AIDL HAL, mogą jako obejście skorzystać z samodzielnego interfejsu AIDL API ISoundDoseFactory . ISoundDoseFactory korzysta z interfejsu ISoundDose , jak pokazano w poniższym przykładzie kodu:

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

Dawka dźwięku Obsługa AIDL Audio HAL

Interfejs dawki dźwięku jest obsługiwany długoterminowo jako część AIDL Audio HAL poprzez rozszerzenie interfejsu IModule , jak pokazano w poniższym przykładzie kodu:

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

Ta funkcja stanowi implementację nowej regulacji opisanej w trzeciej edycji IEC62368-1 i EN50332-3, dlatego nie ma żadnych zewnętrznych interfejsów API.

Producenci OEM mogą certyfikować swoje urządzenia, wdrażając nowe interfejsy HAL i dostarczając dokładne dane MEL dla CSD do platformy audio (zalecane) lub zapewniając niestandardową implementację dawki dźwięku.

Włącz obliczanie dawki dźwięku

Domyślnie AOSP obsługuje logikę bezpieczeństwa słuchu, która zapewnia certyfikację z istniejącymi normami EN50332-2 i IEC62368-1 10.6.5.

W systemie Android 14 obliczanie dawki dźwięku jest domyślnie wyłączone.

Skorzystaj z poniższych wskazówek, aby umożliwić obliczanie dawki dźwięku , począwszy od Androida 14-QPR1.

  • Jeśli w Twoim kraju obowiązują przepisy dotyczące dawki dźwięku, sprawdź, czy config_safe_media_volume_enabled w config.xml ma wartość true .

  • Aby zachować zgodność z normami EN50332-3 i IEC62368-1 10.6.3, dostawcy muszą nałożyć flagę config_safe_sound_dosage_enabled w config.xml na true . W przypadku urządzeń obsługujących dekodowanie odciążające i nie implementujących interfejsów HAL dawki dźwięku , config_safe_sound_dosage_enabled nie może być ustawiony na true . W takich przypadkach ustawienie config_safe_sound_dosage_enabled na true może prowadzić do niedokładnych wartości CSD i problemów z certyfikacją standardów bezpieczeństwa.

Poniższy wykres decyzyjny opisuje logikę określającą, czy na podstawie ograniczeń krajowych i wartości flag obliczany jest CSD lub starsze poziomy bezpieczeństwa słuchu (wdrożone przed Androidem 14).

enable_csd

Rysunek 2. Włącz obliczanie dawki dźwięku (logika została dodana w Androidzie 14-QPR1).

Walidacja

Implementując interfejs HAL dla dawki dźwięku, producenci OEM muszą sprawdzić przypadki testowe VTS zdefiniowane przez VtsHalAudioCoreTargetTest dla implementacji IModule AIDL Audio HAL lub przez VtsHalSoundDoseFactoryTargetTest dla samodzielnej implementacji AIDL HAL dawki dźwięku.