Android 14 obsługuje dawkę dźwięku w ramach platformy audio i warstwie HAL audio, ponieważ stale monitoruje pomiary dawki dźwięku i ostrzega użytkowników o szkodliwych poziomach narażenia.
Dawka dźwięku to pomiar poziomu ciśnienia akustycznego w określonym czasie. Dzięki monitorowaniu dawki dźwięku możemy chronić użytkowników przed szkodliwym działaniem nadmiernego lub długotrwałego narażenia na hałas, a tym samym zapewnić lepszą ochronę słuchu podczas korzystania ze słuchawek na przenośnych urządzeniach z Androidem i zminimalizować ryzyko uszkodzenia słuchu.
Nowe standardy dotyczące bezpiecznych urządzeń do słuchania są zgodne z wymaganiami dotyczącymi ochrony słuchu w normie IEC62368-1 w wersji 3 (wymaga logowania) i normie EN50332-3 (dostęp ograniczony do subskrybentó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 obsługiwać dawkę dźwięku, producenci OEM muszą przestrzegać specyfikacji interfejsu i przepisów dotyczących wszystkich dostosowań i certyfikatów. Dostosowana implementacja OEM może obejść lub zmodyfikować domyślną implementację dawki dźwięku w AOSP. Zdecydowanie zalecamy jednak korzystanie z implementacji AOSP.
Obliczanie dawki dźwięku
Standardy IEC62368-1 w wersji 3 i EN50332-3 zwiększają dokładność pomiaru narażenia na hałas przez obliczanie dawki dźwięku (CSD). CSD jest obliczany przez integrację chwilowych poziomów narażenia (MEL) w czasie. Do obliczania dawki dźwięku używamy 7-dniowego okna kroczącego z wartościami CSD.
Zgodnie z sekcją 10.6.3.2 normy IEC62368-1 w wersji 3, jeśli wartość CSD osiągnie limit 100%, system ostrzega użytkownika o poziomach dźwięku przy każdym wzroście o 100%. Jeśli użytkownik nie potwierdzi ostrzeżenia, głośność zostanie zmniejszona do predefiniowanej wartości źródła energii promieniowania klasy 1 (RS1) z tabeli 39 normy IEC62368-1.
Jak wspomniano w sekcji 10.6.3.3 normy IEC62368-1 w wersji 3, oprócz ostrzeżeń o dawce dźwięku system musi inicjować ostrzeżenie o narażeniu za każdym razem, gdy wartość MEL przekroczy 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ć trafność wartości CSD, system musi używać dokładnych wartości wyjściowych, które są postrzegane przez użytkowników (np. wyjście odtwarzania multimediów). Ważne jest, aby do obliczania CSD używać wartości zbliżonych do rzeczywistych poziomów ciśnienia akustycznego, na które jest narażony użytkownik.
Architektura
W zależności od tego, gdzie są przechwytywane klatki, charakterystyka sprzętu i efekty przetworników mogą wpływać na poziom mocy renderowanych klatek. Aby uzyskać dokładny pomiar poziomu ciśnienia akustycznego, rozszerzyliśmy warstwę HAL, aby pobierać wartości MEL bezpośrednio z podstawowego sprzętu i uwzględniać możliwe efekty stosowane przez cyfrowy procesor sygnałowy (DSP) lub właściwości głośnika, takie jak impedancja, czułość i pasmo przenoszenia.
Jeśli warstwa HAL nie może podać wartości MEL, w ramach mechanizmu rezerwowego ramy odtwarzania dźwięku analizują i obliczają CSD. Obliczenia w ramach odtwarzania dźwięku są oparte na informacjach o renderowanym wyjściu zgłaszanych przez warstwę HAL oraz na klatkach wysyłanych do procesora DSP dźwięku.
Dawka dźwięku wprowadza 2 komponenty: SoundDoseHelper i
SoundDoseManager,, jak pokazano na ilustracji 1:

Ilustracja 1. Komponenty architektury funkcji dawki dźwięku.
SoundDoseHelper
Klasa SoundDoseHelper, która znajduje się w procesie systemserver, jest
głównym punktem zbierania wszystkich istotnych danych dotyczących dawki dźwięku. Klasa AudioService
zarządza klasą SoundDoseHelper.
Klasa SoundDoseHelper jest odpowiedzialna za:
- obsługę nowych informacji o dawce;
- utrwalanie wartości dawki dźwięku;
- przywracanie stanu w przypadku awarii
audioserver; - wyzwalanie powiadomień interfejsu systemowego;
- zmniejszanie głośności.
SoundDoseManager
Klasa SoundDoseManager, która znajduje się 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 klatek wysyłanych do warstwy HAL. Klasa SoundDoseManager wysyła dane o dawce dźwięku do klasy SoundDoseHelper.
MelProcessor i MelAggregator
Jeśli warstwa HAL nie może podać wartości MEL, do wewnętrznego obliczania dawki dźwięku używane są narzędzia MelProcessor i MelAggregator
w libaudioutils.
W klasie MelProcessor główne obliczenia są wykonywane na buforze z
próbkami dźwięku przez wywołanie MelProcessor::process(const void* buffer, size_t bytes).
W razie potrzeby producenci OEM mogą używać MelProcessor w swojej implementacji warstwy HAL.
Klasa MelAggregator odbiera wartości MEL z różnych portów audio i oblicza wartość CSD za pomocą 7-dniowego okna kroczącego. Logika jest wykonywana przez metodę MelAggregator::aggregateAndAddNewMelRecord_l(MelRecord mel). Wyniki są wysyłane do klasy SoundDoseManager w celu komunikacji z AudioService.
Implementacja
Rozszerzenia interfejsu HIDL są wycofywane od Androida 14,
dlatego nowy interfejs HAL do pobierania obliczonych wartości MEL i wysyłania ostrzeżeń o narażeniu, o nazwie ISoundDose,
jest zdefiniowany jako część warstwy HAL odtwarzania dźwięku AIDL. Jednak,
w przypadku implementatorów, którzy potrzebują więcej czasu na zintegrowanie warstwy HAL odtwarzania dźwięku AIDL, mamy
samodzielną warstwę HAL dawki dźwięku AIDL, która oferuje
ISoundDoseFactory interfejs. W przyszłości zostanie on wycofany.
Metody warstwy HAL obsługujące dawkę dźwięku są pokazane w tym przykładowym kodzie:
/**
* 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 podają wartości MEL gdy poziom wyjściowy przekracza RS1. Gdy te interfejsy są zaimplementowane, platforma używa ich do raportowania CSD. Bez tej implementacji wywołania zwrotnego,
do obliczania szacunków wartości CSD używana jest implementacja rezerwowa w AudioFlinger.
Obsługa samodzielnej warstwy HAL dawki dźwięku AIDL
Zanim producenci OEM zintegrują dawkę dźwięku z warstwą HAL odtwarzania dźwięku AIDL, mogą tymczasowo używać
samodzielnego interfejsu API AIDL ISoundDoseFactory. ISoundDoseFactory używa interfejsu ISoundDose, jak pokazano w
tym przykładowym kodzie:
@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 warstwy HAL odtwarzania dźwięku AIDL dawki dźwięku
Interfejs dawki dźwięku jest obsługiwany długoterminowo jako część warstwy HAL odtwarzania dźwięku AIDL przez
rozszerzenie 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 przepisów opisanych w normach IEC62368-1 w wersji 3 i EN50332-3, dlatego nie ma interfejsów API dostępnych z zewnątrz.
Producenci OEM mogą certyfikować swoje urządzenia, implementując nowe interfejsy HAL i podając dokładne dane MEL dla CSD w ramach platformy audio (zalecane) lub udostępniając niestandardową implementację dawki dźwięku.
Włączanie obliczania dawki dźwięku
Domyślnie AOSP obsługuje logikę bezpieczeństwa słuchu, która zapewnia certyfikację zgodnie z obowiązującymi standardami EN50332-2 i IEC62368-1 10.6.5.
W Androidzie 14 obliczanie dawki dźwięku jest domyślnie wyłączone.
Aby włączyć obliczanie dawki dźwięku, począwszy od Androida 14-QPR1 postępuj zgodnie z tymi wskazówkami.
Jeśli w Twoim kraju obowiązują przepisy dotyczące dawki dźwięku, sprawdź, czy
config_safe_media_volume_enabledwconfig.xmlma wartośćtrue.Aby zachować zgodność z normami EN50332-3 i IEC62368-1 10.6.3, dostawcy muszą zastąpić flagę
config_safe_sound_dosage_enabledwconfig.xmlwartościątrue. W przypadku urządzeń, które obsługują odciążanie dekodowania i nie implementują interfejsów HAL dawki dźwięku,config_safe_sound_dosage_enablednie można ustawić wartości natrue. W takich przypadkach ustawienie wartościconfig_safe_sound_dosage_enablednatruemoże prowadzić do niedokładnych wartości CSD i problemów z certyfikacją w zakresie standardów bezpieczeństwa słuchu.
Ten wykres decyzyjny opisuje logikę, która określa, czy na podstawie ograniczeń krajowych i wartości flag obliczane są wartości CSD czy starsze poziomy bezpieczeństwa słuchu (zaimplementowane przed Androidem 14).

Ilustracja 2. Włączanie obliczania dawki dźwięku (logika została dodana w Androidzie 14-QPR1).
Weryfikacja
Podczas implementowania interfejsu HAL dawki dźwięku producenci OEM muszą przeprowadzić weryfikację na podstawie
przypadków testowych VTS zdefiniowanych przez VtsHalAudioCoreTargetTest
w przypadku implementacji warstwy HAL odtwarzania dźwięku AIDL lub przez VtsHalSoundDoseFactoryTargetTest
w przypadku samodzielnej implementacji warstwy HAL dawki dźwięku AIDL.