Android Automotive OS (AAOS) สร้างจากสแต็กเสียงหลักของ Android เพื่อ รองรับกรณีการใช้งานสำหรับระบบปฏิบัติการสาระบันเทิงในรถ AAOS มีหน้าที่รับผิดชอบต่อเสียงสาระบันเทิง (กล่าวคือ สื่อ การนำทาง และ การสื่อสาร) แต่ไม่รับผิดชอบโดยตรงสําหรับเสียงกริ่งและคําเตือน ความพร้อมใช้งานและกำหนดเวลาที่เข้มงวด ขณะที่ AAOS ให้สัญญาณและ กลไกต่างๆ เพื่อช่วยรถจัดการเสียง ซึ่งในท้ายที่สุดก็ขึ้นอยู่กับยานพาหนะ เพื่อโทรถึงควรเปิดเสียงฝั่งคนขับและ ของผู้โดยสาร โดยตรวจสอบว่าเสียงที่สำคัญด้านความปลอดภัยและเสียงตามกฎข้อบังคับนั้นถูกต้อง โดยไม่ขัดจังหวะ
ในขณะที่ Android จัดการประสบการณ์การใช้งานสื่อของรถยนต์ แหล่งที่มาสื่อภายนอก เช่น ตัวรับสัญญาณวิทยุควรแสดงโดยแอปต่างๆ ซึ่งสามารถจัดการเสียง เหตุการณ์สำคัญของสื่อและโฟกัสสำหรับแหล่งที่มา
Android 11 มีการเปลี่ยนแปลงด้านเสียงที่เกี่ยวข้องกับยานยนต์ดังต่อไปนี้ การสนับสนุน:
- การเลือกโซนเสียงอัตโนมัติตาม User-ID ที่เกี่ยวข้อง
- การใช้ระบบแบบใหม่เพื่อรองรับเสียงเฉพาะสำหรับยานยนต์
- รองรับการโฟกัสเสียงแบบ HAL
- การโฟกัสเสียงแบบหน่วงเวลาสำหรับสตรีมที่ไม่ใช่แบบชั่วคราว
- การตั้งค่าของผู้ใช้เพื่อควบคุมการโต้ตอบระหว่างการนำทางและการโทร
เสียงและสตรีมของ Android
ระบบเสียงในรถยนต์ต้องจัดการกับเสียงและสตรีมต่อไปนี้
รูปที่ 1 แผนภาพสถาปัตยกรรมที่เน้นสตรีมเป็นหลัก
Android จัดการเสียงที่มาจากแอป Android โดยการควบคุมแอปเหล่านั้น และกำหนดเส้นทางเสียงไปยังอุปกรณ์เอาต์พุตที่ HAL ตามประเภทของ เสียง:
- สตรีมแบบลอจิคัล หรือที่เรียกว่าแหล่งที่มาในเสียงหลัก การตั้งชื่อจะติดแท็กด้วยแอตทริบิวต์เสียง
- สตรีมทางกายภาพ หรือที่เรียกว่าอุปกรณ์ในเสียงหลัก ชื่อเรียก ไม่มีข้อมูลบริบทหลังจากผสม
เพื่อความน่าเชื่อถือ เสียงภายนอก (ที่มาจากแหล่งอิสระ แหล่งที่มาต่างๆ เช่น เสียงแจ้งเตือนการคาดเข็มขัดนิรภัย) ได้รับการจัดการนอก Android โดยอยู่ภายใต้ HAL หรือแม้กระทั่งในฮาร์ดแวร์ที่แยกต่างหาก ผู้ที่ติดตั้งใช้งานระบบต้องจัดให้มีเครื่องผสมที่ ยอมรับสตรีมเสียงจาก Android อย่างน้อย 1 สตรีมแล้วรวมสตรีมดังกล่าว สตรีมในลักษณะที่เหมาะสมโดยใช้แหล่งเสียงภายนอก ยานพาหนะ
การใช้งาน HAL และเครื่องผสมอาหารภายนอกจะรับผิดชอบในการดูแลให้ ได้ยินเสียงภายนอกที่สำคัญเพื่อความปลอดภัยและสำหรับมิกซ์เสียงจากอุปกรณ์ Android สตรีมและกำหนดเส้นทางไปยังลำโพงที่เหมาะสม
เสียง Android
แอปอาจมีโปรแกรมเล่นอย่างน้อย 1 คนที่โต้ตอบผ่าน Android มาตรฐาน API (เช่น AudioManager สำหรับการควบคุมโฟกัสหรือ MediaPlayer สำหรับสตรีมมิง) เพื่อส่งสตรีมข้อมูลเสียงเชิงตรรกะอย่างน้อย 1 รายการ ข้อมูลนี้ อาจเป็นโมโนช่องเดี่ยวหรือ 7.1 เซอร์ราวด์ แต่จะได้รับการกำหนดเส้นทางและถือว่าเป็น แหล่งที่มาเดียว สตรีมแอปเชื่อมโยงกับ AudioAttributes ที่ให้คำแนะนำแก่ระบบว่าควรจะแสดงเสียงอย่างไร
สตรีมเชิงตรรกะจะส่งผ่าน AudioService และกำหนดเส้นทางไปยัง (และ เพียงรายการเดียว) จากสตรีมเอาต์พุตทางกายภาพที่พร้อมใช้งาน ซึ่งแต่ละรายการเป็นเอาต์พุต ของมิกเซอร์ภายใน AudioFlinger หลังจากระบบผสมแอตทริบิวต์เสียงแล้ว ไปยังสตรีมจริง สตรีมเหล่านั้นจะไม่สามารถใช้งานได้อีกต่อไป
ระบบจะส่งสตรีมจริงแต่ละรายการไปยัง HAL เสียงเพื่อแสดงผล ฮาร์ดแวร์ ในแอปยานยนต์ ฮาร์ดแวร์เรนเดอร์สามารถใช้ตัวแปลงรหัสในเครื่องได้ (คล้ายกับอุปกรณ์เคลื่อนที่) หรือโปรเซสเซอร์ระยะไกลในรถยนต์ เครือข่าย ไม่ว่าคุณจะใช้ Audio HAL หรือไม่ก็ตาม ก็เป็นหน้าที่ของการติดตั้งใช้งาน Audio HAL ข้อมูลตัวอย่างจริง และทำให้ได้ยินเสียง
สตรีมภายนอก
สตรีมเสียงที่ไม่ควรกำหนดเส้นทางผ่าน Android (สำหรับการรับรอง หรือ เหตุผลด้านเวลา) อาจส่งไปยังมิกเซอร์ภายนอกโดยตรง สำหรับ Android 11 ตอนนี้ HAL สามารถขอโฟกัสเสียงภายนอกเหล่านี้เพื่อเป็นข้อมูลให้กับ Android ได้แล้ว เพื่อให้มีการดำเนินการที่เหมาะสม เช่น การหยุดสื่อชั่วคราวหรือการป้องกัน ไม่ได้รับความสนใจจากผู้อื่น
หากสตรีมภายนอกเป็นแหล่งที่มาของสื่อที่ควรโต้ตอบกับเสียง สภาพแวดล้อมที่ Android กำลังสร้างขึ้น (ตัวอย่างเช่น หยุดการเล่น MP3 เมื่อ ตัวรับสัญญาณภายนอกเปิดอยู่) สตรีมภายนอกเหล่านั้นควรแสดงด้วย แอปสำหรับ Android แอปดังกล่าวจะขอให้โฟกัสเสียงในนามของแหล่งที่มาของสื่อ แทน HAL และจะตอบกลับการแจ้งเตือนที่สำคัญโดย เริ่ม/หยุดแหล่งที่มาภายนอกตามความจำเป็นเพื่อให้พอดีกับโฟกัสของ Android แอปยังมีหน้าที่จัดการเหตุการณ์สำคัญของสื่อด้วย เช่น เล่น/หยุดชั่วคราว กลไกที่แนะนำอย่างหนึ่งในการควบคุมอุปกรณ์ภายนอกดังกล่าวคือ HwAudioSource
อุปกรณ์เอาต์พุต
ที่ระดับ HAL เสียง อุปกรณ์ประเภท AUDIO_DEVICE_OUT_BUS
จัดเตรียมอุปกรณ์เอาต์พุตทั่วไปสำหรับใช้ในระบบเสียงของยานพาหนะ รถประจำทาง
อุปกรณ์รองรับพอร์ตที่ระบุที่อยู่ได้ (โดยที่แต่ละพอร์ตคือจุดสิ้นสุดสำหรับ
สตรีมจริง) และคาดว่าจะเป็นอุปกรณ์เอาต์พุตประเภทเดียวที่รองรับใน
ยานพาหนะ
การติดตั้งใช้งานระบบจะใช้พอร์ตบัส 1 พอร์ตสำหรับเสียง Android ทั้งหมด
ซึ่งทำให้ Android ผสมผสานทุกอย่างเข้าด้วยกันและ
ส่งเป็นสตรีมเดียว
หรือ HAL อาจมีท่าเรือบัส 1 แห่งสำหรับแต่ละCarAudioContext
เพื่อให้
การส่งมอบเสียงทุกประเภทพร้อมกัน วิธีนี้ทำให้มีโอกาสสำหรับช่วง HAL
เพื่อมิกซ์และตัดเสียงต่างๆ ตามที่ต้องการ
การกำหนดบริบทเสียงให้กับอุปกรณ์เอาต์พุตจะดำเนินการผ่าน
car_audio_configuration.xml
อินพุตไมโครโฟน
เมื่อบันทึกเสียง HAL ของเสียงจะได้รับ openInputStream
ที่มีอาร์กิวเมนต์ AudioSource
ที่ระบุวิธีที่ฟังก์ชัน
อินพุตไมโครโฟนจะได้รับการประมวลผล
แหล่งที่มา VOICE_RECOGNITION
(โดยเฉพาะ Google Assistant) ต้องการสตรีมไมโครโฟนสเตอริโอที่มี
เอฟเฟกต์การตัดเสียงก้อง (หากมี) แต่ไม่มีการประมวลผลอื่นๆ กับเอฟเฟกต์นั้น
Assistant คาดว่าบีมฟอร์มจะเป็นผู้ดำเนินการ
อินพุตไมโครโฟนแบบหลายช่อง
หากต้องการบันทึกเสียงจากอุปกรณ์ที่มีช่องสัญญาณมากกว่า 2 ช่อง (สเตอริโอ) ให้ใช้
มาสก์ดัชนีแชแนล แทนมาสก์ดัชนีตำแหน่ง (เช่น
CHANNEL_IN_LEFT
) ตัวอย่าง
final AudioFormat audioFormat = new AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setSampleRate(44100) .setChannelIndexMask(0xf /* 4 channels, 0..3 */) .build(); final AudioRecord audioRecord = new AudioRecord.Builder() .setAudioFormat(audioFormat) .build(); audioRecord.setPreferredDevice(someAudioDeviceInfo);
เมื่อทั้ง setChannelMask
และ setChannelIndexMask
ได้รับการตั้งค่าแล้ว AudioRecord
จะใช้เฉพาะค่าที่ตั้งค่าโดย
setChannelMask
(สูงสุด 2 ช่อง)
การจับภาพพร้อมกัน
สําหรับ Android 10 เฟรมเวิร์กของ Android รองรับการจับภาพพร้อมกัน
แต่มีข้อจำกัดเพื่อปกป้องความเป็นส่วนตัวของผู้ใช้ เป็นส่วนหนึ่งของ
ของข้อจำกัดเหล่านี้ แหล่งที่มาเสมือนจริง เช่น
ระบบจะไม่สนใจ AUDIO_SOURCE_FM_TUNER
ดังนั้น คุณจึงอนุญาตให้
คู่กับอินพุตปกติ (เช่น ไมโครโฟน)
ไม่ถือว่า HwAudioSources
เป็นส่วนหนึ่งของการแสดงพร้อมกัน
ข้อจำกัดการจับภาพ
แอปที่ออกแบบมาเพื่อทำงานกับอุปกรณ์ AUDIO_DEVICE_IN_BUS
หรือ
อุปกรณ์ AUDIO_DEVICE_IN_FM_TUNER
สำรองต้องใช้
ระบุอุปกรณ์เหล่านั้นและใช้ AudioRecord.setPreferredDevice()
เพื่อข้ามตรรกะการเลือกแหล่งที่มาเริ่มต้นของ Android
การใช้เสียง
AAOS ใช้
AudioAttributes.AttributeUsages
เป็นหลัก
สำหรับการกำหนดเส้นทาง การปรับระดับเสียง และการจัดการโฟกัส การใช้งานเป็น
การนำเสนอ "เหตุผล" สตรีมกำลังเล่น ดังนั้น สตรีมทั้งหมด
และคำขอโฟกัสเสียงควรระบุการใช้งานการเล่นเสียง วันและเวลา
ไม่ได้ตั้งค่าไว้โดยเฉพาะเมื่อสร้างออบเจ็กต์ AudioAttributes การใช้งานจะ
เป็นค่าเริ่มต้น USAGE_UNKNOWN
แม้ว่าในปัจจุบันจะยังได้รับการปฏิบัติแบบเดียวกัน
ในฐานะ USAGE_MEDIA
คุณไม่ควรใช้ลักษณะการทำงานนี้สำหรับสื่อ
การเล่น
การใช้งานระบบ
ใน Android 11 มีการนำการใช้งานระบบมาใช้ พฤติกรรมการใช้งานเหล่านี้
คล้ายกับการใช้งานที่สร้างขึ้นก่อนหน้านี้ เว้นแต่ว่าต้องใช้ API ระบบ
รวมถึง android.permission.MODIFY_AUDIO_ROUTING
ฟิลด์
การใช้งานระบบมีดังนี้
USAGE_EMERGENCY
USAGE_SAFETY
USAGE_VEHICLE_STATUS
USAGE_ANNOUNCEMENT
หากต้องการสร้าง AudioAttributes
โดยใช้การใช้งานระบบ ให้ใช้
วันที่ AudioAttributes.Builder#setSystemUsage
แทนที่จะเป็น setUsage
การเรียกใช้วิธีการนี้สำหรับการใช้งานที่ไม่ใช่ระบบ
จะส่งผลให้มีการโยนIllegalArgumentException
นอกจากนี้ หาก
มีการตั้งค่าการใช้งานระบบและการใช้งานในเครื่องมือสร้างไว้
IllegalArgumentException
เมื่อสร้าง
วิธีตรวจสอบการใช้งานที่เชื่อมโยงกับ AudioAttributes
เรียกใช้ AudioAttributes#getSystemUsage
จะแสดงผลการใช้งานหรือการใช้งานระบบที่เกี่ยวข้อง
บริบทของเสียง
เราได้จัดกลุ่มการใช้งานที่คล้ายกันเพื่อให้กำหนดค่าเสียง AAOS ได้ง่ายขึ้น
ลงใน CarAudioContext
บริบทด้านเสียงเหล่านี้จะใช้ใน
CarAudioService
เพื่อกำหนดเส้นทาง กลุ่มระดับเสียง และโฟกัสของเสียง
การจัดการ
บริบทของเสียงใน Android 11 มีดังนี้
บริบทเสียงของรถยนต์ | การใช้แอตทริบิวต์ที่เชื่อมโยง |
---|---|
MUSIC |
UNKNOWN, GAME, MEDIA |
NAVIGATION |
ASSISTANCE_NAVIGATION_GUIDANCE |
VOICE_COMMAND |
ASSISTANT, ASSISTANCE_ACCESSIBILITY |
CALL_RING |
NOTIFICATION_RINGTONE |
CALL |
VOICE_COMMUNICATION, VOICE_COMMUNICATION_SIGNALING |
ALARM |
ALARM |
NOTIFICATION |
NOTIFICATION, NOTIFICATION_* |
SYSTEM_SOUND |
ASSISTANCE_SONIFICATION |
EMERGENCY |
EMERGENCY |
SAFETY |
SAFETY |
VEHICLE_STATUS |
VEHICLE_STATUS |
ANNOUNCEMENT |
ANNOUNCEMENT |
การจับคู่ระหว่างบริบทของเสียงกับการใช้งาน แถวที่ไฮไลต์มีไว้สำหรับรายการใหม่ การใช้งานระบบ
เสียงแบบหลายโซน
สำหรับยานยนต์จะมี Use Case ชุดใหม่ที่เกี่ยวข้องกับผู้ใช้ที่ใช้งานพร้อมกัน มีปฏิสัมพันธ์กับแพลตฟอร์มและต้องการสื่อแยกต่างหาก สำหรับ เช่น คนขับเปิดเพลงในห้องโดยสารได้ ส่วนผู้โดยสารที่เบาะหลัง กำลังดูวิดีโอ YouTube บนจอแสดงผลด้านหลัง เสียงแบบหลายโซนจะเปิดใช้ฟีเจอร์นี้ โดยอนุญาตให้แหล่งที่มาของเสียงต่างๆ เล่นพร้อมกันผ่านพื้นที่ต่างๆ ของยานพาหนะ
เสียงแบบหลายโซนที่เริ่มต้นใน Android 10 จะช่วยให้ OEM กำหนดค่าเสียงได้ ให้เป็นโซนแยกกัน แต่ละโซนคือคอลเล็กชันของอุปกรณ์ภายในยานพาหนะ โดยมีกลุ่มวอลุ่มของตัวเอง การกำหนดค่าการกำหนดเส้นทางสำหรับบริบท และโฟกัส การจัดการ ในลักษณะนี้ สามารถกำหนดค่าห้องโดยสารหลักเป็นเสียงเดียวได้ ขณะที่ช่องเสียบหูฟังของจอแสดงผลด้านหลังจะกำหนดค่าเป็นโซนที่ 2
โซนได้รับการกำหนดไว้เป็นส่วนหนึ่งของ car_audio_configuration.xml
จากนั้น CarAudioService
จะอ่านการกำหนดค่าและช่วย AudioService
กำหนดเส้นทางของสตรีมเสียงตามโซนที่เกี่ยวข้อง แต่ละโซนยังคงกำหนด
สำหรับการกำหนดเส้นทางตามบริบทและ UID แอปพลิเคชัน เมื่อโปรแกรมเล่นวิดีโอ
สร้างแล้ว CarAudioService
จะกำหนดโซนที่โปรแกรมเล่นอยู่
ที่เกี่ยวข้อง จากนั้นจึงพิจารณาจากการใช้งาน
อุปกรณ์ที่ AudioFlinger
ควรกำหนดเส้นทางของเสียงไป
โฟกัสจะได้รับการเก็บรักษาแยกกันสำหรับโซนเสียงแต่ละโซน วิธีนี้ช่วยให้
แอปพลิเคชันในโซนต่างๆ เพื่อผลิตเสียงอย่างอิสระโดยไม่ต้อง
ซึ่งมีการแทรกแซงซึ่งกันและกัน ในขณะที่แอปพลิเคชันยังคงเคารพการเปลี่ยนแปลง
ภายในขอบเขตของตนเอง CarZonesAudioFocus
ภายใน
CarAudioService
มีหน้าที่รับผิดชอบในการจัดการโฟกัสของ
รูปที่ 2 กำหนดค่าเสียงแบบหลายโซน
HAL เสียง
การติดตั้งใช้งานเสียงในรถยนต์จะใช้ HAL มาตรฐานสำหรับเสียง Android ซึ่งรวมถึงสิ่งต่อไปนี้
IDevice.hal
สร้างสตรีมอินพุตและเอาต์พุต จัดการระดับเสียงหลัก การปิดเสียง รวมถึงการใช้งานต่อไปนี้createAudioPatch
เพื่อสร้างแพตช์ภายนอกระหว่างอุปกรณ์IDevice.setAudioPortConfig()
เพื่อให้ปริมาณสำหรับแต่ละสตรีม
IStream.hal
นอกจากตัวแปรอินพุตและเอาต์พุตแล้ว จัดการการสตรีมตัวอย่างเสียงไปและกลับจากฮาร์ดแวร์
ประเภทอุปกรณ์ยานยนต์
ประเภทอุปกรณ์ต่อไปนี้เกี่ยวข้องกับแพลตฟอร์มยานยนต์
ประเภทอุปกรณ์ | คำอธิบาย |
---|---|
AUDIO_DEVICE_OUT_BUS |
เอาต์พุตหลักจาก Android (นี่คือรูปแบบเสียงทั้งหมดจาก Android ที่ได้รับโดยอัตโนมัติ) ใช้เป็นที่อยู่สำหรับชี้แจงสตรีม สำหรับแต่ละบริบท |
AUDIO_DEVICE_OUT_TELEPHONY_TX |
ใช้สำหรับเสียงที่กำหนดเส้นทางไปยังวิทยุมือถือเพื่อส่งสัญญาณ |
AUDIO_DEVICE_IN_BUS |
ใช้สำหรับอินพุตที่ไม่มีการจัดประเภท |
AUDIO_DEVICE_IN_FM_TUNER |
ใช้สำหรับการส่งข้อมูลวิทยุเท่านั้น |
AUDIO_DEVICE_IN_TV_TUNER |
ใช้สำหรับอุปกรณ์ทีวี (หากมี) |
AUDIO_DEVICE_IN_LINE |
ใช้สำหรับช่องเสียบอินพุต AUX |
AUDIO_DEVICE_IN_BLUETOOTH_A2DP |
เพลงที่ได้รับทางบลูทูธ |
AUDIO_DEVICE_IN_TELEPHONY_RX |
ใช้สำหรับเสียงที่ได้รับจากวิทยุมือถือที่เชื่อมโยงกับโทรศัพท์ การโทร |
กำลังกำหนดค่าอุปกรณ์เสียง
ต้องกำหนดอุปกรณ์เสียงที่ Android มองเห็นได้ใน
/audio_policy_configuration.xml
ซึ่งมีคอมโพเนนต์ต่อไปนี้
- ชื่อโมดูล รองรับ "หลัก" (ใช้สำหรับกรณีการใช้งานยานยนต์)
"A2DP", "remote_submix" และ "USB" ชื่อโมดูลและเสียงที่เกี่ยวข้อง
ไดรเวอร์ควรได้รับการคอมไพล์เป็น
audio.primary.$(variant).so
- devicePorts มีรายการข้อบ่งชี้อุปกรณ์สำหรับอินพุตและเอาต์พุตทั้งหมด (รวมถึงอุปกรณ์ที่เชื่อมต่อกันอย่างถาวรและอุปกรณ์ที่ถอดออกได้) ที่สามารถ ที่เข้าถึงจากโมดูลนี้
- สำหรับอุปกรณ์เอาต์พุตแต่ละเครื่อง คุณสามารถกำหนดการควบคุมค่าเกนที่ประกอบด้วย ค่าต่ำสุด/สูงสุด/ค่าเริ่มต้น/จำนวนก้าว หน่วยเป็นมิลลิเบล (1 มิลลิเบล = 1/100 dB = 1/1000 เบล)
- แอตทริบิวต์ที่อยู่บนอินสแตนซ์ devicePort สามารถใช้เพื่อค้นหา
แม้ว่าจะมีอุปกรณ์หลายเครื่องที่มี
ประเภทของอุปกรณ์เดียวกันก็ตาม
AUDIO_DEVICE_OUT_BUS
- MixPorts ประกอบด้วยรายการเอาต์พุตและสตรีมอินพุตทั้งหมดที่เปิดเผยโดย HAL เสียง อินสแตนซ์ MixPort แต่ละรายการถือว่าเป็นสตรีมจริงเพื่อ Android AudioService
- เส้นทาง กำหนดรายการการเชื่อมต่อที่เป็นไปได้ระหว่างอินพุตและเอาต์พุต หรือระหว่างสตรีมกับอุปกรณ์
ตัวอย่างต่อไปนี้จะกำหนดอุปกรณ์เอาต์พุต Bus0_phone_out ซึ่ง
สตรีมเสียง Android จะผสมโดยMixer_bus0_phone_out เส้นทางนี้ใช้
สตรีมเอาต์พุตของ mixer_bus0_phone_out
ไปยังอุปกรณ์
bus0_phone_out
<audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude"> <modules> <module name="primary" halVersion="3.0"> <attachedDevices> <item>bus0_phone_out</item> <defaultOutputDevice>bus0_phone_out</defaultOutputDevice> <mixPorts> <mixPort name="mixport_bus0_phone_out" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> </mixPorts> <devicePorts> <devicePort tagName="bus0_phone_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="BUS00_PHONE"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> <gains> <gain name="" mode="AUDIO_GAIN_MODE_JOINT" minValueMB="-8400" maxValueMB="4000" defaultValueMB="0" stepValueMB="100"/> </gains> </devicePort> </devicePorts> <routes> <route type="mix" sink="bus0_phone_out" sources="mixport_bus0_phone_out"/> </routes> </module> </modules> </audioPolicyConfiguration>