Bản phát hành Android 4.1 đã giới thiệu các thay đổi về khung nội bộ để có đường dẫn đầu ra âm thanh có độ trễ thấp hơn. Có rất ít thay đổi về API ứng dụng khách công khai hoặc API HAL. Tài liệu này mô tả thiết kế ban đầu, thiết kế này đã tiếp tục phát triển theo thời gian. Việc hiểu rõ thiết kế này sẽ giúp nhà sản xuất thiết bị gốc (OEM) và nhà cung cấp SoC triển khai thiết kế một cách chính xác trên các thiết bị và chipset cụ thể của họ. Bài viết này không dành cho nhà phát triển ứng dụng.
Tạo kênh
Ứng dụ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ó các ứng dụng sau đây mới thực hiện việc này:
- Âm thanh gốc trên Android dựa trên OpenSL ES hoặc AAudio
- android.media.SoundPool
- android.media.ToneGenerator
Quá trình 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 tiếp yêu cầu, thì lớp này sẽ thực hiện việc đó bằng cách sử dụng bit TRACK_FAST
của tham số track_flags_t
của phương thức nhà máy IAudioTrack
IAudioFlinger::createTrack()
.
Máy chủ âm thanh AudioFlinger xem xét yêu cầu TRACK_FAST
và có thể từ chối yêu cầu ở cấp máy chủ. Phương thức này thông báo cho ứng dụng liệu 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:
- Có luồng bộ trộn nhanh cho đầu ra này (xem bên dưới)
- Theo dõi tốc độ lấy mẫu
- Có luồng ứng dụng để thực thi trình xử lý gọi lại cho kênh này
- Dung lượng bộ nhớ đệm của bản nhạc
- Các khung giờ hỗ trợ ưu tiên hiện có (xem bên dưới)
Nếu yêu cầu của khách hàng được chấp nhận, thì yêu cầu đó được gọi là "xử lý ưu tiên". Nếu không, đó được gọi là "đường dẫn thông thường".
Luồng Mixer
Tại thời điểm AudioFlinger tạo một luồng bộ trộn thông thường, luồng này sẽ quyết định có tạo luồng bộ trộn nhanh hay không. Cả trình trộn âm thanh thông thường và trình trộn âm thanh nhanh đều không liên kết với một kênh cụ thể mà là với một nhóm kênh. Luôn có một luồng trình trộn bình 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.
Trình trộn nhanh
Tính năng
Luồng bộ trộn nhanh cung cấp các tính năng sau:
- Việc kết hợp 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 ứng dụng
- Độ suy hao trên mỗi kênh
Các tính năng bị bỏ qua:
- Chuyển đổi tốc độ lấy mẫu trên mỗi bản nhạc
- Hiệu ứng trên mỗi kênh
- Hiệu ứng trên mỗi bản phối
Khoảng thời gian
Trình trộn nhanh chạy định kỳ, với khoảng thời gian đề xuất từ 2 đến 3 mili giây (ms) hoặc khoảng thời gian cao hơn một chút là 5 ms nếu cần để lên lịch ổn định. Số này được chọn để tính đến toàn bộ quy trình vùng đệm, tổng độ trễ ở mức 10 mili giây. Bạn có thể sử dụng các giá trị nhỏ hơn nhưng điều này có thể làm tăng mức tiêu thụ điện năng và khả năng xảy ra sự cố, tuỳ thuộc vào khả năng dự đoán lịch biểu của CPU. Bạn có thể sử dụng các giá trị lớn hơn, lên đến 20 mili giây, nhưng điều này sẽ làm giảm tổng độ trễ, vì vậy, bạn nên tránh sử dụng.
Lập lịch
Trình trộn nhanh chạy ở mức độ ưu tiên SCHED_FIFO
cao. Quá trình này 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 biểu thấp.
Jitter (Độ trễ) thể hiện sự biến động 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.
Việc chạy quá muộn sẽ dẫn đến sự cố do thiếu dữ liệu. Việc chạy quá sớm sẽ dẫn đến sự cố do kéo từ một kênh nhanh trước khi kênh đó cung cấp dữ liệu.
Chặn
Tốt nhất là luồng bộ trộn nhanh không bao giờ bị 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ụ thể, bạn nên tránh sử dụng mutex.
Thay vào đó, 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 phần 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
Trình trộn nhanh có ít hoạt động tương tác trực tiếp với ứng dụng. Cụ thể, trình điều khiển này không thấy các thao tác cấp liên kết, nhưng truy cập vào khối điều khiển bộ nhớ dùng chung của ứng dụng.
Trình trộn nhanh nhận lệnh từ trình trộn thông thường thông qua hàng đợi trạng thái.
Ngoài việc lấy dữ liệu bản nhạc, bạn có thể tương tác với ứng dụng thông qua bộ trộn thông thường.
Vùng chứa chính của bộ trộn nhanh là HAL âm thanh.
Trình trộn thông thường
Tính năng
Tất cả tính năng đều được bật:
- Tối đa 32 bản nhạc
- Độ suy hao trên mỗi kênh
- Chuyển đổi tốc độ lấy mẫu trên mỗi bản nhạc
- Xử lý hiệu ứng
Khoảng thời gian
Chu kỳ được tính là bội số tích phân đầu tiên của chu kỳ bộ trộn nhanh >= 20 mili giây.
Lập lịch
Trình trộn thông thường chạy ở mức độ ưu tiên SCHED_OTHER
cao.
Chặn
Trình trộn thông thường được phép chặn và thường thực hiện việc này tại nhiều khoá đồng bộ hoá cũng như tại một ống chặn để ghi hỗn hợp phụ.
Mối quan hệ với các thành phần khác
Trình trộn âm thanh 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 trình trộn nhanh và các kênh của ứng dụng.
Vùng chứa của bộ trộn thông thường là một ống chặn đến kênh 0 của bộ trộn nhanh.
Cờ
Bit 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. Không xuất hiện trong máy chủ.
TRACK_FAST
là khái niệm máy khách -> máy chủ.