অডিও নীতি কনফিগার করুন

অ্যান্ড্রয়েড 10 রিলিজে জটিল স্বয়ংচালিত ব্যবহারের ক্ষেত্রে আরও নমনীয়তা প্রদানের জন্য অডিও নীতি পরিচালকের একটি উল্লেখযোগ্য রিফ্যাক্টরিং অন্তর্ভুক্ত রয়েছে:

  • OEM-নির্দিষ্ট রাউটিং কৌশল।
  • একই ভলিউম বক্ররেখা ব্যবহার করে লিগ্যাসি স্ট্রিম প্রকারের গোষ্ঠীগুলির জন্য কাস্টমাইজযোগ্য ভলিউম গ্রুপ।
  • হার্ড কোডেড হওয়ার পরিবর্তে অডিও নীতি ইঞ্জিন দ্বারা ঘোষিত রাউটিং কৌশল।
  • অডিও নীতি ইঞ্জিন দ্বারা পরিচালিত ভলিউম বক্ররেখা এবং গোষ্ঠী।
  • অভ্যন্তরীণ রিফ্যাক্টরিং সাধারণ কোড এবং কনফিগারযোগ্য কোডের মধ্যে ভবিষ্যতের বিভাজনের জন্য প্রস্তুতি নিচ্ছে এবং আরও সমৃদ্ধ অডিও ডিভাইস পরিচালনার প্রস্তাব করছে। উদাহরণস্বরূপ, সমস্ত ডিভাইস বৈশিষ্ট্যের ব্যবহার শুধুমাত্র নীতি নিয়মে এর ধরন নয়।

আপনার অডিও টপোলজি বর্ণনা করার জন্য Android 7.0 একটি অডিও নীতি কনফিগারেশন ফাইল ফর্ম্যাট (XML) চালু করেছে।

আপনার পণ্যে উপস্থিত অডিও ডিভাইসগুলি ঘোষণা করতে device/<company>/<device>/audio/audio_policy.conf ব্যবহার করে পূর্ববর্তী অ্যান্ড্রয়েড রিলিজ প্রয়োজন (আপনি device/samsung/tuna/audio/audio_policy.conf গ্যালাক্সি নেক্সাস অডিও হার্ডওয়্যারের জন্য এই ফাইলটির একটি উদাহরণ দেখতে পারেন) device/samsung/tuna/audio/audio_policy.conf )। যাইহোক, CONF হল একটি সহজ, মালিকানাধীন বিন্যাস যা টেলিভিশন এবং অটোমোবাইলের মতো উল্লম্বগুলির জন্য জটিল টপোলজিগুলি বর্ণনা করতে খুব সীমিত।

অ্যান্ড্রয়েড 7.0 audio_policy.conf বাতিল করেছে এবং একটি XML ফাইল ফর্ম্যাট ব্যবহার করে একটি অডিও টপোলজি সংজ্ঞায়িত করার জন্য সমর্থন যোগ করেছে যা আরও মানব-পাঠযোগ্য, সম্পাদনা এবং পার্সিং সরঞ্জামগুলির বিস্তৃত পরিসর রয়েছে এবং জটিল অডিও টপোলজিগুলি বর্ণনা করার জন্য যথেষ্ট নমনীয়৷ Android 7.0 কনফিগার ফাইলগুলির XML ফর্ম্যাট বেছে নেওয়ার জন্য USE_XML_AUDIO_POLICY_CONF বিল্ড পতাকা ব্যবহার করে।

XML বিন্যাসের সুবিধা

