Başlama

Bu bölümde, OpenSL ES API'lerini kullanmaya başlamak için gereken bilgiler sağlanmaktadır.

Uygulamanıza OpenSL ES'yi ekleyin

OpenSL ES'yi hem C hem de C++ kodundan çağırabilirsiniz. Uygulamanıza temel OpenSL ES özelliği eklemek için OpenSLES.h başlık dosyasını ekleyin:

#include <SLES/OpenSLES.h>

OpenSL ES Android uzantılarını eklemek için OpenSLES_Android.h başlık dosyasını da ekleyin:

#include <SLES/OpenSLES_Android.h>

OpenSLES_Android.h başlık dosyasını eklediğinizde aşağıdaki üstbilgiler otomatik olarak eklenir:

#include <SLES/OpenSLES_AndroidConfiguration.h>
#include <SLES/OpenSLES_AndroidMetadata.h>

Not: Bu başlıklar zorunlu değildir ancak API'yi öğrenmeye yardımcı olması için gösterilir.

Derleme ve hata ayıklama

OpenSL ES'yi, NDK derleme sisteminin yapma dosyalarından biri olarak işlev gören Android.mk dosyasında belirterek derlemenize dahil edebilirsiniz. Aşağıdaki satırı Android.mk hedefine ekleyin:

LOCAL_LDLIBS += -lOpenSLES

Güçlü bir hata ayıklama işlemi için OpenSL ES API'lerinin çoğunun döndürdüğü SLresult değerini incelemenizi öneririz. Hata ayıklama için hak talepleri veya daha gelişmiş hata işleme mantığını kullanabilirsiniz. Her iki yöntem de OpenSL ES ile çalışmak için doğal bir avantaj sunmaz ancak belirli bir kullanım alanı için daha uygun olabilir.

Örneklerimizde, kodlama hatası olduğunu gösterecek gerçekçi olmayan koşulları yakalamaya yardımcı oldukları için iddiaları kullanıyoruz. Üretimde gerçekleşme olasılığı daha yüksek olan diğer koşullar için açık hata işlemeyi kullandık.

Birçok API hatası, sıfır olmayan bir sonuç koduna ek olarak günlük girişiyle sonuçlanır. Bu tür günlük girişleri, özellikle Engine::CreateAudioPlayer gibi nispeten karmaşık API'ler için faydalı olan 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

Günlüğü Android Studio'dan incelemek için Görünüm > Araç Pencereleri > Logcat'i seçin. Daha fazla bilgi için Logcat ile Günlük Yazma ve Görüntüleme bölümünü inceleyin.

Örnek kod

Kendi kodunuz için model olarak kullanılabilen, desteklenen ve test edilmiş örnek kodu kullanmanızı öneririz. Bu örnek kodu, android-ndk GitHub deposunun audio-echo ve native-audio klasörlerinde bulabilirsiniz.

Dikkat: OpenSL ES 1.0.1 spesifikasyonu, eklerde örnek kod içerir (daha fazla ayrıntı için bkz. Khronos OpenSL ES Registry). Ancak Ek B: Örnek Kod ve Ek C: Kullanım Alanı Örnek Kodu bölümlerindeki örneklerde Android tarafından desteklenmeyen özellikler kullanılmıştır. Bazı örneklerde yazım hataları da bulunur veya değişmesi muhtemel API'ler kullanılır. Bunlardan bahsederken dikkatli olun; kod tüm OpenSL ES standardını anlamada yardımcı olabilir ancak 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ını aşağıda bulabilirsiniz:

  • Kaynaklar: Ses dosyalarınızı res/raw/ klasörüne yerleştirdiğinizde, Resources ile ilişkili API'ler tarafından bu dosyalara kolayca erişilebilir. Ancak kaynaklara doğrudan yerel erişim yoktur. Bu nedenle, 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 yerel öğe yöneticisi API'lerinden doğrudan erişilebilir. Bu API'ler hakkında daha fazla bilgi için android/asset_manager.h ve android/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ı veri bulucuyla birlikte kullanır.
  • : Ses içeriğini doğrudan ağdan oynatmak için URI veri bulucuyu kullanabilirsiniz. Ancak Güvenlik ve izinler bölümünü okumayı unutmayın.
  • Yerel dosya sistemi: URI veri bulucu, dosyaların uygulama tarafından erişilebilir olması koşuluyla yerel dosyalar için file: şemasını destekler. Android güvenlik çerçevesinin, dosya erişimini Linux kullanıcı kimliği ve grup kimliği mekanizmaları aracılığıyla kısıtladığını unutmayın.
  • Kayıtlı: Uygulamanız, mikrofon girişinden ses verisi kaydedebilir, bu içeriği depolayabilir ve daha sonra oynatabilir. Örnek kod, Oynatma klibi için bu yöntemi kullanır.
  • Derlenmiş ve bağlanmış satır içi: Ses içeriğinizi doğrudan paylaşılan kitaplığa bağlayabilir, ardından arabellek sırası veri bulucusuna sahip bir ses çalar kullanarak dinleyebilirsiniz. Bu, en çok kısa PCM biçimli klipler için uygundur. Örnek kodda bu teknik Hello ve Android klipleri için kullanılmaktadır. PCM verileri, bin2c aracı (sağlanmadı) kullanılarak on altılık dizelere dönüştürüldü.
  • Gerçek zamanlı sentez: Uygulamanız, PCM verilerini anında sentezleyebilir ve ardından arabellek sırası veri bulucuya sahip bir ses çalar kullanarak bu verileri oynatabilir. Bu nispeten gelişmiş bir teknik olduğundan ses senteziyle ilgili ayrıntılar bu makalenin kapsamı dışındadır.

Not: Uygulamanız için yararlı ses içeriği bulma veya oluşturma konuları, bu makalenin kapsamında değildir. Daha fazla bilgi bulmak için etkileşimli ses, oyun sesi, ses tasarımı ve ses programlama gibi web arama terimlerini kullanabilirsiniz.

Dikkat: İçerikleri oynatmak veya kaydetmek için yasal izninizin olduğundan emin olmak sizin sorumluluğunuzdadır. İçerik kaydederken gizlilik göz önünde bulundurulabilir.

Kod örnekleri

Şu örnek uygulamaları GitHub sayfamızda bulabilirsiniz:

  • audio-echo, girişten çıkışa bir gidiş dönüş döngüsü oluşturur.
  • native-audio, basit bir ses kaydedici/çalardır.

OpenSL ES'nin Android NDK uygulaması, bazı yönlerden OpenSL ES 1.0.1 referans spesifikasyonundan farklıdır. Bu farklılıklar, doğrudan OpenSL ES referans spesifikasyonundan kopyaladığınız örnek kodun Android uygulamanızda çalışmamasının önemli bir nedenidir.

Referans spesifikasyonu ve Android uygulaması arasındaki farklar hakkında daha fazla bilgi için Android için OpenSL ES konusuna bakın.