Dịch vụ plugin âm thanh ô tô

Các dịch vụ plugin OEM ô tô mới trong Android 14 cho phép định cấu hình một số thành phần ô tô. Cụ thể đối với âm thanh, ba dịch vụ plugin mới được giới thiệu, cho phép các OEM định cấu hình linh hoạt quản lý âm thanh trên các thiết bị AAOS:

  • Kiểm soát tập trung âm thanh
  • Điều khiển âm lượng và tắt tiếng
  • Kiểm soát giảm âm thanh

Kiến trúc dịch vụ plugin ô tô

Hình dưới đây cung cấp cái nhìn tổng quan về các dịch vụ ô tô và mối quan hệ của chúng với dịch vụ ô tô 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ô OEM chiếm không gian xử lý riêng.

hình ảnh

Dịch vụ ô tô bắt đầu dịch vụ ô tô 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 ô tô phải ghi đè các API để có được dịch vụ OEM âm thanh ô tô:

public final class OemCarServiceImp extends OemCarService {
    @Override
    public OemCarAudioFocusService getOemAudioFocusService();

    @Override
    public OemCarAudioDuckingService getOemAudioDuckingService();

    @Override
    public OemCarAudioVolumeService getOemAudioVolumeService();
}

dụ : hãy xem ứng dụng thử nghiệm tham chiếu được xác định trong packages/services/Car/tests/OemCarServiceTestApp .

Mặc dù dịch vụ được khởi động bởi dịch vụ ô tô nhưng nó không tự động kế thừa các quyền có sẵn đối với dịch vụ âm thanh ô tô. Do đó, bất kỳ sự cho phép nào mà các dịch vụ OEM yêu cầu phải được lấy theo 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 ô tô với kiến ​​trúc dịch vụ OEM

Trong AAOS, dịch vụ âm thanh ô tô quản lý những hành động sau:

  • Định tuyến âm thanh
  • Tập trung âm thanh
  • Giảm âm thanh
  • Âm lượng và 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 cài đặt, mặc dù trong một số trường hợp rất hạn chế. Android 14 đã giới thiệu một cơ chế để dịch vụ âm thanh ô tô giao tiếp với một thành phần do OEM xác định nhằm quản lý:

  • Tập trung âm thanh
  • Giảm âm thanh
  • Âm lượng và tắt tiếng

Hình bên dưới thể hiện kiến ​​trúc đơn giản hóa cho dịch vụ âm thanh ô tô và dịch vụ OEM ô tô. Dịch vụ âm thanh ô tô xác định các móc khác nhau có thể gọi dịch vụ âm thanh OEM ô tô để quản lý hành vi âm thanh. Điều sau chỉ xảy ra nếu thành phần dịch vụ âm thanh xe hơi OEM tương ứng được xác định. Nếu không, dịch vụ âm thanh ô tô sẽ sử dụng hành vi mặc định.

hình ảnh

Để đảm bảo rằng dịch vụ âm thanh ô tô và dịch vụ âm thanh OEM ô tô luôn đồng bộ, đối với mỗi cuộc gọi, dịch vụ âm thanh ô tô sẽ chuyển các phần bắt buộc ở trạng thái hiện tại của ngăn xếp âm thanh tới dịch vụ âm thanh OEM ô tô. Ví dụ: khi dịch vụ âm thanh ô tô chặn yêu cầu đánh giá tiêu điểm âm thanh, nó sẽ chuyển trạng thái hiện tại của ngăn xếp sang dịch vụ âm thanh OEM ô tô. Trạng thái hiện tại bao gồm người giữ tiêu điểm hiện tại và người mất tiêu điểm hiện tại. Yêu cầu mất tiêu điểm 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 ô tô phải quản lý mọi hoạt động âm thanh trong ô tô. Nếu dịch vụ âm thanh ô tô không quản lý một số phần của hành vi âm thanh thì thông tin cung cấp cho dịch vụ âm thanh OEM ô tô là không đầy đủ. Ví dụ: nếu OEM ghi đè việc 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 OEM ô 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ụ âm thanh ô tô có thể thiếu thông tin mà dịch vụ âm thanh ô tô không hiển thị.

Để thực hiện hành động, dịch vụ âm thanh ô tô sẽ gọi đến dịch vụ ô tô OEM. Các cuộc gọi này được thực hiện qua các quy trình, yêu cầu giao tiếp giữa các quá trình (IPC). IPC thêm độ trễ cho mỗi cuộc gọi. Điều quan trọng là giảm thiểu độ trễ trong dịch vụ OEM.

