Định cấu hình chính sách âm thanh

Bản phát hành Android 10 bao gồm việc tái cấu trúc đáng kể trình quản lý chính sách âm thanh nhằm mang lại sự linh hoạt hơn nhằm hỗ trợ các trường hợp sử dụng ô tô phức tạp:

  • Chiến lược định tuyến dành riêng cho OEM.
  • Các nhóm âm lượng có thể tùy chỉnh cho các nhóm loại luồng kế thừa bằng cách sử dụng cùng một đường cong âm lượng.
  • Chiến lược định tuyến được công cụ chính sách âm thanh khai báo thay vì được mã hóa cứng.
  • Đường cong âm lượng và nhóm được quản lý bởi công cụ chính sách âm thanh.
  • Tái cấu trúc nội bộ chuẩn bị cho sự phân chia trong tương lai giữa mã thông thường và mã có thể định cấu hình, đồng thời cung cấp khả năng quản lý thiết bị âm thanh phong phú hơn. Ví dụ: việc sử dụng tất cả các thuộc tính của thiết bị không chỉ là loại của nó trong các quy tắc chính sách.

Android 7.0 đã giới thiệu định dạng tệp cấu hình chính sách âm thanh (XML) để mô tả cấu trúc liên kết âm thanh của bạn.

Các bản phát hành Android trước đây bắt buộc phải sử dụng device/<company>/<device>/audio/audio_policy.conf để khai báo các thiết bị âm thanh có trên sản phẩm của bạn (bạn có thể xem ví dụ về tệp này cho phần cứng âm thanh Galaxy Nexus trong device/samsung/tuna/audio/audio_policy.conf ). Tuy nhiên, CONF là một định dạng đơn giản, độc quyền và quá hạn chế để mô tả các cấu trúc liên kết phức tạp cho các ngành dọc như tivi và ô tô.

Android 7.0 không dùng nữa audio_policy.conf và thêm hỗ trợ để xác định cấu trúc liên kết âm thanh bằng định dạng tệp XML dễ đọc hơn, có nhiều công cụ chỉnh sửa và phân tích cú pháp cũng như đủ linh hoạt để mô tả các cấu trúc liên kết âm thanh phức tạp. Android 7.0 sử dụng cờ xây dựng USE_XML_AUDIO_POLICY_CONF để chọn định dạng XML của tệp cấu hình.

Ưu điểm của định dạng XML

Giống như trong tệp CONF, tệp XML cho phép xác định số lượng và loại cấu hình luồng đầu ra và đầu vào, các thiết bị có thể sử dụng để phát lại và ghi cũng như các thuộc tính âm thanh. Ngoài ra, định dạng XML còn cung cấp các cải tiến sau:

  • Trong Android 10, được phép sử dụng đồng thời nhiều ứng dụng ghi hoạt động.
    • Việc bắt đầu ghi không bao giờ bị từ chối do tình huống đồng thời.
    • Lệnh gọi lại registerAudioRecordingCallback(AudioManager.AudioRecordingCallback cb) sẽ thông báo cho khách hàng về những thay đổi trong đường dẫn ghi.
  • Trong các trường hợp sau, máy khách nhận được mẫu âm thanh im lặng:
    • Trường hợp sử dụng nhạy cảm về quyền riêng tư (ví dụ: VOICE_COMMUNICATION ) đang hoạt động.
    • Máy khách không có dịch vụ trên nền trước hoặc giao diện người dùng trên nền trước.
    • Các vai trò đặc biệt được chính sách công nhận:
      • Dịch vụ trợ năng: Có thể ghi lại ngay cả khi trường hợp sử dụng nhạy cảm về quyền riêng tư đang hoạt động.
      • Trợ lý: Được coi là nhạy cảm về quyền riêng tư nếu giao diện người dùng ở trên cùng.
  • Cấu hình âm thanh có cấu trúc tương tự như bộ mô tả âm thanh đơn giản HDMI, cho phép đặt một bộ tốc độ lấy mẫu/mặt nạ kênh khác nhau cho từng định dạng âm thanh.
  • Có các định nghĩa rõ ràng cho tất cả các kết nối có thể có giữa các thiết bị và luồng. Trước đây, một quy tắc ngầm cho phép kết nối tất cả các thiết bị được gắn vào cùng một mô-đun HAL, ngăn chính sách âm thanh kiểm soát các kết nối được yêu cầu bằng API bản vá âm thanh. Ở định dạng XML, mô tả cấu trúc liên kết xác định các giới hạn kết nối.
  • Hỗ trợ bao gồm tránh lặp lại các định nghĩa gửi A2DP, USB hoặc định tuyến lại tiêu chuẩn.
  • Đường cong âm lượng có thể tùy chỉnh. Trước đây, bảng âm lượng được mã hóa cứng. Ở định dạng XML, các bảng khối lượng được mô tả và có thể được tùy chỉnh.

