Bản phát hành Android 4.1 đã giới thiệu các thay đổi 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. Hiểu rõ về thiết kế này sẽ giúp các nhà cung cấp OEM và SoC thiết bị 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 các nhà phát triển ứng dụng.
Tạo bản nhạc
Máy khách có thể tùy ý đặt bit AUDIO_OUTPUT_FLAG_FAST
trong tham số audio_output_flags_t
của hàm tạo AudioTrack C++ hoặc AudioTrack::set()
. Hiện nay các khách hàng duy nhất làm như vậy là:
- Âm thanh gốc của Android dựa trên OpenSL ES hoặc AAudio
- android.media.SoundPool
- android.media.ToneGenerator
Việc triển khai AudioTrack C++ xem xét yêu cầu AUDIO_OUTPUT_FLAG_FAST
và có thể tùy ý từ chối yêu cầu ở cấp máy khách. Nếu nó quyết định chuyển yêu cầu, nó sẽ thực hiện bằng cách sử dụng bit TRACK_FAST
của tham số track_flags_t
của phương thức xuất xưởng IAudioTrack
IAudioFlinger::createTrack()
.
Máy chủ âm thanh AudioFlinger xem xét yêu cầu TRACK_FAST
và có thể tùy ý từ chối yêu cầu ở cấp máy chủ. Nó thông báo cho máy khách xem 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 bao gồm:
- Sự hiện diện của một luồng trộn nhanh cho đầu ra này (xem bên dưới)
- Theo dõi tốc độ mẫu
- Sự hiện diện của một luồng máy khách để thực thi các trình xử lý gọi lại cho bản nhạc này
- Theo dõi kích thước bộ đệm
- Các khe theo dõi nhanh có sẵn (xem bên dưới)
Nếu yêu cầu của khách hàng được chấp nhận, nó được gọi là "đường dẫn nhanh". Nếu không thì nó được gọi là "đường bình thường".
Chủ đề trộn
Tại thời điểm AudioFlinger tạo một luồng trộn thông thường, nó sẽ quyết định có tạo luồng trộn nhanh hay không. Cả máy trộn thông thường và máy trộn nhanh đều không được liên kết với một bản nhạc cụ thể mà gắn với một tập hợp các bản nhạc. Luôn có một sợi trộn bình thường. Luồng trộn nhanh, nếu có, sẽ phụ thuộc vào luồng trộn thông thường và hoạt động dưới sự kiểm soát của nó.
Máy trộn nhanh
Đặc trưng
Chuỗi trộn nhanh cung cấp các tính năng sau:
- Trộn hỗn hợp phụ của máy trộn thông thường và tối đa 7 bản nhạc nhanh của khách hàng
- Suy giảm trên mỗi rãnh
Các tính năng bị bỏ qua:
- Chuyển đổi tỷ lệ mẫu trên mỗi bản nhạc
- Hiệu ứng trên mỗi bản nhạc
- Mỗi hiệu ứng trộn
Giai đoạn
Bộ trộn nhanh chạy định kỳ, với khoảng thời gian khuyến nghị là từ hai đến ba 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ập lịch ổn định. Con số này được chọn sao cho tính đến đường truyền bộ đệm hoàn chỉnh, tổng độ trễ ở mức 10 ms. Có thể sử 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 trục trặc tùy thuộc vào khả năng dự đoán lịch trình của CPU. Có thể có các giá trị lớn hơn, lên tới 20 ms, nhưng làm giảm tổng độ trễ và do đó nên tránh.
Lên 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. Jitter thể hiện sự thay đổi 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. Chạy quá muộn sẽ dẫn đến trục trặc do thiếu tốc độ. Chạy quá sớm sẽ dẫn đến trục trặc do bị kéo ra khỏi đường đua nhanh trước khi đường đua cung cấp dữ liệu.
Chặn
Lý tưởng nhất là luồng 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 biệt, mutexes được tránh. Thay vào đó, các thuật toán không chặn (còn được gọi là thuật toán không khóa) được sử dụng. Xem 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 có ít tương tác trực tiếp với khách hàng. Đặc biệt, nó không nhìn thấy các hoạt động ở cấp độ kết dính, nhưng nó truy cập vào khối điều khiển bộ nhớ dùng chung của máy khách.
Bộ trộn nhanh nhận lệnh từ bộ 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 theo dõi, việc tương tác với khách hàng còn thông qua bộ trộn thông thường.
Phần chìm chính của bộ trộn nhanh là âm thanh HAL.
Máy trộn thông thường
Đặc trưng
Tất cả các tính năng được kích hoạt:
- Lên đến 32 bài hát
- Suy giảm trên mỗi rãnh
- Chuyển đổi tỷ lệ mẫu trên mỗi bản nhạc
- Xử lý hiệu ứng
Giai đoạn
Khoảng thời gian được tính là bội số nguyên thứ nhất của khoảng thời gian trộn nhanh >= 20 ms.
Lên 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 làm như vậy ở nhiều mutex khác nhau cũng như tại một đường ống chặn để ghi hỗn hợp phụ của nó.
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 trộn nhanh và các bản nhạc máy khách.
Bồn rửa của máy trộn thông thường là một đường ống chặn đường 0 của máy trộn nhanh.
Cờ
Bit AUDIO_OUTPUT_FLAG_FAST
là một gợi ý. Không có gì đảm bảo yêu cầu sẽ được thực hiện.
AUDIO_OUTPUT_FLAG_FAST
là khái niệm cấp độ máy khách. Nó không xuất hiện trong máy chủ.
TRACK_FAST
là khái niệm máy khách -> máy chủ.