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ùng một các thuộc tính âm thanh dùng cho luồng logic. Ứng dụng phải tôn trọng tiêu điểm tổn thất để hoạt động như dự kiến trong 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 coi trọng tâm là phương tiện để gián tiếp kiểm soát và tránh xung đột trong khi phát thay vì làm cơ chế điều khiển âm thanh chính. Chiếc xe không được phụ thuộc vào hệ thống lấy nét để vận hành hệ thống âm thanh phụ.

Tập trung vào hoạt động tương tác

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

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

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

Đây là mô hình tương tác thường dùng nhất với Android.

Trong các hoạt động tương tác độc quyền, tại mỗi thời điểm, chỉ một ứng dụng được phép giữ tiêu điểm. Do đó, một yêu cầu lấy tiêu điểm đến sẽ được cấp tiêu điểm trong khi tiêu điểm hiện có phần tử giữ 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ữ tập trung. Do đó, yêu cầu lấy tiêu điểm của ứng dụng mới bắt đầu được trả về cùng AUDIOFOCUS_REQUEST_GRANTED trong khi ứng dụng đang phát nhạc nhận được một sự kiện thay đổi tiêu điểm có trạng thái ngừng sử dụng tương ứng với loại yêu cầu đã được tạo ra.

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

Khi tương tác từ chối, yêu cầu đến luôn bị từ chối. Cho ví dụ: khi cố gắng phát nhạc trong khi cuộc gọi đang diễn ra. Trong phần này trường hợp, 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 tiêu điểm để phát nhạc, ứng dụng nhạc sẽ nhận được AUDIOFOCUS_REQUEST_FAILED khi phản hồi đối với yêu cầu. Vì yêu cầu lấy tiêu điểm bị từ chối nên sẽ không có yêu cầu lấy tiêu điểm nào được gửi đi vào phần tử giữ tiêu điểm hiện tại.

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

Riêng đối với AAOS là các tương tác đồng thời. Thao tác này sẽ cung cấp cho các ứng dụng yêu cầu âm thanh lấy nét trong ô tô nhờ khả năng giữ tiêu điểm đồng thời với các ứng dụng khác. Đối với tương tác đồng thời xảy ra thì 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 lấy tiêu điểm sẽ được trả về cùng AUDIOFOCUS_REQUEST_GRANTED trong khi phần tử giữ tiêu điểm hiện tại không thay đổi trong tập trung. 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 được giảm vị trí, trình 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 công dụng, hãy cẩn thận khi kết hợp và giảm hiệu suất ở cấp độ phần cứng trên các thiết bị đầu ra. Chúng tôi đặc biệt khuyên bạn CarAudioContext được phép phát đồng thời phải được gửi đến 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 phát đồng thời, điều này cho phép HAL để ẩn một trong các dòng dữ liệu trước khi kết hợp hoặc để định tuyến các dòng dữ liệu thực đến các loa khác nhau trong xe. Nếu các luồng logic được kết hợp trong Với Android, mức tăng không bị thay đổi và được phân phối trong cùng một luồng vật lý.

Ví dụ: khi điều hướng và nội dung nghe nhìn được phân phối đồng thời, mức tăng cho luồng nội dung đa phương tiện có thể tạm thời được giảm đi (hoặc giảm bớt) để người dùng có thể nghe thấy hướng dẫn di chuyển rõ ràng hơn. Ngoài ra, hoạt động điều hướng luồng có thể được định tuyến đến loa phía trình điều khiển trong khi nội dung đa phương tiện vẫn tiếp tục chơi trong suốt phần còn lại của căn nhà gỗ.

Ma trận tương tác

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

Ví dụ: khi một ứng dụng đa phương tiện về nhạc giữ tiêu điểm dưới dạng một yêu cầu của ứng dụng chỉ đường tiêu điểm, ma trận chỉ ra rằng hai tương tác này 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 thực hiện.

Do các 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, một yêu cầu lấy tiêu điểm đến được so sánh với từng yêu cầu người giữ tiêu điểm hiện tại trước khi xác định tương tác nào sẽ áp dụng. Trong phần này thì tương tác thận trọng nhất sẽ chiến thắng. Từ chối, sau đó loại trừ và cuối cùng đồ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.

