Dịch vụ trình bổ trợ âm thanh cho ô tô

Bật dịch vụ trình bổ trợ mới cho nhà sản xuất thiết bị gốc (OEM) trong Android 14 một số thành phần của ô tô cần định cấu hình. Riêng đối với âm thanh, 3 giới thiệu các dịch vụ trình bổ trợ, cho phép OEM định cấu hình một cách linh hoạt quản lý âm thanh trên thiết bị AAOS:

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

Cấu trúc dịch vụ của trình bổ trợ cho ô tô

Hình dưới đây cung cấp thông tin tổng quan về dịch vụ xe hơi và mối quan hệ của chúng cho dịch vụ nhà sản xuất thiết bị gốc (OEM) về ô tô. Tương tự như các quy trình ứng dụng và quy trình dịch vụ của ô tô, quy trình dịch vụ ô tô của OEM chiếm không gian quy trình riêng.

hình ảnh

Dịch vụ ô tô bắt đầu dịch vụ của OEM (Nhà sản xuất thiết bị gốc) cho ô tô bằng cách tìm thành phần được xác định trong config_oemCarService. Nếu cấu hình này trống thì dịch vụ OEM sẽ không tồn tại và không có dịch vụ nào được khởi động. Thành phần phải mở rộng OemCarService. Dịch vụ âm thanh ô tô phải ghi đè các API để lấy OEM âm thanh cho ô tô dịch vụ:

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

    @Override
    public OemCarAudioDuckingService getOemAudioDuckingService();

    @Override
    public OemCarAudioVolumeService getOemAudioVolumeService();
}

Cho ví dụ, 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ụ bắt đầu bằng dịch vụ ô tô, nhưng dịch vụ không tự động kế thừa các quyền có sẵn đối với dịch vụ âm thanh trên ô tô. Như vậy, bất kỳ mà các dịch vụ OEM yêu cầu phải được cấp phép bằng cơ chế. Ví dụ: hãy xem packages/services/Car/data/etc/com.android.car.oemcarservice.testapp.xml.

Dịch vụ âm thanh ô tô có cấu trúc dịch vụ của nhà sản xuất thiết bị gốc (OEM)

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

  • Định tuyến âm thanh
  • Quyền phát âm thanh
  • Giảm âm thanh
  • Âm lượng và tắt tiếng

Trước Android 14, hành vi này chủ yếu là tĩnh và chỉ có thể sửa đổi được thông qua cài đặt, mặc dù đối với một số ít trường hợp. Android 14 ra mắt một cơ chế phát âm thanh ô tô để giao tiếp với một thành phần do OEM xác định. Thành phần này quản lý:

  • Quyền phát âm thanh
  • Giảm âm thanh
  • Âm lượng và tắt tiếng

Hình dưới đây thể hiện kiến trúc được đơn giản hoá cho dịch vụ âm thanh ô tô và dịch vụ OEM trong ô tô. Dịch vụ âm thanh ô tô xác định nhiều nội dung hấp dẫn có thể gọi dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM) trong ô tô để quản lý hoạt động âm thanh. Trường hợp sau chỉ xảy ra nếu thành phần dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM) tương ứng được xác định. Nếu không, giá trị dịch vụ âm thanh ô tô sử dụng hành vi mặc định.

hình ảnh

Để đảm bảo dịch vụ âm thanh ô tô và dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM) luôn hoạt động đồng bộ hoá, đối với mỗi cuộc 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) trong ô tô. Ví dụ: khi thì dịch vụ âm thanh trên ô tô chặn yêu cầu đánh giá quyền phát âm thanh trạng thái hiện tại của ngăn xếp cho dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM) trong ô tô. Trạng thái hiện tại bao gồm nắm giữ tiêu điểm hiện tại và những biến mất tiêu điểm hiện tại. Những yếu tố làm mất tiêu điểm là các yêu cầu lấy tiêu điểm vẫn nằm trong ngăn xếp nhưng tạm thời bị mất tập trung.

