Âm thanh kỹ thuật số USB

Bài viết này xem xét tính năng hỗ trợ của Android đối với âm thanh kỹ thuật số qua USB và các giao thức liên quan dựa trên USB.

Đối tượng người xem

Đối tượng mục tiêu của bài viết này là các nhà sản xuất thiết bị gốc (OEM) thiết bị Android, nhà cung cấp SoC, nhà cung cấp thiết bị ngoại vi âm thanh USB, nhà phát triển ứng dụng âm thanh nâng cao và những người khác muốn tìm hiểu chi tiết về nội dung âm thanh kỹ thuật số USB trên Android.

Người dùng cuối của thiết bị Nexus nên xem bài viết Ghi và phát âm thanh bằng chế độ máy chủ USB tại Trung tâm trợ giúp của Nexus. Mặc dù bài viết này không hướng đến người dùng cuối, nhưng một số người tiêu dùng âm thanh có thể tìm thấy những phần thú vị.

Tổng quan về USB

Cổng nối tiếp đa năng (USB) được mô tả không chính thức trong bài viết USB trên Wikipedia và được xác định chính thức theo các tiêu chuẩn do USB Implementers Forum, Inc phát hành. Để thuận tiện, chúng tôi tóm tắt các khái niệm chính về USB tại đây, nhưng các tiêu chuẩn này là tài liệu tham khảo chính thức.

Các khái niệm và thuật ngữ cơ bản

USB là một bus (bus là một phương thức truyền dữ liệu giữa các thiết bị) với một trình khởi tạo duy nhất của các thao tác chuyển dữ liệu, được gọi là máy chủ. Máy chủ lưu trữ giao tiếp với thiết bị ngoại vi thông qua bus.

Lưu ý: Các thuật ngữ thiết bịthiết bị phụ kiện là các từ đồng nghĩa phổ biến của thiết bị ngoại vi. Chúng tôi tránh sử dụng các thuật ngữ đó ở đây vì có thể gây nhầm lẫn với thiết bị Android hoặc khái niệm dành riêng cho Android có tên là chế độ phụ kiện.

Vai trò quan trọng của máy chủ là đếm: quy trình phát hiện thiết bị ngoại vi nào được kết nối với bus và truy vấn các thuộc tính của thiết bị ngoại vi được thể hiện thông qua trình mô tả.

Một thiết bị ngoại vi có thể là một đối tượng thực nhưng thực sự triển khai nhiều hàm logic. Ví dụ: thiết bị ngoại vi webcam có thể có cả chức năng máy ảnh và chức năng âm thanh micrô.

Mỗi hàm ngoại vi có một giao diện xác định giao thức để giao tiếp với hàm đó.

Máy chủ lưu trữ giao tiếp với một thiết bị ngoại vi qua một ống dẫn đến một điểm cuối, một nguồn dữ liệu hoặc bồn lưu trữ do một trong các hàm của thiết bị ngoại vi cung cấp.

Có hai loại ống: thông báoluồng. Ống dẫn tin nhắn được dùng để kiểm soát và trạng thái hai chiều. Ống luồng được dùng để chuyển dữ liệu một chiều.

Máy chủ lưu trữ bắt đầu tất cả các lượt chuyển dữ liệu, vì vậy, các thuật ngữ đầu vàođầu ra được thể hiện tương ứng với máy chủ lưu trữ. Thao tác đầu vào sẽ chuyển dữ liệu từ thiết bị ngoại vi sang máy chủ, còn thao tác đầu ra sẽ chuyển dữ liệu từ máy chủ sang thiết bị ngoại vi.

Có 3 chế độ chuyển dữ liệu chính: gián đoạn, hàng loạttương đồng. Chúng ta sẽ thảo luận thêm về chế độ đồng bộ trong ngữ cảnh âm thanh.

Thiết bị ngoại vi có thể có đầu nối kết nối với thế giới bên ngoài, ngoài chính thiết bị ngoại vi. Bằng cách này, thiết bị ngoại vi sẽ dịch giữa giao thức USB và tín hiệu "thực tế". Các thiết bị đầu cuối là các đối tượng logic của hàm.

Chế độ USB trên Android

Chế độ phát triển

