IDIOMAS

Google-Translate-Chinese Google-Translate-Spanish to French Google-Translate-Spanish to German Google-Translate-Spanish to Japanese Google-Translate-Spanish to English Google-Translate-Spanish to Russian Google-Translate-Spanish to Portuguese Google-Translate-Spanish to Italian

martes, 24 de marzo de 2015

Sonido en Android Studio: clase SOUNDPOOL.

La SOUNPOOL CLASS es sin duda la clase más utilizada para reproducir archivos de audio en dispositivos Android por la inmediatez en que el sistema llama a estos archivos y la posibilidad de reproducción de múltiples sonidos a la vez.

SOUNPOOL en inglés significa "piscina de sonido". Así define el espacio en la memoria donde se "llena" de los archivos que vamos a utilizar para la reproducción. De ahí su inmediatez, ya que permanecen preparados para su uso reduciéndose el lag ( latencia ). Esta clase utiliza también el servicio MEDIAPLAYER.

Esta CLASS es la más utilizada en vídeo juegos para lanzar sonidos de animales, explosiones, ruidos, efectos... Los archivos que ejecuta no superan 1 MB de memoria, siendo mucho menos lo recomendable para no sobrepasar la capacidad del Theard donde trabajamos. También nos pernite hacer sonar varios Streams simultáneamente como hemos mencionado anteriormente.

Podemos elaborar el Constructor y modificar los atributos y parámetros completamente a nuestro antojo, además de poder reproducir archivos en diferentes formatos de archivo, siendo .ogg el formato preferido y recomendable en SOUNDPOOL. Los archivos WAV dan algun que otro problema.

(más información en http://developer.android.com/reference/android/media/SoundPool.html).

Os muestro algunos ejemplos con los que podemos operar con esta CLASS.


Esta linea de código es para el método ONCLICKLISTENER y ONLOADCOMPLETELISTENER desde una carpeta RAW:



package com.example.cinta.myapplication;

import android.media.AudioManager;
import android.media.SoundPool;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;


public class MainActivity extends ActionBarActivity {

    Button play;
    int soundId;
    SoundPool sp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        play = (Button) findViewById(R.id.bt_play);
        sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 1);
        soundId = sp.load(this, R.raw.ejemploaudio, 1);

        play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sp = new SoundPool(16, AudioManager.STREAM_MUSIC, 0);
                sp.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {

                    @Override
                    public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                        soundPool.play(soundId, 1f, 1f, 1, 0, 1f); //.play nos pide el int de nuestra canción, un //int float de volumen tanto derecho como izquierdo que van de 0.0=0% a 1.0=100%, el int de loop //donde -1 es reproducción en loop, 0 reproduce una vez y 1 repite sólo una vez, y por último tenemos //un int de Rate que va de 0.5 a 2 y modifica la velocidad de pitch donde 1.0 seria la velicidad normal
                    }
                });

            }
        });
        sp.load(this,R.raw.ejemploaudio, 1);
    } 



Este es un ejemplo con un método ONCLICK asignado por nosotros con el nonbre play_sound al botón:



package com.example.cinta.myapplication;

import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.media.AudioManager;
import android.media.SoundPool;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;


public class MainActivity extends ActionBarActivity {

    Button play;
    SoundPool sp;
    int soundId;
 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

     
        play = (Button) findViewById(R.id.bt_play);
        sp = new SoundPool(1,AudioManager.STREAM_MUSIC,1);
        soundId = sp.load(this, R.raw.ejemploaudio, 1);

        }

    public void play_sound(View view) {

      sp.play(soundId,1,1,1,0,0);
}



Este es un ejemplo con GETASSETS y ASSETSFILEDESCRIPTOR en una carpeta ASSETS:



package com.example.cinta.myapplication;

import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.media.AudioManager;
import android.media.SoundPool;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import java.io.IOException;


public class MainActivity extends ActionBarActivity {

    Button play;
    AssetManager   assetManager;
    SoundPool sp;
    int soundId;
    AssetManager AM;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        play = (Button) findViewById(R.id.id_bt_play);
        sp = new SoundPool(1,AudioManager.STREAM_MUSIC,1);
     
        AM = getAssets();
        AssetFileDescriptor sound1 = null;
        try {
            sound1 = AM.openFd("ejemploaudio");
        } catch (IOException e) {
            e.printStackTrace();
        }

        soundId = sp.load(sound1,1);

}

 play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sp = new SoundPool(16, AudioManager.STREAM_MUSIC, 0);
                sp.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {

                    @Override
                    public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                        sp.play(soundId, 1f, 1f, 1, 0, 1f);
                    }
                });

            }
        });
        sp.load(sound1,1);
    }




El Contructor para las diferentes versiones de SDK ( API 21 ) es:

//dentro de OnCreade
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            AudioAttributes aa = new AudioAttributes.Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .setUsage(AudioAttributes.USAGE_MEDIA)
                    .build();

            sp = new SoundPool.Builder()
                    .setMaxStreams(1)
                    .setAudioAttributes(aa)
                    .build();
            soundId = sp.load(this, R.raw.ejemploaudio, 1);

        } else {
            sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 1);
            soundId = sp.load(this, R.raw.ejemploaudio, 1);
        }
//después podemos llamar a .setOnClickListener


Saludos a tod@s y gracias por la visita!


2 comentarios:

  1. Perdón por la ignorancia pero soy nuevo en AS.
    Cuando dices "Esta linea de código es para el método ONCLICKLISTENER y ONLOADCOMPLETELISTENER desde una carpeta RAW:" osea creo la carpeta RAW, y dentro de esa carpeta que hago? donde encuentro el "metodo"?
    Gracias

    ResponderEliminar