Dawka dźwięku

Android 14 obsługuje dawkowanie dźwięku platforma audio i HAL audio dzięki stałemu monitorowaniu pomiarów dawki dźwięku. oraz wysyłanie do użytkowników ostrzeżeń o szkodliwych poziomach narażenia na kontakt.

Dawka dźwięku to pomiar ciśnienia akustycznego w określonym czasie. Monitorując dawkę dźwięku, możemy chronić użytkowników przed szkodliwymi efektami nadmierna lub długotrwała ekspozycja na dźwięk, zapewniając lepszą ochronę słuchu; podczas korzystania ze słuchawek na urządzeniach przenośnych z Androidem i minimalizuje ryzyko niedosłuch.

Nowe standardy urządzeń do bezpiecznego słuchania są zgodne z regulacjami wymagania dotyczące ochrony słuchu zgodnie z normą IEC62368-1 3 wersji (wymaga zalogowania) i EN50332-3 (dostęp tylko dla subskrybentów), który wprowadza koncepcję dawki dźwięku.

Funkcja dawkowania dźwięku pozwala producentom OEM przestrzegać nowych przepisów dotyczących bezpieczeństwa słuchu. Do obsługi dawki dźwięku, OEM musi przestrzegać specyfikacji i przepisów dotyczących interfejsu w przypadku wszystkich dostosowań i certyfikatów. Dostosowane wdrożenie OEM mogą ominąć lub zmodyfikować domyślną implementację dawki dźwięku zgodnie z AOSP. Pamiętaj jednak: za pomocą AOSP.

Obliczanie dawki dźwięku

Standardy IEC62368-1 3 edycji i EN50332-3 zwiększają dokładność pomiar ekspozycji na hałas za pomocą obliczonej dawki dźwięku (CSD). CSD to oblicza się przez integrowanie poziomów ekspozycji chwilowej (MEL) w czasie. 7 dni ciągły okres skumulowanych wartości CSD jest utrzymywany przez przy obliczaniu dawki dźwięku.

Zgodnie z artykułem 10.6.3.2 normy IEC62368-1 3rd wersji, jeśli wartość CSD osiągnie limit 100%, system informuje użytkownika o poziomie głośności przy każdym zwiększeniu poziomu dźwięku o 100%. Jeśli użytkownik nie uzna ostrzeżenia, głośność zmniejszy się do wstępnie zdefiniowanego promieniowania wartość źródła energii 1 (RS1) według tabeli 39 normy IEC62368-1.

Jak wspomnieliśmy w artykule 10.6.3.3 ustawy IEC62368-1 3 edycji wraz z dźwiękiem ostrzeżenia o dawkowaniu, system musi inicjować ostrzeżenie dotyczące narażenia na kontakt za każdym razem, Wartość MEL przekracza wartość źródła energii promieniowania 2 (RS2) z tabeli 39 IEC62368-1.

Aby uzyskać certyfikat zgodności z tymi przepisami i zwiększyć wartości CSD istotne, system musi używać dokładnych wartości wyjściowych postrzeganych przez użytkowników (np. z urządzenia wyjściowego do odtwarzania multimediów). Istotne jest, aby obliczenia CSD używaj wartości zbliżonych do rzeczywistego poziomu ciśnienia akustycznego, jest narażone na niebezpieczeństwo.

Architektura

W zależności od miejsca przechwytywania klatek, charakterystyki sprzętowej i efektów może wpływać na poziom mocy renderowanych klatek. Aby mieć dokładny pomiar ciśnienia akustycznego, rozszerzyliśmy HAL, aby uzyskać wartości MEL bezpośrednio z danego sprzętu i konta, efekty stosowane przez procesor sygnału cyfrowego lub głośnika. takie jak impedancja, czułość i odpowiedź częstotliwości.

Jeśli HAL nie może podać wartości MEL, jako mechanizm zastępczy udostępnia platformę do analizy i obliczania CSD. To obliczenia w strukturze audio na podstawie informacji o wyrenderowanych danych wyjściowych zgłoszonych z HAL i klatek które są wysyłane do platformy DSP.

Dawka dźwięku wprowadza 2 elementy: SoundDoseHelper i SoundDoseManager, zgodnie z ilustracją 1:

archiwizacja_dawki_dźwiękowej

Rysunek 1. Architektoniczne komponenty funkcji dawkowania dźwięku.

Asystent dawkowania dźwięków

Klasa SoundDoseHelper, która znajduje się w procesie systemserver, jest do głównego punktu gromadzenia wszystkich danych. AudioService zarządza klasą SoundDoseHelper.

Klasa SoundDoseHelper odpowiada za:

  • Obsługa nowych informacji o dawkowaniu
  • Stałe wartości dawki dźwięku
  • Stan przywracania po audioserver awarii
  • Aktywowanie powiadomień w interfejsie systemu
  • Zmniejszam głośność