Vì các lệnh gọi dịch vụ âm thanh ô tô tới dịch vụ OEM đang bị chặn nên dịch vụ OEM không được gọi dịch vụ âm thanh ô tô theo đánh giá API trực tiếp. Thay vào đó, dịch vụ âm thanh ô tô cung cấp thông tin cần thiết để các cuộc 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 xe hơi OEM

Dịch vụ tập trung âm thanh xe hơi OEM

Dịch vụ âm thanh ô tô quản lý các yêu cầu tập trung vào âm thanh từ các ứng dụng bằng cách đăng ký trình nghe tập trung vào chính sách âm thanh. Dịch vụ âm thanh ô tô có cơ chế quản lý hành vi lấy nét dựa trên ma trận Tương tác tĩnh. Ma trận xác định ba loại tương tác khác nhau:

  • Tương tác đồng thời. Người giữ tiêu điểm có thể duy trì tiêu điểm cùng một lúc.

  • Tương tác độc quyền. Yêu cầu tiêu điểm đến sẽ lấy tiêu điểm từ người giữ 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 chủ sở hữu tiêu điểm hiện tại.

Mặc dù điều này đủ cho một số trường hợp sử dụng ô tô nhưng nó không đáp ứng được tất cả các nhu cầu tương tác có thể khác nhau do yêu cầu của OEM. Để làm được điều nà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 ô tô bất cứ lúc nào có yêu cầu đánh giá tiêu điểm âm thanh. Đây là API hai chiều chặn kết quả trả về. Yêu cầu chứa thông tin về trạng thái hiện tại của ngăn xếp âm thanh:

Thông tin này có thể được sử dụng để đánh giá newFocusRequest so với các đối tượng giữ tiêu điểm hiện tại trong focusHolders và các đối tượng mất tiêu điểm hiện tại trong focusLosers . API sẽ trả về kết quả:

class OemCarAudioFocusResult {
    int audioZoneId;
    int audioFocusEvaluationResults;
    AudioFocusEntry focusResult;
    List<AudioFocusEntry> newLosers;
    List<AudioFocusEntry> newlyBlocked;
}

Phần 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 chấp nhận, 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 newLosersnewlyBlocked , tùy thuộc vào tính 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 bây giờ sẽ mất tiêu điểm, vĩnh viễn hoặc tạm thời. Các điểm mất tiêu điểm vĩnh viễn sẽ bị xóa khỏi ngăn xếp tiêu điểm âm thanh và các điểm mất tiêu điểm tạm thời sẽ được chuyển đến ngăn xếp các điểm mất tiêu điểm hiện tại cho đến khi chúng lấy lại được tiêu điểm hoặc bị bỏ khỏi trình yêu cầu lấy nét ban đầu. Bất chấp điều đó, người nghe tiêu điểm cho các yêu cầu sẽ bị mất tiêu điểm tương ứng.

Danh sách newlyBlocked chứa các mục trước đây nằm trong danh sách mất tiêu điểm nhưng hiện bị chặn bởi mục nhập mới. 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ị xóa khỏi ngăn xếp và việc mất tiêu điểm sẽ được gửi đến người nghe tiêu điểm. Đối với mất tiêu điểm nhất thời, mục nhập sẽ vẫn nằm trong ngăn xếp mất tiêu điểm 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 nó, sẽ không có hiện tượng mất tiêu điểm nào được gửi như một mục đã được gửi trước đó khi nó bị chặn lần đầu tiên. Yêu cầu cuối cùng sẽ được bỏ chặn khi tất cả các trình chặn hiện tại bị xóa hoặc nó sẽ bị xóa khỏi ngăn xếp nếu tiêu điểm bị bỏ qua.

API thứ hai, notifyAudioFocusChange , là một cách được gọi cho mọi yêu cầu hoặc từ bỏ tiêu điểm âm thanh. API chủ yếu được sử dụng để thông báo cho dịch vụ OEM về những thay đổi trọng tâm, điều này có thể ảnh hưởng đến hoạt động của dịch vụ âm thanh xe hơi OEM.

Hướng dẫn đánh giá trọng tâm

