Quyền phát âm thanh

Trước khi bắt đầu luồng logic, ứng dụng sẽ yêu cầu tập trung âm thanh bằng cách sử dụng cùng thuộc tính âm thanh như được sử dụng cho luồng logic. Ứng dụng phải tôn trọng tình trạng mất tiêu điểm để hoạt động như mong đợi trong các trường hợp sử dụng ô tô.

Mặc dù bạn nên gửi yêu cầu tập trung nhưng hệ thống không thực thi yêu cầu này. Do đó, hãy coi focus như một phương tiện để kiểm soát gián tiếp và tránh xung đột trong quá trình phát lại thay vì như một cơ chế điều khiển âm thanh chính. Xe không nên phụ thuộc vào hệ thống lấy nét để vận hành hệ thống con âm thanh.

Tương tác tập trung

Để hỗ trợ AAOS, các yêu cầu tập trung vào âm thanh được xử lý dựa trên các tương tác được xác định trước giữa CarAudioContext của yêu cầu và của chủ sở hữu tiêu điểm hiện tại. Có ba loại tương tác:

  • Loại trừ
  • Từ chối
  • Đồng thời

Tương tác độc quyền

Đây là mô hình tương tác được sử dụng phổ biến nhất với Android.

Trong các tương tác độc quyền , mỗi lần chỉ một ứng dụng được phép giữ tiêu điểm. Do đó, yêu cầu tiêu điểm đến sẽ được cấp tiêu điểm trong khi người giữ tiêu điểm hiện tại mất tiêu điểm. Vì cả hai ứng dụng đều phát phương tiện nên chỉ một ứng dụng được phép giữ tiêu điểm. Do đó, yêu cầu tiêu điểm của ứng dụng mới khởi động được trả về với AUDIOFOCUS_REQUEST_GRANTED trong khi ứng dụng hiện đang phát nhạc nhận được sự kiện thay đổi tiêu điểm có trạng thái mất tương ứng với loại yêu cầu đã được thực hiện.

Từ chối tương tác

Với các tương tác từ chối , yêu cầu đến luôn bị từ chối. Ví dụ: khi cố gắng phát nhạc trong khi đang thực hiện cuộc gọi. Trong trường hợp này, nếu Trình quay số giữ tiêu điểm âm thanh cho cuộc gọi và ứng dụng thứ hai yêu cầu tiêu điểm để phát nhạc thì ứng dụng âm nhạc sẽ nhận được AUDIOFOCUS_REQUEST_FAILED để phản hồi yêu cầu. Vì yêu cầu tiêu điểm bị từ chối nên không có tổn thất tiêu điểm nào được gửi đến người giữ tiêu điểm hiện tại.

Tương tác đồng thời

Duy nhất ở AAOS là các tương tác đồng thời . Điều này mang lại cho các ứng dụng yêu cầu tiêu điểm âm thanh trong ô tô khả năng duy trì tiêu điểm đồng thời với các ứng dụng khác. Để tương tác đồng thời diễn ra, phải đáp ứng các điều kiện sau. Các:

Nếu các tiêu chí này được đáp ứng thì yêu cầu tiêu điểm sẽ trả về với AUDIOFOCUS_REQUEST_GRANTED trong khi chủ sở hữu tiêu điểm hiện tại không có thay đổi nào về tiêu điểm. Tuy nhiên, nếu người giữ tiêu điểm hiện tại chọn nhận các sự kiện vịt hoặc tạm dừng khi bị vịt, người giữ tiêu điểm hiện tại sẽ mất tiêu điểm, như xảy ra với tương tác độc quyền.

Xử lý các luồng đồng thời

Mặc dù tương tác đồng thời có nhiều mục đích sử dụng nhưng hãy cẩn thận khi trộn và giảm bớt ở cấp độ phần cứng trên các thiết bị đầu ra. Chúng tôi thực sự khuyên rằng các CarAudioContext được phép phát đồng thời nên được chuyển đến các thiết bị đầu ra khác nhau.

Bằng cách có các thiết bị đầu ra riêng biệt cho các luồng đồng thời, điều này cho phép HAL điều chỉnh một trong các luồng trước khi trộn chúng hoặc định tuyến các luồng vật lý đến các loa khác nhau trong xe. Nếu các luồng logic được trộn lẫn trong Android thì mức tăng sẽ không bị thay đổi và được phân phối như một phần của cùng một luồng vật lý.