CONF ফাইলের মতো, XML ফাইলটি আউটপুট এবং ইনপুট স্ট্রীম প্রোফাইলের সংখ্যা এবং প্রকার, প্লেব্যাক এবং ক্যাপচারের জন্য ব্যবহারযোগ্য ডিভাইস এবং অডিও বৈশিষ্ট্যগুলি নির্ধারণ করতে সক্ষম করে। উপরন্তু, XML বিন্যাস নিম্নলিখিত বর্ধিতকরণ অফার করে:

  • অ্যান্ড্রয়েড 10-এ, একাধিক সক্রিয় রেকর্ডিং অ্যাপ একই সাথে অনুমোদিত।
    • একযোগে পরিস্থিতির কারণে রেকর্ডিং শুরু কখনই প্রত্যাখ্যান করা হয় না।
    • registerAudioRecordingCallback(AudioManager.AudioRecordingCallback cb) কলব্যাক ক্যাপচার পাথ পরিবর্তনের ক্লায়েন্টদের অবহিত করে।
  • নিম্নলিখিত পরিস্থিতিতে, একজন ক্লায়েন্ট নীরব অডিও নমুনা পায়:
    • একটি গোপনীয়তা-সংবেদনশীল ব্যবহারের ক্ষেত্রে (উদাহরণস্বরূপ, VOICE_COMMUNICATION ) সক্রিয়।
    • ক্লায়েন্টের ফোরগ্রাউন্ড সার্ভিস বা ফোরগ্রাউন্ড UI নেই।
    • বিশেষ ভূমিকা নীতি দ্বারা স্বীকৃত হয়:
      • অ্যাক্সেসিবিলিটি পরিষেবা: গোপনীয়তা-সংবেদনশীল ব্যবহারের ক্ষেত্রে সক্রিয় থাকলেও রেকর্ড করতে পারে।
      • সহকারী: UI শীর্ষে থাকলে গোপনীয়তা সংবেদনশীল বলে বিবেচিত হয়।
  • অডিও প্রোফাইলে HDMI সাধারণ অডিও বর্ণনাকারীর অনুরূপ একটি কাঠামো রয়েছে, যা প্রতিটি অডিও বিন্যাসের জন্য নমুনা হার/চ্যানেল মাস্কের একটি ভিন্ন সেট সক্ষম করে।
  • ডিভাইস এবং স্ট্রিমগুলির মধ্যে সমস্ত সম্ভাব্য সংযোগের জন্য সুস্পষ্ট সংজ্ঞা রয়েছে৷ পূর্বে, একটি অন্তর্নিহিত নিয়ম একই HAL মডিউলের সাথে সংযুক্ত সমস্ত ডিভাইস সংযোগ করা সম্ভব করেছিল, অডিও প্যাচ API-এর সাথে অনুরোধ করা সংযোগগুলি নিয়ন্ত্রণ করতে অডিও নীতিকে বাধা দেয়। XML বিন্যাসে, টপোলজি বিবরণ সংযোগের সীমাবদ্ধতা সংজ্ঞায়িত করে।
  • অন্তর্ভুক্ত করার জন্য সমর্থন স্ট্যান্ডার্ড A2DP, ইউএসবি, বা পুনরায় রুট জমা সংজ্ঞা পুনরাবৃত্তি এড়ায়।
  • ভলিউম বক্ররেখা কাস্টমাইজযোগ্য. পূর্বে, ভলিউম টেবিলগুলি হার্ডকোড করা হয়েছিল। XML বিন্যাসে, ভলিউম টেবিল বর্ণনা করা হয় এবং কাস্টমাইজ করা যেতে পারে।

frameworks/av/services/audiopolicy/config/audio_policy_configuration.xml এর টেমপ্লেট ব্যবহার করা এই বৈশিষ্ট্যগুলির অনেকগুলি দেখায়।

ফাইল বিন্যাস এবং অবস্থান

