Tái cấu trúc SCO được quản lý bằng âm thanh

Trang này mô tả cách bật khung âm thanh và HAL âm thanh (AHAL) để quản lý các kết nối hướng kết nối đồng bộ (SCO), một quy trình được xác định là SCO do âm thanh quản lý (AMSCO).

Trong Android 17 trở lên, khung âm thanh Android sử dụng tính năng quản lý SCO để quản lý việc định tuyến SCO. Ban đầu, tính năng này do khung Bluetooth (BT) xử lý. Quá trình di chuyển này sẽ chuyển trạng thái kết nối SCO từ trạng thái do khung BT sở hữu sang hậu quả hạ lưu của hoạt động truyền phát trực tiếp âm thanh.

Bằng cách tập trung quyền sở hữu việc định tuyến âm thanh trong khung âm thanh, tính năng này sẽ điều chỉnh việc triển khai lớp trừu tượng phần cứng âm thanh (HAL) cho SCO với các cấu hình BT khác như Cấu hình phân phối âm thanh nâng cao (A2DP) và Âm thanh LE. Hoạt động cải tiến này giúp đơn giản hoá hoạt động tương tác giữa các ngăn xếp viễn thông và Bluetooth, cho phép có một cấu trúc định tuyến âm thanh mạnh mẽ và tập trung hơn.

Tổng quan về kiến trúc

Cấu trúc AMSCO tập trung việc quản lý kết nối SCO trong khung âm thanh Android, dựa trên các quyết định định tuyến về hoạt động phát trực tuyến âm thanh. Cấu trúc này tương phản với mô hình trước đó, trong đó ngăn xếp BT quản lý các kết nối. Vai trò của từng thành phần trong cấu trúc này như sau:

AHAL chỉ bắt đầu và tạm dừng phiên SCO nếu đáp ứng các điều kiện sau:

  • Luồng đang hoạt động được vá vào một thiết bị SCO.
  • Chế độ phát âm thanh được đặt và có một bản vá cho thiết bị SCO.

Khung âm thanh ngăn thiết bị A2DP có bản vá đồng thời khi đáp ứng các tiêu chí cụ thể này. Khung âm thanh không còn gửi các thay đổi về trạng thái SCO hoặc A2DP tạm ngưng đến AHAL nữa.

Khung âm thanh xử lý việc quản lý SCO, vì vậy ngăn xếp BT không còn gọi kết nối hoặc ngắt kết nối âm thanh nữa. Trong trường hợp ngắt kết nối SCO hoặc lỗi chủ động, ngăn xếp BT sẽ thông báo cho khung âm thanh bằng AudioManager#onHfpAudioDisconnected.

Lập kế hoạch

Hãy sử dụng thông tin trong phần này để đánh giá các yêu cầu sau về khả năng tương thích và cấu trúc trước khi triển khai quy trình cải tiến hoạt động quản lý SCO.

Khả năng tương thích ngược

Để cho phép khung tiếp tục hỗ trợ những thiết bị có thể nhận được bản cập nhật hệ điều hành mà không cần cập nhật AHAL hoặc AHAL BT, hãy dùng một thuộc tính hệ thống để cho biết rằng bạn phải bật tính năng quản lý SCO mới. Đường dẫn cũ được giữ lại trong tối đa 6 năm trong trường hợp thuộc tính hệ thống bị vô hiệu hoá hoặc phiên bản HAL đã lỗi thời.

Thiết lập phiên HFP

AHAL phải sử dụng loại phiên cấu hình rảnh tay (HFP) mới để bắt đầu hoặc tạm dừng phát, tương tự như các loại phiên BT khác. Trạng thái luồng cuối cùng được quản lý bằng cách sử dụng nhiều IBluetoothAudioProviders, được liệt kê và tạo bởi một lớp Factory tuỳ thuộc vào các đường dẫn có sẵn.

Ngăn xếp BT sử dụng đường dẫn giảm tải phần cứng bất cứ khi nào có thể. Lựa chọn ưu tiên cho codec trong quá trình thương lượng tuân theo thứ tự sau: phần cứng LC3 được ưu tiên hơn phần mềm LC3, tiếp theo là phần cứng mSBC, sau đó là phần mềm mSBC và cuối cùng là phần cứng CVSD được ưu tiên hơn phần mềm CVSD.

Các sơ đồ trình tự sau đây trình bày chi tiết các hoạt động tương tác giữa AHAL và ngăn xếp BT cần thiết để thiết lập trạng thái luồng.

Quy trình giảm tải phần cứng

Hình 1 minh hoạ cách AHAL và ngăn xếp BT phối hợp để thiết lập đường dẫn dữ liệu phần cứng trực tiếp cho âm thanh SCO:

hw-offload-procedure

Hình 1. Quy trình giảm tải phần cứng.

Quy trình đường dẫn dữ liệu phần mềm

Hình 2 minh hoạ quy trình xử lý dữ liệu âm thanh cần có quy trình xử lý phần mềm hệ thống:

sw-data-path

Hình 2. Quy trình đường dẫn dữ liệu phần mềm.

Quy trình thương lượng lại codec