Trong AAOS, tiêu điểm âm thanh được sử dụng để quản lý việc phát lại âm thanh và xác định ứng dụng nào sẽ tuân thủ để mang lại trải nghiệm tối ưu cho người dùng. Do đó, dịch vụ plugin OEM phải tính đến những điều sau khi quản lý yêu cầu tập trung vào âm thanh:

  • Nếu không có bất kỳ ứng dụng tập trung âm thanh có mức độ ư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), các ứng dụng sẽ có thể tập trung vào âm thanh tạm thời hoặc vĩnh viễn.

  • Khi tiêu điểm đa phương tiện đang hoạt động, các ứng dụng sẽ yêu cầu:

    • Tiêu điểm sử dụng cuộc gọi sẽ có thể nhận được tiêu điểm đồng thời hoặc riêng biệt.

    • 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 riêng biệt.

    • 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 riêng biệt.

  • Trong khi các ứng dụng tập trung vào â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 thì mọi yêu cầu tập trung vào âm thanh bị trì hoãn đến đều phải được chấp thuận hoặc 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 lấy nét sẽ có thể lấy được tiêu điểm khi không có âm thanh 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 nét bị trì hoãn vẫn phải được tôn trọng và có thể lấy được tiêu điểm khi âm thanh có mức độ ưu tiên cao dừng lại.

Dịch vụ khối lượng xe OEM

Dịch vụ âm thanh ô tô quản lý các sự kiện phím âm lượng bằng cách nghe các điều chỉnh âm lượng từ hệ thống âm thanh hoặc bằng cách nghe các sự kiện phím âm lượng trực tiếp từ dịch vụ đầu vào ô tô. Trong mỗi trường hợp, hành vi mặc định của dịch vụ âm thanh ô tô là xác định nhóm âm lượng nào sẽ thay đổi dựa trên trình phát âm thanh đang hoạt động và danh sách ưu tiên ngữ cảnh âm thanh.

Chúng tôi cung cấp hai danh sách ưu tiên số 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 âm thanh điều hướng và âm thanh nhạc đều hoạt động cùng lúc thì âm lượng điều hướng sẽ thay đổi trong sự kiện phím âm lượng.

  1. dẫn đường
  2. Gọi
  3. Âm nhạc
  4. Thông báo
  5. Ra lệnh bằng giọng nói
  6. Chuông gọi
  7. Âm thanh hệ thống
  8. Sự an toàn
  9. Báo thức
  10. Thông báo
  11. Tình trạng xe
  12. Khẩn cấp

Để giúp việc quản lý sự kiện phím âm lượng bớt phức tạp hơn, dịch vụ âm thanh ô tô có danh sách ngữ cảnh âm thanh ưu tiên thứ hai:

  1. Gọi
  2. Phương tiện truyền thông
  3. Thông báo
  4. Ra lệnh bằng giọng nó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 quan trọng. Không phổ biến, có lẽ âm thanh có thời lượng ngắn hơn, chỉ có thể được quản lý thông qua giao diện người dùng cài đặt âm thanh.

Phiên bản thực tế của âm lượng có thể được đặt bằng cấu hình audioVolumeAdjustmentContextsVersion . Cấu hình có thể được đặt thành 1 hoặc 2 ( 2 là mặc định).

Để mang lại sự linh hoạt hơn 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 ô tô OEM có một phương thức duy nhất bao gồm volumeAdjustmentOemCarAudioVolumeRequest :

class OemCarAudioVolumeRequest {
    int audioZoneId;
    int callState;
    List<AudioAttributes> activePlaybackAttributes;
    List<AudioAttributes> duckedAttributes;
    List<CarVolumeGroupInfo> volumeGroupState;
}

activePlaybackAttributes của yêu cầu có thuộc tính âm thanh đang hoạt động. Các thuộc duckedAttributes đều là các thuộc tính âm thanh hiện đã bị ẩn. volumeGroupState có trạng thái hiện tại của nhóm ổ đĩa. Yêu cầu thể hiện trạng thái hiện tại của ngăn xếp âm thanh và có thể được sử dụng để xác định nhóm âm lượng nào sẽ được thay đổi. Kết quả sẽ được trả về trong OemCarVolumeChangeInfo :

class OemCarVolumeChangeInfo {
    boolean change;
    CarVolumeGroupInfo volumeGroupChanged;
}

Boolean change cho biết liệu có bất kỳ ổ đĩa nào đã thay đổi hay không, true cho biết có sự thay đổi và nhóm ổ đĩa 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 tới API. Ví dụ: nếu kết quả chỉ ra rằng nhóm âm lượng điều hướng nên bị tắt tiếng thì boolean sẽ true và nhóm âm lượng được trả về sẽ là nhóm âm lượng điều hướng.

