เครื่องเสียงรถยนต์

Android Automotive OS (AAOS) สร้างบนกลุ่มเสียงหลักของ Android เพื่อรองรับกรณีการใช้งานสำหรับการทำงานเป็นระบบสาระบันเทิงในรถยนต์ AAOS มีหน้าที่รับผิดชอบด้านเสียงระบบสาระบันเทิง (นั่นคือ สื่อ การนำทาง และการสื่อสาร) แต่ไม่รับผิดชอบโดยตรงต่อเสียงกริ่งและเสียงเตือนที่มีข้อกำหนดด้านความพร้อมใช้งานและเวลาที่เข้มงวด แม้ว่า AAOS จะให้สัญญาณและกลไกเพื่อช่วยให้ยานพาหนะจัดการเสียงได้ แต่ในท้ายที่สุดก็ขึ้นอยู่กับรถยนต์ที่จะโทรออกว่าเสียงใดควรเปิดสำหรับผู้ขับขี่และผู้โดยสาร เพื่อให้มั่นใจว่าเสียงที่มีความสำคัญด้านความปลอดภัยและเสียงตามกฎระเบียบจะได้ยินอย่างเหมาะสมโดยไม่ต้อง การหยุดชะงัก

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

Android 11 มีการเปลี่ยนแปลงต่อไปนี้ในการรองรับเสียงที่เกี่ยวข้องกับยานยนต์:

เสียงและสตรีมของ Android

ระบบเครื่องเสียงรถยนต์รองรับเสียงและสตรีมต่อไปนี้:

แผนภาพสถาปัตยกรรมแบบสตรีมเป็นศูนย์กลาง

รูปที่ 1 แผนภาพสถาปัตยกรรมแบบสตรีมเป็นศูนย์กลาง

Android จัดการเสียงที่มาจากแอป Android ควบคุมแอปเหล่านั้นและกำหนดเส้นทางเสียงไปยังอุปกรณ์เอาต์พุตที่ HAL ตามประเภทของเสียง:

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

เพื่อความน่าเชื่อถือ เสียงภายนอก (ที่มาจากแหล่งอิสระ เช่น เสียงเตือนรัดเข็มขัดนิรภัย) จะได้รับการจัดการภายนอก Android, ต่ำกว่า HAL หรือแม้แต่ในฮาร์ดแวร์ที่แยกจากกัน ผู้ติดตั้งระบบจะต้องจัดเตรียมมิกเซอร์ที่รับอินพุตเสียงตั้งแต่หนึ่งสตรีมขึ้นไปจาก Android จากนั้นจึงรวมสตรีมเหล่านั้นในวิธีที่เหมาะสมกับแหล่งกำเนิดเสียงภายนอกที่ยานพาหนะต้องการ

การใช้งาน HAL และมิกเซอร์ภายนอกมีหน้าที่รับผิดชอบในการรับรองว่าได้ยินเสียงภายนอกที่มีความสำคัญด้านความปลอดภัย และสำหรับการมิกซ์ในสตรีมที่ Android จัดเตรียมไว้ให้ และกำหนดเส้นทางไปยังลำโพงที่เหมาะสม

เสียง Android

แอปอาจมีเครื่องเล่นอย่างน้อย 1 ตัวที่โต้ตอบผ่าน Android API มาตรฐาน (เช่น AudioManager สำหรับการควบคุมโฟกัสหรือ MediaPlayer สำหรับการสตรีม) เพื่อปล่อยสตรีมข้อมูลเสียงแบบลอจิคัลอย่างน้อย 1 รายการ ข้อมูลนี้อาจเป็นโมโนแชนเนลเดี่ยวหรือเซอร์ราวด์ 7.1 แต่ถูกกำหนดเส้นทางและถือเป็นแหล่งข้อมูลเดียว สตรีมแอปเชื่อมโยงกับ AudioAttributes ที่ให้คำแนะนำแก่ระบบเกี่ยวกับวิธีการแสดงเสียง

สตรีมแบบลอจิคัลจะถูกส่งผ่าน AudioService และกำหนดเส้นทางไปยังหนึ่ง (และเพียงหนึ่งเดียว) ของสตรีมเอาต์พุตทางกายภาพที่มีอยู่ ซึ่งแต่ละสตรีมเป็นเอาต์พุตของมิกเซอร์ภายใน AudioFlinger หลังจากผสมคุณลักษณะเสียงเข้ากับสตรีมจริงแล้ว คุณลักษณะเหล่านั้นจะไม่สามารถใช้งานได้อีกต่อไป

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

กระแสภายนอก

สตรีมเสียงที่ไม่ควรส่งผ่าน Android (สำหรับเหตุผลด้านการรับรองหรือเรื่องจังหวะเวลา) อาจถูกส่งไปยังมิกเซอร์ภายนอกโดยตรง ใน Android 11 ตอนนี้ HAL สามารถขอโฟกัสสำหรับเสียงภายนอกเหล่านี้เพื่อแจ้งให้ Android ดำเนินการที่เหมาะสมได้ เช่น หยุดสื่อชั่วคราวหรือป้องกันไม่ให้ผู้อื่นจับโฟกัส

