CẢNH BÁO: OpenSL ES không còn được dùng nữa. Nhà phát triển nên sử dụng thư viện Oboe nguồn mở có trên GitHub. Oboe là một trình bao bọc C++, cung cấp một API gần giống với AAudio. Oboe gọi AAudio khi có API này và quay lại sử dụng OpenSL ES nếu không có AAudio.
Phần này cung cấp thông tin cần thiết để bắt đầu sử dụng các API OpenSL ES.
Thêm OpenSL ES vào ứng dụng
Bạn có thể gọi OpenSL ES qua cả mã C và mã C++. Để thêm bộ tính năng OpenSL ES cốt lõi vào ứng dụng, hãy bổ sung tệp tiêu đề OpenSLES.h
:
#include <SLES/OpenSLES.h>
Để thêm cả tiện ích Android OpenSL ES, hãy bổ sung tệp tiêu đề OpenSLES_Android.h
:
#include <SLES/OpenSLES_Android.h>
Khi bạn bổ sung tệp tiêu đề OpenSLES_Android.h
, các tiêu đề sau sẽ được tự động thêm vào:
#include <SLES/OpenSLES_AndroidConfiguration.h> #include <SLES/OpenSLES_AndroidMetadata.h>
Lưu ý: Các tiêu đề này là không bắt buộc nhưng được đưa ra để hỗ trợ việc tìm hiểu API.
Xây dựng và gỡ lỗi
Bạn có thể tích hợp OpenSL ES vào bản dựng bằng cách chỉ định trong tệp Android.mk
. Tệp này đóng vai trò là một trong những tệp đóng góp (makefile) của hệ thống xây dựng NDK. Hãy thêm dòng sau đây vào Android.mk
:
LOCAL_LDLIBS += -lOpenSLES
Để có thể gỡ lỗi hiệu quả, bạn nên kiểm tra giá trị SLresult
mà hầu hết API OpenSL ES đều trả về. Bạn có thể dùng các thành phần xác nhận (assert) hoặc logic xử lý lỗi nâng cao để gỡ lỗi. Mặc dù một trong hai thành phần này có thể phù hợp hơn trong một trường hợp sử dụng nhất định, nhưng cả hai đều không đem lại lợi thế vốn có khi dùng OpenSL ES.
Chúng tôi sử dụng các thành phần xác nhận trong ví dụ vì chúng giúp nắm bắt các điều kiện không thực tế có thể chỉ ra lỗi lập trình. Chúng tôi đã sử dụng biện pháp xử lý lỗi rõ ràng đối với các điều kiện khác có nhiều khả năng sẽ xảy ra trong quá trình sản xuất.
Nhiều lỗi API được ghi lại trong một mục nhật ký, ngoài mã kết quả khác 0. Các mục nhật ký đó có thể cung cấp thêm thông tin chi tiết đặc biệt hữu ích cho các API tương đối phức tạp, chẳng hạn như Engine::CreateAudioPlayer
.
Bạn có thể xem nhật ký qua dòng lệnh hoặc qua Android Studio. Để kiểm tra nhật ký qua dòng lệnh, hãy nhập câu lệnh sau đây:
$ adb logcat
Để kiểm tra nhật ký qua Android Studio, hãy chọn View (Xem) > Tool Windows (Cửa sổ công cụ) > Logcat. Để biết thêm thông tin, hãy xem nội dung Viết và xem nhật ký bằng Logcat.
Mã ví dụ
Bạn nên sử dụng mã ví dụ đã được hỗ trợ và kiểm thử để làm mẫu cho mã của riêng bạn. Mã nguồn này nằm trong thư mục audio-echo và native-audio trong kho lưu trữ GitHub của android-ndk.
Thận trọng: Phần đặc tả của OpenSL ES 1.0.1 có chứa mã mẫu trong các phụ lục (xem nội dung Khronos OpenSL ES Registry để biết thêm chi tiết). Tuy nhiên, các ví dụ trong Appendix B: Sample Code (Phụ lục B: Mã mẫu) và Appendix C: Use Case Sample Code (Phụ lục C: Mã mẫu theo trường hợp sử dụng) có sử dụng một số tính năng không được Android hỗ trợ. Một số ví dụ cũng có lỗi ký tự hoặc sử dụng những API có thể đã thay đổi. Hãy thận trọng khi tham khảo những ví dụ này. Tuy phần mã nguồn có thể hữu ích trong việc tìm hiểu tiêu chuẩn OpenSL ES đầy đủ, nhưng bạn không nên sử dụng nguyên trạng mã nguồn này cho Android.
Nội dung âm thanh
Sau đây là một số cách để đóng gói nội dung âm thanh cho ứng dụng:
- Tài nguyên: Bằng cách đặt các tệp âm thanh vào thư mục
res/raw/
, bạn có thể dễ dàng truy cập vào các tệp đó bằng các API liên kết dành choResources
. Tuy nhiên, bạn không thể sử dụng mã gốc để truy cập trực tiếp vào tài nguyên, vì vậy bạn phải viết mã ngôn ngữ lập trình Java để sao chép tài nguyên trước khi sử dụng. - Tài sản: Bằng cách đặt các tệp âm thanh vào thư mục
assets/
, bạn có thể truy cập trực tiếp vào các tệp đó bằng các API quản lý tài sản gốc của Android. Xem các tệp tiêu đềandroid/asset_manager.h
vàandroid/asset_manager_jni.h
để biết thêm thông tin về các API này. Mã ví dụ (nằm trong kho lưu trữ android-ndk trên GitHub) sử dụng các API quản lý tài sản gốc này kết hợp với trình định vị dữ liệu chỉ số mô tả tệp Android. - Mạng: Bạn có thể sử dụng trình định vị dữ liệu URI để phát nội dung âm thanh trực tiếp qua mạng. Tuy nhiên, hãy nhớ đọc nội dung Bảo mật và quyền truy cập.
- Hệ thống tệp cục bộ: Trình định vị dữ liệu URI hỗ trợ lược đồ
file:
dành cho các tệp cục bộ, miễn là ứng dụng có thể truy cập vào các tệp đó. Xin lưu ý rằng khung bảo mật Android hạn chế quyền truy cập vào tệp thông qua cơ chế mã nhận dạng người dùng (user ID) và mã nhận dạng nhóm (group ID) của Linux. - Ghi âm: Ứng dụng của bạn có thể ghi lại dữ liệu âm thanh qua đầu vào micrô, lưu trữ nội dung này rồi phát lại sau. Mã ví dụ sử dụng phương thức này cho đoạn Playback.
- Biên dịch và liên kết cùng dòng: Bạn có thể trực tiếp liên kết nội dung âm thanh vào thư viện dùng chung, sau đó phát nội dung bằng trình phát âm thanh có trình định vị dữ liệu hàng đợi bộ đệm. Kỹ thuật này phù hợp nhất với các đoạn ngắn có định dạng PCM. Mã ví dụ sử dụng kỹ thuật này cho các đoạn Hello và Android. Dữ liệu PCM đã được chuyển đổi thành chuỗi hex bằng công cụ
bin2c
(không được cung cấp). - Tổng hợp dữ liệu theo thời gian thực: Ứng dụng của bạn có thể nhanh chóng tổng hợp dữ liệu PCM rồi phát dữ liệu này bằng trình phát âm thanh có trình định vị dữ liệu hàng đợi bộ đệm. Đây là một kỹ thuật tương đối nâng cao và bài viết này cũng không đề cập chi tiết đến quá trình tổng hợp âm thanh.
Lưu ý: Bài viết này cũng sẽ không đề cập đến việc tìm hoặc tạo nội dung âm thanh hữu ích cho ứng dụng của bạn. Bạn có thể sử dụng các cụm từ tìm kiếm trên web như: âm thanh tương tác (interactive audio), âm thanh trò chơi (game audio), thiết kế âm thanh (sound design) hay lập trình âm thanh (audio programming) để tìm thêm thông tin.
Thận trọng: Bạn có trách nhiệm đảm bảo rằng mình có quyền hợp pháp để phát hoặc ghi nội dung. Khi ghi âm nội dung, có thể bạn phải chú ý đến quyền riêng tư.
Mã mẫu
Những ứng dụng mẫu này hiện có trên trang GitHub của chúng tôi:
- audio-echo tạo một vòng lặp trọn vòng từ đầu vào đến đầu ra.
- native-audio là một trình phát/ghi âm đơn giản.
Phương thức triển khai NDK Android của OpenSL ES khác với bản đặc tả tham chiếu dành cho OpenSL ES 1.0.1 ở một số khía cạnh. Những khác biệt này là một lý do quan trọng giải thích nguyên nhân mã mẫu mà bạn sao chép trực tiếp qua bản đặc tả tham chiếu OpenSL ES có thể sẽ không hoạt động được trong ứng dụng Android của bạn.
Để biết thêm thông tin về sự khác biệt giữa bản đặc tả tham chiếu và phương thức triển khai Android, hãy xem nội dung OpenSL ES dành cho Android.