Quyền phát âm thanh

Trước khi bắt đầu một luồng logic, ứng dụng sẽ yêu cầu quyền phát âm thanh bằng cách sử dụng các thuộc tính âm thanh giống như được dùng cho luồng logic. Ứng dụng phải tuân thủ việc 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 lấy tiêu điểm, nhưng hệ thống không thực thi yêu cầu này. Do đó, hãy xem tiêu điểm là một phương tiện để kiểm soát gián tiếp và tránh xung đột trong khi phát thay vì là cơ chế điều khiển âm thanh chính. Xe không được phụ thuộc vào hệ thống lấy nét để vận hành hệ thống con âm thanh.

Lượt tương tác với tiêu điểm

Để hỗ trợ AAOS, các yêu cầu về quyền phát âm thanh được xử lý dựa trên các lượt tương tác được xác định trước giữa CarAudioContext của yêu cầu và lượt tương tác của các chủ thể có quyền phát hiện hiện tại. Có 3 loại tương tác:

  • Độc quyền
  • Từ chối
  • Concurrent

Hoạt động 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 lượt tương tác độc quyền, mỗi lần chỉ có một ứng dụng được phép giữ tiêu điểm. Do đó, yêu cầu tiêu điểm sắp tới sẽ được cấp tiêu điểm trong khi chủ thể tiêu điểm hiện tại mất tiêu điểm. Vì cả hai ứng dụng đều phát nội dung nghe nhì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 bắt đầu sẽ được trả về bằng AUDIOFOCUS_REQUEST_GRANTED trong khi ứng dụng đang phát nhạc sẽ 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 lượt tương tác từ chối, yêu cầu đến luôn bị từ chối. Ví dụ: khi bạn cố gắng phát nhạc trong khi đang gọi điện. Trong trường hợp này, nếu Trình quay số giữ quyền phát âm thanh cho một cuộc gọi và ứng dụng thứ hai yêu cầu quyền phát để phát nhạc, thì ứng dụng nhạc sẽ nhận được AUDIOFOCUS_REQUEST_FAILED để phản hồi yêu cầu. Vì yêu cầu lấy tiêu điểm bị từ chối, nên không có sự kiện mất tiêu điểm nào được gửi đến chủ thể tiêu điểm hiện tại.

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

Điểm đặc biệt của AAOS là các lượt tương tác đồng thời. Điều này cho phép các ứng dụng yêu cầu quyền phát âm thanh trong ô tô giữ quyền phát đồng thời với các ứng dụng khác. Để một lượt tương tác đồng thời diễn ra, bạn phải đáp ứng các điều kiện sau. Các:

Nếu đáp ứng các tiêu chí này, thì yêu cầu tiêu điểm sẽ trả về bằng AUDIOFOCUS_REQUEST_GRANTED trong khi chủ thể 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 chủ thể tiêu điểm hiện tại chọn nhận sự kiện nhấn giữ hoặc tạm dừng khi bị nhấn giữ, thì chủ thể tiêu điểm hiện tại sẽ mất tiêu điểm, như xảy ra với một lượt tương tác độc quyền.

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

Mặc dù hoạt động tương tác đồng thời có nhiều ứng dụng, nhưng hãy cẩn thận khi kết hợp và giảm âm ở cấp phần cứng trên các thiết bị đầu ra. Bạn nên định tuyến các CarAudioContext được phép phát đồng thời đế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 giảm một trong các luồng trước khi kết hợp các luồng đó hoặc định tuyến các luồng thực tế đến các loa khác nhau trong xe. Nếu các luồng logic được kết hợp trong Android, thì các mức tăng sẽ không bị thay đổi và được phân phối trong cùng một luồng thực.

Ví dụ: khi nội dung đa phương tiện và chỉ đường được phân phối đồng thời, mức tăng đối với luồng nội dung đa phương tiện có thể tạm thời giảm (hoặc bị giảm) để có thể nghe rõ hơn hướng dẫn chỉ đường. Ngoài ra, luồng điều hướng có thể được định tuyến đến loa bên người lái trong khi nội dung nghe nhìn 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 dưới đây cho thấy ma trận tương tác do CarAudioService xác định. Mỗi hàng đại diện cho CarAudioContext của chủ thể lấy tiêu điểm hiện tại và mỗi cột đại diện cho yêu cầu sắp tới.

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

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

Hình 1. Ma trận tương tác của quyền phát âm thanh.

Trong Android 11, chúng tôi đã ra mắt một chế độ cài đặt người dùng mới để cho phép người dùng thay đổi hành vi tương tác giữa tính năng chỉ đường và cuộc gọi điện thoại. Khi được đặt, android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL sẽ thay đổi hoạt động tương tác giữa các yêu cầu tiêu điểm NAVIGATION sắp tới 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 chỉ đường không làm gián đoạn cuộc gọi, họ có thể bật chế độ cài đặt này. Chế độ cài đặt này sẽ được duy trì cho người dùng và có thể được thiết lập một cách linh động để các yêu cầu tiêu điểm tiếp theo tuân theo chế độ cài đặt mới.