Khi cổng âm thanh (AG) nhận được lệnh bộ mã hoá và giải mã BT mới (AT+BAC), AG sẽ khởi động lại quy trình thương lượng bộ mã hoá và giải mã. Hình 3 minh hoạ quy trình thương lượng lại codec:

codec-renego-process

Hình 3. Quy trình thương lượng lại codec.

Tác động đến HeadsetStateMachine

Máy trạng thái tai nghe của lớp Java (do lớp HeadsetStateMachine đại diện) phần lớn không thay đổi, ngoại trừ trạng thái AUDIO_CONNECTED do các sự kiện ngăn xếp gốc điều khiển. Trong lớp Java, hệ thống sẽ không còn khởi tạo connectAudioNative hoặc disconnectAudioNative nữa. Thay vào đó, hệ thống sẽ phản hồi các thay đổi về trạng thái kết nối âm thanh từ ngăn xếp gốc. Những thay đổi này được kích hoạt bằng các lệnh của AHAL trên IBluetoothAudioProvider hoặc IBluetoothAudioPort.

Triển khai

Để tích hợp quá trình cải tiến quản lý SCO, hãy cập nhật thông tin liên lạc giữa ngăn xếp BT và khung âm thanh.

Hãy làm theo các bước sau để triển khai tính năng này:

  1. Thông báo cho khung âm thanh về các thay đổi đối với BT đang hoạt động để hỗ trợ việc quản lý đúng cách quá trình khởi tạo và huỷ SCO trong các kết nối thiết bị HFP cũng như xử lý các thay đổi đối với thiết bị đang hoạt động. Sử dụng AudioManager.handleBluetoothActiveDeviceChanged(HfpInfo) để cung cấp thông tin này cho khung âm thanh.

    conn-hfp

    Hình 4. Kết nối thiết bị HFP.

    Khung âm thanh sử dụng lệnh gọi lại AudioManagerAudioDeviceCallback#onAudioDevicesAdded thay vì các thông báo truyền tin cũ để cho biết trạng thái của thiết bị âm thanh.

  2. Triển khai chế độ kiểm soát luồng AHAL bằng cách sử dụng setCommunicationDevice(AudioDeviceInfodevice) làm điểm kiểm soát chính để bắt đầu kết nối SCO.

    Nếu HfpTransport::StartRequest trả về BluetoothAudioCtrlAck::PENDING, thì AHAL phải thử lại yêu cầu vì máy trạng thái HFP chưa được thiết lập.

Trường hợp sử dụng

Các phần sau đây trình bày những hành trình trọng yếu của người dùng (CUJ) thường gặp.

Quy trình cuộc gọi viễn thông

Việc tái cấu trúc hoạt động quản lý SCO sẽ thay đổi phoneStateChanged thành một hàm chặn. Thay đổi này khiến telecom chờ quá trình thực thi phoneStateChanged trong phương thức BluetoothInCallService.onCallAdded() hoàn tất trước khi gọi API khung âm thanh để bắt đầu tạo SCO.

call-telecom

Hình 5. Trả lời hoặc bắt đầu cuộc gọi qua nhà cung cấp dịch vụ viễn thông.

Quy trình cuộc gọi VOIP

Khung âm thanh bắt đầu quy trình bằng cách gọi phương thức BluetoothHeadset.startScoUsingVirtualVoiceCall. Sau khi ngăn xếp BT cung cấp kết quả cho khung âm thanh, khung này sẽ hướng dẫn AHAL thực thi startStream. Hình sau đây minh hoạ quy trình này:

call-voip

Hình 6. Trả lời hoặc bắt đầu cuộc gọi qua VOIP.

Nhận dạng giọng nói

Đối với cả chế độ rảnh tay (HF) và chế độ nhận dạng giọng nói do AG khởi tạo, ngăn xếp BT phải yêu cầu khung âm thanh mở SCO bằng AudioManager.setCommunicationDevice(). Điều này được minh hoạ trong hình sau:

voice-recog

Hình 7. Bắt đầu SCO nhận dạng giọng nói.

Kết nối âm thanh

Ngăn xếp BT bắt đầu kết nối SCO bằng cách yêu cầu khung âm thanh bằng AudioManager.setCommunicationDevice(AudioDeviceInfo) trong quá trình nhận dạng giọng nói. Nếu có cuộc gọi đang diễn ra, ngăn xếp BT sẽ yêu cầu BluetoothInCallService#requestBluetoothAudio từ ngăn xếp viễn thông.

Quy trình này được minh hoạ trong hình sau:

audio-conn

Hình 8. Kết nối âm thanh.

Xác thực và kiểm thử

Để xác thực rằng tính năng này được tích hợp đúng cách và đáp ứng các tiêu chuẩn chất lượng, nhà sản xuất thiết bị phải chạy các kiểm thử sau:

  • Trình xác minh CTS: Sử dụng Trình xác minh CTS để kiểm thử tương tác việc định tuyến âm thanh trong các cuộc gọi.
  • Bộ kiểm thử của nhà cung cấp (VTS): Xác thực các hoạt động tương tác AHAL và BT AHAL bằng VTS.

Yêu cầu

Tính năng này phải tuân thủ các yêu cầu sau:

  • AHAL: Việc triển khai yêu cầu một AHAL tương thích hỗ trợ đường dẫn quản lý SCO được tái cấu trúc.