หากสตรีมภายนอกเป็นแหล่งสื่อที่ควรโต้ตอบกับสภาพแวดล้อมเสียงที่ Android กำลังสร้างขึ้น (เช่น หยุดการเล่น MP3 เมื่อเปิดเครื่องรับสัญญาณภายนอก) สตรีมภายนอกเหล่านั้นควรจะแสดงโดยแอป Android แอปดังกล่าวจะขอโฟกัสเสียงในนามของแหล่งสื่อแทน HAL และจะตอบสนองต่อการแจ้งเตือนโฟกัสโดยการเริ่ม/หยุดแหล่งข้อมูลภายนอกตามความจำเป็นเพื่อให้สอดคล้องกับนโยบายการโฟกัสของ Android แอปนี้ยังรับผิดชอบในการจัดการเหตุการณ์สำคัญของสื่อ เช่น การเล่น/หยุดชั่วคราว กลไกหนึ่งที่แนะนำในการควบคุมอุปกรณ์ภายนอกดังกล่าวคือ HwAudioSource

อุปกรณ์เอาท์พุต

ที่ระดับ Audio HAL อุปกรณ์ประเภท AUDIO_DEVICE_OUT_BUS จะเป็นอุปกรณ์เอาต์พุตทั่วไปสำหรับใช้ในระบบเครื่องเสียงรถยนต์ อุปกรณ์บัสรองรับพอร์ตที่สามารถกำหนดแอดเดรสได้ (โดยที่แต่ละพอร์ตคือจุดสิ้นสุดสำหรับฟิสิคัลสตรีม) และคาดว่าจะเป็นอุปกรณ์เอาต์พุตประเภทเดียวที่รองรับในรถยนต์

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

การกำหนดบริบทเสียงให้กับอุปกรณ์เอาต์พุตทำได้ผ่าน car_audio_configuration.xml

อินพุตไมโครโฟน

เมื่อบันทึกเสียง Audio HAL จะได้รับการเรียก openInputStream ซึ่งมีอาร์กิวเมนต์ AudioSource ที่ระบุวิธีประมวลผลอินพุตไมโครโฟน

แหล่งที่มาของ VOICE_RECOGNITION (โดยเฉพาะ Google Assistant) คาดว่าจะมีสตรีมไมโครโฟนสเตอริโอที่มีผลกระทบในการยกเลิกเสียงก้อง (ถ้ามี) แต่ไม่มีการประมวลผลอื่นใดที่ใช้อยู่ Assistant คาดว่าจะทำบีมฟอร์มมิ่งได้

อินพุตไมโครโฟนหลายช่องสัญญาณ

หากต้องการบันทึกเสียงจากอุปกรณ์ที่มีมากกว่าสองช่องสัญญาณ (สเตอริโอ) ให้ใช้มาสก์ดัชนีช่องแทนมาสก์ดัชนีตำแหน่ง (เช่น 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

การทำแผนที่ระหว่างบริบทเสียงและการใช้งาน แถวที่ไฮไลต์มีไว้สำหรับ การใช้งานระบบ ใหม่

เสียงหลายโซน

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

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

โซนถูกกำหนดให้เป็นส่วนหนึ่งของ car_audio_configuration.xml จากนั้น CarAudioService จะอ่านการกำหนดค่าและช่วย AudioService กำหนดเส้นทางสตรีมเสียงตามโซนที่เกี่ยวข้อง แต่ละโซนยังคงกำหนดกฎสำหรับการกำหนดเส้นทางตามบริบทและ uid ของแอปพลิเคชัน เมื่อเครื่องเล่นถูกสร้างขึ้น CarAudioService จะกำหนดว่าเครื่องเล่นเชื่อมโยงกับโซนใด จากนั้นขึ้นอยู่กับการใช้งานว่าอุปกรณ์ใดที่ AudioFlinger ควรกำหนดเส้นทางเสียงไป

โฟกัสจะยังคงแยกจากกันสำหรับแต่ละโซนเสียง ช่วยให้แอปพลิเคชันในโซนต่างๆ สามารถสร้างเสียงได้อย่างอิสระโดยไม่รบกวนซึ่งกันและกัน ในขณะที่แอปพลิเคชันยังคงเคารพการเปลี่ยนแปลงโฟกัสภายในโซนของตน CarZonesAudioFocus ภายใน CarAudioService มีหน้าที่ในการจัดการโฟกัสสำหรับแต่ละโซน

กำหนดค่าเสียงหลายโซน

รูปที่ 2 กำหนดค่าเสียงหลายโซน

เครื่องเสียง HAL

การใช้งานเครื่องเสียงรถยนต์ต้องอาศัย Android Audio HAL มาตรฐาน ซึ่งรวมถึงสิ่งต่อไปนี้:

  • 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 ซึ่งรวมถึงส่วนประกอบต่อไปนี้:

  • ชื่อโมดูล รองรับ "primary" (ใช้สำหรับกรณีการใช้งานในยานยนต์), "A2DP", "remote_submix" และ "USB" ชื่อโมดูลและไดรเวอร์เสียงที่เกี่ยวข้องควรได้รับการคอมไพล์เป็น audio.primary.$(variant).so
  • พอร์ตอุปกรณ์ ประกอบด้วยรายการตัวอธิบายอุปกรณ์สำหรับอุปกรณ์อินพุตและเอาต์พุตทั้งหมด (รวมถึงอุปกรณ์ที่เชื่อมต่ออย่างถาวรและอุปกรณ์แบบถอดได้) ที่สามารถเข้าถึงได้จากโมดูลนี้
    • สำหรับอุปกรณ์เอาต์พุตแต่ละตัว คุณสามารถกำหนดการควบคุมเกนที่ประกอบด้วยค่าต่ำสุด/สูงสุด/ค่าเริ่มต้น/ขั้นตอนในหน่วยมิลลิเบล (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>