Trên Android 11, chúng tôi đã ra mắt một chế độ cài đặt mới cho người dùng để cho phép người dùng thay đổi hành vi tương tác giữa điều hướng và cuộc gọi điện thoại. Khi đặt, android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL thay đổi sự tương tác giữa NAVIGATION yêu cầu lấy tiêu điểm đến và CALL hiện tại phần tử giữ tiêu điểm từ đồng thời sang từ chối. Nếu người dùng muốn hướng dẫn di chuyển không làm gián đoạn cuộc gọi, người dùng có thể bật chế độ cài đặt này. Chiến dịch này cố định cho người dùng và có thể được đặt linh động để lấy tiêu điểm tiếp theo các yêu cầu sẽ 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ễ. Chiến dịch này cho phép trì hoãn các yêu cầu lấy tiêu điểm không tạm thời khi chúng tương tác với phần tử giữ tiêu điểm hiện tại thường bị từ chối. Khi thì sự thay đổi về tiêu điểm sẽ dẫn đến trạng thái trong đó yêu cầu bị trì hoãn có thể được lấy tiêu điểm, yêu cầu được chấp thuận.

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

  • Chỉ dành cho các yêu cầu không tạm thời. Chỉ có thể gửi yêu cầu bị trì hoãn cho các nguồn không tạm thời để tránh phải phát âm thanh tạm thời trong thời gian dài sau khi thích hợp.

  • Mỗi lần yêu cầu chỉ được trì hoãn. Nếu một yêu cầu có thể bị trì hoãn được thực hiện trong khi đã có một yêu cầu bị trì hoãn, yêu cầu bị trì hoãn ban đầu nhận được một sự kiện thay đổi AUDIOFOCUS_LOSS và yêu cầu mới sẽ nhận được một 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 Khi một yêu cầu bị trì hoãn, trình nghe được dùng để thông báo cho người yêu cầu khi cuối cùng yêu cầu sẽ được chấp thuận (AUDIOFOCUS_GAIN) hoặc nếu sau đó yêu cầu bị từ chối (AUDIOFOCUS_LOSS).

Yêu cầu lấy 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, quyền phát âm thanh sẽ được quản lý độc lập cho từng vùng. Như vậy, yêu cầu về một vùng không tính đến những gì duy trì tiêu điểm ở các vùng khác, cũng như không khiến cho các đối tượng giữ tiêu điểm ở các vùng khác mất tiêu điểm. Bằng cách này, bạn có thể quản lý trọng tâm của cabin chính một cách riêng biệt với hệ thống giải trí ở ghế sau, nhờ đó không làm gián đoạn quá trình phát âm thanh một vùng bởi các thay đổi được tập trung vào vùng khác.

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

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

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 tập trung cho từng vùng bằng cách đưa AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID vào phần 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 trình yêu cầu ghi đè vùng âm thanh tự động thay vào đó, hãy dùng mã vùng được chỉ định. Do đó, ứng dụng có thể phát hành yêu cầu riêng cho từng vùng âm thanh.

Quyền phát âm thanh HAL

Kể từ Android 11, HAL được bật để yêu cầu lấy tiêu điểm thay cho các luồng bên ngoài. 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 người tham gia tối ưu trong hệ sinh thái Android và nhằm 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ề việc âm thanh nào được ưu tiên. Trong trường hợp này, hệ thống phải phát các âm thanh quan trọng khẩn cấp và an toàn bất kể về việc HAL có được cấp quyền phát âm thanh hay không và có nên tiếp tục phát khi phù hợp ngay cả khi HAL mất quyền phát âm thanh. Điều này cũng đúng đối với bất kỳ âm thanh nào theo yêu cầu của quy định của chính phủ.

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

AudioControl@2.0

Phiên bản 2.0 của AudioControl HAL ra mắt các API mới này:

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

HAL có thể có nhiều yêu cầu lấy nét cùng một lúc, nhưng chỉ được yêu cầu một lần theo từng yêu cầu sử dụng và ghép nối mã 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 có yêu cầu và tiếp tục làm như vậy cho đến khi nó bỏ tiêu điểm.

Ngoại trừ 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 phải không phải chờ lấy sự tập trung rồi mới phát những âm thanh quan trọng về an toàn. Không bắt buộc để HAL nghe và phản hồi những thay đổi về quyền phát âm thanh thông qua IAudioControl#onAudioFocusChange.

Dịch vụ tập trung vào âm thanh của nhà sản xuất thiết bị gốc (OEM) trên ô tô

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

  • Không có âm thanh tập trung ở trạng thái đứng, 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) đều phải thu được âm thanh lấy tiêu điểm tạm thời hoặc vĩnh viễn.

  • Khi một tiêu điểm nghe nhìn đang hoạt động:

    • Ứng dụng yêu cầu tập trung vào việc 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 tập trung vào việc sử dụng tính năng chỉ đường phải có thể nhận thông tin chỉ đường lấy tiêu điểm đồng thời hoặc chỉ tập trung.

    • Các ứng dụng yêu cầu tập trung vào mức sử dụng Trợ lý phải có thể nhận thông tin tập trung vào mức sử dụng đồng thời hoặc độc quyền.

  • Trong khi chờ đợi âm thanh có mức độ ưu tiên cao (bao gồm cả cuộc gọi điện thoại, ứng dụng cảnh báo khẩn cấp hoặc thông báo an toàn) đều đang hoạt động, có bất cứ Yêu cầu tập trung âm thanh bị trì hoãn sẽ đượ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 tiêu điểm nếu không có âm thanh có mức ưu tiên cao đang hoạt động. Kể cả khi cao âm thanh ưu tiên đang hoạt động, nên vẫn phải tuân thủ các yêu cầu lấy nét bị trễ và có thể lấy nét khi âm thanh có mức độ ưu tiên cao dừng lại.