Chế độ phát triển đã xuất hiện kể từ bản phát hành đầu tiên của Android. Thiết bị Android xuất hiện dưới dạng thiết bị ngoại vi USB đối với máy tính lưu trữ chạy hệ điều hành máy tính như Linux, Mac OS X hoặc Windows. Hàm ngoại vi duy nhất hiển thị là Android fastboot hoặc Cầu gỡ lỗi Android (adb). Giao thức khởi động nhanh và adb được xếp chồng lên chế độ chuyển dữ liệu hàng loạt qua USB.

Chế độ máy chủ

Chế độ máy chủ được giới thiệu trong Android 3.1 (API cấp 12).

Vì thiết bị Android phải đóng vai trò là máy chủ và hầu hết các thiết bị Android đều có đầu nối micro-USB không cho phép hoạt động máy chủ trực tiếp, nên bạn thường cần có bộ chuyển đổi di động (OTG) như sau:

OTG

Hình 1. Bộ chuyển đổi On-the-go (OTG)

Thiết bị Android có thể không cung cấp đủ năng lượng để vận hành một thiết bị ngoại vi cụ thể, tuỳ thuộc vào lượng năng lượng mà thiết bị ngoại vi cần và lượng năng lượng mà thiết bị Android có thể cung cấp. Ngay cả khi có đủ nguồn điện, thời lượng pin của thiết bị Android có thể bị rút ngắn đáng kể. Đối với những trường hợp này, hãy sử dụng một hub (mạng trung tâm) có nguồn điện như sau:

Trung tâm có nguồn điện

Hình 2. Trung tâm có nguồn điện

Chế độ phụ kiện

Chế độ phụ kiện được giới thiệu trong Android 3.1 (API cấp 12) và được điều chỉnh cho phù hợp với Android 2.3.4. Ở chế độ này, thiết bị Android hoạt động như một thiết bị ngoại vi USB, dưới sự kiểm soát của một thiết bị khác, chẳng hạn như một đế cắm đóng vai trò là máy chủ. Sự khác biệt giữa chế độ phát triển và chế độ phụ kiện là máy chủ có thể thấy các chức năng USB bổ sung, ngoài adb. Thiết bị Android bắt đầu ở chế độ phát triển, sau đó chuyển sang chế độ phụ kiện thông qua quy trình đàm phán lại.

Chế độ phụ kiện được mở rộng với các tính năng bổ sung trong Android 4.1, đặc biệt là âm thanh được mô tả bên dưới.

Âm thanh qua cổng USB

Lớp USB

Mỗi hàm ngoại vi đều có một tài liệu lớp thiết bị liên kết chỉ định giao thức tiêu chuẩn cho hàm đó. Điều này cho phép các máy chủ tuân thủ lớp và các chức năng ngoại vi tương tác với nhau mà không cần hiểu rõ cách hoạt động của nhau. Việc tuân thủ lớp là rất quan trọng nếu máy chủ và thiết bị ngoại vi do các thực thể khác nhau cung cấp.

Thuật ngữ không cần trình điều khiển là một từ đồng nghĩa phổ biến của tương thích với lớp, cho biết rằng bạn có thể sử dụng các tính năng tiêu chuẩn của thiết bị ngoại vi như vậy mà không cần cài đặt trình điều khiển dành riêng cho hệ điều hành. Có thể giả định rằng một thiết bị ngoại vi được quảng cáo là "không cần trình điều khiển" cho các hệ điều hành máy tính lớn sẽ tuân thủ lớp, mặc dù có thể có trường hợp ngoại lệ.

Lớp âm thanh USB

Ở đây, chúng ta chỉ quan tâm đến các thiết bị ngoại vi triển khai các chức năng âm thanh, do đó tuân thủ lớp thiết bị âm thanh. Có hai phiên bản quy cách lớp âm thanh USB: lớp 1 (UAC1) và 2 (UAC2).

So sánh với các lớp khác

USB bao gồm nhiều lớp thiết bị khác, một số lớp có thể bị nhầm lẫn với lớp âm thanh. Lớp bộ nhớ khối lượng lớn (MSC) được dùng để truy cập vào nội dung nghe nhìn theo hướng phân đoạn, còn Giao thức truyền nội dung nghe nhìn (MTP) dùng để truy cập đầy đủ vào tệp nội dung nghe nhìn. Bạn có thể sử dụng cả MSC và MTP để chuyển tệp âm thanh, nhưng chỉ lớp âm thanh USB mới phù hợp để truyền trực tuyến theo thời gian thực.

