การกำหนดเส้นทางเสียง

ใน Android 10 car_audio_configuration.xml จะแทนที่ car_volumes_groups.xml และ IAudioControl.getBusForContext ในไฟล์การกําหนดค่าใหม่จะมีการกำหนดรายการโซน แต่ละโซนจะมีกลุ่มโวลุ่มอย่างน้อย 1 กลุ่มที่มีอุปกรณ์ที่เกี่ยวข้อง และอุปกรณ์แต่ละเครื่องจะมีบริบทที่ควรกำหนดเส้นทางภายในโซนนั้น คุณต้องแสดงบริบททั้งหมดภายในแต่ละโซน

การกำหนดค่าการกำหนดเส้นทางเสียง

ไฟล์นโยบายเสียงซึ่งมักจะอยู่ในพาร์ติชันของผู้ให้บริการจะแสดงการกำหนดค่าฮาร์ดแวร์เสียงของบอร์ด อุปกรณ์ทั้งหมดที่อ้างอิงใน car_audio_configuration.xml ต้องกำหนดภายใน audio_policy_configuration.xml

การเปิดใช้การกำหนดเส้นทาง AAOS

หากต้องการใช้การกำหนดเส้นทางตาม AAOS คุณต้องตั้งค่า Flag audioUseDynamicRouting เป็น true ดังนี้

<resources>
    <bool name="audioUseDynamicRouting">true</bool>
</resources>

เมื่อ false ระบบจะปิดใช้การกำหนดเส้นทางและ CarAudioService ส่วนใหญ่ และระบบปฏิบัติการจะกลับไปใช้ลักษณะการทำงานเริ่มต้นของ AudioService

โซนหลัก

โดยค่าเริ่มต้น ระบบจะกำหนดเส้นทางเสียงทั้งหมดไปยังโซนหลัก โซนหลักจะมีได้เพียงโซนเดียว ซึ่งระบุไว้ในการกำหนดค่าด้วยแอตทริบิวต์ isPrimary="true"

ตัวอย่างการกําหนดค่า

ตัวอย่างเช่น ยานพาหนะอาจมี 2 โซน ได้แก่ โซนหลักและระบบความบันเทิงสำหรับเบาะหลัง car_audio_configuration.xml ที่เป็นไปได้จะได้รับการกําหนดดังนี้

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true">
           <volumeGroups>
               <group>
                   <device address="bus0_media_out">
                       <context context="music"/>
                       <context context="announcement"/>
                   </device>
                   <device address="bus3_call_ring_out">
                       <context context="call_ring"/>
                   </device>
                   <device address="bus6_notification_out">
                       <context context="notification"/>
                   </device>
                   <device address="bus7_system_sound_out">
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                   </device>
               </group>
               <group>
                   <device address="bus1_navigation_out">
                       <context context="navigation"/>
                   </device>
                   <device address="bus2_voice_command_out">
                       <context context="voice_command"/>
                   </device>
               </group>
               <group>
                   <device address="bus4_call_out">
                       <context context="call"/>
                   </device>
               </group>
               <group>
                   <device address="bus5_alarm_out">
                       <context context="alarm"/>
                   </device>
               </group>
           </volumeGroups>
       </zone>
        <zone name="rear seat zone" audioZoneId="1">
           <volumeGroups>
               <group>
                   <device address="bus100_rear_seat">
                       <context context="music"/>
                       <context context="navigation"/>
                       <context context="voice_command"/>
                       <context context="call_ring"/>
                       <context context="call"/>
                       <context context="alarm"/>
                       <context context="notification"/>
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                       <context context="announcement"/>
                   </device>
               </group>
           </volumeGroups>
    </zones>
</audioZoneConfiguration>

ในกรณีนี้ โซนหลักได้แยกบริบทไปยังอุปกรณ์ต่างๆ ซึ่งช่วยให้ HAL ใช้เอฟเฟกต์หลังการประมวลผลและมิกซ์ที่แตกต่างกันในเอาต์พุตของอุปกรณ์แต่ละเครื่องได้โดยใช้ฮาร์ดแวร์ของยานพาหนะ อุปกรณ์ได้รับการจัดเรียงเป็นกลุ่มระดับเสียง 4 กลุ่ม ได้แก่ สื่อ การนำทาง การโทร และการปลุก หากระบบได้รับการกําหนดค่าเป็น useFixedVolume ระบบจะส่งระดับเสียงของแต่ละกลุ่มไปยัง HAL เพื่อใช้กับเอาต์พุตของอุปกรณ์เหล่านี้