নতুন অডিও নীতি কনফিগারেশন ফাইল হল audio_policy_configuration.xml এবং এটি /system/etc এ অবস্থিত। নিম্নলিখিত উদাহরণগুলি Android 12 এর জন্য এবং Android 12 এর নীচের সংস্করণগুলির জন্য XML ফাইল বিন্যাসে একটি সাধারণ অডিও নীতি কনফিগারেশন দেখায়।

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<audioPolicyConfiguration version="7.0" xmlns:xi="http://www.w3.org/2001/XInclude">
    <globalConfiguration speaker_drc_enabled="true"/>
    <modules>
        <module name="primary" halVersion="3.0">
            <attachedDevices>
                <item>Speaker</item>
                <item>Earpiece</item>
                <item>Built-In Mic</item>
            </attachedDevices>
            <defaultOutputDevice>Speaker</defaultOutputDevice>
            <mixPorts>
                <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                             samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                </mixPort>
                <mixPort name="primary input" role="sink">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                             samplingRates="8000 16000 48000"
                             channelMasks="AUDIO_CHANNEL_IN_MONO"/>
                </mixPort>
            </mixPorts>
            <devicePorts>
                <devicePort tagName="Earpiece" type="AUDIO_DEVICE_OUT_EARPIECE" role="sink">
                   <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/>
                </devicePort>
                <devicePort tagName="Speaker" role="sink" type="AUDIO_DEVICE_OUT_SPEAKER" address="">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                             samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                </devicePort>
                <devicePort tagName="Wired Headset" type="AUDIO_DEVICE_OUT_WIRED_HEADSET" role="sink">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                             samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                </devicePort>
                <devicePort tagName="Built-In Mic" type="AUDIO_DEVICE_IN_BUILTIN_MIC" role="source">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                             samplingRates="8000 16000 48000"
                             channelMasks="AUDIO_CHANNEL_IN_MONO"/>
                </devicePort>
                <devicePort tagName="Wired Headset Mic" type="AUDIO_DEVICE_IN_WIRED_HEADSET" role="source">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                             samplingRates="8000 16000 48000"
                             channelMasks="AUDIO_CHANNEL_IN_MONO"/>
                </devicePort>
            </devicePorts>
            <routes>
                <route type="mix" sink="Earpiece" sources="primary output"/>
                <route type="mix" sink="Speaker" sources="primary output"/>
                <route type="mix" sink="Wired Headset" sources="primary output"/>
                <route type="mix" sink="primary input" sources="Built-In Mic,Wired Headset Mic"/>
            </routes>
        </module>
        <xi:include href="a2dp_audio_policy_configuration.xml"/>
    </modules>

    <xi:include href="audio_policy_volumes.xml"/>
    <xi:include href="default_volume_tables.xml"/>
</audioPolicyConfiguration>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
    <globalConfiguration speaker_drc_enabled="true"/>
    <modules>
        <module name="primary" halVersion="3.0">
            <attachedDevices>
                <item>Speaker</item>
                <item>Earpiece</item>
                <item>Built-In Mic</item>
            </attachedDevices>
            <defaultOutputDevice>Speaker</defaultOutputDevice>
            <mixPorts>
                <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                             samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                </mixPort>
                <mixPort name="primary input" role="sink">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                             samplingRates="8000,16000,48000"
                             channelMasks="AUDIO_CHANNEL_IN_MONO"/>
                </mixPort>
            </mixPorts>
            <devicePorts>
                <devicePort tagName="Earpiece" type="AUDIO_DEVICE_OUT_EARPIECE" role="sink">
                   <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/>
                </devicePort>
                <devicePort tagName="Speaker" role="sink" type="AUDIO_DEVICE_OUT_SPEAKER" address="">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                             samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                </devicePort>
                <devicePort tagName="Wired Headset" type="AUDIO_DEVICE_OUT_WIRED_HEADSET" role="sink">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                             samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                </devicePort>
                <devicePort tagName="Built-In Mic" type="AUDIO_DEVICE_IN_BUILTIN_MIC" role="source">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                             samplingRates="8000,16000,48000"
                             channelMasks="AUDIO_CHANNEL_IN_MONO"/>
                </devicePort>
                <devicePort tagName="Wired Headset Mic" type="AUDIO_DEVICE_IN_WIRED_HEADSET" role="source">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                             samplingRates="8000,16000,48000"
                             channelMasks="AUDIO_CHANNEL_IN_MONO"/>
                </devicePort>
            </devicePorts>
            <routes>
                <route type="mix" sink="Earpiece" sources="primary output"/>
                <route type="mix" sink="Speaker" sources="primary output"/>
                <route type="mix" sink="Wired Headset" sources="primary output"/>
                <route type="mix" sink="primary input" sources="Built-In Mic,Wired Headset Mic"/>
            </routes>
        </module>
        <xi:include href="a2dp_audio_policy_configuration.xml"/>
    </modules>

    <xi:include href="audio_policy_volumes.xml"/>
    <xi:include href="default_volume_tables.xml"/>
</audioPolicyConfiguration>