Ví dụ: khi điều hướng và phương tiện được phân phối đồng thời, mức tăng cho luồng phương tiện có thể tạm thời bị giảm (hoặc giảm bớt) để có thể nghe rõ hơn hướng dẫn điều hướng. Ngoài ra, luồng điều hướng có thể được chuyển đến loa bên người lái trong khi phương tiện truyền thông tiếp tục phát trong phần còn lại của cabin.

Ma trận tương tác

Bảng bên dưới hiển thị ma trận tương tác được xác định bởi CarAudioService . Mỗi hàng đại diện cho CarAudioContext của chủ sở hữu tiêu điểm hiện tại và mỗi cột đại diện cho yêu cầu đến.

Ví dụ: khi một ứng dụng phương tiện âm nhạc giữ tiêu điểm khi ứng dụng điều hướng yêu cầu tiêu điểm, ma trận sẽ chỉ ra rằng hai tương tác có thể phát đồng thời, giả sử các tiêu chí khác cho tương tác đồng thời được đáp ứng.

Do có sự tương tác đồng thời nên có thể có nhiều hơn một bộ giữ tiêu điểm. Trong trường hợp này, yêu cầu tiêu điểm đến sẽ được so sánh với từng chủ sở hữu tiêu điểm hiện tại trước khi xác định nên áp dụng tương tác nào. Trong trường hợp này, sự tương tác thận trọng nhất sẽ thắng. Từ chối, sau đó loại trừ và cuối cùng là đồng thời.

Ma trận tương tác tập trung vào âm thanh

Hình 1. Ma trận tương tác tập trung vào âm thanh.

Trong Android 11, một cài đặt người dùng mới đã được giới thiệu để cho phép người dùng thay đổi hành vi tương tác giữa điều hướng và gọi điện thoại. Khi được đặt, android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL sẽ thay đổi sự tương tác giữa các yêu cầu tiêu điểm NAVIGATION đến và chủ sở hữu tiêu điểm CALL hiện tại từ đồng thời thành từ chối . Nếu người dùng muốn hướng dẫn điều hướng không làm gián đoạn cuộc gọi thì họ có thể bật cài đặt này. Điều này được duy trì cho người dùng và có thể được đặt linh hoạt để các yêu cầu lấy nét tiếp theo tuân theo cài đặt mới.

Tập trung âm thanh có thể trì hoãn

Trong Android 11, AAOS đã bổ sung tính năng hỗ trợ yêu cầu trì hoãn tiêu điểm âm thanh. Điều này cho phép các yêu cầu tiêu điểm không nhất thời bị trì hoãn khi tương tác của chúng với chủ sở hữu tiêu điểm hiện tại thường dẫn đến việc chúng bị từ chối. Sau khi thay đổi tiêu điểm dẫn đến trạng thái mà yêu cầu bị trì hoãn có thể lấy được tiêu điểm thì yêu cầu sẽ được chấp nhận.

Quy tắc dành cho yêu cầu tập trung vào âm thanh bị trì hoãn

  • Chỉ những yêu cầu không nhất thời. Yêu cầu bị trì hoãn chỉ có thể được thực hiện đối với các nguồn không nhất thời để tránh phát ra âm thanh nhất thời rất lâu sau khi có liên quan.

  • Mỗi lần chỉ có một yêu cầu có thể bị trì hoãn. Nếu một yêu cầu có thể trì hoãn được thực hiện trong khi đã có một yêu cầu bị trì hoãn, thì yêu cầu bị trì hoãn ban đầu sẽ nhận được sự kiện thay đổi AUDIOFOCUS_LOSS và yêu cầu mới sẽ nhận được phản hồi đồng bộ là AUDIOFOCUS_REQUEST_DELAYED .

  • Các yêu cầu có thể trì hoãn phải có OnAudioFocusChangeListener Khi yêu cầu bị trì hoãn, trình nghe được sử dụng để thông báo cho người yêu cầu khi yêu cầu cuối cùng được chấp nhận ( AUDIOFOCUS_GAIN ) hoặc nếu yêu cầu đó bị từ chối sau đó ( AUDIOFOCUS_LOSS ).

Yêu cầu tập trung trễ