Mẫu tại frameworks/av/services/audiopolicy/config/audio_policy_configuration.xml hiển thị nhiều tính năng trong số này đang được sử dụng.

Định dạng và vị trí tệp

Tệp cấu hình chính sách âm thanh mới là audio_policy_configuration.xml và nằm ở /system/etc . Các ví dụ sau đây minh họa cấu hình chính sách âm thanh đơn giản ở định dạng tệp XML dành cho Android 12 và các phiên bản Android 12 trở xuống.

Cấu trúc cấp cao nhất chứa các mô-đun tương ứng với từng mô-đun phần cứng HAL âm thanh, trong đó mỗi mô-đun có danh sách các cổng kết hợp, cổng thiết bị và tuyến đường:

  • Các cổng kết hợp mô tả các cấu hình cấu hình có thể có cho các luồng có thể được mở ở HAL âm thanh để phát lại và ghi lại.
  • Cổng thiết bị mô tả các thiết bị có thể được gắn với loại của chúng (và các thuộc tính âm thanh và địa chỉ tùy chọn, nếu có).
  • Các tuyến được tách biệt khỏi bộ mô tả cổng trộn, cho phép mô tả các tuyến từ thiết bị này sang thiết bị khác hoặc luồng tới thiết bị.

Bảng âm lượng là danh sách đơn giản các điểm xác định đường cong được sử dụng để chuyển từ chỉ số UI sang âm lượng tính bằng dB. Một tệp bao gồm riêng biệt cung cấp các đường cong mặc định, nhưng mỗi đường cong cho một trường hợp sử dụng nhất định và danh mục thiết bị có thể bị ghi đè.

Bao gồm tập tin

Phương pháp Bao gồm XML (XInclude) có thể được sử dụng để bao gồm thông tin cấu hình chính sách âm thanh nằm trong các tệp XML khác. Tất cả các tệp được bao gồm phải tuân theo cấu trúc được mô tả ở trên với các hạn chế sau:

  • Tệp chỉ có thể chứa các phần tử cấp cao nhất.
  • Tệp không được chứa phần tử XInclude.

Việc sử dụng bao gồm để tránh sao chép thông tin cấu hình mô-đun HAL âm thanh Dự án nguồn mở Android (AOSP) tiêu chuẩn vào tất cả các tệp cấu hình chính sách âm thanh (dễ xảy ra lỗi). Tệp XML cấu hình chính sách âm thanh tiêu chuẩn được cung cấp cho các HAL âm thanh sau:

  • A2DP: a2dp_audio_policy_configuration.xml
  • Định tuyến lại tập hợp con: rsubmix_audio_policy_configuration.xml
  • USB: usb_audio_policy_configuration.xml

Tổ chức mã chính sách âm thanh

AudioPolicyManager.cpp được chia thành nhiều mô-đun để dễ dàng bảo trì và định cấu hình. Việc tổ chức frameworks/av/services/audiopolicy bao gồm các mô-đun sau.

mô-đun Sự miêu tả
/managerdefault Bao gồm các giao diện chung và cách triển khai hành vi chung cho tất cả các ứng dụng. Tương tự như AudioPolicyManager.cpp với chức năng công cụ và các khái niệm phổ biến được trừu tượng hóa.
/common Xác định các lớp cơ sở (ví dụ: cấu trúc dữ liệu cho cấu hình luồng âm thanh đầu vào, bộ mô tả thiết bị âm thanh, bản vá âm thanh và cổng âm thanh). Điều này trước đây đã được xác định bên trong AudioPolicyManager.cpp .
/engine

Triển khai các quy tắc xác định thiết bị và ổ đĩa nào sẽ được sử dụng cho trường hợp sử dụng nhất định. Nó triển khai một giao diện tiêu chuẩn với phần chung, chẳng hạn như để có được thiết bị phù hợp cho trường hợp sử dụng phát lại hoặc chụp nhất định hoặc để đặt các thiết bị được kết nối hoặc trạng thái bên ngoài (nghĩa là trạng thái cuộc gọi của việc sử dụng bắt buộc) có thể thay đổi định tuyến phán quyết.

Có sẵn trong hai phiên bản: có thể định cấu hìnhmặc định . Để biết thông tin về cách chọn phiên bản, hãy xem Cấu hình bằng Khung tham số .

/engineconfigurable Triển khai công cụ chính sách dựa trên Khung tham số (xem bên dưới). Cấu hình dựa trên Khung tham số và trong đó chính sách được xác định bởi các tệp XML.
/enginedefault Triển khai công cụ chính sách dựa trên hoạt động triển khai Trình quản lý chính sách âm thanh của Android trước đây. Đây là mặc định và bao gồm các quy tắc được mã hóa cứng tương ứng với việc triển khai Nexus và AOSP.
/service Bao gồm các giao diện liên kết, phân luồng và triển khai khóa với giao diện với phần còn lại của khung.

