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

Bản phát hành Android 10 tái cấu trúc đáng kể âm thanh trình quản lý chính sách để 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.
  • Nhóm âm lượng có thể tuỳ chỉnh cho các nhóm loại luồng cũ sử dụng cùng đường cong âm lượng.
  • Các chiến lược định tuyến được công cụ chính sách âm thanh khai báo thay vì được mã hoá cứng.
  • Nhóm và đường cong âm lượng do công cụ chính sách âm thanh quản lý.
  • Tái cấu trúc nội bộ để chuẩn bị cho việc phân chia trong tương lai giữa mã chung và mã có thể định cấu hình và cung cấp tính năng quản lý thiết bị âm thanh phong phú hơn. Ví dụ: việc sử dụng tất cả thuộc tính thiết bị, không chỉ loại tương ứng trong quy tắc chính sách.

Android 7.0 ra mắt một định dạng tệp cấu hình chính sách âm thanh (XML) cho 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 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 (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, thuộc quyền sở hữu riêng quá giới hạn nên không thể mô tả những lời xin lỗi phức tạp đối với các ngành dọc như TV và ô tô.

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

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

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 và chụp, và thuộc tính âm thanh. Ngoài ra, định dạng XML còn có những tính năng nâng cao sau:

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

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

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

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 hoạ một cấu hình chính sách âm thanh đơn giản trong Định dạng tệp XML cho Android 12 và các phiên bản bên dưới Android 12.

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

  • Kết hợp cổng mô tả các cấu hình có thể có cho luồng có thể mở ở HAL âm thanh để phát lại và ghi lại.
  • Cổng thiết bị mô tả những thiết bị có thể kết nối loại của chúng (và tuỳ ý địa chỉ và các thuộc tính âm thanh, nếu thích hợp).
  • Tuyến đường được tách biệt với chỉ số mô tả cổng kết hợp, bật tính năng mô tả các tuyến đường từ thiết bị này đến thiết bị khác hoặc truyền trực tuyến đến thiết bị.

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

Bao gồm tệp

Bạn có thể sử dụng phương thức XML Inclusions (XInclude) để thêm chính sách về âm thanh thông tin cấu hình nằm trong các tệp XML khác. Tất cả tệp được đưa vào 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 các phần tử XInclude.

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

  • A2DP: a2dp_audio_policy_configuration.xml
  • Định tuyến lại danh sách phụ: rsubmix_audio_policy_configuration.xml
  • USB: usb_audio_policy_configuration.xml

Sắp xếp mã chính sách âm thanh

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

Mô-đun Mô tả
/managerdefault Bao gồm những giao diện chung và cách triển khai hành vi chung cho tất cả mọi người của chúng tôi. Tương tự như AudioPolicyManager.cpp khi có công cụ chức năng và các khái niệm phổ biến bị loại bỏ.
/common Xác định các lớp cơ sở (ví dụ: cấu trúc dữ liệu cho luồng âm thanh đầu vào cấu hình, mã mô tả thiết bị âm thanh, bản vá âm thanh và cổng âm thanh). Trước đây là đượ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 một trường hợp sử dụng cụ thể. Công cụ này triển khai một giao diện chuẩn với phần chung, chẳng hạn như để có được thiết bị thích hợp cho một trường hợp sử dụng phát hoặc ghi hình nhất định, hoặc để đặt thiết bị đã kết nối hoặc trạng thái bên ngoài (tức là trạng thái cuộc gọi sử dụng bắt buộc) có thể thay đổi quyết định định tuyến.

Có 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 thông số.

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

Định cấu hình bằng Khung thông số

Mã chính sách dạng âm thanh được sắp xếp sao cho dễ hiểu và dễ hiểu duy trì mà vẫn hỗ trợ chính sách âm thanh được xác định hoàn toàn theo cấu hình tệp. Thiết kế của tổ chức và chính sách âm thanh dựa trên Tham số của Intel Khung dựa trên trình bổ trợ và 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 cho phép OEM của nhà cung cấp:

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

AOSP có một ví dụ về tệp cấu hình chính sách âm thanh sử dụng Parameters Khung tại Frameworks/av/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/PolicyConfigurableDomains.xml. Cho hãy tham khảo tài liệu của Intel trên Khung thông số.

Trên Android 10 trở xuống, chính sách về âm thanh có thể định cấu hình được chọn bằng tuỳ chọn bản dựng USE_CONFIGURABLE_AUDIO_POLICY. Trên Android 11 trở lên, phiên bản của chính sách âm thanh công cụ đượ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 engine_library thuộc tính của phần tử globalConfiguration với 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 ra mắt một API Enumeration và Selection API công khai nằm trên ở đầu cơ sở hạ tầng bản vá âm thanh/cổng âm thanh và cho phép ứng dụng nhà phát triển cho biết lựa chọn ưu tiên về một đầu ra hoặc đầu vào cụ thể của thiết bị bản ghi hoặc bản âm thanh được kết nối.

Trong Android 7.0, Enumeration and Selection API được xác minh qua các bài kiểm thử CTS và được mở rộng để bao gồm cả chức năng đị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 trong Java, với việc bổ sung giao diện AudioRouting thay thế, kết hợp và ngừng sử dụng các phương thức định tuyến rõ ràng dành riêng cho AudioTrackAudioRecord.

Để biết thông tin chi tiết về API liệt kê và lựa chọn, vui lòng tham khảo Android giao diện cấu hìnhOpenSLES_AndroidConfiguration.h. Để biết thông tin chi tiết về việc định tuyến âm thanh, tham khảo Định tuyến âm thanh.

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, thì bạn có thể xuất luồng âm thanh trực tiếp đến phần cứng âm thanh (điều này bỏ qua Bộ trộn AudioFlinger để không bị trộn lẫn xuống hai kênh.) Lớp trừu tượng phần cứng (HAL) cho âm thanh phải cho biết cấu hình luồng đầu ra có hỗ trợ âm thanh đa kênh hay không các chức năng khác nhau. Nếu HAL cho thấy khả năng của mình, thì trình quản lý chính sách mặc định cho phép phát đa kênh qua HDMI. Để biết thông tin chi tiết về cách triển khai, hãy xem device/samsung/tuna/audio/audio_hw.c.

Để cho biết rằng sản phẩm của bạn có chứa đầ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 của Google. Ví dụ sau từ frameworks/av/services/audiopolicy/config/primary_audio_policy_configuration_tv.xml hiển thị mặt nạ kênh động, tức là trình quản lý chính sách âm thanh truy vấn kênh mặt nạ được hỗ trợ bởi bồn lưu trữ HDMI sau khi kết nối.

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

Bộ mã hoá và giải mã nội dung nghe nhìn

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