Để xây dựng một yêu cầu có thể bị trì hoãn:

  1. Sử dụng AudioFocusRequest.Builder#setAcceptsDelayedFocusGain .

    mMediaWithDelayedFocusListener = new MediaWithDelayedFocusListener();
    
    mDelayedFocusRequest = new AudioFocusRequest
         .Builder(AudioManager.AUDIOFOCUS_GAIN)
         .setAudioAttributes(mMusicAudioAttrib)
         .setOnAudioFocusChangeListener(mMediaWithDelayedFocusListener)
         .setForceDucking(false)
         .setWillPauseWhenDucked(false)
         .setAcceptsDelayedFocusGain(true)
         .build();
    
  2. Khi thực hiện yêu cầu, hãy xử lý phản hồi AUDIOFOCUS_REQUEST_DELAYED :

    int delayedFocusRequestResults = mAudioManager.requestAudioFocus(mDelayedFocusRequest);
    if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
        // start audio playback
        return;
    }
    if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) {
         // audio playback delayed to audio focus listener
         return;
    }
    
  3. Khi yêu cầu bị trì hoãn, trình xử lý tiêu điểm sẽ xử lý các thay đổi về tiêu điểm:

    private final class MediaWithDelayedFocusListener implements
    OnAudioFocusChangeListener {
           @Override
           public void onAudioFocusChange(int focusChange) {
               synchronized (mLock) {
                   switch (focusChange) {
                       case AudioManager.AUDIOFOCUS_GAIN:
                           … // Start focus playback
                       case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                           … // Pause media transiently
                       case AudioManager.AUDIOFOCUS_LOSS:
                           … // Stop media
    

Quản lý tập trung đa vùng

Đối với xe có nhiều vùng âm thanh, tiêu điểm âm thanh được quản lý độc lập cho từng vùng. Do đó, yêu cầu tới một vùng không tính đến yếu tố giữ tiêu điểm ở các vùng khác và cũng không khiến người giữ tiêu điểm ở các vùng khác mất tiêu điểm. Với điều này, trọng tâm của cabin chính có thể được quản lý tách biệt với hệ thống giải trí cho hàng ghế sau, do đó không làm gián đoạn quá trình phát lại âm thanh ở một vùng do những thay đổi được thực hiện trong trọng tâm sang khu vực khác.

Đối với tất cả ứng dụng, CarAudioService tự động quản lý tiêu điểm. Vùng âm thanh của yêu cầu tập trung được xác định bởi UserId hoặc UID được liên kết của nó (để biết chi tiết, hãy xem Định tuyến âm thanh ).

Yêu cầu âm thanh từ nhiều vùng đồng thời

Nếu một ứng dụng muốn phát âm thanh ở nhiều vùng cùng lúc thì ứng dụng đó phải yêu cầu tiêu điểm cho từng vùng bằng cách đưa AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID vào gói:

//Create attribute with bundle and AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID
Bundle bundle = new Bundle();
bundle.putInt(CarAudioManager.AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID,
               zoneId);

AudioAttributes attributesWithZone = new AudioAttributes.Builder()
     .setUsage(AudioAttributes.USAGE_MEDIA)
     .addBundle(bundle)
     .build();

//Create focus request using built attributesWithZone

Thông số gói này cho phép người yêu cầu ghi đè ánh xạ vùng âm thanh tự động để sử dụng ID vùng được chỉ định thay vào đó. Do đó, ứng dụng có thể đưa ra các yêu cầu riêng biệt cho các vùng âm thanh khác nhau.

Tiêu điểm âm thanh HAL

Bắt đầu từ Android 11, HAL được kích hoạt để yêu cầu tập trung thay mặt cho các luồng bên ngoài. Mặc dù là tùy chọn nhưng chúng tôi rất khuyến khích việc sử dụng các API này để cho phép âm thanh bên ngoài trở thành thành phần tham gia tối ưu trong hệ sinh thái Android và mang lại trải nghiệm liền mạch cho người dùng.

HAL đưa ra quyết định cuối cùng về âm thanh nào sẽ được ưu tiên. Trong phạm vi này, các âm thanh quan trọng về an toàn và khẩn cấp phải được phát bất kể HAL có được cấp tiêu điểm âm thanh hay không và phải tiếp tục được phát khi thích hợp ngay cả khi HAL mất tiêu điểm âm thanh. Điều này cũng đúng với bất kỳ âm thanh nào theo quy định của chính phủ.

HAL nên chủ động tắt tiếng các luồng Android khi thích hợp khi phát các âm thanh khẩn cấp hoặc quan trọng về an toàn để đảm bảo chúng được nghe rõ ràng.

AudioControl@2.0

Phiên bản 2.0 của AudioControl HAL giới thiệu các API mới này:

API Mục đích
IAudioControl#registerFocusListener Đăng ký một phiên bản của IFocusListener với AudioControl HAL. Trình nghe này cho phép HAL yêu cầu và từ bỏ tiêu điểm âm thanh. HAl cung cấp một phiên bản ICloseHandle để Android sử dụng để hủy đăng ký trình nghe.
IAudioControl#onAudioFocusChange Thông báo cho HAL về những thay đổi về trạng thái đối với các yêu cầu tập trung do HAL thực hiện thông qua IFocusListener , bao gồm cả phản hồi cho các yêu cầu tập trung ban đầu.
IFocusListener#requestAudioFocus Các yêu cầu tập trung thay mặt cho HAL cho cách sử dụng, Id vùng và loại mức tăng tiêu điểm được chỉ định.
IFocusListener#abandonAudioFocus Bỏ qua các yêu cầu tập trung HAL hiện có cho Id vùng và mức sử dụng được chỉ định.

HAL có thể có nhiều yêu cầu tập trung cùng một lúc, nhưng bị giới hạn ở một yêu cầu cho mỗi lần sử dụng và ghép nối Id vùng. Android giả định HAL ngay lập tức bắt đầu phát âm thanh cho một mục đích sử dụng sau khi yêu cầu được đưa ra và tiếp tục làm như vậy cho đến khi nó bỏ tiêu điểm.

Ngoài registerFocusListener , những yêu cầu này oneway để đảm bảo rằng Android không trì hoãn HAL trong khi yêu cầu tiêu điểm được xử lý. HAL không nên đợi lấy nét trước khi phát những âm thanh quan trọng về an toàn. HAL có thể tùy chọn lắng nghe và phản hồi những thay đổi về tiêu điểm âm thanh thông qua IAudioControl#onAudioFocusChange .

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

Trong Android 14, AAOS đã giới thiệu dịch vụ plugin OEM dành cho ô tô để hỗ trợ khả năng cấu hình cho một số bộ phận của ô tô. Đối với Dịch vụ plugin âm thanh ô tô , dịch vụ plugin cho phép OEM quản lý các yêu cầu tập trung bị dịch vụ âm thanh ô tô chặn. Điều này giúp các OEM linh hoạt hơn trong việc quản lý trọng tâm theo yêu cầu của các quy tắc và quy định. Do đó, sự tương tác tập trung vào âm thanh có thể khác nhau giữa các nhà sản xuất và giữa các vùng. Tiền đề cơ bản cho việc tập trung vào âm thanh vẫn được giữ nguyên, đó là các ứng dụng vẫn phải yêu cầu tập trung để quản lý âm thanh tốt hơn nhằm nâng cao trải nghiệm người dùng. Nhìn chung, một số quy tắc nhất định vẫn áp dụng cho yêu cầu tập trung vào âm thanh của ứng dụng:

  • Nếu không có bất kỳ ứng dụng tập trung âm thanh có mức độ ưu tiên cao, cố định nào (bao gồm cuộc gọi điện thoại, cảnh báo khẩn cấp hoặc thông báo 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.

  • Trong khi tiêu điểm phương tiện đang hoạt động:

    • Các ứng dụng yêu cầu tập trung vào việc sử dụng cuộc gọi sẽ có thể nhận cuộc gọi đồng thời hoặc riêng biệt.

    • Các ứng dụng yêu cầu tiêu điểm sử dụng điều hướng phải có thể nhận được tiêu điểm điều hướng đồng thời hoặc riêng biệt.

    • Các ứng dụng yêu cầu tiêu điểm sử dụng của trợ lý sẽ có thể nhận được tiêu điểm sử dụng đồng thời hoặc riêng biệt.

  • Khi các ứng dụng tập trung vào âm thanh có mức độ ưu tiên cao (bao gồm cuộc gọi điện thoại, cảnh báo khẩn cấp hoặc thông 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 các ứng dụng yêu cầu lấy nét lấy được tiêu điểm nếu không tồn tại â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.