Ses dozu

Android 14, ses maruziyetini sürekli olarak izleyerek ve kullanıcılara zararlı maruziyet seviyeleri hakkında uyarılar vererek ses çerçevesinde ve Audio HAL'de ses maruziyeti desteği sunar.

Ses dozu, belirli bir süre boyunca ses basıncı seviyelerinin ölçümüdür. Ses dozunu izleyerek kullanıcıları aşırı veya uzun süreli ses maruziyetinin zararlı etkilerinden koruyabiliriz. Böylece, taşınabilir Android cihazlarda kulaklık kullanırken daha iyi işitme koruması sunar ve işitme bozukluğu riskini en aza indiririz.

Güvenli dinleme cihazlarıyla ilgili yeni standartlar, IEC62368-1 3. sürüm (giriş yapılması gerekir) ve EN50332-3'teki (abone erişimiyle sınırlıdır) işitme korumasıyla ilgili yasal şartlara uygundur. Bu standartlar, ses dozu kavramını ortaya koyar.

Ses dozu işlevi, OEM'lerin yeni işitme güvenliği yönetmeliklerine uymasına olanak tanır. OEM'ler, sağlıklı dozajı desteklemek için tüm özelleştirmeler ve sertifikalarla ilgili arayüz spesifikasyonlarına ve düzenlemelere uymalıdır. Özelleştirilmiş bir OEM uygulaması, ses dozunun AOSP varsayılan uygulamasını atlayabilir veya değiştirebilir. Ancak, AOSP uygulamasının kullanılması önemle tavsiye edilir.

Ses dozu hesaplaması

IEC62368-1 3. sürüm ve EN50332-3'teki standartlar, hesaplanmış ses dozunu (CSD) hesaplayarak sese maruz kalma ölçümünün doğruluğunu artırır. CSD, anlık maruz kalma düzeylerinin (MEL) zaman içinde entegre edilmesiyle hesaplanır. Ses dozu hesaplaması için yedi günlük sürekli olarak değişen bir birikmiş CSD değerleri penceresi korunur.

IEC62368-1 3. baskısının 10.6.3.2 bölümüne göre, CSD değeri% 100 sınırına ulaşırsa sistem, her %100 artışta kullanıcıyı ses seviyeleri hakkında uyarır. Kullanıcı uyarıyı onaylamazsa ses düzeyi, IEC62368-1'in Tablo 39'unda önceden tanımlanmış 1. sınıf radyasyon enerji kaynağı (RS1) değerine düşer.

IEC62368-1 3. baskısının 10.6.3.3 bölümünde belirtildiği gibi, ses dozu uyarılarının yanı sıra sistem, MEL değeri IEC62368-1'in Tablo 39'undaki radyasyon enerji kaynağı sınıfı 2 (RS2) değerini her aştığında maruz kalmaya dayalı bir uyarı başlatmalıdır.

Bu yönetmeliklere uygun sertifika almak ve CSD değerlerini daha alakalı hale getirmek için sistem, kullanıcılar tarafından algılandığı şekliyle doğru çıkış değerlerini (ör. medya oynatma çıkışı) kullanmalıdır. CSD hesaplamasında, kullanıcının maruz kaldığı gerçek ses basıncı seviyelerine yakın değerlerin kullanılması önemlidir.

Mimari

Karelerin çekildiği yere bağlı olarak, donanım özellikleri ve dönüştürücülerin etkileri, oluşturulan karelerin güç düzeyini etkileyebilir. Hassas bir çıkış ses basıncı seviyesi ölçümü için HAL'ı genişleterek MEL değerlerini doğrudan temel donanımdan aldık ve dijital sinyal işlemcisi (DSP) veya hoparlör özellikleri (ör. empedans, hassasiyet ve frekans yanıtı) tarafından uygulanan olası etkileri hesaba kattık.

HAL, MEL değerlerini sağlayamıyorsa yedek mekanizma olarak ses çerçevesi, CSD'yi analiz edip hesaplar. Ses çerçevesindeki bu hesaplama, HAL'den bildirilen oluşturulmuş çıkışla ilgili bilgilere ve ses DSP'sine gönderilen çerçevelere dayanır.

Şekil 1'de gösterildiği gibi, ses dozu iki bileşen içerir: SoundDoseHelper ve SoundDoseManager,.

sound_dose_arch

1. şekil. Ses dozu özelliğinin mimari bileşenleri.

SoundDoseHelper

systemserver sürecinde bulunan SoundDoseHelper sınıfı, ilgili tüm ses dozajı verilerinin ana toplama noktasıdır. AudioService sınıfı, SoundDoseHelper sınıfını yönetir.

SoundDoseHelper sınıfı aşağıdakilerden sorumludur:

  • Yeni dozaj bilgilerini işleme
  • Ses dozu değerlerini kalıcı hale getirme
  • audioserver çökmesi durumunda kurtarma
  • Sistem kullanıcı arayüzü bildirimlerini tetikleme
  • Sesi kısma

SoundDoseManager

SoundDoseManager sınıfı, audioserver sürecinde yer alır ve AudioFlinger sınıfının bir parçasıdır. Bu sınıf, HAL'den ses dozu verilerini toplar veya alternatif olarak HAL'e gönderilen karelerden dahili olarak hesaplar. SoundDoseManager sınıfı, ses dozu verilerini SoundDoseHelper sınıfına gönderir.