Cấu hình sử dụng Parameter Framework

Mã chính sách âm thanh được tổ chức để dễ hiểu và duy trì, đồng thời hỗ trợ chính sách âm thanh được xác định hoàn toàn bởi các tệp cấu hình. Thiết kế chính sách âm thanh và tổ chức dựa trên Khung tham số của Intel, một khung dựa trên plugin và dựa trên quy tắc để xử lý các tham số.

Việc sử dụng chính sách âm thanh có thể định cấu hình sẽ cho phép OEM của nhà cung cấp:

  • Mô tả cấu trúc của hệ thống và các tham số của nó bằng XML.
  • Viết (bằng C++) hoặc sử dụng lại phần phụ trợ (plugin) để truy cập các tham số được mô tả.
  • Xác định các điều kiện/quy tắc (bằng XML hoặc bằng ngôn ngữ dành riêng cho miền) mà theo đó một tham số đã cho phải nhận một giá trị nhất định.

AOSP bao gồm một ví dụ về tệp cấu hình chính sách âm thanh sử dụng Khung tham số tại Frameworks/av/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/PolicyConfigurableDomains.xml . Để biết chi tiết, hãy tham khảo tài liệu của Intel về Khung tham số .

Trong Android 10 trở xuống, chính sách âm thanh có thể định cấu hình được chọn bằng tùy chọn bản dựng USE_CONFIGURABLE_AUDIO_POLICY . Trong Android 11 trở lên, phiên bản của công cụ chính sách âm thanh được chọn trong tệp audio_policy_configuration.xml . Để chọn công cụ chính sách âm thanh có thể định cấu hình, hãy đặt giá trị của thuộc tính engine_library của phần tử globalConfiguration thành configurable như trong ví dụ sau:

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

API định tuyến chính sách âm thanh

Android 6.0 đã giới thiệu API liệt kê và lựa chọn công khai nằm trên cơ sở hạ tầng cổng âm thanh/bản vá âm thanh và cho phép các nhà phát triển ứng dụng chỉ ra tùy chọn cho đầu ra hoặc đầu vào của thiết bị cụ thể cho các bản ghi hoặc bản âm thanh được kết nối.

Trong Android 7.0, API liệt kê và lựa chọn được xác minh bằng các thử nghiệm CTS và được mở rộng để bao gồm việc định tuyến cho các luồng âm thanh C/C++ (OpenSL ES) gốc. Việc định tuyến các luồng gốc tiếp tục được thực hiện bằng Java, với việc bổ sung giao diện AudioRouting thay thế, kết hợp và không dùng các phương thức định tuyến rõ ràng dành riêng cho các lớp AudioTrackAudioRecord .

Để biết chi tiết về API liệt kê và lựa chọn, hãy tham khảo Giao diện cấu hình AndroidOpenSLES_AndroidConfiguration.h . Để biết chi tiết về định tuyến âm thanh, hãy tham khảo AudioRouting .

Hỗ trợ đa kênh

Nếu phần cứng và trình điều khiển của bạn hỗ trợ âm thanh đa kênh qua HDMI, bạn có thể xuất luồng âm thanh trực tiếp sang phần cứng âm thanh (điều này bỏ qua bộ trộn AudioFlinger để nó không bị trộn xuống hai kênh.) HAL âm thanh phải cho biết liệu cấu hình luồng đầu ra có hay không hỗ trợ khả năng âm thanh đa kênh. Nếu HAL bộc lộ khả năng của mình, trình quản lý chính sách mặc định sẽ cho phép phát lại đa kênh qua HDMI. Để biết chi tiết triển khai, hãy xem device/samsung/tuna/audio/audio_hw.c .

Để chỉ định rằng sản phẩm của bạn có đầu ra âm thanh đa kênh, hãy chỉnh sửa tệp cấu hình chính sách âm thanh để mô tả đầu ra đa kênh cho sản phẩm của bạn. Ví dụ sau đây từ frameworks/av/services/audiopolicy/config/primary_audio_policy_configuration_tv.xml hiển thị mặt nạ kênh động , nghĩa là trình quản lý chính sách âm thanh truy vấn mặt nạ kênh được hỗ trợ bởi bộ thu HDMI sau khi kết nối.

Bạn cũng có thể chỉ định mặt nạ kênh tĩnh như AUDIO_CHANNEL_OUT_5POINT1 . Bộ trộn của AudioFlinger tự động trộn nội dung thành âm thanh nổi khi được gửi đến thiết bị âm thanh không hỗ trợ âm thanh đa kênh.

Bộ giải mã phương tiện

Đảm bảo rằng các codec âm thanh mà phần cứng và trình điều khiển hỗ trợ được khai báo chính xác cho sản phẩm của bạn. Để biết chi tiết, hãy xem Hiển thị Codec cho Khung .