Dịch vụ âm thanh trên ô tô phải quản lý tất cả hoạt động âm thanh trong ô tô. Nếu ô tô không quản lý một số phần trong hành vi âm thanh, thì thông tin tiếp xúc với dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM) về ô tô chưa đầy đủ. Ví dụ: nếu OEM ghi đè tính năng xử lý quyền phát âm thanh trong dịch vụ ô tô bằng cách đăng ký do chính sách về quyền phát âm thanh của riêng họ, thì dịch vụ âm thanh ô tô sẽ không thể cung cấp đầy đủ cho dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM) về ô tô. Điều này có thể ảnh hưởng đến khả năng của ô tô Dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM) để đưa ra quyết định vì dịch vụ này có thể thiếu thông tin không hiển thị đến dịch vụ âm thanh ô tô.

Để thực hiện thao tác, dịch vụ âm thanh ô tô sẽ gọi cho các dịch vụ của OEM (Nhà sản xuất thiết bị gốc) dành cho ô tô. Các cuộc gọi này được thực hiện trên các quy trình đòi hỏi giao tiếp liên quy trình (IPC). IPC sẽ tăng độ trễ cho mỗi cuộc 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 ô tô khi đá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 lệnh gọi giữa hai quá trình chỉ cần đi theo một hướng.

Định nghĩa dịch vụ âm thanh ô tô của OEM (Nhà sản xuất thiết bị gốc)

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ô

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

  • Tương tác đồng thời. Phần giữ tiêu điểm có thể duy trì tiêu điểm ở cùng một thời điểm bất cứ lúc nào.

  • 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ừ phần tử giữ tiêu điểm hiện tại.

  • Từ chối lượt tương tác. Yêu cầu lấy tiêu điểm đến đã bị từ chối dựa trên phần tử giữ 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 tất cả nhu cầu tương tác có thể khác do các 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 sẽ được gọi qua dịch vụ âm thanh ô tô bất cứ lúc nào có một yêu cầu về quyền phát âm thanh cần được đánh giá, đó là cách API 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 dùng để đánh giá newFocusRequest so với chủ sở hữu tiêu điểm hiện tại trong focusHolders và những ứng dụng giảm tiêu điểm hiện tại ở focusLosers. API sẽ trả về kết quả:

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

Thẻ này chứa thông tin về kết quả đánh giá thực tế theo audioFocusEvaluationResults cho biết liệu yêu cầu hiện tại đã đã được cấp, bị hoãn lại hoặc 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 thiết lập trong các mục nhập newLosersnewlyBlocked, tuỳ thuộc vào bản chất thay đổi của ngăn xếp.

Trong trường hợp newLosers chứa các mục nhập từng giữ tiêu điểm nhưng giờ đây sẽ mất tiêu điểm, vĩnh viễn hoặc tạm thời. Chỉ mất tập trung vào vĩnh viễn sẽ bị xoá thêm khỏi ngăn xếp tiêu điểm âm thanh và những thành phần mất tiêu điểm tạm thời sẽ được chuyển sang ngăn xếp biến mất tiêu điểm hiện tại cho đến khi chúng lấy lại tiêu điểm hoặc bị loại bỏ khỏi đối tượng yêu cầu lấy tiêu điểm ban đầu. Bất kể thế nào, trình nghe tiêu điểm cho các yêu cầu sẽ nhận được tiêu điểm bị mất tương ứng.

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

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

Nguyên tắc đánh giá tiêu điểm

Trong AAOS, quyền phát âm thanh được dùng để quản lý việc phát âm thanh và xác định xem ứng dụng phải tuân thủ nhằm mang lại trải nghiệm tối ưu cho người dùng. Do vậy, dịch vụ trình bổ trợ OEM cần xem xét những điều sau đây khi quản lý yêu cầu quyền phát âm thanh:

  • Khi không có bất kỳ quyền phát âm thanh có mức độ ưu tiên cao nào (chẳng hạn như gọi điện thoại, ứng dụng khẩn cấp hoặc an toàn) đều phải có thể lấy được quyền phát âm thanh tạm thời hoặc vĩnh viễn.

  • Khi tiêu điểm nghe nhìn đang hoạt động, các ứng dụng sẽ yêu cầu:

    • Tập trung vào việc sử dụng cuộc gọi, phải có thể nhận tiêu điểm đồng thời hoặc độc quyền.

    • Tiêu điểm sử dụng thành phần điều hướng phải có thể nhận tiêu điểm đồng thời hoặc độc quyền.

    • Chế độ tập trung vào việc sử dụng Trợ lý, sẽ có thể nhận tiêu điểm đồng thời hoặc độc quyền.

  • Trong khi đứ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, trường hợp khẩn cấp cảnh báo hoặc cảnh báo an toàn) đang hoạt động và có bất cứ tập trung vào âm thanh nào bị trễ nên đượ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 tiêu điểm phải có thể lấy tiêu điểm khi không có tâm điểm nào đang hoạt động âm thanh có mức độ ưu tiên cao. Ngay cả khi các âm thanh có mức độ ưu tiên cao đang hoạt động, thì việc lấy nét bị trễ các yêu cầu vẫn được tôn trọng và có thể được chú ý sau khi âm thanh có mức ưu tiên cao sẽ dừng.

