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 của ô tô. Cụ thể đối với âm thanh, 3 dịch vụ bổ trợ mới được ra mắt, cho phép các OEM linh hoạt định cấu hình tính năng quản lý âm thanh trên các 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ụ trên ô tô và mối quan hệ của chúng với dịch vụ trên ô tô của OEM. Tương tự như quy trình ứng dụng và quy trình dịch vụ ô tô, quy trình dịch vụ ô tô của nhà sản xuất thiết bị gốc chiếm không gian quy trình riêng.
Dịch vụ ô tô sẽ khởi động dịch vụ ô tô của 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, thì dịch vụ OEM 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 để có được 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ù dịch vụ này được khởi động bằng dịch vụ ô tô, 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à các dịch vụ của OEM yêu cầu đều phải được cấp 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ô sẽ 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à chế độ tắt tiếng
Trước Android 14, hành vi này phần lớn 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ế để dịch vụ âm thanh trên ô tô giao tiếp với một thành phần do OEM xác định để quản lý:
- Quyền phát âm thanh
- Giảm âm thanh
- Âm lượng và chế độ tắt tiếng
Hình dưới đây cho thấy một cấu trúc đơn giản cho dịch vụ âm thanh trên ô tô và dịch vụ OEM ô tô. Dịch vụ âm thanh trên ô tô xác định nhiều hook có thể gọi dịch vụ âm thanh của OEM ô 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 xe 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 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) luôn đồng bộ, đối với mỗi lệnh gọi, dịch vụ âm thanh trên ô tô sẽ truyề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). 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ẽ truyền trạng thái hiện tại của ngăn xếp đến dịch vụ âm thanh của OEM ô tô. Trạng thái hiện tại bao gồm trình giữ tiêu điểm hiện tại và trình mất tiêu điểm hiện tại. Focus loser là những yêu cầu lấy tiêu điểm vẫn thuộc 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ý mọi hoạt động liên quan đến â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 được cung cấp cho dịch vụ âm thanh của OEM ô tô sẽ không đầy đủ. Ví dụ: nếu một nhà sản xuất thiết bị gốc ghi đè quá trình 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 ô tô 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. Đ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 mà dịch vụ âm thanh trên ô tô không thấy được.
Để thực hiện các thao tác, dịch vụ âm thanh trên ô tô sẽ gọi các dịch vụ ô tô của OEM. Các lệnh gọi này được thực hiện trên nhiều quy trình, yêu cầu giao tiếp giữa các quy trình (IPC). IPC làm tăng độ trễ cho 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 truyền theo một hướng.
Định nghĩa dịch vụ âm thanh trên ô tô của OEM
Dịch vụ quyền phát âm thanh trên ô tô của 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ý một 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 3 loại lượt tương tác:
Tương tác đồng thời. Giá đỡ lấy nét 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 lấy tiêu điểm đến sẽ lấy tiêu điểm từ trình giữ tiêu điểm hiện tại.
Từ chối tương tác. Yêu cầu lấy 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ù đủ cho một số trường hợp sử dụng ô tô, nhưng điều này không đáp ứng mọi nhu cầu tương tác có thể khác nhau do yêu cầu của OEM. Vì vậy, chúng tôi 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 các 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ể dùng thông tin này để đánh giá newFocusRequest
so với những thành phần hiện đang giữ tiêu điểm trong focusHolders
và những thành phần hiện đang mất 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;
}
Đối tượng này chứa thông tin về kết quả đánh giá thực tế trong audioFocusEvaluationResults
, cho biết liệu 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 đều 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 tại nên mất tiêu điểm, vĩnh viễn hoặc tạm thời. Những đố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, còn những đối tượng mất quyền phát âm thanh tạm thời sẽ được chuyển đến ngăn xếp đối tượng mất quyền phát âm thanh hiện tại cho đến khi lấy lại được quyền phát âm thanh hoặc bị đối tượng yêu cầu cấp quyền phát âm thanh ban đầu từ bỏ. Bất kể điều gì xảy ra, trình nghe tiêu điểm cho các yêu cầu sẽ nhận được thông báo tương ứng về việc mất tiêu điểm.
Danh sách newlyBlocked
chứa những mục trước đây nằm 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 khối tiêu điểm vĩnh viễn, mục nhập sẽ bị xoá khỏi ngăn xếp và thông báo mất tiêu điểm sẽ được gửi đến các 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 tiêu điểm bị mất nhưng một trình chặn tiêu điểm mới sẽ được thêm vào danh sách trình chặn của mục nhập đó, không có tiêu điểm bị mất nào được gửi vì tiêu điểm đã được gửi trước đó khi mục nhập bị chặn lần đầu. 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 yêu cầu sẽ bị xoá khỏi ngăn xếp nếu tiêu điểm bị bỏ qua.
API thứ hai, notifyAudioFocusChange
, là một chiều được gọi trên mọi yêu cầu hoặc từ bỏ 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. Những thay đổi 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 xem xét những điều sau đây khi quản lý yêu cầu lấy tiêu điểm âm thanh:
Nếu không có quyền phát âm thanh ưu tiên cao đang hoạt động (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), các ứng dụng sẽ có thể tạm thời hoặc vĩnh viễn giành được quyền phát âm thanh.
Trong khi tiêu điểm nội dung nghe nhìn đang hoạt động, các ứng dụng yêu cầu:
Gọi tiêu điểm sử dụng, có thể nhận tiêu điểm đồng thời hoặc riêng biệt.
Tiêu điểm sử dụng chế độ điều hướng, có thể nhận tiêu điểm đồng thời hoặc riêng biệt.
Tiêu điểm sử dụng Trợ lý, có thể nhận tiêu điểm đồng thời hoặc riêng biệt.
Trong khi các ứng dụng có mức độ ưu tiên cao về âm thanh (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 lấy tiêu điểm âm thanh đến bị trì hoãn đều phải được cấp hoặc trì hoãn khi cần.
Mặc dù những đề xuất trên chưa phải là tất cả, nhưng chúng có thể giúp đảm bảo rằng các ứng dụng yêu cầu lấy tiêu điểm sẽ có thể lấy tiêu điểm khi không có âm thanh nào có mức độ ư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 lấy 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.
Dịch vụ âm lượng của xe OEM
Dịch vụ âm thanh trên ô tô quản lý các sự kiện liên quan đến phím âm lượng bằng cách lắng nghe các điều chỉnh âm lượng từ hệ thống âm thanh hoặc bằng cách lắng nghe trực tiếp các sự kiện liên quan đến phím âm lượng từ dịch vụ đầu vào của ô 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 các trình phát âm thanh đang hoạt động và danh sách mức độ ưu tiên của ngữ cảnh âm thanh.
Chúng tôi cung cấp 2 danh sách ưu tiên theo khối lượng. Danh sách đầu tiên xem xét tất cả cá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 cả âm thanh chỉ đường và âm thanh nhạc đều đang hoạt động cùng một lúc, thì âm lượng chỉ đường sẽ thay đổi trong sự kiện khoá â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 khoá âm lượng bớt phức tạp, dịch vụ âm thanh trên ô tô có danh sách ưu tiên 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 nhiều â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ý những â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ủa chế độ cài đặt âm thanh.
Bạn có thể đặt phiên bản thực tế của âm lượng bằng cấu hình audioVolumeAdjustmentContextsVersion
. Bạn có thể đặt cấu hình thành 1
hoặc 2
(2
là chế độ mặc định).
Để tăng tính linh hoạt cho việc quản lý âm lượng, OemCarAudioVolumeService
được ra mắt 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 OEM có một phương thức duy nhất, nhận 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 được giảm âm lượng. volumeGroupState
có trạng thái hiện tại của nhóm âm lượng. Yêu cầu này thể hiện trạng thái hiện tại của ngăn xếp âm thanh và có thể 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 có âm lượng nào thay đổi hay không, true
cho biết có thay đổi và nhóm âm lượng cần được cập nhật. volumeGroupChanged
là nhóm âm lượng thực tế cần được thay đổi. Nhóm này phải được thay đổi 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 cần được 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 cho điều hướng.
Dịch vụ giảm âm lượng cho xe của OEM
Dịch vụ âm thanh trên ô tô quản lý tính năng giảm âm lượng 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ề những thiết bị âm thanh cần giảm âm lượng.
Khi tiêu điểm thay đổi, tất cả các thành phần giữ tiêu điểm đang hoạt động sẽ được đánh giá để xác định thành phần nào cần được giảm âm lượng dựa trên bộ quy tắc giảm âm lượng tĩnh này:
- Âm thanh khẩn cấp sẽ giảm âm lượng mọi âm thanh, ngoại trừ âm thanh cuộc gọi
- Chế độ an toàn sẽ chặn mọi thứ, ngoại trừ âm thanh khẩn cấp
- Chế độ chỉ đường sẽ giảm âm lượng mọi âm thanh, ngoại trừ âm thanh an toàn và khẩn cấp
- Chặn mọi âm thanh, trừ âm thanh an toàn, khẩn cấp và chỉ đường
- Âm thanh chuông cuộc gọi thoại
- Mọi thứ đều phải giảm âm lượng nhạc và thông báo
Các quy tắc này không phải là quy tắc toàn diện và OEM vẫn phải chịu trách nhiệm xác định cách giảm âm lượng dựa trên các nguyên tắc này. Các OEM có thể kiểm soát những đề xuất này một cách chủ động hơn 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 có thay đổi về chế độ lấy nét âm thanh. Nó sử dụng lại OemCarAudioVolumeRequest
được giới thiệu trong dịch vụ âm lượng ô tô OEM và chứa thông tin liên quan để đưa ra quyết định về những thuộc tính cần giảm âm lượng. Danh sách các thuộc tính âm thanh cần giảm âm lượng 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 đang bị giảm âm lượng:
- Trong danh sách, tiếp tục bị giảm âm lượng
- Không có trong danh sách, chế độ né tránh đã tắt
Thuộc tính âm thanh hiện không bị giảm âm lượng:
- Trong danh sách, bị giảm âm lượng
- Không có trong danh sách, chế độ né tránh đã tắt
Sau đó, dịch vụ âm thanh trên ô tô sẽ xác định 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 lượng hoặc danh sách thiết bị âm thanh không bị giảm âm lượng, tương ứng. Cuối cùng, yêu cầu này sẽ được gửi đến AudioControl HAL để thực hiện việc giảm âm lượng 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 giảm âm lượng âm thanh cho một yêu cầu lấy tiêu điểm khi dịch vụ giảm âm lượng của OEM được dùng:
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 này được chuyển tiếp đến dịch vụ âm thanh trên ô tô để xác định kết quả. Khi quyết định lấy tiêu điểm âm thanh, dịch vụ âm thanh trên ô tô sẽ đánh giá tính năng giảm âm lượng bằng cách gọi OemCarAudioDuckingService
để đánh giá những thuộc tính âm thanh nào cần giảm âm lượng. 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.
Bản triển khai tham chiếu dịch vụ âm thanh trên ô tô của OEM
AAOS cung cấp một cách triển khai tham chiếu cho dịch vụ ô tô của OEM trong packages/services/Car/tests/OemCarServiceTestApp
, 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ẽ sử dụng một tệp XML để tải 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ụ trên ô tô của OEM là một phần của mã nguồn AOSP. Các OEM có thể thực hiện thay đổi theo nhu cầu của mình. Để 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" translatab>le="false"
com.android.car.oemcarservice.testapp</.OemCa>r
ServiceImpl
/string
Để xác minh dịch vụ trên ô tô của OEM, hãy sử dụng lệnh dump
của dịch vụ trên ô tô cho dịch vụ của OEM:
adb shell dumpsys car_service --oem-service
Kết quả có thể tương tự như đầu ra 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 giá trị boolean trong mỗi lô thông tin dump
sẽ 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 xem dịch vụ đã sẵn sàng để sử dụng hay chưa, 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.