Đầu nối âm thanh

Các đầu nối của thiết bị ngoại vi âm thanh thường là tương tự. Tín hiệu tương tự được trình bày tại đầu vào của thiết bị ngoại vi được chuyển đổi sang kỹ thuật số bằng một bộ chuyển đổi tương tự sang kỹ thuật số (ADC) và được truyền qua giao thức USB để máy chủ sử dụng. ADC là một nguồn dữ liệu cho máy chủ lưu trữ. Tương tự, máy chủ gửi một tín hiệu âm thanh kỹ thuật số qua giao thức USB đến thiết bị ngoại vi, trong đó bộ chuyển đổi kỹ thuật số sang tương tự (DAC) sẽ chuyển đổi và hiển thị tín hiệu đó đến một đầu ra tương tự. DAC là một vùng chứa cho máy chủ.

Kênh

Thiết bị ngoại vi có chức năng âm thanh có thể bao gồm thiết bị đầu cuối nguồn, thiết bị đầu cuối bồn lưu trữ hoặc cả hai. Mỗi hướng có thể có một kênh (đơn âm), hai kênh (âm thanh nổi) hoặc nhiều kênh. Các thiết bị ngoại vi có nhiều hơn hai kênh được gọi là đa kênh. Thông thường, luồng âm thanh nổi được hiểu là bao gồm các kênh tráiphải, và mở rộng để diễn giải luồng âm thanh đa kênh là có các vị trí không gian tương ứng với từng kênh. Tuy nhiên, cũng khá thích hợp (đặc biệt là đối với âm thanh USB hơn là HDMI) khi không chỉ định bất kỳ ý nghĩa không gian chuẩn cụ thể nào cho từng kênh. Trong trường hợp này, ứng dụng và người dùng sẽ tự xác định cách sử dụng từng kênh. Ví dụ: luồng đầu vào USB 4 kênh có thể có 3 kênh đầu tiên được đính kèm với nhiều micrô trong một phòng và kênh cuối cùng nhận dữ liệu đầu vào từ đài AM.

Chế độ truyền đồng bộ

Âm thanh USB sử dụng chế độ truyền đồng bộ cho các đặc điểm theo thời gian thực, với chi phí là khả năng khôi phục lỗi. Ở chế độ đồng bộ, băng thông được đảm bảo và lỗi truyền dữ liệu được phát hiện bằng cách sử dụng tính năng kiểm tra dư thừa tuần hoàn (CRC). Tuy nhiên, không có xác nhận gói hoặc truyền lại trong trường hợp xảy ra lỗi.

Quá trình truyền đồng bộ xảy ra trong mỗi khoảng thời gian Bắt đầu khung (SOF). Khoảng thời gian SOF là một mili giây đối với tốc độ đầy đủ và 125 micro giây đối với tốc độ cao. Mỗi khung tốc độ đầy đủ mang tải trọng tối đa 1023 byte và khung tốc độ cao mang tải trọng tối đa 1024 byte. Khi kết hợp các giá trị này, chúng ta tính được tốc độ truyền tối đa là 1.023.000 hoặc 8.192.000 byte/giây. Điều này đặt ra giới hạn trên lý thuyết về tốc độ lấy mẫu âm thanh, số lượng kênh và độ sâu bit kết hợp. Giới hạn thực tế thấp hơn.

Trong chế độ đồng bộ, có 3 chế độ phụ:

  • Thích ứng
  • Không đồng bộ
  • Đồng bộ

Ở chế độ phụ thích ứng, bồn lưu trữ hoặc nguồn ngoại vi sẽ thích ứng với tốc độ lấy mẫu có thể thay đổi của máy chủ.

Ở chế độ phụ không đồng bộ (còn gọi là phản hồi ngầm ẩn), bồn lưu trữ hoặc nguồn xác định tốc độ lấy mẫu và máy chủ lưu trữ sẽ điều chỉnh cho phù hợp. Ưu điểm lý thuyết chính của chế độ phụ không đồng bộ là đồng hồ USB nguồn hoặc bồn lưu trữ gần hơn về mặt vật lý và điện với (và thực sự có thể giống với hoặc bắt nguồn từ) đồng hồ điều khiển DAC hoặc ADC. Khoảng cách gần này có nghĩa là chế độ phụ không đồng bộ sẽ ít bị ảnh hưởng hơn đối với độ trễ xung nhịp. Ngoài ra, xung nhịp mà DAC hoặc ADC sử dụng có thể được thiết kế để có độ chính xác cao hơn và độ lệch thấp hơn so với xung nhịp của máy chủ.