Dịch vụ âm lượng xe của OEM

Dịch vụ âm thanh trên ô tô quản lý các sự kiện nhấn phím âm lượng bằng cách nghe âm lượng các mức điều chỉnh khác trong hệ thống âm thanh hoặc nghe trực tiếp các sự kiện nhấn phím âm lượng từ dịch vụ nhập dữ liệu của ô tô. Trong mỗi trường hợp, hành vi mặc định của ô tô dịch vụ âm thanh là để xác định nhóm âm lượng nào cần thay đổi dựa trên trình phát âm thanh 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 mọi âm thanh ngữ cảnh theo thứ tự này. Danh sách được trình bày theo thứ tự giảm dần, thứ tự cao nhất mức độ ưu tiên ở 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 điều hướng và âm thanh nhạc đều hoạt động cùng một lúc, sau đó âm lượng điều hướng thay đổi trong một sự kiện nhấn phím âm lượng.

  1. Di chuyển
  2. Gọi
  3. Âm nhạc
  4. Thông báo
  5. Lệnh thoại
  6. Chuông cuộc gọi
  7. Âm hệ thống
  8. An toàn
  9. Chuông báo
  10. Thông báo
  11. Trạng thái xe
  12. Khẩn cấp

Để việc quản lý sự kiện liên quan đến phím âm lượng trở nên đơn giản hơn, dịch vụ âm thanh ô tô có một danh sách ngữ cảnh âm thanh ưu tiên thứ hai:

  1. Gọi
  2. Nội dung nghe nhìn
  3. Thông báo
  4. 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 sec này là cho phép thay đổi những âm thanh phổ biến thông qua các sự kiện chính. Không phổ biến, Bạn có thể quản lý những âm thanh có thời lượng ngắn thông qua phần cài đặt âm thanh Chỉ giao diện người dùng.

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

Để linh hoạt hơn trong việc quản lý số lượng, OemCarAudioVolumeService được ra mắt trong Android 14:

public interface OemCarAudioVolumeService {
    OemCarvolumeChangeInfo getSuggestedGroupForVolumeChange(
OemCarAudioVolumeRequest request, int volumeAdjustment);
}

Dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM) có một phương thức duy nhất, lấy 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. Chiến lược phát hành đĩa đơn duckedAttributes hiện là tất cả các thuộc tính âm thanh đã được giảm âm thanh. Chiến lược phát hành đĩa đơn volumeGroupState có trạng thái hiện tại của nhóm tập. Yêu cầu biểu thị 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 nào sẽ được thay đổi. Kết quả phải được trả về trong OemCarVolumeChangeInfo:

class OemCarVolumeChangeInfo {
    boolean change;
    CarVolumeGroupInfo volumeGroupChanged;
}

Giá trị boolean change cho biết liệu có bất kỳ âm lượng nào đã thay đổi hay không, true cho biết rằng có thay đổi và nhóm âm lượng sẽ được cập nhật. Chiến lược phát hành đĩa đơn volumeGroupChanged là nhóm âm lượng thực tế cần được thay đổi. Chiến dịch này nhóm phải được thay đổi theo tham số volumeAdjustment ban đầu được truyền đến API. Ví dụ: nếu kết quả chỉ ra rằng thao tác điều hướng nhóm âm lượng sẽ bị tắt tiếng, thì boolean sẽ là true và giá trị được trả về nhóm âm lượng nên là nhóm điều hướng.

Dịch vụ giảm chấn ô tô của nhà sản xuất thiết bị gốc (OEM)

