אזהרה: OpenSL ES הוצא משימוש. המפתחים צריכים להשתמש בספריית הקוד הפתוח Oboe, שזמינה ב-GitHub. Oboe הוא מעטפת של C++ שמספקת ממשק API שדומה מאוד ל-AAudio. כש-AAudio זמין, Oboe קורא ל-AAudio, ואם AAudio לא זמין, הוא עובר ל-OpenSL ES.
בקטע הזה מפורט המידע הנדרש כדי להתחיל להשתמש בממשקי ה-API של OpenSL ES.
הוספת OpenSL ES לאפליקציה
אפשר להפעיל את OpenSL ES גם מקובצי קוד ב-C וגם מקובצי קוד ב-C++. כדי להוסיף את תכונת הליבה OpenSL ES שמוגדרת לאפליקציה, צריך לכלול את קובץ הכותרת OpenSLES.h
:
#include <SLES/OpenSLES.h>
כדי להוסיף גם את תוספי Android של OpenSL ES, צריך לכלול את קובץ הכותרת OpenSLES_Android.h
:
#include <SLES/OpenSLES_Android.h>
כשכוללים את קובץ הכותרת OpenSLES_Android.h
, הכותרות הבאות נכללות באופן אוטומטי:
#include <SLES/OpenSLES_AndroidConfiguration.h> #include <SLES/OpenSLES_AndroidMetadata.h>
הערה: הכותרות האלה לא נדרשות, אבל הן מוצגות כעזרה ללמידה של ה-API.
פיתוח ופתרון באגים
כדי לשלב את OpenSL ES ב-build, מציינים אותו בקובץ Android.mk
שמשמש כאחד מקבצי ה-makefile של מערכת ה-build של NDK. מוסיפים את השורה הבאה לקובץ Android.mk
:
LOCAL_LDLIBS += -lOpenSLES
כדי לבצע ניפוי באגים יסודי, מומלץ לבדוק את הערך SLresult
שמוחזר על ידי רוב ממשקי ה-API של OpenSL ES. אפשר להשתמש בטענות נכוֹנוּת (asserts) או בלוגיקה מתקדמת יותר לטיפול בטעויות כדי לנפות באגים. אף אחת מהשיטות האלה לא מציעה יתרון מהותי לעבודה עם OpenSL ES, אבל אחת מהן עשויה להתאים יותר לתרחיש לדוגמה.
אנחנו משתמשים בטענות נכוֹנוּת (asserts) ב דוגמאות שלנו, כי הן עוזרות לזהות תנאים לא מציאותיים שעשויים להצביע על שגיאה בקוד. השתמשנו בטיפול מפורש בשגיאות בתנאים אחרים שיש סיכוי גבוה יותר שיקרו בסביבת הייצור.
שגיאות רבות ב-API יוצרות רשומה ביומן, בנוסף לקוד תוצאה שאינו אפס. רשומות כאלה ביומן יכולות לספק פרטים נוספים, שמועילים במיוחד לממשקי API מורכבים יחסית כמו
Engine::CreateAudioPlayer
.
אפשר להציג את היומן משורת הפקודה או מ-Android Studio. כדי לבדוק את היומן משורת הפקודה, מקלידים את הפקודה הבאה:
$ adb logcat
כדי לבדוק את היומן מ-Android Studio, בוחרים באפשרות View (תצוגה) > Tool Windows (חלונות כלים) > Logcat. מידע נוסף זמין במאמר כתיבה והצגה של יומנים באמצעות Logcat.
קוד לדוגמה
מומלץ להשתמש בקוד לדוגמה נתמך ומאומת שאפשר להשתמש בו כמודל לקוד שלכם. הקוד נמצא בתיקיות audio-echo ו-native-audio במאגר GitHub של android-ndk.
זהירות: הנספחים של מפרט OpenSL ES 1.0.1 מכילים דוגמאות לקוד (למידע נוסף, ראו Khronos OpenSL ES Registry). עם זאת, בדוגמאות שמפורטות בנספח ב': קוד לדוגמה ובנספח ג': קוד לדוגמה לתרחיש לדוגמה נעשה שימוש בתכונות שלא נתמכות ב-Android. חלק מהדוגמאות מכילות גם שגיאות דפוס, או משתמשות בממשקי API שצפויים להשתנות. חשוב להפעיל שיקול דעת כשמעיינים בקוד הזה. אמנם הקוד יכול לעזור לכם להבין את תקן OpenSL ES המלא, אבל אסור להשתמש בו כפי שהוא ב-Android.
תוכן אודיו
ריכזנו כאן כמה מהדרכים הרבות לאריזת תוכן אודיו לאפליקציה:
- מקורות מידע: אם מציבים את קובצי האודיו בתיקייה
res/raw/
, ממשקי ה-API המשויכים לחשבוןResources
יוכלו לגשת אליהם בקלות. עם זאת, אין גישה ישירה לשימוש במשאבים, לכן צריך לכתוב קוד בשפת התכנות Java כדי להעתיק אותם לפני השימוש. - נכסים: אם תוסיפו את קובצי האודיו לתיקייה
assets/
, תוכלו לגשת אליהם ישירות דרך ממשקי ה-API של מנהל הנכסים המובנה של Android. מידע נוסף על ממשקי ה-API האלה זמין בקובצי הכותרתandroid/asset_manager.h
ו-android/asset_manager_jni.h
. קוד הדוגמה שנמצא במאגר GitHub android-ndk משתמש בממשקי ה-API האלה של מנהל הנכסים המקומיים בשילוב עם מאתר הנתונים של מתאר הקובץ של Android. - רשת: אפשר להשתמש במאתר הנתונים של URI כדי להפעיל תוכן אודיו ישירות מהרשת. עם זאת, חשוב לקרוא את המאמר אבטחה והרשאות.
- מערכת קבצים מקומית: מאתר הנתונים של URI תומך בסכימה
file:
לקבצים מקומיים, בתנאי שהאפליקציה יכולה לגשת לקבצים. שימו לב שמסגרת האבטחה של Android מגבילה את הגישה לקבצים באמצעות המנגנונים של מזהה המשתמש ומזהה הקבוצה ב-Linux. - הקלטה: האפליקציה יכולה להקליט נתוני אודיו מהמיקרופון, לאחסן את התוכן הזה ולאחר מכן להפעיל אותו מחדש. הקוד לדוגמה משתמש בשיטה הזו בקליפ Playback.
- מורכב ומקושר מוטבע: אפשר לקשר את תוכן האודיו ישירות לספרייה המשותפת, ואז להפעיל אותו באמצעות נגן אודיו עם מאתר נתונים בתור מאגר נתונים זמני. הפורמט הזה מתאים במיוחד לקטעים קצרים בפורמט PCM. הקוד לדוגמה משתמש בשיטה הזו בקליפים של
Hello ו-Android. נתוני ה-PCM הומרו למחרוזות הקסדצימליות באמצעות
הכלי
bin2c
(לא סופק). - סינתזה בזמן אמת: האפליקציה יכולה לסנתז נתוני PCM בזמן אמת ואז להפעיל אותם באמצעות נגן אודיו עם מאתר נתונים של תור מאגר. זוהי שיטה מתקדמת יחסית, והפרטים של סינתזת אודיו לא נכללים במאמר הזה.
הערה: המאמר הזה לא עוסק במציאת תוכן אודיו שימושי לאפליקציה או ביצירתו. אתם יכולים להשתמש במונחי חיפוש באינטרנט כמו אודיו אינטראקטיבי, אודיו במשחק, עיצוב אודיו ותכנות אודיו כדי לאתר מידע נוסף.
זהירות: באחריותכם לוודא שיש לכם הרשאה חוקית להפעיל או להקליט תוכן. כשהקלטת תוכן עשויה להשתנות, יכול להיות שיחולו שיקולי פרטיות.
דוגמאות קוד
האפליקציות לדוגמה האלה זמינות בדף שלנו ב-GitHub:
- audio-echo יוצר לולאה של נסיעה הלוך ושוב מקלט לפלט.
- native-audio הוא מקליט אודיו/נגן אודיו פשוט.
הטמעת OpenSL ES ב-Android NDK שונה במספר היבטים מהמפרט של OpenSL ES 1.0.1. ההבדלים האלה הם סיבה חשובה לכך שקוד לדוגמה שאתם מעתיקים ישירות מתקן העזר של OpenSL ES עשוי שלא לפעול באפליקציה שלכם ל-Android.
למידע נוסף על ההבדלים בין המפרט של קובצי העזר לבין ההטמעה של Android, ראו OpenSL ES ל-Android.