Trong chế độ phụ đồng bộ, một số byte cố định được chuyển trong mỗi khoảng thời gian SOF. Tốc độ lấy mẫu âm thanh được lấy từ đồng hồ USB một cách hiệu quả. Chế độ phụ đồng bộ thường không được dùng với âm thanh vì cả máy chủ và thiết bị ngoại vi đều phụ thuộc vào đồng hồ USB.

Bảng dưới đây tóm tắt các chế độ phụ đồng bộ:

Chế độ phụ Số byte
mỗi gói
Tốc độ lấy mẫu
do
Dùng cho âm thanh
thích ứng biến thiên người tổ chức
không đồng bộ biến thiên thiết bị ngoại vi
đồng bộ đã khắc phục Đồng hồ USB không

Trong thực tế, chế độ phụ tất nhiên là quan trọng, nhưng bạn cũng nên cân nhắc các yếu tố khác.

Hỗ trợ Android cho lớp âm thanh USB

Chế độ phát triển

Âm thanh USB không được hỗ trợ ở chế độ phát triển.

Chế độ máy chủ

Android 5.0 (API cấp 21) trở lên hỗ trợ một số tính năng của USB âm thanh loại 1 (UAC1):

  • Thiết bị Android phải đóng vai trò là máy chủ lưu trữ
  • Định dạng âm thanh phải là PCM (giao diện loại I)
  • Độ sâu bit phải là 16 bit, 24 bit hoặc 32 bit, trong đó 24 bit dữ liệu âm thanh hữu ích được căn trái trong các bit quan trọng nhất của từ 32 bit
  • Tốc độ lấy mẫu phải là 48, 44,1, 32, 24, 22,05, 16, 12, 11,025 hoặc 8 kHz
  • Số lượng kênh phải là 1 (đơn âm) hoặc 2 (âm thanh nổi)

Việc xem xét kỹ mã nguồn khung Android có thể cho thấy mã bổ sung ngoài mức tối thiểu cần thiết để hỗ trợ các tính năng này. Tuy nhiên, mã này chưa được xác thực nên các tính năng nâng cao hơn chưa được xác nhận.

Chế độ phụ kiện

Android 4.1 (API cấp 16) đã thêm tính năng hỗ trợ hạn chế cho việc phát âm thanh cho máy chủ. Khi ở chế độ phụ kiện, Android sẽ tự động định tuyến đầu ra âm thanh đến USB. Tức là thiết bị Android đóng vai trò là nguồn dữ liệu cho máy chủ, chẳng hạn như một đế cắm.

Âm thanh ở chế độ phụ kiện có các tính năng sau:

  • Thiết bị Android phải được một máy chủ có kiến thức kiểm soát. Trước tiên, máy chủ này có thể chuyển đổi thiết bị Android từ chế độ phát triển sang chế độ phụ kiện, sau đó máy chủ phải chuyển dữ liệu âm thanh từ điểm cuối thích hợp. Do đó, thiết bị Android không xuất hiện "không có trình điều khiển" đối với máy chủ lưu trữ.
  • Hướng phải là đầu vào, được thể hiện tương ứng với máy chủ lưu trữ
  • Định dạng âm thanh phải là PCM 16 bit
  • Tốc độ lấy mẫu phải là 44,1 kHz
  • Số kênh phải là 2 (âm thanh nổi)

Âm thanh ở chế độ phụ kiện chưa được áp dụng rộng rãi và hiện không được đề xuất cho các thiết kế mới.

Ứng dụng của âm thanh kỹ thuật số qua USB

Như tên gọi, tín hiệu âm thanh kỹ thuật số USB được biểu thị bằng luồng dữ liệu kỹ thuật số thay vì tín hiệu tương tựđầu nối tai nghe TRS mini thông thường sử dụng. Cuối cùng, mọi tín hiệu kỹ thuật số đều phải được chuyển đổi sang tín hiệu tương tự thì mới có thể nghe được. Bạn sẽ phải đánh đổi khi chọn vị trí đặt lượt chuyển đổi đó.

