Cómo utilizar OpenSL ES para programación de sonido en c4droid
El requisito previo para usar opensl es está en el código fuente:
#include lt; SLES/OpenSLES.hgt;, incluido el archivo de encabezado de opensl es
En gcc:
-lOpenSLES enlaza archivos de biblioteca l es
Los pasos son los siguientes:
1. Crea un motor de sonido
3. Configura el búfer de reproducción
opensl es opera principalmente la interfaz. En términos generales, tiene las siguientes interfaces:
. SLObjectItf: Interfaz de objeto,
SLEngineItf: Interfaz de motor
SLPlayItf: Interfaz de reproducción
SLBufferQueueItf: Interfaz de cola de búfer
SLEffectSendItf: Efecto de sonido interfaz de envío
SLMuteSoloItf: canal apagado/interfaz mono
SLVolumeItf: interfaz de volumen
Excepto slCreateEngine, esta función se utiliza para crear objetos de motor de sonido Excepto la interfaz , todas las demás operaciones se completan a través de las funciones miembro de la interfaz. Ahora estudiemos cómo inicializar el motor de sonido
La inicialización del motor de sonido requiere 3 interfaces y debemos declararlas como variables globales: < / p>
SLObjectItf _aud; /* Interfaz del objeto del motor de sonido*/
SLEngineItf _aud_eng; /* Motor de sonido*/
SLObjectItf _aud_mix /* Interfaz del objeto mezclador*/
Primero creamos la interfaz de objetos del motor de sonido:
slCreateEngine(amp;_aud, 0, NULL, 0, NULL, NULL);
La interfaz después de la creación no se puede usar inmediatamente. Primero debemos realizarlo (Realizarlo) a través de la subfunción de la interfaz:
(*_aud)-gt;Realize(_aud, SL_BOOLEAN_FALSE);/* Pasar _aud's The. Darse cuenta de que la subfunción implementa la interfaz de objeto del motor de sonido*/
Después de la implementación, tomamos el motor de sonido del objeto del motor de sonido. Aquí tomamos la interfaz (GetInterface) a través de la subfunción. de la interfaz el objeto es _aud, el tipo de captura es motor y la ubicación de memoria almacenada después de la captura es la ubicación del puntero de la interfaz del motor _aud_eng que declaramos anteriormente. Las instrucciones son las siguientes:
(*_aud)-gt; GetInterface(_aud, SL_IID_ENGINE, amp; _aud_eng);
El motor de sonido está inicializado
Tercero El siguiente paso es crear un objeto "mezclador de salida" desde el motor de sonido para que podamos reproducir el sonido.
Tenga en cuenta que, al igual que el objeto del motor de sonido, dado que el "mezclador de salida" es un objeto, debemos crearlo y luego implementarlo.
Dado que la creación del "Mezclador de salida" requiere dos parámetros de efectos de sonido al mismo tiempo, primero preparamos estos dos parámetros: el primer tipo de parámetro es el número de interfaz de sonido (SLInterfaceID), que es una matriz Podemos considerarlo como una lista de configuración de efectos de sonido, donde se colocan diferentes números de efectos de sonido.
El segundo parámetro es una matriz lógica: si se debe forzar el efecto de sonido correspondiente en el número de interfaz de sonido que se implementará. Si la lógica de un efecto de sonido es verdadera (SL_BOOLEAN_TRUE), se considerará que se ha creado el "mezclador de salida". falla cuando el efecto de sonido no se puede realizar; de lo contrario, el efecto de sonido se ignorará. Debido a que el hardware de sonido de Android admite diferentes efectos de sonido, es mejor no forzar la implementación, por lo que completamos todo SL_BOOLEAN_FALSE en la segunda matriz.
Ahora comenzamos a crear el "mezclador de salida". La reverberación ambiental (SL_IID_ENVIRONMENTALREVERB) es un efecto de sonido común. Usaremos este efecto de sonido de forma opcional.
Efecto SLInterfaceID[1] = {SL_IID_ENVIRONMENTALREVERB}; /*Efecto de sonido de eco ambiental*/
Efecto SLboolean_bool[1] = {SL_BOOLEAN_FALSE} /* Lógica de implementación forzada del efecto de sonido de eco; */
(*_aud_eng)-gt;CreateOutputMix(_aud_eng, amp;_aud_mix, 1, effect, effect_bool);/* Crea un "mezclador de salida" desde el motor de sonido */
(*_aud_mix)-gt;Realize(_aud_mix, SL_BOOLEAN_FALSE); /* Implementar el "mezclador de salida" recién creado */
De esta manera, se completa todo el trabajo de inicialización.
Obtenemos el siguiente código completo:
SLObjectItf _aud;/* Objeto de motor de sonido*/
SLEngineItf _aud_eng;/* Motor de sonido*/
SLObjectItf _aud_mix; / * Objeto mezclador de salida */
/* audio_init: Inicializar opensl es */
int audio_init ()
{
SLInterfaceID effect[1] = {SL_IID_ENVIRONMENTALREVERB}; /* Efecto de sonido*/
SLboolean effect_bool[1] = {SL_BOOLEAN_FALSE} /*Lógica de implementación de fuerza de efecto de sonido*/
slCreateEngine( amp ;_aud, 0, NULL, 0, NULL, NULL); /* Crear un objeto de motor de sonido*/
(*_aud)-gt; Realize(_aud, SL_BOOLEAN_FALSE); objeto del motor*/ /
(*_aud)-gt;GetInterface(_aud, SL_IID_ENGINE, amp;_aud_eng);/* Toma el motor de sonido del objeto del motor de sonido*/
(*_aud_eng) -gt; CreateOutputMix(_aud_eng, amp; _aud_mix, 1, effect, effect_bool); /* Crea un objeto mezclador de salida a través del motor de sonido y, opcionalmente, habilita el efecto de reverberación ambiental */
( *_aud_mix)-gt;Realize(_aud_mix, SL_BOOLEAN_FALSE);/* Implementar el objeto mezclador*/
}
Después de inicializar el motor, también necesitamos crear un objeto reproductor. , Puede generar sonido en el reproductor
El objeto del reproductor es el mismo que el mezclador de salida. Es un objeto y debe implementarse después de la creación:
SLObjectItf _aud_plyobj /*. Objeto reproductor */
(*_aud_eng)-gt;CreateAudioPlayer(_aud_eng, amp;_aud_plyobj, amp;sndsrc, amp;sndsnk, 3, ids, req);
/* Esta es la función para crear el objeto reproductor de sonido aud_plyobj*/
Simplemente complete las posiciones del puntero del motor de sonido y del motor del reproductor en los dos primeros parámetros
Lo que realmente necesitamos completar in son los siguientes cuatro parámetros:
sndsrc: fuente de datos de sonido
sndsnk: grupo de salida de sonido (sumidero de datos), que es el dispositivo de salida de sonido
3 : Número de lista de funciones, queremos que el reproductor admita 3 funciones
ids: Lista de funciones, queremos que el reproductor admita las funciones
req: Lógica de aplicación de funciones