สำหรับโซนรอง ผลลัพธ์ที่คาดไว้คือผ่านอุปกรณ์เอาต์พุตเครื่องเดียว ในตัวอย่างนี้ การใช้งานทั้งหมดจะกำหนดเส้นทางไปยังอุปกรณ์และกลุ่มปริมาณข้อมูลกลุ่มเดียวเพื่อให้การดำเนินการง่ายขึ้น

การกำหนดค่าเสียงของโซนคน

ใน Android 11 car_audio_configuration.xml ได้รับการขยายเพิ่มเติมเพื่อเปิดตัวช่องใหม่ 2 ช่อง ได้แก่ audioZoneId และ occupantZoneId รายการแรกคือ audioZoneId ซึ่งใช้เพื่อควบคุมการจัดการโซนได้ดียิ่งขึ้น ในทางกลับกัน occupantZoneId สามารถใช้เพื่อกําหนดค่าการกำหนดเส้นทางตามรหัสผู้ใช้

หากต้องการใช้ช่องใหม่เหล่านี้ คุณต้องใช้ car_audio_configuration.xml เวอร์ชัน 2 กลับไปดูการกำหนดค่าเสียงด้านบน แต่ใช้ช่องใหม่สำหรับการแมปรหัสโซนผู้อยู่อาศัยและรหัสโซนเสียง การกำหนดค่าใหม่ที่ไม่มีการกำหนดกลุ่มระดับเสียงจะตั้งค่าได้ดังนี้

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true" occupantZoneId="0">
         ...
       </zone>
       <zone name="rear seat zone" audioZoneId="1" occupantZoneId="1">
         ...
       </zone>
    </zones>
</audioZoneConfiguration>

การกําหนดค่าข้างต้นจะกําหนดการแมปสําหรับโซนหลักกับโซนผู้อยู่อาศัย 0 และ audioZoneId 1 กับ occupantZoneId 1 โดยทั่วไปแล้ว คุณสามารถกำหนดค่าการแมประหว่างโซนคนนั่งและโซนเสียงได้ แต่การแมปต้องเป็นแบบ 1:1 กฎที่กําหนดช่องใหม่ 2 ช่องมีดังนี้

  • audioZoneId สำหรับโซนหลักจะเป็น 0 เสมอ
  • หมายเลข audioZoneId และ occupantZoneId ต้องไม่ซ้ำกัน
  • audioZoneId และ occupantZoneId มีการแมปแบบ 1:1 ได้เท่านั้น

การกำหนดเส้นทางผ่าน UID ของแอปพลิเคชัน

เราได้เปิดตัวชุด API ที่ซ่อนอยู่ใน CarAudioManager ของปี 2010 เพื่ออนุญาตให้แอปค้นหาและตั้งค่าโซนเสียงและโฟกัส

int[] getAudioZoneIds();
int getZoneIdForUid(int uid);
boolean setZoneIdForUid(int zoneId, int uid);
boolean clearZoneIdForUid(int uid);

API ข้างต้นอนุญาตให้แอปพลิเคชันของบุคคลที่หนึ่งจัดการการกำหนดเส้นทางเสียงตาม UID ของแอปพลิเคชัน ดังนั้น คุณจึงต้องใช้ทั้งรหัสโซนเสียงและ UID ของแอปพลิเคชันด้วย เมื่อทราบข้อมูลดังกล่าวแล้ว คุณจะกำหนดการกำหนดเส้นทางเสียงได้โดยใช้ CarAudioManager#setZoneIdForUid API

การเปลี่ยนเขตเวลาสำหรับแอป

โดยค่าเริ่มต้น เสียงทั้งหมดจะส่งไปยังโซนหลัก หากต้องการอัปเดตแอปพลิเคชันเพื่อเปลี่ยนเส้นทางไปยังโซนอื่น ให้ใช้ CarAudioManager#setZoneIdForUid โดยทำดังนี้

// Find zone to play
int zoneId = ...

// Find application's uid
Int uid = mContext.getPackageManager()
        .getApplicationInfo(mContext.getPackageName(), 0)
        .uid;

if (mCarAudioManager.setZoneIdForUid(zoneId, info.uid)) {
    Log.d(TAG, "Zone successfully updated");
} else {
    Log.d(TAG, "Failed to change zone");
}