শীর্ষ-স্তরের কাঠামোতে এমন মডিউল রয়েছে যা প্রতিটি অডিও HAL হার্ডওয়্যার মডিউলের সাথে মিলে যায়, যেখানে প্রতিটি মডিউলে মিক্স পোর্ট, ডিভাইস পোর্ট এবং রুটের একটি তালিকা থাকে:

  • মিক্স পোর্টগুলি স্ট্রিমগুলির জন্য সম্ভাব্য কনফিগার প্রোফাইলগুলি বর্ণনা করে যা প্লেব্যাক এবং ক্যাপচারের জন্য অডিও HAL-এ খোলা যেতে পারে।
  • ডিভাইস পোর্টগুলি তাদের প্রকারের সাথে সংযুক্ত করা যেতে পারে এমন ডিভাইসগুলি বর্ণনা করে (এবং ঐচ্ছিকভাবে ঠিকানা এবং অডিও বৈশিষ্ট্য, যদি প্রাসঙ্গিক হয়)।
  • রুটগুলিকে মিক্স পোর্ট বর্ণনাকারী থেকে আলাদা করা হয়েছে, যা ডিভাইস থেকে ডিভাইসে বা ডিভাইসে স্ট্রিমের রুটের বর্ণনা সক্ষম করে।

ভলিউম টেবিলগুলি হল পয়েন্টগুলির সহজ তালিকা যা একটি UI সূচক থেকে dB তে একটি ভলিউম অনুবাদ করতে ব্যবহৃত বক্ররেখাকে সংজ্ঞায়িত করে৷ একটি পৃথক অন্তর্ভুক্ত ফাইল ডিফল্ট বক্ররেখা প্রদান করে, তবে প্রদত্ত ব্যবহারের ক্ষেত্রে এবং ডিভাইস বিভাগের জন্য প্রতিটি বক্ররেখা ওভাররাইট করা যেতে পারে।

<?xml version="1.0" encoding="UTF-8"?>
<volumes>
    <reference name="FULL_SCALE_VOLUME_CURVE">
        <point>0,0</point>
        <point>100,0</point>
    </reference>
    <reference name="SILENT_VOLUME_CURVE">
        <point>0,-9600</point>
        <point>100,-9600</point>
    </reference>
    <reference name="DEFAULT_VOLUME_CURVE">
        <point>1,-4950</point>
        <point>33,-3350</point>
        <point>66,-1700</point>
        <point>100,0</point>
    </reference>
</volumes>
<?xml version="1.0" encoding="UTF-8"?>
<volumes>
    <volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>

    <volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>

    <volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA"ref="DEFAULT_VOLUME_CURVE"/>

    <volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_SPEAKER">
        <point>1,-5500</point>
        <point>20,-4300</point>
        <point>86,-1200</point>
        <point>100,0</point>
    </volume>
    <volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>

    <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>

    <volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>

    <volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>

    <volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>

    <volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>

    <volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="SILENT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="FULL_SCALE_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="SILENT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="SILENT_VOLUME_CURVE"/>

    <volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>

    <volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="FULL_SCALE_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="FULL_SCALE_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="FULL_SCALE_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="FULL_SCALE_VOLUME_CURVE"/>

    <volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="FULL_SCALE_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="FULL_SCALE_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="FULL_SCALE_VOLUME_CURVE"/>
    <volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="FULL_SCALE_VOLUME_CURVE"/>
</volumes>

ফাইল অন্তর্ভুক্তি

XML অন্তর্ভুক্তি (XInclude) পদ্ধতিটি অন্যান্য XML ফাইলে অবস্থিত অডিও নীতি কনফিগারেশন তথ্য অন্তর্ভুক্ত করতে ব্যবহার করা যেতে পারে। সমস্ত অন্তর্ভুক্ত ফাইলগুলিকে নিম্নলিখিত বিধিনিষেধের সাথে উপরে বর্ণিত কাঠামো অনুসরণ করতে হবে:

  • ফাইলগুলিতে শুধুমাত্র শীর্ষ-স্তরের উপাদান থাকতে পারে।
  • ফাইলগুলিতে XInclude উপাদান থাকতে পারে না।