Câu chuyện về hai bộ chuyển đổi kỹ thuật số sang tương tự

Trong sơ đồ ví dụ dưới đây, chúng ta so sánh hai thiết kế. Trước tiên, chúng ta có một thiết bị di động với Bộ xử lý ứng dụng (AP), DAC trên bo mạch, bộ khuếch đại và đầu nối TRS tương tự gắn với tai nghe. Chúng tôi cũng xem xét một thiết bị di động có USB kết nối với bộ khuếch đại và DAC USB bên ngoài, cũng như tai nghe.

So sánh DAC

Hình 3. So sánh hai DAC

Thiết kế nào tốt hơn? Câu trả lời phụ thuộc vào nhu cầu của bạn. Mỗi phương thức đều có ưu và nhược điểm riêng.

Lưu ý: Đây là một phép so sánh giả tạo, vì thiết bị Android thực có thể có cả hai tuỳ chọn.

Thiết kế A đầu tiên đơn giản hơn, rẻ hơn, tiêu thụ ít năng lượng hơn và sẽ là thiết kế đáng tin cậy hơn giả sử các thành phần khác cũng đáng tin cậy như nhau. Tuy nhiên, thường thì chất lượng âm thanh sẽ phải đánh đổi với các yêu cầu khác. Ví dụ: nếu đây là thiết bị dành cho thị trường đại chúng, thì thiết bị này có thể được thiết kế để phù hợp với nhu cầu của người tiêu dùng nói chung, chứ không phải cho những người đam mê âm thanh.

Trong thiết kế thứ hai, thiết bị ngoại vi âm thanh bên ngoài C có thể được thiết kế để mang lại chất lượng âm thanh cao hơn và công suất đầu ra lớn hơn mà không ảnh hưởng đến chi phí của thiết bị Android B cơ bản dành cho thị trường đại chúng. Đúng vậy, đây là một thiết kế đắt tiền hơn, nhưng chi phí này chỉ dành cho những người muốn sử dụng.

Thiết bị di động nổi tiếng là có bảng mạch có mật độ cao, điều này có thể dẫn đến nhiều cơ hội hơn cho tiếng xuyên âm làm giảm chất lượng tín hiệu tương tự liền kề. Giao tiếp kỹ thuật số ít bị ảnh hưởng bởi nhiễu hơn, vì vậy, việc di chuyển DAC từ thiết bị Android A sang bảng mạch bên ngoài C cho phép các giai đoạn tương tự cuối cùng được tách biệt về mặt vật lý và điện với bảng mạch dày đặc và nhiều nhiễu, dẫn đến âm thanh có độ trung thực cao hơn.

Mặt khác, thiết kế thứ hai phức tạp hơn và khi độ phức tạp tăng lên, nhiều khả năng sẽ xảy ra lỗi hơn. Ngoài ra, độ trễ cũng tăng lên từ bộ điều khiển USB.

Ứng dụng ở chế độ máy chủ

Các ứng dụng âm thanh ở chế độ máy chủ USB thông thường bao gồm:

  • nghe nhạc
  • điện thoại
  • nhắn tin nhanh và trò chuyện thoại
  • đang ghi

Đối với tất cả các ứng dụng này, Android sẽ phát hiện một thiết bị ngoại vi âm thanh kỹ thuật số USB tương thích và tự động định tuyến chế độ phát và ghi âm thanh một cách thích hợp, dựa trên các quy tắc chính sách âm thanh. Nội dung âm thanh nổi được phát trên hai kênh đầu tiên của thiết bị ngoại vi.

Không có API dành riêng cho âm thanh kỹ thuật số qua USB. Đối với trường hợp sử dụng nâng cao, chế độ định tuyến tự động có thể ảnh hưởng đến các ứng dụng nhận biết USB. Đối với các ứng dụng như vậy, hãy tắt tính năng định tuyến tự động thông qua chế độ điều khiển tương ứng trong mục Nội dung nghe nhìn của phần Cài đặt / Tuỳ chọn cho nhà phát triển.

Gỡ lỗi khi ở chế độ máy chủ

