Inizia

Questa sezione fornisce le informazioni necessarie per iniziare a utilizzare le API OpenSL ES.

Aggiungi OpenSL ES alla tua app

Puoi chiamare OpenSL ES sia dal codice C che da C++. Per aggiungere il set di funzionalità di base di OpenSL ES alla tua app, includi il file di intestazione OpenSLES.h:

#include <SLES/OpenSLES.h>

Per aggiungere le estensioni Android OpenSL ES, includi anche il file di intestazione OpenSLES_Android.h:

#include <SLES/OpenSLES_Android.h>

Quando includi il file di intestazioni OpenSLES_Android.h, vengono incluse automaticamente le seguenti intestazioni:

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

Nota: queste intestazioni non sono obbligatorie, ma vengono mostrate come supporto per l'apprendimento dell'API.

Crea ed esegui il debug

Puoi incorporare OpenSL ES nella tua build specificandolo nel file Android.mk che funge da makefile del sistema di build NDK. Aggiungi la seguente riga a Android.mk:

LOCAL_LDLIBS += -lOpenSLES

Per un debug efficace, ti consigliamo di esaminare il valore SLresult restituito dalla maggior parte delle API OpenSL ES. Puoi utilizzare gli assert o una logica di gestione degli errori più avanzata per il debug; nessuna delle due offre un vantaggio intrinseco per il lavoro con OpenSL ES, sebbene l'una o l'altra logica possano essere più adatte per un determinato caso d'uso.

Nei nostri esempi vengono utilizzate le dichiarazioni, perché aiutano a individuare condizioni non realistiche che indicherebbero un errore di programmazione. Abbiamo utilizzato la gestione esplicita degli errori per altre condizioni che hanno maggiori probabilità di verificarsi in produzione.

Molti errori dell'API comportano una voce di log, oltre a un codice risultato diverso da zero. Queste voci di log possono fornire ulteriori dettagli che si rivelano particolarmente utili per API relativamente complesse come Engine::CreateAudioPlayer.

Puoi visualizzare il log dalla riga di comando o da Android Studio. Per esaminare il log dalla riga di comando, digita quanto segue:

$ adb logcat

Per esaminare il log di Android Studio, seleziona Visualizza > Finestre degli strumenti > Logcat. Per ulteriori informazioni, consulta Scrivere e visualizzare log con Logcat.

Codice di esempio

Ti consigliamo di utilizzare codice di esempio supportato e testato che sia utilizzabile come modello per il tuo codice, che si trova nelle cartelle audio-echo e audio nativo del repository GitHub android-ndk.

Attenzione: la specifica OpenSL ES 1.0.1 contiene codice di esempio nelle appendici (per ulteriori dettagli, consulta il registro Khronos OpenSL ES). Tuttavia, gli esempi in Appendice B: codice di esempio e in Appendice C: codice di esempio per i casi d'uso utilizzano funzionalità non supportate da Android. Alcuni esempi contengono anche errori tipografici o utilizzano API che potrebbero cambiare. Procedi con cautela quando fai riferimento a questi elementi; sebbene il codice possa essere utile per comprendere l'intero standard OpenSL ES, non deve essere utilizzato così com'è con Android.

Contenuti audio

Di seguito sono riportati alcuni dei molti modi per pacchettizzare i contenuti audio per la tua applicazione:

  • Risorse: se inserisci i file audio nella cartella res/raw/, le API associate per Resources possono accedervi facilmente. Tuttavia, non esiste un accesso nativo diretto alle risorse, pertanto devi scrivere codice del linguaggio di programmazione Java per copiarlo prima dell'uso.
  • Asset: se posizioni i file audio nella cartella assets/, saranno accessibili direttamente dalle API native di asset Manager di Android. Consulta i file di intestazione android/asset_manager.h e android/asset_manager_jni.h per ulteriori informazioni su queste API. Il codice di esempio che si trova nel repository GitHub android-ndk utilizza queste API native degli asset manager in combinazione con il localizzatore di dati del descrittore di file Android.
  • Rete: puoi utilizzare il localizzatore di dati URI per riprodurre i contenuti audio direttamente dalla rete. Tuttavia, assicurati di leggere Sicurezza e autorizzazioni.
  • File system locale: il localizzatore di dati URI supporta lo schema file: per i file locali, a condizione che i file siano accessibili dall'applicazione. Tieni presente che il framework di sicurezza di Android limita l'accesso ai file tramite i meccanismi ID utente e ID gruppo di Linux.
  • Registrato. L'applicazione può registrare dati audio dall'ingresso del microfono, memorizzare questi contenuti e riprodurli in un secondo momento. Il codice di esempio utilizza questo metodo per il clip Riproduzione.
  • Compilato e collegato in linea: puoi collegare i tuoi contenuti audio direttamente alla libreria condivisa, quindi riprodurli utilizzando un lettore audio con un localizzatore di dati della coda di buffer. È la scelta più adatta per i clip PCM brevi. Il codice di esempio utilizza questa tecnica per i clip Hello e Android. I dati PCM sono stati convertiti in stringhe esadecimali utilizzando uno strumento bin2c (non fornito).
  • Sintesi in tempo reale: l'applicazione può sintetizzare i dati PCM al momento e riprodurli utilizzando un lettore audio con un localizzatore dei dati della coda del buffer. Questa è una tecnica relativamente avanzata e i dettagli della sintesi audio non rientrano nell'ambito di questo articolo.

Nota: la ricerca o la creazione di contenuti audio utili per la tua applicazione non rientra nell'ambito di questo articolo. Per trovare ulteriori informazioni, puoi utilizzare termini di ricerca web come audio interattivo, audio di giochi, design audio e programmazione audio.

Attenzione: è tua responsabilità verificare di possedere l'autorizzazione legale per riprodurre o registrare contenuti. Potrebbero esserci considerazioni relative alla privacy per la registrazione di contenuti.

Esempi di codice

Queste app di esempio sono disponibili nella nostra pagina GitHub:

  • audio-echo crea un loop di round trip da input a output.
  • native-audio è un semplice registratore/lettore audio.

L'implementazione NDK per Android di OpenSL ES differisce dalla specifica di riferimento per OpenSL ES 1.0.1 per diversi aspetti. Queste differenze sono un motivo importante per cui il codice campione copiato direttamente dalla specifica di riferimento di OpenSL ES potrebbe non funzionare nella tua app per Android.

Per ulteriori informazioni sulle differenze tra la specifica di riferimento e l'implementazione di Android, consulta OpenSL ES per Android.