সমস্ত অডিও নীতি কনফিগারেশন ফাইলে স্ট্যান্ডার্ড অ্যান্ড্রয়েড ওপেন সোর্স প্রজেক্ট (AOSP) অডিও HAL মডিউল কনফিগারেশন তথ্য অনুলিপি করা এড়াতে ব্যবহার অন্তর্ভুক্ত (যা ত্রুটির প্রবণ)। নিম্নলিখিত অডিও HAL-এর জন্য একটি আদর্শ অডিও নীতি কনফিগারেশন XML ফাইল প্রদান করা হয়েছে:

  • A2DP: a2dp_audio_policy_configuration.xml
  • সাবমিক্স রিরুট করুন: rsubmix_audio_policy_configuration.xml
  • USB: usb_audio_policy_configuration.xml

অডিও নীতি কোড সংগঠন

AudioPolicyManager.cpp রক্ষণাবেক্ষণ এবং কনফিগার করা সহজ করতে কয়েকটি মডিউলে বিভক্ত। frameworks/av/services/audiopolicy সংগঠন নিম্নলিখিত মডিউলগুলিকে অন্তর্ভুক্ত করে।

মডিউল বর্ণনা
/managerdefault জেনেরিক ইন্টারফেস এবং সমস্ত অ্যাপের জন্য সাধারণ আচরণ বাস্তবায়ন অন্তর্ভুক্ত করে। AudioPolicyManager.cpp এর মতো ইঞ্জিন কার্যকারিতা এবং সাধারণ ধারণাগুলিকে বিমূর্ত করা।
/common বেস ক্লাস সংজ্ঞায়িত করে (উদাহরণস্বরূপ, ইনপুট আউটপুট অডিও স্ট্রিম প্রোফাইল, অডিও ডিভাইস বর্ণনাকারী, অডিও প্যাচ এবং অডিও পোর্টের জন্য ডেটা স্ট্রাকচার)। এটি আগে AudioPolicyManager.cpp ভিতরে সংজ্ঞায়িত করা হয়েছিল।
/engine

প্রদত্ত ব্যবহারের ক্ষেত্রে কোন ডিভাইস এবং ভলিউম ব্যবহার করা উচিত তা নির্ধারণ করে এমন নিয়মগুলি প্রয়োগ করে৷ এটি জেনেরিক অংশের সাথে একটি স্ট্যান্ডার্ড ইন্টারফেস প্রয়োগ করে, যেমন একটি প্রদত্ত প্লেব্যাক বা ক্যাপচার ব্যবহারের ক্ষেত্রে উপযুক্ত ডিভাইস পেতে, বা সংযুক্ত ডিভাইস বা বাহ্যিক অবস্থা (অর্থাৎ, জোরপূর্বক ব্যবহারের একটি কল অবস্থা) সেট করতে যা রাউটিং পরিবর্তন করতে পারে। সিদ্ধান্ত

দুটি সংস্করণে উপলব্ধ: কনফিগারযোগ্য এবং ডিফল্ট । সংস্করণটি কীভাবে নির্বাচন করবেন সে সম্পর্কে তথ্যের জন্য, প্যারামিটার ফ্রেমওয়ার্ক ব্যবহার করে কনফিগারেশন দেখুন।

/engineconfigurable নীতি ইঞ্জিন বাস্তবায়ন যা প্যারামিটার ফ্রেমওয়ার্কের উপর নির্ভর করে (নীচে দেখুন)। কনফিগারেশন প্যারামিটার ফ্রেমওয়ার্কের উপর ভিত্তি করে এবং যেখানে নীতি XML ফাইল দ্বারা সংজ্ঞায়িত করা হয়।
/enginedefault পূর্ববর্তী Android অডিও নীতি পরিচালক বাস্তবায়নের উপর ভিত্তি করে নীতি ইঞ্জিন বাস্তবায়ন। এটি ডিফল্ট এবং এতে হার্ড-কোডেড নিয়ম রয়েছে যা Nexus এবং AOSP বাস্তবায়নের সাথে সঙ্গতিপূর্ণ।
/service ফ্রেমওয়ার্কের বাকি অংশে ইন্টারফেসের সাথে বাইন্ডার ইন্টারফেস, থ্রেডিং এবং লকিং বাস্তবায়ন অন্তর্ভুক্ত করে।