MelProcessor ve MelAggregator

HAL, MEL değerleri sağlayamıyorsa libaudioutils içindeki MelProcessor ve MelAggregator yardımcı programları dahili ses dozu hesaplaması için kullanılır.

MelProcessor sınıfında, ana hesaplama MelProcessor::process(const void* buffer, size_t bytes) çağrılarak ses örnekleri içeren bir arabellekte gerçekleştirilir. OEM'ler gerekirse HAL uygulamalarında MelProcessor kullanabilir.

MelAggregator sınıfı, farklı ses bağlantı noktalarından MEL değerlerini alır ve CSD değerini yedi günlük bir hareketli pencereyle hesaplar. MelAggregator::aggregateAndAddNewMelRecord_l(MelRecord mel) yöntemi mantığı yürütür. Sonuçlar, AudioService ile iletişim için SoundDoseManager sınıfına gönderilir.

Uygulama

HIDL arayüzü uzantılarının desteği Android 14'ten itibaren sonlandırıldığından, hesaplanmış MEL değerlerini alma ve pozlama uyarıları verme için yeni HAL arayüzü (ISoundDose) AIDL Audio HAL'in bir parçası olarak tanımlanır. Ancak, AIDL Audio HAL'yi entegre etmek için daha fazla zamana ihtiyacı olan uygulayıcılar için ISoundDoseFactory arayüzünü sunan bağımsız bir ses dozu AIDL HAL'miz var. Bu özellik gelecekte kullanımdan kaldırılacaktır.

Ses dozu desteği için HAL yöntemleri aşağıdaki kod örneğinde gösterilmektedir:

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

Yeni HAL arayüzü, çerçeveyi anlık pozlama hakkında bilgilendiren geri çağırma işlevlerini uygular ve çıkış seviyesi RS1'i aştığında MEL değerlerini sağlar. Bu arayüzler uygulandığında çerçeve, bunları CSD raporlaması için kullanır. Bu geri çağırma işlevi uygulanmadığında, AudioFlinger üzerinde yedek bir uygulama, CSD değerlerinin tahminlerini hesaplamak için kullanılır.

Bağımsız AIDL ses dozu desteği

OEM'ler, ses dozunu AIDL ses HAL'sine entegre edene kadar geçici çözüm olarak bağımsız AIDL API'sini ISoundDoseFactory kullanabilir. ISoundDoseFactory, aşağıdaki kod örneğinde gösterildiği gibi ISoundDose arayüzünü kullanır:

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

Ses dozu AIDL Audio HAL desteği

Ses dozu arayüzü, aşağıdaki kod örneğinde gösterildiği gibi IModule arayüzü genişletilerek AIDL Audio HAL'in bir parçası olarak uzun vadeli desteklenir:

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

Bu özellik, IEC62368-1 3. sürüm ve EN50332-3'te açıklanan yeni bir düzenlemenin uygulanmasıdır. Bu nedenle, harici kullanıma yönelik API'ler yoktur.

OEM'ler, yeni HAL arayüzlerini uygulayarak ve ses çerçevesine CSD için doğru MEL verileri sağlayarak (önerilir) veya özel bir ses dozu uygulaması sağlayarak cihazlarını sertifikalandırabilir.

Ses dozunun hesaplanmasını etkinleştirme

AOSP, varsayılan olarak mevcut EN50332-2 ve IEC62368-1 10.6.5 standartlarıyla sertifikalandırmayı sağlayan işitme güvenliği mantığını destekler.

Android 14'te ses dozunun hesaplanması varsayılan olarak devre dışıdır.

Android 14-QPR1'den itibaren ses dozunun hesaplanmasını etkinleştirmek için aşağıdaki yönergeleri kullanın.

  • Ülkenizde ses dozuyla ilgili düzenlemeler uygulanıyorsa config.xml bölümündeki config_safe_media_volume_enabled ayarının true olarak ayarlanıp ayarlanmadığını kontrol edin.

  • EN50332-3 ve IEC62368-1 10.6.3 ile uyumlu olmak için tedarikçiler, config_safe_sound_dosage_enabled işaretini config.xml içinde true olarak yerleştirmelidir. Offload kod çözme özelliğini destekleyen ve ses dozu HAL arayüzlerini uygulamayan cihazlarda config_safe_sound_dosage_enabled, true olarak ayarlanmamalıdır. Bu gibi durumlarda, config_safe_sound_dosage_enabled değerinin true olarak ayarlanması, yanlış CSD değerlerine ve güvenlikli işitme standartlarıyla ilgili sertifika sorunlarına yol açabilir.

Aşağıdaki karar grafiğinde, ülke kısıtlamalarına ve işaretlerin değerlerine göre CSD'nin mi yoksa eski işitme güvenliği seviyelerinin mi (Android 14'ten önce uygulanan) hesaplanacağını belirleyen mantık açıklanmaktadır.

enable_csd

Şekil 2. Ses dozunun hesaplanmasını etkinleştirin (mantık Android 14-QPR1'de eklenmiştir).

Doğrulama

Ses dozu için HAL arayüzünü uygularken OEM'ler, IModule AIDL Audio HAL uygulaması için VtsHalAudioCoreTargetTest tarafından veya bağımsız ses dozu AIDL HAL uygulaması için VtsHalSoundDoseFactoryTargetTest tarafından tanımlanan VTS test senaryolarına göre doğrulama yapmalıdır.