Menedżer dawki dźwięku

Klasa SoundDoseManager, która znajduje się w procesie audioserver i jest część AudioFlinger zbiera dane o dawkowaniu dźwięku z HAL lub oblicza je wewnętrznie jako z klatek wysłanych do HAL. Klasa SoundDoseManager wysyła dane dawkowania dźwięku do klasy SoundDoseHelper.

MelProcessor i MeldAggregator

Jeśli HAL nie może podać wartości MEL, MelProcessor i MelAggregator narzędzia w: libaudioutils są wykorzystywane do wewnętrznego obliczania dawki dźwięku.

W klasie MelProcessor główne obliczenia są wykonywane w buforze z atrybutem próbek audio, wywołując metodę MelProcessor::process(const void* buffer, size_t bytes). W razie potrzeby producenci OEM w implementacji HAL mogą używać identyfikatora MelProcessor.

Klasa MelAggregator otrzymuje wartości MEL z różnych portów audio i oblicza wartość CSD w ruchomym oknie wynoszącym 7 dni. Metoda MelAggregator::aggregateAndAddNewMelRecord_l(MelRecord mel) uruchamia logikę. Wyniki są wysyłane do klasy SoundDoseManager na potrzeby komunikacja z użytkownikiem AudioService.

Implementacja

Rozszerzenia interfejsu HIDL są wycofywane od Androida 14, więc nowy interfejs HAL do pobierania obliczonych wartości MEL i wystawiania ekspozycji ostrzeżenia o nazwie ISoundDose, jest zdefiniowana w ramach pakietu AIDL Audio HAL. Pamiętaj jednak: dla osób wdrażających, które potrzebują więcej czasu na integrację AIDL Audio HAL, samodzielna dawkowanie dźwięku AIDL HAL, która zapewnia ISoundDoseFactory. Będzie to wycofane w przyszłości.

Metody HAL dotyczące wspomagania dawkowania dźwięku są przedstawione w tym kodzie przykład:

/**
 * 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ą strukturę o ekspozycji chwilowej i określają wartości MEL gdy poziom wyjściowy przekracza RS1. Gdy te interfejsy są zaimplementowane, są używane do raportowania CSD. Bez implementacji wywołania zwrotnego implementacja zastępcza w AudioFlinger jest używany do obliczania szacunków wartości CSD.

Obsługa samodzielnego AIDL w przypadku dawki dźwięku

Dopóki OEM nie zaimplementuje dawki dźwięku w interfejsie HAL audio AIDL, mogą używać samodzielnym AIDL API ISoundDoseFactory, aby obejść ten problem. ISoundDoseFactory używa interfejsu ISoundDose, jak pokazano w następujący przykładowy kod:

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

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

Interfejs dawkowania dźwięku jest obsługiwany długoterminowo jako część AIDL Audio HAL przez rozszerzanie interfejsu IModule, jak pokazano w tym przykładowym kodzie:

@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 jest implementacją nowych regulacji opisanych w normie IEC62368-1 wersji trzeciej i EN50332-3, w związku z czym nie ma interfejsów API dostępnych dla użytkowników zewnętrznych.

OEM może certyfikować swoje urządzenia, wdrażając nowe interfejsy HAL i dostarczanie na platformie audio dokładnych danych MEL na potrzeby CSD (zalecane) lub przez zapewnienie niestandardowej 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ę. zgodne z normami EN50332-2 i IEC62368-1 10.6.5.

Na Androidzie 14 obliczanie dawki dźwięku jest wyłączone domyślnie.

Aby umożliwić obliczanie dawki dźwięku, postępuj zgodnie z tymi wytycznymi od Androida 14-QPR1.

  • Jeśli w Twoim kraju obowiązują przepisy dotyczące dawek dźwiękowych, sprawdź, 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ą nakładać flaga config_safe_sound_dosage_enabled w config.xml do true. W przypadku urządzeń, które obsługują dekodowanie odciążające i nie mają implementacji funkcji interfejsy HAL do dawkowania dźwięku, Pole config_safe_sound_dosage_enabled nie może mieć wartości true. W takich przypadkach ustawienie wartości config_safe_sound_dosage_enabled na true może spowodować nieprawidłowe CSD wartości i certyfikaty w zakresie standardów słuchu.

Poniższy wykres decyzyjny opisuje logikę, która określa, czy na podstawie ograniczenia krajowe i wartości flag – CSD lub poziomy bezpieczeństwa słuchu (wdrożone przed Androidem 14)

włącz_csd

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

Weryfikacja

Podczas wdrażania interfejsu HAL pod kątem dawki dźwięku producenci OEM muszą przejść przypadki testowe VTS określone w zasadzie VtsHalAudioCoreTargetTest dla implementacji IModule AIDL Audio HAL lub przez VtsHalSoundDoseFactoryTargetTest dla samodzielnej implementacji AIDL HAL dawkowania dźwięku.