Dịch vụ âm thanh trên ô tô quản lý tính năng giảm âm thanh bằng cách theo dõi các thay đổi về quyền phát âm thanh và đang gửi tín hiệu đến HAL AudioControl về thiết bị âm thanh cần giảm kích thước. Khi tiêu điểm thay đổi, tất cả các đối tượng giữ tiêu điểm đang hoạt động sẽ được đánh giá để xác định cần được giảm bớt dựa trên nhóm giảm hiệu suất tĩnh này quy tắc:

  • Âm thanh khẩn cấp sẽ loại bỏ mọi thứ trừ âm thanh cuộc gọi
  • Tính năng an toàn sẽ tắt mọi âm thanh ngoại trừ âm thanh khẩn cấp
  • Tính năng chỉ đường sẽ tắt mọi âm thanh ngoại trừ âm thanh an toàn và khẩn cấp
  • Tắt tiếng mọi thứ trừ âm thanh an toàn, khẩn cấp và chỉ đường
  • Tắt tiếng chuông báo khi cuộc gọi bị tắt
  • Bạn nên giảm bớt nội dung âm nhạc và thông báo

Những quy tắc này chưa đầy đủ và OEM vẫn chịu trách nhiệm xác định cách giảm âm thanh dựa trên những nguyên tắc này. OEM có thể kiểm soát những thông tin này đưa ra đề xuất một cách chủ động hơn dựa trên các yêu cầu hiện có. Chiến lược phát hành đĩa đơn OemCarDuckingService được ra mắt trong Android 14:

class OemCarAudioDuckingService {
List<AudioAttributes>   evaluateAttributesToDuck(
        OemCarAudioVolumeRequest request);
}

API này được gọi qua dịch vụ âm thanh ô tô khi thay đổi quyền phát âm thanh. Tái sử dụng OemCarAudioVolumeRequest được giới thiệu trong Dịch vụ âm lượng ô tô của OEM và chứa thông tin liên quan để đưa ra quyết định về thuộc tính nào cần tránh xa. Danh sách thuộc tính âm thanh cần bỏ qua 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 được giảm bớt:

    • Trong danh sách, tiếp tục bị ẩn
    • Không có trong danh sách, tính năng giảm hiệu suất đã tắt
  • Thuộc tính âm thanh hiện chưa được điều chỉnh:

    • Đã ẩn vào danh sách
    • Không có trong danh sách, tính năng giảm hiệu suất đã tắt

Sau đó, dịch vụ âm thanh trên ô tô sẽ xác định những thiết bị đầu ra âm thanh hiển thị âm thanh đều thuộc và thêm chúng vào danh sách thiết bị đầu ra âm thanh đã giảm hoặc danh sách thiết bị âm thanh không được bật tiếng tương ứng. Cuối cùng, điều này sẽ được gửi đến AudioControl HAL để thực hiện cần phải giảm ở cấp độ phần cứng.

Hình dưới đây là một sơ đồ trình tự đơn giản hoá quy trình giảm âm thanh khả năng kiểm soát yêu cầu lấy tiêu điểm khi sử dụng dịch vụ giảm vị trí của OEM:

hình ảnh

Trình tự 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 được chuyển tiếp đến hệ thống âm thanh của ô tô để xác định kết quả. Khi quyền phát âm thanh được quyết định, âm thanh sẽ giảm sẽ được dịch vụ âm thanh trên ô tô gọi OemCarAudioDuckingService để đánh giá đánh giá xem thuộc tính âm thanh nào cần được giảm bớt. Sau khi kết quả được trả về từ API evaluateAttributesToDuck, các thiết bị âm thanh đến vị trí sẽ được tính toán, và cuối cùng thông tin được gửi đến AudioControl để áp dụng tính năng giảm hiệu suất vào phần cứng âm thanh.

Triển khai tham chiếu dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM)

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

Tham chiếu gỡ lỗi ứng dụng kiểm thử

Ứng dụng kiểm tra dịch vụ ô tô của OEM là một phần của mã nguồn AOSP. OEM có thể tạo thay đổi theo nhu cầu của họ. Để gỡ lỗi, hãy dùng 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ô của OEM, hãy sử dụng lệnh dump của 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ả 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 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ụ của bạn. Ví dụ: thông tin tệp kết xuất mIsOemServiceReady sẽ chỉ định liệu giá trị dịch vụ đã sẵn sàng để sử dụng, trong đó true cho biết dịch vụ đã sẵn sàng và false cho biết dữ liệu chưa sẵn sàng.