Dịch vụ giảm xóc ô tô OEM

Dịch vụ âm thanh ô tô quản lý việc 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 AudioControl HAL về việc cần giảm âm thanh cho thiết bị nào. Khi tiêu điểm thay đổi, tất cả người giữ tiêu điểm đang hoạt động sẽ được đánh giá để xác định cái nào cần được né tránh dựa trên bộ quy tắc dìm tĩnh này:

  • Âm thanh khẩn cấp loại bỏ mọi thứ ngoại trừ âm thanh cuộc gọi
  • An toàn loại bỏ mọi thứ ngoại trừ âm thanh khẩn cấp
  • Điều hướng loại bỏ mọi thứ ngoại trừ âm thanh an toàn và khẩn cấp
  • Gọi vịt mọi thứ ngoại trừ âm thanh an toàn, khẩn cấp và điều hướng
  • Tiếng vịt kêu vang vang
  • Âm nhạc và thông báo nên được tránh xa mọi thứ

Các quy tắc này không đầy đủ và cá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. OEM có thể kiểm soát các đề xuất này một cách tích cực hơn dựa trên các yêu cầu sẵ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 ô tô khi thay đổi tiêu điểm âm thanh. Nó sử dụng lại OemCarAudioVolumeRequest được giới thiệu trong dịch vụ khối lượng ô tô OEM và chứa thông tin liên quan để đưa ra quyết định về thuộc tính nào cần vịt. Danh sách các thuộc tính âm thanh được rút ra 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ị loại bỏ:

    • Trong danh sách, tiếp tục bị loại
    • Không có trong danh sách, tính năng vịt đã tắt
  • Thuộc tính âm thanh hiện không bị loại bỏ:

    • Trong danh sách, đã bị loại
    • Không có trong danh sách, tính năng vịt đã tắt

Sau đó, dịch vụ âm thanh ô 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 chúng vào danh sách thiết bị đầu ra âm thanh bị loại bỏ hoặc danh sách thiết bị âm thanh bị loại bỏ tương ứng. Điều này cuối cùng sẽ được gửi tới AudioControl HAL để thực hiện việc giảm âm thanh cần thiết ở cấp độ phần cứng.

Hình bên dưới hiển thị sơ đồ trình tự đơn giản hóa của điều khiển giảm âm thanh cho yêu cầu tập trung khi sử dụng dịch vụ giảm âm thanh OEM:

hình ảnh

Trình tự bắt đầu khi một ứng dụng yêu cầu Quản lý tiêu điểm âm thanh thông qua API trình quản lý âm thanh công cộng. Yêu cầu được chuyển tiếp đến dịch vụ âm thanh xe hơi để xác định kết quả. Khi trọng tâm âm thanh được quyết định, dịch vụ âm thanh ô tô sẽ đánh giá việc giảm âm thanh bằng cách gọi OemCarAudioDuckingService để đánh giá những thuộc tính âm thanh nào sẽ bị giảm. Sau khi kết quả được trả về từ API evaluateAttributesToDuck , các thiết bị âm thanh cần điều khiển sẽ được tính toán và cuối cùng thông tin sẽ được gửi đến AudioControl để áp dụng chức năng giảm âm lượng cho phần cứng âm thanh.

Triển khai tham chiếu dịch vụ âm thanh xe hơi OEM

AAOS cung cấp cách triển khai tham chiếu của dịch vụ ô tô OEM trong packages/services/Car/tests/OemCarServiceTestApp , triển khai OemCarService , cùng với OemCarAudioFocusService , OemCarAudioDuckingServiceOemCarAudioVolumeService . Về sau, mỗi dịch vụ sử dụng tệp XML để tải một hành vi tĩnh. Ví dụ: OemCarAudioFocusServiceImp tải oem_focus_config.xml chứa ma trận tương tác. Ma trận được sử dụng để đánh giá yêu cầu tập trung khi evaluateAudioFocusRequest được gọi.

Gỡ lỗi ứng dụng thử nghiệm tham khảo

Ứng dụng thử nghiệm dịch vụ ô tô OEM là một phần của mã nguồn AOSP. 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 thử nghiệm.

<!-- 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ô OEM sử dụng lệnh dump 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ả đầu ra bên dưới:

***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 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.