Thiết kế để giảm độ trễ

Nhà cung cấp có thể triển khai 2 tính năng chính để giảm độ trễ âm thanh:

  • FAST Mixer trong AudioFlinger: Được giới thiệu trong Android 4.1, tính năng này hỗ trợ các ứng dụng sử dụng Java AudioTrack và AAudio. FAST Mixer có rất ít thay đổi về API ứng dụng công khai hoặc API HAL.
  • AAudio MMAP: Được ra mắt trong Android 8.1, tính năng này cho phép các ứng dụng gốc đạt được độ trễ thấp hơn nữa thông qua AAudio. Hãy xem AAudio và MMAP để biết thêm thông tin.

Trang này mô tả thiết kế độ trễ âm thanh ban đầu, vốn đã không ngừng phát triển theo thời gian. Việc hiểu rõ thiết kế này là rất quan trọng đối với các OEM thiết bị và nhà cung cấp SoC để đảm bảo triển khai chính xác trên các thiết bị và chipset cụ thể của họ. Trang này không dành cho nhà phát triển ứng dụng.

Tạo kênh phát hành

Khách hàng có thể tuỳ ý đặt bit AUDIO_OUTPUT_FLAG_FAST trong tham số audio_output_flags_t của hàm khởi tạo AudioTrack C++ hoặc AudioTrack::set(). Hiện tại, chỉ có những ứng dụng sau đây làm như vậy:

Việc triển khai AudioTrack C++ sẽ xem xét yêu cầu AUDIO_OUTPUT_FLAG_FAST và có thể từ chối yêu cầu ở cấp ứng dụng (không bắt buộc). Nếu quyết định chuyển yêu cầu, thì nó sẽ thực hiện bằng cách sử dụng bit TRACK_FAST của tham số track_flags_t trong phương thức tạo IAudioTrack IAudioFlinger::createTrack().

Máy chủ âm thanh AudioFlinger xem xét yêu cầu TRACK_FAST và có thể tuỳ ý từ chối yêu cầu ở cấp máy chủ. Thao tác này thông báo cho máy khách biết yêu cầu có được chấp nhận hay không, thông qua bit CBLK_FAST của khối điều khiển bộ nhớ dùng chung.

Các yếu tố ảnh hưởng đến quyết định này bao gồm:

  • Sự hiện diện của một luồng bộ trộn nhanh cho đầu ra này (xem bên dưới)
  • Tốc độ lấy mẫu của bản nhạc
  • Sự hiện diện của một luồng ứng dụng để thực thi trình xử lý gọi lại cho bản nhạc này
  • Dung lượng bộ nhớ đệm của bản nhạc
  • Suất còn trống trong chương trình tiếp cận sớm (xem bên dưới)

Nếu yêu cầu của khách hàng được chấp nhận, thì đó được gọi là lối đi tắt. Nếu không, đó sẽ là bản phát hành công khai.

Luồng Mixer

Tại thời điểm AudioFlinger tạo một luồng bộ trộn thông thường, nó sẽ quyết định có tạo một luồng bộ trộn nhanh hay không. Cả bộ trộn thông thường và bộ trộn nhanh đều không liên kết với một bản nhạc cụ thể mà liên kết với một nhóm bản nhạc. Luôn có một luồng bộ trộn thông thường. Luồng bộ trộn nhanh (nếu có) sẽ phụ thuộc vào luồng bộ trộn thông thường và hoạt động dưới sự kiểm soát của luồng này.

Fast mixer

Tính năng

Luồng bộ trộn nhanh cung cấp các tính năng sau:

  • Trộn bản phối phụ của bộ trộn thông thường và tối đa 7 bản nhạc nhanh của máy khách
  • Giảm âm lượng theo từng bản nhạc

Các tính năng bị bỏ qua:

  • Chuyển đổi tốc độ lấy mẫu cho mỗi bản nhạc
  • Hiệu ứng cho từng bản âm thanh
  • Hiệu ứng cho mỗi bản phối

Khoảng thời gian

