1. soma-web, 22.07.2011 #1
    soma-web

    soma-web Threadstarter App-Anbieter (kostenpfl.)

    Hi AH Community,
    ich hab ein Problem mit dem Soundpool, ich will einen Ton abspielen sobald der Wert des Lichtsensors unter einen bestimmten Wert fällt. Das Problem dabei ist, dass der Wert sehr oft schwankt und somit der Ton öfters übereinander abgespielt wird.

    Code:
    SensorEventListener lightSensorEventListener
        = new SensorEventListener(){
    ..
    public void onSensorChanged(SensorEvent arg0) {
    ..
     if(start == true){
    		   if(arg0.values[0] < Threshold){
    			    float actualVolume = (float) audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
    	   			float maxVolume = (float) audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
    	   			float volume = actualVolume / maxVolume;
    	   			// Is the sound loaded already?
    	   			if (loaded) {
    	   				soundPool.play(soundID, volume, volume, 1, 0, 1f);
    	   				Log.e("Test", "Played sound");
    	   			}
    	   		}
    	   }else{
    		   
    	   }
    	   
       }};
    
    Wie gesagt das Problem ist, dass er beim schnellen Schwanken des Sensorwertes den Sound übereinander abspielt. Das ist aber unschön.
    Kann ich beim SoundPool irgendwie abfragen, ob zur zeit etwas gespielt wird und darauf reagieren? Oder sollte man das irgdendwie anders lösen?

    Danke euch!

    Gruß Soma
     
  2. computer_freak, 22.07.2011 #2
    computer_freak

    computer_freak Gewerbliches Mitglied

    Wenn der Sound gestartet wird, merkst du dir die aktuelle Zeit.
    Wird der Sound erneut versucht zu starten, testest du ob die Laenge des Sounds vergangen ist, seit der sound das letzte mal gestartet hat.

    Vorraussetzung hierfuer ist, dass du die Laenge des Soundes hast.
     
  3. soma-web, 22.07.2011 #3
    soma-web

    soma-web Threadstarter App-Anbieter (kostenpfl.)

    Danke, aber hab es jetzt mit nem MediaPlayer gelöst:

    Code:
    boolean completed = true;
    MediaPlayer mMediaPlayer;
    
     @Override
       public void onCreate(Bundle savedInstanceState) {
    ...
    //MEDIAPLAYER
    		mMediaPlayer = MediaPlayer.create(this, R.raw.alarm_1);
    		mMediaPlayer.setLooping(false);
    		mMediaPlayer.setOnCompletionListener(complete);
    }
    //Listener wenn Song vorbei ;)
    private OnCompletionListener complete = new OnCompletionListener(){
    	   public void onCompletion(MediaPlayer arg0){
    		   completed =  true;
    	   }
       };
    //z.b. beim Button event
    private OnClickListener btListener = new OnClickListener()
       {
       	public void onClick(View v){   	
       		
       		if(completed){   		
       		mMediaPlayer.start();
       		completed = false;
       		}
               }
    };
    
     
  4. computer_freak, 22.07.2011 #4
    computer_freak

    computer_freak Gewerbliches Mitglied

    Jop, hier hast du zur erleichterung den onCompletionListener.
    Du brauchst uebrigens keine variable "completed",
    der MediaPlayer kommt bereits mit einer Methode "isPlaying()", die du einsetzen kannst.
     
    soma-web gefällt das.
  5. soma-web, 22.07.2011 #5
    soma-web

    soma-web Threadstarter App-Anbieter (kostenpfl.)

    Aaah noch besser.
    Werd ich demnächst Umsetzen danke!