يوفّر نظام التشغيل Android 14 ميزة "جرعة الصوت" في إطار عمل الصوت وواجهة برمجة التطبيقات لنظام الصوت (HAL) من خلال مراقبة قياسات جرعة الصوت باستمرار وإصدار تحذيرات للمستخدمين بشأن مستويات التعرض الضارة.
جرعة الصوت هي قياس لمستويات ضغط الصوت على مدار فترة زمنية. من خلال مراقبة مستوى الصوت، يمكننا المساعدة في حماية المستخدمين من الآثار الضارة للتعرّض للصوت المفرط أو لفترات طويلة، وبالتالي توفير حماية أفضل للسمع عند استخدام سماعات الرأس على أجهزة Android المحمولة والحد من احتمال حدوث اضطرابات في السمع.
تتوافق المعايير الجديدة لأجهزة الاستماع الآمن مع المتطلبات التنظيمية لحماية السمع في الإصدار الثالث من IEC62368-1 (تتطلّب تسجيل الدخول) وEN50332-3 (إمكانية الوصول مقتصرة على المشتركين)، والتي يتم من خلالها تقديم مفهوم جرعة الصوت.
تتيح وظيفة "جرعة الصوت" لمصنّعي المعدّات الأصلية الالتزام باللوائح التنظيمية الجديدة لسلامة السمع. لكي تتمكّن المصنّعين الأصليّين للأجهزة من إتاحة ميزة "الجرعة الصوتية"، عليهم اتّباع مواصفات الواجهة ولوائحها التنظيمية لجميع عمليات التخصيص والشهادات. يمكن لعملية التنفيذ المخصّصة للمصنّع الأصلي للجهاز أن تتجاوز أو تعدل التنفيذ التلقائي لجرعة الصوت من AOSP. ومع ذلك، ننصح بشدة باستخدام عملية التنفيذ في AOSP.
احتساب الجرعة الصوتية
تزيد المعايير الواردة في الإصدار 3 من IEC62368-1 والإصدار 3 من EN50332-3 من دقة قياس التعرّض للصوت من خلال احتساب الجرعة الصوتية المحسوبة (CSD). يتم احتساب CSD من خلال دمج مستويات التعرّض اللحظية (MEL) بمرور الوقت. يتم الاحتفاظ بفترة متجدّدة باستمرار مدّتها سبعة أيام لقيم CSD المتراكمة بغرض حساب كثافة الصوت.
وفقًا للفقرة 10.6.3.2 من الإصدار الثالث من معيار IEC62368-1، إذا بلغت قيمة CSD الحد الأقصى البالغ% 100، يُرسِل النظام تنبيهًا إلى المستخدم بشأن مستويات الصوت عند كل زيادة بنسبة %100. إذا لم يقرّ العميل بالتحذير، يتم خفض مستوى الصوت إلى قيمة فئة مصدر طاقة ακτινοβολίας 1 (RS1) المحدّدة مسبقًا في الجدول 39 من IEC62368-1.
كما هو موضّح في القسم 10.6.3.3 من الإصدار 3 من IEC62368-1، يجب أن يُصدر النظام تحذيرًا مستندًا إلى التعرّض كلما تجاوزت قيمة MEL قيمة مصدر الطاقة الإشعاعية من الفئة 2 (RS2) في الجدول 39 من IEC62368-1، بالإضافة إلى التحذيرات بشأن كثافة الصوت.
للحصول على شهادة الاعتماد وفقًا لهذه اللوائح التنظيمية ولجعل قيم CSD أكثر صلة، يجب أن يستخدم النظام قيم الإخراج الدقيقة التي يلاحظها المستخدمون (مثل إخراج تشغيل الوسائط). من المهم أن تستخدم العمليات الحاسوبية لتقنية CSD قيمًا قريبة من مستويات ضغط الصوت الفعلية التي يتعرض لها المستخدم.
هندسة معمارية
استنادًا إلى مكان التقاط اللقطات، يمكن أن تؤثر خصائص الأجهزة والمؤثرات للمحوِّلات في مستوى الطاقة للّقطات المعروضة. للحصول على قياس دقيق لمستوى ضغط الصوت الناتج، وسّعنا نطاق HAL للحصول على قيم MEL مباشرةً من الأجهزة الأساسية مع مراعاة التأثيرات المحتملة التي يتم تطبيقها من خلال معالِج الإشارات الرقمية (DSP) أو خصائص مكبّر الصوت، مثل المعاوقة والحساسية واستجابة التردد.
إذا تعذّر على HAL تقديم قيم MEL، يحلّ إطار العمل الصوتي محلّها من خلال تحليل CSD واحتساب قيمه. تستند عملية الحساب هذه في إطار العمل الصوتي إلى المعلومات حول الإخراج المعروض من HAL والإطارات التي يتم إرسالها إلى وحدة معالجة الإشارات الرقمية للصوت.
تُعرِض جرعة الصوت مكوّنين، SoundDoseHelper
و
SoundDoseManager,
كما هو موضّح في الشكل 1:
الشكل 1: المكونات المعمارية لميزة "جرعة الصوت"
SoundDoseHelper
فئة SoundDoseHelper
، التي تُستخدم في عملية systemserver
، هي
نقطة التجميع الرئيسية لجميع بيانات الجرعات الصوتية ذات الصلة. يدير صف AudioService
صف SoundDoseHelper
.
تتحمّل فئة SoundDoseHelper
المسؤولية عن ما يلي:
- التعامل مع معلومات الجرعة الجديدة
- الاحتفاظ بقيم جرعة الصوت
- حالة الاسترداد في حال تعطُّل
audioserver
- تشغيل إشعارات واجهة مستخدِم النظام
- خفض مستوى الصوت
SoundDoseManager
إنّ الفئة SoundDoseManager
، وهي جزء من الفئة AudioFlinger
، تجمع بيانات جرعة الصوت من طبقة تجريد الأجهزة (HAL) أو تحسبها داخليًا من الإطارات التي يتم إرسالها إلى طبقة تجريد الأجهزة (HAL) كإجراء احتياطي.audioserver
تُرسِل فئة SoundDoseManager
بيانات الجرعة الصوتية إلى فئة SoundDoseHelper
.
MelProcessor وMeAggregator
إذا لم يتمكّن HAL من توفير قيم MEL، يتم استخدام الأدوات المساعدة MelProcessor
وMelAggregator
في libaudioutils
لحساب جرعة الصوت الداخلية.
في فئة MelProcessor
، يتم إجراء العملية الحسابية الرئيسية على ذاكرة تخزين مؤقت تحتوي على
عيّنات صوتية من خلال استدعاء MelProcessor::process(const void* buffer, size_t bytes)
.
يمكن للمصنّعين الأصليين للأجهزة استخدام MelProcessor
في تنفيذ HAL إذا لزم الأمر.
تتلقى الفئة MelAggregator
قيم MEL من منافذ صوت مختلفة وتحتسب قيمة CSD من خلال فترة تحرّك تبلغ سبعة أيام. تنفّذ الطريقة MelAggregator::aggregateAndAddNewMelRecord_l(MelRecord mel)
المنطق. يتم إرسال النتائج إلى فئة SoundDoseManager
من أجل
التواصل مع AudioService
.
التنفيذ
تم إيقاف استخدام إضافات واجهة HIDL نهائيًا اعتبارًا من Android 14،
لذلك تم تحديد واجهة HAL الجديدة لاسترداد قيم MEL المحسوبة وإصدار تحذيرات التعرّض للضوء، والتي تحمل الاسم ISoundDose
،
كجزء من AIDL Audio HAL. ومع ذلك،
بالنسبة إلى القائمين بالتنفيذ الذين يحتاجون إلى مزيد من الوقت لدمج HAL Audio AIDL،
لدينا جرعة صوتية مستقلة من قناة AIDL HAL، والتي توفّر واجهة
ISoundDoseFactory
. سيتم
إيقاف هذه الميزة نهائيًا في المستقبل.
تظهر طرق HAL لتوفير ميزة "جرعة الصوت" في الرمز المبرمَج التالي النموذجي:
/**
* 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);
}
}
تُنفِّذ واجهة HAL الجديدة طلبات استدعاء
تُعلم إطار العمل بالتعرّض اللحظي وتوفّر قيم MEL
عندما يتجاوز مستوى الإخراج RS1. عند تنفيذ هذه الواجهات،
يستخدِم إطار العمل هذه الواجهات لإعداد تقارير CSD. في حال عدم تنفيذ هذا المرجع،
يتم استخدام تنفيذ احتياطي في AudioFlinger
لاحتساب تقديرات قيم CSD.
يجب أن يتوفّر لدى Sound دعم AIDL مستقل.
إلى أن يتمكّن المصنّعون الأصليون للأجهزة من دمج واجهة برمجة التطبيقات Sound Dose في واجهة برمجة التطبيقات لوحدة التحكّم في الصوت (HAL) في واجهة برمجة التطبيقات لنظام التشغيل Android (AIDL)، يمكنهم استخدام واجهة برمجة التطبيقات المستقلة لنظام التشغيل Android (AIDL) ISoundDoseFactory
كحل بديل. يستخدم ISoundDoseFactory
واجهة ISoundDose
، كما هو موضّح في المثال التالي على الرمز البرمجي:
@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);
}
يجب أن يتوفّر في Sound dose دعم واجهة برمجة التطبيقات لنظام التشغيل Android (AIDL) لواجهة HAL للصوت.
تتوفّر واجهة "جرعة الصوت" على المدى الطويل كجزء من واجهة HAL للصوت في AIDL من خلال
توسيع واجهة IModule
، كما هو موضّح في نموذج الرمز البرمجي التالي:
@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();
}
هذه الميزة هي تنفيذ لائحة جديدة موضّحة في الإصدار 3 من IEC62368-1 وEN50332-3، لذا لا تتوفّر واجهات برمجة تطبيقات موجّهة للجهات الخارجية.
يمكن لمصنّعي المعدّات الأصلية اعتماد أجهزتهم من خلال تنفيذ واجهات HAL الجديدة و تقديم بيانات MEL دقيقة لميزة CSD إلى إطار العمل الصوتي (إجراء يُنصح به)، أو من خلال تنفيذ جرعة صوت مخصّصة.
تفعيل احتساب "جرعة الصوت"
تتوافق AOSP تلقائيًا مع منطق سلامة السمع الذي يضمن الحصول على شهادة الاعتماد وفقًا لمعايير EN50332-2 وIEC62368-1 10.6.5 الحالية.
في Android 14، تكون طريقة احتساب جرعة الصوت غير مفعَّلة تلقائيًا.
اتّبِع الإرشادات التالية لتفعيل احتساب "جرعة الصوت" بدءًا من الإصدار Android 14-QPR1.
إذا كانت اللوائح التنظيمية لجرعات الصوت مطبَّقة في بلدك، تحقَّق مما إذا تم ضبط
config_safe_media_volume_enabled
فيconfig.xml
علىtrue
.للامتثال لمعيارَي EN50332-3 وIEC62368-1 10.6.3، على المورّدين وضع علامة
config_safe_sound_dosage_enabled
فيconfig.xml
علىtrue
. بالنسبة إلى الأجهزة التي تتيح فك ترميز البيانات التي لا تستخدم واجهات HAL للجرعة الصوتية، يجب عدم ضبطconfig_safe_sound_dosage_enabled
علىtrue
. في هذه الحالات، يمكن أن يؤدي ضبط القيمةconfig_safe_sound_dosage_enabled
علىtrue
إلى قيم غير دقيقة لمعيار CSD ومشاكل في اعتماد معايير السلامة المتعلقة بالسمع.
يوضِّح الرسم البياني التالي للقرارات المنطق الذي يحدِّد ما إذا كان سيتم احتساب CSD أو مستويات أمان السمع القديمة (التي تم تنفيذها قبل Android 14) استنادًا إلى قيود البلدان وقيم العلامات.
الشكل 2: تفعيل احتساب جرعة الصوت (يتمّ إضافة المنطق في Android 14-QPR1)
التحقُّق
عند تنفيذ واجهة HAL لميزة "الجرعة الصوتية"، على المصنّعين الأصليين للأجهزة التحقّق من صحة الإجراء باستخدام
حالات اختبار VTS التي حدّدها VtsHalAudioCoreTargetTest
لتطبيق IModule AIDL Audio HAL، أو باستخدام VtsHalSoundDoseFactoryTargetTest
لتطبيق AIDL HAL المستقل لميزة "الجرعة الصوتية".