UYARI: OpenSL ES desteği sonlandırılmıştır. Geliştiriciler, GitHub'da bulunan açık kaynak Oboe kitaplığını kullanmalıdır. Oboe, AAudio'ya çok benzeyen bir API sağlayan bir C++ sarmalayıcısıdır. Oboe, AAudio kullanılabilir olduğunda AAudio'yu çağırır ve AAudio kullanılamıyorsa OpenSL ES'ye geri döner.
Bu bölümde, OpenSL ES API'lerini kullanmaya başlamak için gereken bilgiler sağlanmaktadır.
OpenSL ES'i uygulamanıza ekleme
OpenSL ES'i hem C hem de C++ kodundan çağırabilirsiniz. Temel OpenSL ES özellik grubunu uygulamanıza eklemek için OpenSLES.h
üstbilgi dosyasını ekleyin:
#include <SLES/OpenSLES.h>
OpenSL ES Android uzantılarını da eklemek için OpenSLES_Android.h
üstbilgi dosyasını dahil edin:
#include <SLES/OpenSLES_Android.h>
OpenSLES_Android.h
üstbilgi dosyasını eklediğinizde aşağıdaki üstbilgiler otomatik olarak eklenir:
#include <SLES/OpenSLES_AndroidConfiguration.h> #include <SLES/OpenSLES_AndroidMetadata.h>
Not: Bu üstbilgiler zorunlu değildir ancak API'yi öğrenmenize yardımcı olması için gösterilir.
Derleme ve hata ayıklama
OpenSL ES'i, NDK derleme sisteminin makefile'lerinden biri olarak hizmet veren Android.mk
dosyasında belirterek derlemenize dahil edebilirsiniz. Aşağıdaki satırı Android.mk
dosyasına ekleyin:
LOCAL_LDLIBS += -lOpenSLES
Güçlü bir hata ayıklama için çoğu OpenSL ES API'sinin döndürdüğü SLresult
değerini incelemenizi öneririz. Hata ayıklama için assert'leri veya daha gelişmiş hata işleme mantığını kullanabilirsiniz. Her ikisi de OpenSL ES ile çalışmak için doğal bir avantaj sunmaz ancak belirli bir kullanım alanı için biri diğerinden daha uygun olabilir.
Örneklermizde, kodlama hatasına işaret edecek gerçekçi olmayan koşulları yakalamaya yardımcı oldukları için onaylar kullanırız. Üretimde gerçekleşme olasılığı daha yüksek olan diğer koşullar için açık hata işleme kullandık.
Birçok API hatası, sıfır olmayan bir sonuç koduna ek olarak günlük girişine neden olur. Bu tür günlük girişleri, özellikle
Engine::CreateAudioPlayer
gibi nispeten karmaşık API'ler için yararlı olabilecek ek ayrıntılar sağlayabilir.
Günlüğü komut satırından veya Android Studio'dan görüntüleyebilirsiniz. Günlüğü komut satırından incelemek için aşağıdakileri yazın:
$ adb logcat
Android Studio'daki günlüğü incelemek için View > Tool Windows > Logcat'i (Görünüm > Araç Pencereleri > Logcat) seçin. Daha fazla bilgi için Logcat ile Günlük Yazma ve Görüntüleme başlıklı makaleyi inceleyin.
Örnek kod
Kendi kodunuz için model olarak kullanabileceğiniz, desteklenen ve test edilmiş örnek kodu kullanmanızı öneririz. Bu kod, android-ndk GitHub deposunun audio-echo ve native-audio klasörlerinde yer alır.
Dikkat: OpenSL ES 1.0.1 spesifikasyonunun eklerinde örnek kodlar bulunur (daha fazla bilgi için Khronos OpenSL ES Kaydı'na bakın). Ancak Ek B: Örnek Kod ve Ek C: Kullanım Alanı Örnek Kodu'ndaki örneklerde Android tarafından desteklenmeyen özellikler kullanılmaktadır. Bazı örneklerde yazım hataları da bulunur veya değişebilecek API'ler kullanılır. Bu ifadelerden bahsederken dikkatli olun. Kod, OpenSL ES standardının tamamını anlamanıza yardımcı olsa da Android'de olduğu gibi kullanılmamalıdır.
Ses içeriği
Uygulamanız için ses içeriğini paketlemenin birçok yolundan bazıları aşağıda açıklanmıştır:
- Kaynaklar: Ses dosyalarınızı
res/raw/
klasörüne yerleştirerekResources
ile ilişkili API'ler tarafından kolayca erişilebilir hale getirebilirsiniz. Ancak kaynaklara doğrudan yerel erişim olmadığından, bunları kullanmadan önce kopyalamak için Java programlama dili kodu yazmanız gerekir. - Öğeler: Ses dosyalarınızı
assets/
klasörüne yerleştirdiğinizde Android doğal öğe yöneticisi API'leri tarafından doğrudan erişilebilirler. Bu API'ler hakkında daha fazla bilgi içinandroid/asset_manager.h
veandroid/asset_manager_jni.h
başlık dosyalarına bakın. android-ndk GitHub deposunda bulunan örnek kod, bu yerel öğe yöneticisi API'lerini Android dosya tanımlayıcısı veri bulucuyla birlikte kullanır. - Ağ: Ses içeriğini doğrudan ağdan oynatmak için URI veri bulucuyu kullanabilirsiniz. Ancak Güvenlik ve izinler bölümünü okuduğunuzdan emin olun.
- Yerel dosya sistemi: URI veri bulucusu, uygulamanın erişebildiği yerel dosyalar için
file:
şemasını destekler. Android güvenlik çerçevesinin, Linux kullanıcı kimliği ve grup kimliği mekanizmaları aracılığıyla dosya erişimini kısıtladığını unutmayın. - Kaydedilen: Uygulamanız, mikrofon girişinden ses verileri kaydedebilir, bu içeriği depolayabilir ve daha sonra oynatabilir. Örnek kodda, Oynatma klibi için bu yöntem kullanılmaktadır.
- Derlenmiş ve bağlantılı satır içi: Ses içeriğinizi doğrudan paylaşılan kitaplığa bağlayabilir ve ardından arabellek sırası veri bulucusu olan bir ses çalar kullanarak oynatabilirsiniz. Bu, kısa PCM biçimli klipler için en uygun seçenektir. Örnek kod, bu tekniği
Hello ve Android klipleri için kullanır. PCM verileri,
bin2c
aracı (temin edilmez) kullanılarak onaltılık dizelere dönüştürülmüştür. - Gerçek zamanlı sentez: Uygulamanız, PCM verilerini anında sentezleyebilir ve ardından arabellek sırası veri buluculu bir ses çalar kullanarak çalabilir. Bu nispeten gelişmiş bir tekniktir ve ses sentezlemeyle ilgili ayrıntılar bu makalenin kapsamı dışındadır.
Not: Uygulamanız için yararlı ses içeriği bulmak veya oluşturmak bu makalenin kapsamı dışındadır. Daha fazla bilgi edinmek için etkileşimli ses, oyun sesi, ses tasarımı ve ses programlama gibi web arama terimlerini kullanabilirsiniz.
Dikkat: İçerik oynatma veya kaydetme izninizin yasal olarak geçerli olduğundan emin olmak sizin sorumluluğunuzdadır. İçerik kaydetme konusunda gizlilik açısından dikkat edilmesi gereken noktalar olabilir.
Kod örnekleri
Aşağıdaki örnek uygulamaları GitHub sayfamızda bulabilirsiniz:
- audio-echo, giriş-çıkış döngü döngüsü oluşturur.
- native-audio basit bir ses kaydedici/oynatıcıdır.
OpenSL ES'nin Android NDK uygulaması, OpenSL ES 1.0.1'in referans spesifikasyonundan çeşitli açılardan farklıdır. Doğrudan OpenSL ES referans spesifikasyonundan kopyaladığınız örnek kodun Android uygulamanızda çalışmamasının önemli bir nedeni bu farklılıklardır.
Referans spesifikasyonu ve Android uygulaması arasındaki farklılıklar hakkında daha fazla bilgi edinmek için Android için OpenSL ES sayfasına bakın.