Các dịch vụ trình bổ trợ OEM mới cho ô tô trong Android 14 cho phép định cấu hình một số thành phần ô tô. Riêng đối với âm thanh, chúng tôi sẽ giới thiệu 3 dịch vụ trình bổ trợ mới, cho phép OEM linh hoạt định cấu hình tính năng quản lý âm thanh trên thiết bị AAOS:
- Điều khiển quyền phát âm thanh
- Điều khiển âm lượng và tắt tiếng
- Điều khiển tính năng Giảm âm thanh
Cấu trúc dịch vụ trình bổ trợ ô tô
Hình dưới đây cung cấp thông tin tổng quan về các dịch vụ ô tô và mối quan hệ của các dịch vụ này với dịch vụ ô tô của nhà sản xuất thiết bị gốc (OEM). Tương tự như quy trình ứng dụng và quy trình bảo dưỡng ô tô, quy trình bảo dưỡng ô tô của nhà sản xuất thiết bị gốc (OEM) chiếm không gian quy trình riêng.
Dịch vụ ô tô sẽ khởi động dịch vụ ô tô của nhà sản xuất thiết bị gốc (OEM) bằng cách tìm thành phần được xác định trong config_oemCarService
. Nếu cấu hình trống, dịch vụ OEM sẽ không tồn tại và không có dịch vụ nào được khởi động. Thành phần này phải mở rộng OemCarService.
Dịch vụ âm thanh trên ô tô phải ghi đè các API để thu nạp dịch vụ OEM âm thanh trên ô tô:
public final class OemCarServiceImp extends OemCarService {
@Override
public OemCarAudioFocusService getOemAudioFocusService();
@Override
public OemCarAudioDuckingService getOemAudioDuckingService();
@Override
public OemCarAudioVolumeService getOemAudioVolumeService();
}
Ví dụ: hãy xem ứng dụng kiểm thử tham chiếu được xác định trong packages/services/Car/tests/OemCarServiceTestApp
.
Mặc dù được dịch vụ ô tô khởi động, nhưng dịch vụ này không tự động kế thừa các quyền có sẵn cho dịch vụ âm thanh trên ô tô. Do đó, mọi quyền mà dịch vụ OEM yêu cầu phải được lấy bằng cơ chế thích hợp. Ví dụ: xem packages/services/Car/data/etc/com.android.car.oemcarservice.testapp.xml
.
Dịch vụ âm thanh trên ô tô có cấu trúc dịch vụ OEM
Trong AAOS, dịch vụ âm thanh trên ô tô quản lý các thao tác sau:
- Định tuyến âm thanh
- Quyền phát âm thanh
- Giảm âm thanh
- Âm lượng và tắt tiếng
Trước Android 14, hành vi này chủ yếu là tĩnh và chỉ có thể được sửa đổi thông qua phần cài đặt, mặc dù chỉ trong một số ít trường hợp. Android 14 đã giới thiệu một cơ chế cho dịch vụ âm thanh trên ô tô để giao tiếp với một thành phần do OEM xác định, thành phần này quản lý:
- Quyền phát âm thanh
- Giảm âm thanh
- Âm lượng và tắt tiếng
Hình dưới đây cho thấy cấu trúc đơn giản của dịch vụ âm thanh trên ô tô và dịch vụ OEM trên ô tô. Dịch vụ âm thanh trên ô tô xác định nhiều loại trình nối có thể gọi dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM) trên ô tô để quản lý hành vi âm thanh. Trường hợp sau chỉ xảy ra nếu thành phần dịch vụ âm thanh trên ô tô của OEM tương ứng được xác định. Nếu không, dịch vụ âm thanh trên ô tô sẽ sử dụng hành vi mặc định.
Để đảm bảo rằng dịch vụ âm thanh trên ô tô và dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM) trên ô tô luôn đồng bộ, đối với mỗi lệnh gọi, dịch vụ âm thanh trên ô tô sẽ chuyển các phần bắt buộc của trạng thái hiện tại của ngăn xếp âm thanh đến dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM) trên ô tô. Ví dụ: khi dịch vụ âm thanh trên ô tô chặn một yêu cầu đánh giá tiêu điểm âm thanh, dịch vụ này sẽ chuyển trạng thái hiện tại của ngăn xếp đến dịch vụ âm thanh OEM trên ô tô. Trạng thái hiện tại bao gồm chủ thể tiêu điểm hiện tại và chủ thể mất tiêu điểm hiện tại. Focus loser là các yêu cầu tiêu điểm vẫn nằm trong ngăn xếp nhưng tạm thời mất tiêu điểm.
Dịch vụ âm thanh trên ô tô phải quản lý tất cả hoạt động âm thanh trong ô tô. Nếu dịch vụ âm thanh trên ô tô không quản lý một số phần của hành vi âm thanh, thì thông tin hiển thị cho dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM) trên ô tô sẽ không đầy đủ. Ví dụ: nếu nhà sản xuất thiết bị gốc (OEM) ghi đè hoạt động xử lý tiêu điểm âm thanh trong dịch vụ ô tô bằng cách đăng ký chính sách tiêu điểm âm thanh của riêng họ, thì dịch vụ âm thanh trên ô tô sẽ không thể cung cấp thông tin đầy đủ cho dịch vụ âm thanh của nhà sản xuất thiết bị gốc trên ô tô. Điều này có thể ảnh hưởng đến khả năng đưa ra quyết định của dịch vụ âm thanh OEM trên ô tô vì dịch vụ này có thể thiếu thông tin không hiển thị cho dịch vụ âm thanh trên ô tô.
Để thực hiện hành động, dịch vụ âm thanh trên ô tô sẽ gọi các dịch vụ ô tô của nhà sản xuất thiết bị gốc (OEM). Các lệnh gọi này được thực hiện trên các quy trình, đòi hỏi giao tiếp liên quy trình (IPC). IPC thêm độ trễ vào mỗi lệnh gọi. Điều quan trọng là phải giảm thiểu độ trễ trong dịch vụ OEM.
Vì các lệnh gọi dịch vụ âm thanh trên ô tô đến dịch vụ OEM đang chặn, nên dịch vụ OEM không được gọi dịch vụ âm thanh trên ô tô khi đánh giá API trực tiếp. Thay vào đó, dịch vụ âm thanh trên ô tô cung cấp thông tin cần thiết để các lệnh gọi giữa hai quy trình chỉ cần di chuyển theo một hướng.
Định nghĩa về dịch vụ âm thanh trên ô tô của nhà sản xuất thiết bị gốc (OEM)
Dịch vụ quyền phát âm thanh trên ô tô của nhà sản xuất thiết bị gốc (OEM)
Dịch vụ âm thanh trên ô tô quản lý các yêu cầu về quyền phát âm thanh từ các ứng dụng bằng cách đăng ký trình nghe quyền phát âm thanh theo chính sách. Dịch vụ âm thanh trên ô tô có một cơ chế để quản lý hành vi lấy tiêu điểm dựa trên Ma trận tương tác tĩnh. Ma trận này xác định ba loại tương tác khác nhau:
Tương tác đồng thời. Các chủ thể lấy tiêu điểm có thể duy trì tiêu điểm cùng một lúc.
Lượt tương tác độc quyền. Yêu cầu tiêu điểm sắp tới sẽ lấy tiêu điểm từ chủ sở hữu tiêu điểm hiện tại.
Từ chối tương tác. Yêu cầu tiêu điểm đến bị từ chối dựa trên trình giữ tiêu điểm hiện tại.
Mặc dù điều này là đủ cho một số trường hợp sử dụng trong ngành ô tô, nhưng không đáp ứng được tất cả nhu cầu tương tác có thể khác nhau do các yêu cầu của OEM. Để làm việc này, chúng ta giới thiệu OemCarAudioFocusService
:
public interface OEmCarAudioFocusService {
OemCarAuddioFocusResults evaluateAudioFocusRequest(
OemCarAudioFocusEvaluationRequest request);
void notifyAudioFocusChange(
List<AudioFocusEntry> holder,
List<AudioFocusEntry> losers, int zoneId);
}
API evaluateAudioFocusRequest
được gọi từ dịch vụ âm thanh trên ô tô bất cứ khi nào có yêu cầu về quyền phát âm thanh cần được đánh giá. Đây là một API hai chiều chặn kết quả trả về. Yêu cầu này chứa thông tin về trạng thái hiện tại của ngăn xếp âm thanh:
Bạn có thể sử dụng thông tin này để đánh giá newFocusRequest
so với các thành phần hiện đang có tiêu điểm trong focusHolders
và các thành phần hiện không có tiêu điểm trong focusLosers
. API sẽ trả về kết quả:
class OemCarAudioFocusResult {
int audioZoneId;
int audioFocusEvaluationResults;
AudioFocusEntry focusResult;
List<AudioFocusEntry> newLosers;
List<AudioFocusEntry> newlyBlocked;
}
Thuộc tính này chứa thông tin về kết quả đánh giá thực tế trong audioFocusEvaluationResults
, cho biết yêu cầu hiện tại đã được cấp, bị trì hoãn hay không thành công. Mọi thay đổi đối với ngăn xếp tiêu điểm hiện tại phải được đặt trong các mục newLosers
và newlyBlocked
, tuỳ thuộc vào bản chất của thay đổi ngăn xếp.
Trong đó newLosers
chứa các mục trước đây giữ tiêu điểm nhưng hiện sẽ mất tiêu điểm, vĩnh viễn hoặc tạm thời. Các đối tượng mất quyền phát âm thanh vĩnh viễn sẽ bị xoá khỏi ngăn xếp quyền phát âm thanh và các đối tượng mất quyền phát âm thanh tạm thời sẽ được chuyển sang ngăn xếp đối tượng mất quyền phát âm thanh hiện tại cho đến khi chúng lấy lại quyền phát âm thanh hoặc bị từ bỏ khỏi trình yêu cầu quyền phát âm thanh ban đầu. Bất kể thế nào, trình nghe tiêu điểm cho các yêu cầu sẽ nhận được một tiêu điểm tương ứng bị mất.
Danh sách newlyBlocked
chứa các mục trước đây có trong danh sách focus loser nhưng hiện bị mục mới chặn. Khối này có thể là vĩnh viễn hoặc tạm thời, đối với tiêu điểm bị chặn vĩnh viễn, mục nhập sẽ bị xoá khỏi ngăn xếp và mất tiêu điểm sẽ được gửi đến trình nghe tiêu điểm. Đối với trường hợp mất tiêu điểm tạm thời, mục nhập sẽ vẫn nằm trong ngăn xếp của các đối tượng mất tiêu điểm nhưng trình chặn tiêu điểm mới sẽ được thêm vào danh sách trình chặn, không có trường hợp mất tiêu điểm nào sẽ được gửi vì trước đó đã có một trường hợp mất tiêu điểm được gửi khi bị chặn lần đầu tiên. Cuối cùng, yêu cầu sẽ được bỏ chặn khi tất cả các trình chặn hiện tại bị xoá hoặc sẽ bị xoá khỏi ngăn xếp nếu tiêu điểm bị bỏ.
API thứ hai, notifyAudioFocusChange
, là một chiều được gọi trên mọi yêu cầu hoặc bỏ qua tiêu điểm âm thanh. API này chủ yếu được dùng để thông báo cho dịch vụ OEM về các thay đổi về tiêu điểm. Điều này có thể ảnh hưởng đến hành vi của dịch vụ âm thanh trên ô tô của OEM.
Nguyên tắc đánh giá tiêu điểm
Trong AAOS, tiêu điểm âm thanh được dùng để quản lý việc phát âm thanh và xác định ứng dụng nào nên tuân thủ để mang lại trải nghiệm tối ưu cho người dùng. Do đó, dịch vụ trình bổ trợ OEM phải tính đến những điều sau khi quản lý yêu cầu tiêu điểm âm thanh:
Nếu không có bất kỳ quyền phát âm thanh ưu tiên cao nào (chẳng hạn như cuộc gọi điện thoại, trường hợp khẩn cấp hoặc an toàn), ứng dụng phải có thể giành quyền phát âm thanh tạm thời hoặc vĩnh viễn.
Khi tiêu điểm nội dung nghe nhìn đang hoạt động, các ứng dụng yêu cầu:
Tiêu điểm sử dụng lệnh gọi, phải có thể nhận tiêu điểm đồng thời hoặc độc quyền.
Tiêu điểm sử dụng điều hướng phải có thể nhận được tiêu điểm đồng thời hoặc độc quyền.
Tiêu điểm sử dụng Trợ lý phải có thể nhận được tiêu điểm đồng thời hoặc độc quyền.
Khi các ứng dụng có quyền phát âm thanh có mức độ ưu tiên cao (chẳng hạn như cuộc gọi điện thoại, cảnh báo khẩn cấp hoặc cảnh báo an toàn) đang hoạt động, mọi yêu cầu về quyền phát âm thanh bị trì hoãn sẽ được cấp hoặc bị trì hoãn nếu cần.
Mặc dù các đề xuất ở trên chưa đầy đủ, nhưng chúng có thể giúp đảm bảo rằng các ứng dụng yêu cầu tiêu điểm sẽ có thể lấy tiêu điểm khi không có âm thanh ưu tiên cao đang hoạt động. Ngay cả khi âm thanh có mức độ ưu tiên cao đang hoạt động, các yêu cầu tiêu điểm bị trì hoãn vẫn phải được tuân thủ và có thể lấy tiêu điểm sau khi âm thanh có mức độ ưu tiên cao dừng lại.
Dịch vụ theo số lượng xe của nhà sản xuất thiết bị gốc (OEM)
Dịch vụ âm thanh trên ô tô quản lý các sự kiện phím âm lượng bằng cách nghe các chế độ điều chỉnh âm lượng từ hệ thống âm thanh hoặc bằng cách nghe trực tiếp các sự kiện phím âm lượng từ dịch vụ đầu vào trên ô tô. Trong mỗi trường hợp, hành vi mặc định của dịch vụ âm thanh trên ô tô là xác định nhóm âm lượng cần thay đổi dựa trên trình phát âm thanh đang hoạt động và danh sách mức độ ưu tiên theo ngữ cảnh âm thanh.
Chúng tôi cung cấp hai danh sách mức độ ưu tiên về số lượng. Danh sách đầu tiên xem xét tất cả ngữ cảnh âm thanh theo thứ tự này. Danh sách được trình bày theo thứ tự giảm dần, mức độ ưu tiên cao nhất ở trên cùng và mức độ ưu tiên thấp nhất ở dưới cùng. Ví dụ: nếu âm thanh chỉ đường và âm thanh nhạc đều hoạt động cùng một lúc, thì âm lượng chỉ đường sẽ thay đổi trong sự kiện phím âm lượng.
- Di chuyển
- Gọi
- Âm nhạc
- Thông báo
- Lệnh thoại
- Chuông cuộc gọi
- Âm hệ thống
- An toàn
- Chuông báo
- Thông báo
- Trạng thái xe
- Khẩn cấp
Để việc quản lý sự kiện nhấn phím âm lượng trở nên đơn giản hơn, dịch vụ âm thanh trên ô tô có một danh sách thứ hai về ngữ cảnh âm thanh:
- Gọi
- Nội dung nghe nhìn
- Thông báo
- Lệnh thoại
Danh sách này cũng được trình bày theo thứ tự giảm dần. Mục đích của danh sách thứ hai này là cho phép thay đổi các âm thanh phổ biến hơn thông qua các sự kiện chính. Bạn chỉ có thể quản lý các âm thanh không phổ biến, có thể là âm thanh có thời lượng ngắn hơn thông qua giao diện người dùng cài đặt âm thanh.
Bạn có thể đặt phiên bản thực tế của phương tiện bằng cấu hình audioVolumeAdjustmentContextsVersion
. Bạn có thể đặt cấu hình thành 1
hoặc 2
(2
là mặc định).
Để tăng tính linh hoạt cho việc quản lý âm lượng, OemCarAudioVolumeService
được giới thiệu trong Android 14:
public interface OemCarAudioVolumeService {
OemCarvolumeChangeInfo getSuggestedGroupForVolumeChange(
OemCarAudioVolumeRequest request, int volumeAdjustment);
}
Dịch vụ âm lượng âm thanh trên ô tô của nhà sản xuất thiết bị gốc (OEM) có một phương thức duy nhất, nhận vào một volumeAdjustment
và một OemCarAudioVolumeRequest
:
class OemCarAudioVolumeRequest {
int audioZoneId;
int callState;
List<AudioAttributes> activePlaybackAttributes;
List<AudioAttributes> duckedAttributes;
List<CarVolumeGroupInfo> volumeGroupState;
}
activePlaybackAttributes
của yêu cầu có các thuộc tính âm thanh đang hoạt động. duckedAttributes
là tất cả các thuộc tính âm thanh hiện đang bị giảm âm lượng. volumeGroupState
có trạng thái hiện tại của nhóm phương tiện. Yêu cầu này đại diện cho trạng thái hiện tại của ngăn xếp âm thanh và có thể được dùng để xác định nhóm âm lượng cần thay đổi. Kết quả sẽ được trả về trong OemCarVolumeChangeInfo
:
class OemCarVolumeChangeInfo {
boolean change;
CarVolumeGroupInfo volumeGroupChanged;
}
Giá trị boolean change
cho biết liệu có phương tiện nào đã thay đổi hay không, true
cho biết rằng có thay đổi và nhóm phương tiện cần được cập nhật. volumeGroupChanged
là nhóm âm lượng thực tế cần thay đổi. Bạn nên thay đổi nhóm này theo tham số volumeAdjustment
ban đầu được truyền đến API. Ví dụ: nếu kết quả cho biết nhóm âm lượng điều hướng phải tắt tiếng, thì giá trị boolean sẽ là true
và nhóm âm lượng được trả về sẽ là nhóm âm lượng điều hướng.
Dịch vụ điều chỉnh âm lượng cho xe ô tô của nhà sản xuất thiết bị gốc (OEM)
Dịch vụ âm thanh trên ô tô quản lý tính năng giảm âm thanh bằng cách theo dõi các thay đổi về tiêu điểm âm thanh và gửi tín hiệu đến HAL AudioControl
về thiết bị âm thanh cần giảm âm thanh.
Khi tiêu điểm thay đổi, tất cả các chủ thể tiêu điểm đang hoạt động sẽ được đánh giá để xác định tiêu điểm nào sẽ bị ẩn dựa trên bộ quy tắc ẩn tĩnh này:
- Âm thanh khẩn cấp sẽ chặn mọi âm thanh ngoại trừ âm thanh cuộc gọi
- Chế độ an toàn tắt mọi âm thanh, ngoại trừ âm thanh khẩn cấp
- Navigation tắt mọi âm thanh ngoại trừ âm thanh an toàn và khẩn cấp
- Tắt mọi âm thanh, ngoại trừ âm thanh an toàn, khẩn cấp và chỉ đường
- Âm thanh chuông cuộc gọi của chú vịt thoại
- Âm nhạc và thông báo phải được giảm âm lượng
Các quy tắc này chưa đầy đủ và nhà sản xuất thiết bị gốc (OEM) vẫn chịu trách nhiệm xác định cách giảm âm thanh dựa trên các nguyên tắc này. Các nhà sản xuất thiết bị gốc (OEM) có thể chủ động kiểm soát các đề xuất này dựa trên các yêu cầu hiện có. OemCarDuckingService
được giới thiệu trong Android 14:
class OemCarAudioDuckingService {
List<AudioAttributes> evaluateAttributesToDuck(
OemCarAudioVolumeRequest request);
}
API này được gọi từ dịch vụ âm thanh trên ô tô khi tiêu điểm âm thanh thay đổi. Phương thức này sử dụng lại OemCarAudioVolumeRequest
được giới thiệu trong dịch vụ theo số lượng ô tô của nhà sản xuất thiết bị gốc và chứa thông tin liên quan để đưa ra quyết định về những thuộc tính cần bỏ qua. Danh sách thuộc tính âm thanh cần giảm âm từ API được so sánh với trạng thái âm thanh hiện tại:
Thuộc tính âm thanh hiện bị chặn:
- Có trong danh sách, tiếp tục bị bỏ qua
- Không có trong danh sách, tính năng giảm âm lượng đã tắt
Thuộc tính âm thanh hiện không bị giảm âm lượng:
- Đã có trong danh sách, đã bị bỏ qua
- Không có trong danh sách, tính năng giảm âm lượng đã tắt
Sau đó, dịch vụ âm thanh trên ô tô sẽ xác định các thuộc tính âm thanh thuộc về thiết bị đầu ra âm thanh nào và thêm các thuộc tính đó vào danh sách thiết bị đầu ra âm thanh bị giảm âm hoặc danh sách thiết bị âm thanh không bị giảm âm. Cuối cùng, thông tin này được gửi đến AudioControl HAL để thực hiện tính năng giảm âm thanh cần thiết ở cấp phần cứng.
Hình dưới đây cho thấy sơ đồ trình tự đơn giản của chế độ kiểm soát âm thanh giảm khi có yêu cầu lấy tiêu điểm khi sử dụng dịch vụ giảm âm thanh của OEM:
Trình tự này bắt đầu khi một ứng dụng yêu cầu Quản lý quyền phát âm thanh thông qua các API trình quản lý âm thanh công khai. Yêu cầu được chuyển tiếp đến dịch vụ âm thanh trên ô tô để xác định kết quả. Khi quyết định quyền phát âm thanh, dịch vụ âm thanh trên ô tô sẽ đánh giá tính năng giảm âm thanh bằng cách gọi OemCarAudioDuckingService
để đánh giá những thuộc tính âm thanh cần giảm. Sau khi kết quả được trả về từ API evaluateAttributesToDuck
, các thiết bị âm thanh cần giảm âm lượng sẽ được tính toán và cuối cùng, thông tin sẽ được gửi đến AudioControl
để áp dụng tính năng giảm âm lượng cho phần cứng âm thanh.
Triển khai tài liệu tham khảo về dịch vụ âm thanh trên ô tô của nhà sản xuất thiết bị gốc (OEM)
AAOS cung cấp cách triển khai tham chiếu dịch vụ ô tô OEM trong packages/services/Car/tests/OemCarServiceTestApp
. Dịch vụ này triển khai OemCarService
cùng với OemCarAudioFocusService
, OemCarAudioDuckingService
và OemCarAudioVolumeService
. Đối với trường hợp sau, mỗi dịch vụ sử dụng một tệp XML để tải một hành vi tĩnh. Ví dụ: OemCarAudioFocusServiceImp
tải oem_focus_config.xml
, chứa một ma trận tương tác. Ma trận này được dùng để đánh giá yêu cầu lấy tiêu điểm khi evaluateAudioFocusRequest
được gọi.
Gỡ lỗi ứng dụng kiểm thử tham chiếu
Ứng dụng kiểm thử dịch vụ ô tô của nhà sản xuất thiết bị gốc (OEM) là một phần của mã nguồn AOSP. Nhà sản xuất thiết bị gốc (OEM) có thể thực hiện các thay đổi theo nhu cầu của họ. Để gỡ lỗi, hãy sử dụng cấu hình config_oemCarService
để bật ứng dụng kiểm thử.
<!-- This is the component name for the OEM customization service. OEM can choose to implement
this service to customize car service behavior for different policies. If OEMs choose to
implement it, they have to implement a service extending OemCarService exposed by car-lib,
and implement the required component services.
If the component name is invalid, CarService would not connect to any OEM service.
Component name can not be a third party package. It should be pre-installed -->
<string name="config_oemCarService" translatable="false">
com.android.car.oemcarservice.testapp/.OemCarServiceImpl
</string>
Để xác minh dịch vụ ô tô của nhà sản xuất thiết bị gốc (OEM), hãy sử dụng lệnh dump
của dịch vụ ô tô cho dịch vụ OEM:
adb shell dumpsys car_service --oem-service
Kết quả có thể tương tự như kết quả dưới đây:
***CarOemProxyService dump***
mIsFeatureEnabled: true
mIsOemServiceBound: true
mIsOemServiceReady: true
mIsOemServiceConnected: true
mInitComplete: true
OEM_CAR_SERVICE_CONNECTED_TIMEOUT_MS: 5000
OEM_CAR_SERVICE_READY_TIMEOUT_MS: 5000
mComponentName: com.android.car.oemcarservice.testapp/.OemCarServiceImpl
Mỗi boolean trong mỗi lô thông tin dump
xác định trạng thái của tính năng và dịch vụ. Ví dụ: thông tin kết xuất mIsOemServiceReady
chỉ định liệu dịch vụ có sẵn sàng để sử dụng hay không, trong đó true
cho biết dịch vụ đã sẵn sàng và false
cho biết dịch vụ chưa sẵn sàng.