ไม่ หมายเหตุ: สตรีมและโฟกัสจะสลับโซนแบบไดนามิกไม่ได้ ดังนั้นจึงต้องหยุดการเล่นและขอโฟกัสอีกครั้งเพื่อเปลี่ยนโซน

การกำหนดเส้นทางด้วยรหัสผู้ใช้

แม้ว่าการกำหนดเส้นทางตาม UID ของแอปพลิเคชันจะให้คุณควบคุมการกำหนดเส้นทางเสียงของแอปพลิเคชันแต่ละรายการได้อย่างละเอียด แต่ก็กำหนดให้ต้องกำหนดการกำหนดเส้นทางเสียงสำหรับแต่ละแอปพลิเคชันก่อนที่จะมีแอปพลิเคชันขอโฟกัสเสียงและเล่นเสียง CarAudioService ใช้การแมปโซนผู้นั่งในรถและโซนเสียงเพื่อกำหนดการกำหนดเส้นทางตามรหัสผู้ใช้เพื่อลดปัญหานี้และอำนวยความสะดวกเพิ่มเติมในแอปพลิเคชันของบุคคลที่สามในการเล่นเสียงโดยไม่ต้องแก้ไข วิธีนี้ช่วยให้บริการเสียงของรถยนต์ได้รับการแจ้งเตือนเมื่อผู้ใช้เข้าสู่ระบบโซนคนนั่ง สัญญาณนี้จะทำให้ระบบกำหนดค่าการจัดการโฟกัสเสียงและการกำหนดเส้นทางโดยอัตโนมัติสำหรับโซนเสียงทั้งหมด

คุณยังคงใช้การกำหนดเส้นทางตาม UID ของแอปพลิเคชันได้ แต่จะต้องทำแยกจากการกําหนดเส้นทางตามรหัสผู้ใช้ ซึ่งหมายความว่าหากมีการกำหนดการแมปโซนผู้นั่งกับโซนเสียงของรถยนต์ ระบบจะปิดใช้การกำหนดเส้นทางตาม UID และพยายามเรียกใช้CarAudioManager#setZoneidForUid จะแสดงข้อผิดพลาด

แม้ว่าการจัดการการกำหนดเส้นทางเสียงและโฟกัสจะง่ายขึ้นด้วยการจัดการโซนผู้โดยสาร แต่ผู้ใช้ยังคงต้องได้รับการกำหนดไปยังโซนผู้โดยสาร ซึ่งทำได้โดย การใช้ CarOccupantZoneManager#assignProfileUserToOccupantZone API นี้ต้องมีสิทธิ์ในการจัดการผู้ใช้ ปัจจุบัน OEM มีหน้าที่จัดการการกําหนดผู้ใช้ไปยังโซนผู้อยู่อาศัยผ่าน UI ของระบบ เมื่อดำเนินการเสร็จแล้ว ระบบจะกำหนดค่าการเปิดแอปพลิเคชัน การกำหนดเส้นทางเสียง และการจัดการโฟกัสให้กับผู้ใช้โดยอัตโนมัติ

การกำหนดเส้นทางด้วย setPreferredDevice

นอกจากการเปลี่ยนแปลงข้างต้นแล้ว Android 11 ยังมี API ใหม่สําหรับการค้นหาอุปกรณ์เอาต์พุตที่เชื่อมโยงกับแต่ละโซนด้วย ซึ่งก็คือ CarAudioManager#getOutputDeviceForUsage(int zoneId, int usage)

คุณสามารถใช้ API เพื่อค้นหาอุปกรณ์เอาต์พุตสำหรับโซนและการใช้แอตทริบิวต์เสียงที่เฉพาะเจาะจง วิธีนี้ช่วยให้แอปพลิเคชันของบุคคลที่หนึ่งสามารถกำหนดเส้นทางเสียงไปยังโซนต่างๆ ได้โดยใช้ setPreferredDevice API ของโปรแกรมเล่น getOutputDeviceForUsage API ต้องใช้ PERMISSION_CAR_CONTROL_AUDIO_SETTINGS และเป็น API ของระบบ ด้านล่างนี้คือตัวอย่างการค้นหาอุปกรณ์สื่อสำหรับโซนหนึ่งๆ และการกำหนดเส้นทางไปยังอุปกรณ์นั้นโดยใช้ setPreferredDevice API

audioZoneId = ... ;
mediaDeviceInfo = mCarAudioManager
            .getOutputDeviceForUsage(audioZoneId, AudioAttributes.USAGE_MEDIA);
…
mPlayer.setPreferredDevice(mediaDeviceInfo);