Khi ở chế độ máy chủ USB, bạn sẽ không dùng được tính năng gỡ lỗi adb qua USB. Hãy xem phần Sử dụng qua Wi-Fi của Cầu gỡ lỗi Android để biết phương án thay thế.

Triển khai âm thanh qua USB

Đề xuất dành cho nhà cung cấp thiết bị ngoại vi âm thanh

Để tương tác với các thiết bị Android, nhà cung cấp thiết bị ngoại vi âm thanh phải:

  • thiết kế để tuân thủ lớp âm thanh; hiện tại, Android nhắm đến lớp 1, nhưng bạn nên lên kế hoạch cho lớp 2
  • tránh các điểm kỳ quặc
  • kiểm thử khả năng tương tác với các thiết bị Android phổ biến và thiết bị tham chiếu
  • ghi lại rõ ràng các tính năng được hỗ trợ, việc tuân thủ lớp âm thanh, yêu cầu về nguồn điện, v.v. để người tiêu dùng có thể đưa ra quyết định sáng suốt

Đề xuất dành cho nhà sản xuất thiết bị gốc (OEM) và nhà cung cấp SoC cho thiết bị Android

Để hỗ trợ âm thanh kỹ thuật số qua USB, nhà sản xuất thiết bị gốc (OEM) và nhà cung cấp SoC phải:

  • thiết kế phần cứng để hỗ trợ chế độ máy chủ USB
  • bật tính năng hỗ trợ máy chủ USB chung ở cấp khung thông qua cờ tính năng android.hardware.usb.host.xml
  • bật tất cả các tính năng cần thiết của nhân: chế độ máy chủ USB, âm thanh USB, chế độ truyền đồng bộ
  • luôn cập nhật các bản phát hành và bản vá hạt nhân gần đây; mặc dù mục tiêu cao cả là tuân thủ lớp, nhưng vẫn có các thiết bị ngoại vi âm thanh hiện có với các điểm kỳ lạ và các hạt nhân gần đây có giải pháp cho các điểm kỳ lạ đó
  • bật chính sách âm thanh qua USB như mô tả bên dưới
  • thêm audio.usb.default vào PRODUCT_PACKAGES trong device.mk
  • kiểm thử khả năng tương tác với các thiết bị ngoại vi âm thanh USB phổ biến

Bật chính sách âm thanh USB

Để bật âm thanh qua USB, hãy thêm một mục vào tệp cấu hình chính sách âm thanh. Tệp này thường nằm ở đây:

device/oem/codename/audio_policy.conf

Thành phần đường dẫn "oem" phải được thay thế bằng tên của nhà sản xuất thiết bị gốc (OEM) sản xuất thiết bị Android và "tên mã" phải được thay thế bằng tên mã thiết bị.

Sau đây là ví dụ về mục nhập:

audio_hw_modules {
  ...
  usb {
    outputs {
      usb_accessory {
        sampling_rates 44100
        channel_masks AUDIO_CHANNEL_OUT_STEREO
        formats AUDIO_FORMAT_PCM_16_BIT
        devices AUDIO_DEVICE_OUT_USB_ACCESSORY
      }
      usb_device {
        sampling_rates dynamic
        channel_masks dynamic
        formats dynamic
        devices AUDIO_DEVICE_OUT_USB_DEVICE
      }
    }
    inputs {
      usb_device {
        sampling_rates dynamic
        channel_masks AUDIO_CHANNEL_IN_STEREO
        formats AUDIO_FORMAT_PCM_16_BIT
        devices AUDIO_DEVICE_IN_USB_DEVICE
      }
    }
  }
  ...
}

Mã nguồn

Bạn có thể xem cách triển khai Lớp trừu tượng phần cứng (HAL) cho âm thanh USB tại đây:

hardware/libhardware/modules/usbaudio/

HAL âm thanh USB phụ thuộc nhiều vào tinyalsa, được mô tả tại Thuật ngữ âm thanh. Mặc dù âm thanh USB dựa vào các phương thức truyền đồng bộ, nhưng việc này được trừu tượng hoá bằng cách triển khai ALSA. Vì vậy, HAL âm thanh USB và tinyalsa không cần phải quan tâm đến phần này của giao thức USB.

Kiểm thử âm thanh qua USB

Để biết thông tin về kiểm thử CTS cho âm thanh USB, hãy xem phần Kiểm thử trình xác minh CTS cho âm thanh USB.