প্যারামিটার ফ্রেমওয়ার্ক ব্যবহার করে কনফিগারেশন

কনফিগারেশন ফাইল দ্বারা সম্পূর্ণরূপে সংজ্ঞায়িত একটি অডিও নীতি সমর্থন করার সাথে সাথে বোঝা এবং বজায় রাখা সহজ করার জন্য অডিও নীতি কোড সংগঠিত হয়। প্রতিষ্ঠান এবং অডিও নীতির নকশা ইন্টেলের প্যারামিটার ফ্রেমওয়ার্কের উপর ভিত্তি করে তৈরি করা হয়েছে, প্যারামিটার পরিচালনার জন্য একটি প্লাগইন-ভিত্তিক এবং নিয়ম-ভিত্তিক কাঠামো।

কনফিগারযোগ্য অডিও নীতি ব্যবহার করে বিক্রেতা OEM-কে এতে সক্ষম করে:

  • XML-এ একটি সিস্টেমের গঠন এবং এর পরামিতি বর্ণনা করুন।
  • লিখুন (C++ এ) বা বর্ণিত পরামিতিগুলি অ্যাক্সেস করার জন্য একটি ব্যাকএন্ড (প্লাগইন) পুনরায় ব্যবহার করুন।
  • সংজ্ঞায়িত করুন (XML বা একটি ডোমেন-নির্দিষ্ট ভাষায়) শর্ত/নিয়ম যার ভিত্তিতে একটি প্রদত্ত প্যারামিটার একটি প্রদত্ত মান নিতে হবে।

AOSP একটি অডিও নীতি কনফিগারেশন ফাইলের একটি উদাহরণ অন্তর্ভুক্ত করে যা Frameworks/av/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/PolicyConfigurableDomains.xml এ প্যারামিটার ফ্রেমওয়ার্ক ব্যবহার করে। বিস্তারিত জানার জন্য, প্যারামিটার ফ্রেমওয়ার্কের Intel ডকুমেন্টেশন পড়ুন।

Android 10 বা তার নিচের সংস্করণে, USE_CONFIGURABLE_AUDIO_POLICY বিল্ড বিকল্পটি ব্যবহার করে কনফিগারযোগ্য অডিও নীতি নির্বাচন করা হয়। Android 11 বা উচ্চতর সংস্করণে, audio_policy_configuration.xml ফাইলে অডিও নীতি ইঞ্জিনের সংস্করণ নির্বাচন করা হয়। কনফিগারযোগ্য অডিও নীতি ইঞ্জিন নির্বাচন করতে, globalConfiguration উপাদানের engine_library বৈশিষ্ট্যের মান নিম্নলিখিত উদাহরণের মতো configurable হিসাবে সেট করুন:

<audioPolicyConfiguration>
    <globalConfiguration engine_library="configurable" />
...
</audioPolicyConfiguration>

অডিও নীতি রাউটিং APIs

অ্যান্ড্রয়েড 6.0 একটি সর্বজনীন গণনা এবং নির্বাচন API প্রবর্তন করেছে যা অডিও প্যাচ/অডিও পোর্ট অবকাঠামোর শীর্ষে বসে এবং অ্যাপ বিকাশকারীদের একটি নির্দিষ্ট ডিভাইস আউটপুট বা সংযুক্ত অডিও রেকর্ড বা ট্র্যাকের জন্য ইনপুটের জন্য পছন্দ নির্দেশ করতে দেয়।

অ্যান্ড্রয়েড 7.0-এ, গণনা এবং নির্বাচন API CTS পরীক্ষা দ্বারা যাচাই করা হয় এবং নেটিভ C/C++ (OpenSL ES) অডিও স্ট্রীমগুলির জন্য রাউটিং অন্তর্ভুক্ত করার জন্য প্রসারিত করা হয়। জাভাতে নেটিভ স্ট্রিমগুলির রাউটিং করা অব্যাহত রয়েছে, একটি AudioRouting ইন্টারফেস যোগ করে যা AudioTrack এবং AudioRecord ক্লাসের জন্য সুনির্দিষ্ট সুস্পষ্ট রাউটিং পদ্ধতিগুলিকে ছাড়িয়ে যায়, একত্রিত করে এবং অবমূল্যায়ন করে।