Quyền phát âm thanh có thể trì hoãn

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

Quy tắc đối với yêu cầu quyền phát âm thanh bị trì hoãn

  • Chỉ yêu cầu không tạm thời. Bạn chỉ có thể gửi yêu cầu trì hoãn cho các nguồn không tạm thời để tránh phát âm thanh tạm thời sau khi âm thanh đó có liên quan.

  • Mỗi lần chỉ có thể trì hoãn một yêu cầu. 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 một sự kiện thay đổi AUDIOFOCUS_LOSS và yêu cầu mới sẽ nhận được phản hồi đồng bộ của AUDIOFOCUS_REQUEST_DELAYED.

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

Yêu cầu tiêu điểm có thể trì hoãn

Cách tạo 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 đưa ra 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 nghe 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ý tiêu điểm nhiều vùng

Đối với những 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 đối với một vùng không tính đến đối tượng giữ tiêu điểm trong các vùng khác, cũng không khiến đối tượng giữ tiêu điểm trong các vùng khác mất tiêu điểm. Nhờ đó, bạn có thể quản lý tiêu điểm của khoang chính riêng biệt với hệ thống giải trí cho ghế sau, do đó không làm gián đoạn quá trình phát âm thanh ở một khu vực do các thay đổi được thực hiện trong tiêu điểm sang khu vực khác.

Đối với tất cả ứng dụng, CarAudioService sẽ tự động quản lý tiêu điểm. Vùng âm thanh của yêu cầu lấy tiêu điểm được xác định bằng UserId hoặc UID liên kết (để biết thông tin chi tiết, hãy xem phần Điều hướng âm thanh nhiều vùng).

Yêu cầu âm thanh từ nhiều vùng cùng lúc

Nếu muốn phát âm thanh đồng thời ở nhiều vùng, ứ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

Tham số gói này cho phép bên yêu cầu ghi đè các mối liên kết vùng âm thanh tự động để sử dụng mã vùng đã chỉ định. Do đó, một ứ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.

Quyền phát âm thanh HAL

Kể từ Android 11, HAL được bật để thay mặt cho các luồng bên ngoài yêu cầu tiêu điểm. Mặc dù không bắt buộc, nhưng bạn nên 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 sẽ đưa ra quyết định cuối cùng về âm thanh nào được ưu tiên. Ở mức độ này, âm thanh khẩn cấp và âm thanh quan trọng về an toàn phải được phát bất kể HAL có được cấp quyền phát âm thanh hay không và phải tiếp tục phát khi thích hợp ngay cả khi HAL mất quyền phát âm thanh. Điều này cũng đúng đối với mọi âm thanh theo yêu cầu của quy định của chính phủ.

HAL phải chủ động tắt tiếng các luồng Android khi thích hợp khi phát âm thanh khẩn cấp hoặc âm thanh quan trọng về an toàn để đảm bảo người dùng nghe được 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 sau:

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

HAL có thể có nhiều yêu cầu lấy tiêu điểm 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 mã vùng. Android giả định HAL sẽ bắt đầu phát âm thanh ngay lập tức cho một lần sử dụng sau khi yêu cầu được thực hiện và tiếp tục phát âm thanh cho đến khi từ bỏ tiêu điểm.

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

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)

Trong Android 14, AAOS đã ra mắt các dịch vụ trình bổ trợ OEM cho ô tô để cho phép cấu hình một số thành phần ô tô. Đối với Dịch vụ trình bổ trợ âm thanh trên ô tô, dịch vụ trình bổ trợ cho phép nhà sản xuất thiết bị gốc (OEM) quản lý các yêu cầu lấy tiêu điểm do dịch vụ âm thanh trên ô tô chặn. Điều này giúp nhà sản xuất thiết bị gốc linh hoạt hơn trong việc quản lý tiêu điểm theo yêu cầu của các quy tắc và quy định. Do đó, cách tương tác với tiêu điểm âm thanh có thể khác nhau giữa các nhà sản xuất và theo khu vực. Giả định cơ bản về quyền phát âm thanh vẫn giữ nguyên, tức là các ứng dụng vẫn phải yêu cầu quyền phát để 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 vẫn áp dụng cho yêu cầu quyền phát âm thanh của ứng dụng:

  • Nếu không có tiêu điểm âm thanh ưu tiên cao nào (bao gồm cả 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 phải có thể lấy tiêu điểm â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:

    • Ứng dụng yêu cầu quyền sử dụng cuộc gọi phải có thể nhận cuộc gọi đồng thời hoặc độc quyền.

    • Các ứng dụng yêu cầu tiêu điểm sử dụng tính năng chỉ đường phải có thể nhận được tiêu điểm chỉ đường đồng thời hoặc độc quyền.

    • Ứng dụng yêu cầu tiêu điểm sử dụng trợ lý phải có thể nhận tiêu điểm sử dụng đồ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 (bao gồm cả 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, mọi yêu cầu phát âm thanh bị trì hoãn đến sẽ được cấp 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 tiêu điểm lấy được tiêu điểm nếu 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 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 khi âm thanh có mức độ ưu tiên cao dừng lại.