1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[ANDROID] play little sound

Discussão em 'Programação' iniciada por carvaljo2707, 1 de Março de 2013. (Respostas: 6; Visualizações: 658)

  1. carvaljo2707

    carvaljo2707 Power Member

    boas, estou a tentar que o programa reproduza um som muito pequeno, tipo uma sirene..

    o codigo que usei é este:
    Código:
    private void playSound() {
             soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
             soundPool.load(this,R.raw.correct,1);
             float fSpeed = 1.0f;
              AudioManager mgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
              float streamVolumeCurrent = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);
              float streamVolumeMax = mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
              float volume = streamVolumeCurrent / streamVolumeMax; 
              soundPool.play(R.raw.correct, volume, volume, 1, 0, fSpeed);
            
        }
    mas o programa corre e não se houve nada :/
    alguem me sabe explicar porque ou uma maneira mais inteligente de fazer isto?

    obrigado
     
  2. perinhas

    perinhas What is folding?

    Estive a testar esse código e o problema é que os sons precisam de ser carregados primeiro para a memória antes de serem reproduzidos. Não podemos fazer simplesmente load e play a seguir. A solução é iniciar a soundpool mais cedo com o som que queres reproduzir (por exemplo no construtor) ou adicionar artificialmente algum delay entrou o load e o play.
    Outra solução é implementar o SoundPool.setOnLoadCompleteListener para verificar quando é que o load dos sons terminou.

    Código:
    public class MainActivity extends Activity {
    
    	Button click;
    	SoundPool soundPool;
    	boolean loaded = false;
    	private int mySound;
    
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    
    
    		click = (Button) this.findViewById(R.id.click);
    
    
    		soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
    		mySound = soundPool.load(this,R.raw.yes,1);
    
    
    		soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
    			public void onLoadComplete(SoundPool soundPool, int sampleId,int status) {
    				loaded = true;
    			}
    		});
    
    
    		click.setOnClickListener(new OnClickListener() {
    
    
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				playSound();
    			}
    		});
    	}
    
    
    	private void playSound() {
    
    
    		if(loaded)
    		{
    			float fSpeed = 1.0f;
    			AudioManager mgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
    			float streamVolumeCurrent = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);
    			float streamVolumeMax = mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
    			float volume = streamVolumeCurrent / streamVolumeMax; 
    			soundPool.play(mySound, volume, volume, 1, 0, fSpeed);
    		}
    	}
     
  3. carvaljo2707

    carvaljo2707 Power Member

    então como é que eu ja vi apps em que o som é instantaneo? :/
     
  4. perinhas

    perinhas What is folding?

    O som nesse caso em cima é instantâneo...só tens de fazer load dos sons o mais cedo possível, depois de carregados para a memória é sempre a dar-lhe :)
     
  5. carvaljo2707

    carvaljo2707 Power Member

    então , sendo assim posso carregar na main activity e depois chamo-o? xd
     
  6. perinhas

    perinhas What is folding?

    Não sei como está o teu código, mas no OnCreate() da main seria uma hipótese :P podes encarar isto como aqueles ecrãs de loading, ou assim, carregar primeiro para depois usar sem falhas.
     
  7. nunoemanuel

    nunoemanuel Power Member

    Se tiveres a certeza que o som irá ser tocado, podes carregá-lo no onCreate() sim.
     

Partilhar esta Página