গণনা এবং নির্বাচন API এর বিশদ বিবরণের জন্য, Android কনফিগারেশন ইন্টারফেস এবং OpenSLES_AndroidConfiguration.h দেখুন। অডিও রাউটিং সম্পর্কে বিস্তারিত জানার জন্য, AudioRouting পড়ুন।

মাল্টি-চ্যানেল সমর্থন

যদি আপনার হার্ডওয়্যার এবং ড্রাইভার HDMI এর মাধ্যমে মাল্টিচ্যানেল অডিও সমর্থন করে, আপনি অডিও স্ট্রীমটি সরাসরি অডিও হার্ডওয়্যারে আউটপুট করতে পারেন (এটি অডিওফ্লিংগার মিক্সারকে বাইপাস করে যাতে এটি দুটি চ্যানেলে মিশ্রিত না হয়।) অডিও এইচএএল অবশ্যই প্রকাশ করবে যে একটি আউটপুট স্ট্রিম প্রোফাইল কিনা। মাল্টিচ্যানেল অডিও ক্ষমতা সমর্থন করে। যদি HAL তার ক্ষমতা প্রকাশ করে, ডিফল্ট পলিসি ম্যানেজার HDMI এর মাধ্যমে মাল্টিচ্যানেল প্লেব্যাকের অনুমতি দেয়। বাস্তবায়নের বিশদ বিবরণের জন্য, device/samsung/tuna/audio/audio_hw.c দেখুন।

আপনার পণ্যে একটি মাল্টিচ্যানেল অডিও আউটপুট রয়েছে তা নির্দিষ্ট করতে, আপনার পণ্যের মাল্টিচ্যানেল আউটপুট বর্ণনা করতে অডিও নীতি কনফিগারেশন ফাইলটি সম্পাদনা করুন৷ frameworks/av/services/audiopolicy/config/primary_audio_policy_configuration_tv.xml থেকে নিম্নলিখিত উদাহরণটি একটি ডায়নামিক চ্যানেল মাস্ক দেখায়, যার মানে অডিও নীতি ম্যানেজার সংযোগের পরে HDMI সিঙ্ক দ্বারা সমর্থিত চ্যানেল মাস্কগুলিকে জিজ্ঞাসা করে৷

<module name="primary" halVersion="2.0">
    <attachedDevices>
        <item>Speaker</item>
    </attachedDevices>
    <defaultOutputDevice>Speaker</defaultOutputDevice>
    <mixPorts>
        <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY">
            <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                     samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
        </mixPort>
        <mixPort name="direct" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT" />
        <mixPort name="tunnel" role="source"
                 flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_HW_AV_SYNC" />
   </mixPorts>
   <devicePorts>
        <devicePort tagName="Speaker" type="AUDIO_DEVICE_OUT_SPEAKER" role="sink" />
        <devicePort tagName="Out Aux Digital" type="AUDIO_DEVICE_OUT_AUX_DIGITAL" role="sink"
                    encodedFormats="AUDIO_FORMAT_AC3 AUDIO_FORMAT_IEC61937" />
    </devicePorts>
    <routes>
        <route type="mix" sink="Speaker" sources="primary output"/>
        <route type="mix" sink="Out Aux Digital" sources="primary output,direct,tunnel"/>
    </routes>
</module>

আপনি একটি স্ট্যাটিক চ্যানেল মাস্কও নির্দিষ্ট করতে পারেন যেমন AUDIO_CHANNEL_OUT_5POINT1 । অডিওফ্লিংগারের মিক্সার মাল্টিচ্যানেল অডিও সমর্থন করে না এমন একটি অডিও ডিভাইসে পাঠানো হলে স্বয়ংক্রিয়ভাবে স্টেরিওতে বিষয়বস্তুকে ডাউনমিক্স করে।

মিডিয়া কোডেক

আপনার হার্ডওয়্যার এবং ড্রাইভার সমর্থন অডিও কোডেক আপনার পণ্যের জন্য সঠিকভাবে ঘোষণা করা হয়েছে তা নিশ্চিত করুন। বিস্তারিত জানার জন্য, দেখুন কোডেককে ফ্রেমওয়ার্কে প্রকাশ করা