Bộ trộn nhanh chạy định kỳ, với khoảng thời gian được đề xuất là từ 2 đến 3 mili giây hoặc khoảng thời gian cao hơn một chút là 5 mili giây nếu cần để lên lịch ổn định. Con số này được chọn để tính đến toàn bộ quy trình vùng đệm, tổng độ trễ là khoảng 10 mili giây. Có thể dùng các giá trị nhỏ hơn nhưng có thể dẫn đến mức tiêu thụ điện năng tăng lên và khả năng xảy ra sự cố tuỳ thuộc vào khả năng dự đoán việc lập lịch CPU. Có thể dùng các giá trị lớn hơn, tối đa là 20 mili giây, nhưng điều này sẽ làm giảm tổng độ trễ và do đó bạn nên tránh.

Lập lịch

Bộ trộn nhanh chạy ở mức ưu tiên SCHED_FIFO cao. Nó cần rất ít thời gian CPU, nhưng phải chạy thường xuyên và có độ trễ lập lịch thấp. Độ trễ thể hiện sự biến thiên về thời gian chu kỳ: đó là sự khác biệt giữa thời gian chu kỳ thực tế so với thời gian chu kỳ dự kiến. Nếu chạy quá muộn, bạn sẽ gặp phải lỗi do thiếu dữ liệu. Việc chạy quá sớm sẽ dẫn đến trục trặc do kéo từ một bản phát hành nhanh trước khi bản phát hành đó cung cấp dữ liệu.

Chặn

Tốt nhất là luồng bộ trộn nhanh không bao giờ chặn, ngoại trừ tại HAL write(). Các trường hợp chặn khác trong bộ trộn nhanh được coi là lỗi. Đặc biệt, AAudio tránh sử dụng mutex. Thay vào đó, các thuật toán không chặn (còn gọi là thuật toán không khoá) được sử dụng. Hãy xem bài viết Tránh đảo ngược mức độ ưu tiên để biết thêm về chủ đề này.

Mối quan hệ với các thành phần khác

Máy trộn nhanh ít tương tác trực tiếp với khách hàng. Cụ thể, nó không thấy các thao tác ở cấp độ liên kết, nhưng có quyền truy cập vào khối điều khiển bộ nhớ dùng chung của ứng dụng.

Bộ trộn nhanh nhận lệnh từ bộ trộn thông thường thông qua một hàng đợi trạng thái.

Ngoài việc kéo dữ liệu bản nhạc, việc tương tác với các ứng dụng khách được thực hiện thông qua bộ trộn thông thường.

Sink chính của bộ trộn nhanh là HAL âm thanh.

Bộ trộn thông thường

Tính năng

Đã bật tất cả các tính năng:

  • Tối đa 32 bản nhạc
  • Giảm âm lượng theo từng bản nhạc
  • Chuyển đổi tốc độ lấy mẫu cho mỗi bản nhạc
  • Xử lý hiệu ứng

Khoảng thời gian

Khoảng thời gian được tính là bội số nguyên đầu tiên của khoảng thời gian bộ trộn nhanh và >= 20 mili giây.

Lập lịch

Bộ trộn thông thường chạy ở mức độ ưu tiên SCHED_OTHER cao.

Chặn

Bộ trộn thông thường được phép chặn và thường chặn ở nhiều mutex cũng như ở một đường ống chặn để ghi hỗn hợp phụ.

Mối quan hệ với các thành phần khác

Bộ trộn thông thường tương tác rộng rãi với thế giới bên ngoài, bao gồm các luồng liên kết, trình quản lý chính sách âm thanh, luồng bộ trộn nhanh và các bản nhạc của ứng dụng.

Sink của bộ trộn thông thường là một đường ống chặn đến track 0 của bộ trộn nhanh.

Cờ

AUDIO_OUTPUT_FLAG_FAST là một gợi ý. Không có gì đảm bảo rằng yêu cầu sẽ được thực hiện.

AUDIO_OUTPUT_FLAG_FAST là một khái niệm ở cấp ứng dụng. Nội dung này không xuất hiện trên máy chủ.

TRACK_FAST là một khái niệm máy khách -> máy chủ.