Soru & Cevap

soundpool ile anlık Rate ve balance değiştirmek

04.12.2014 - 10:08

Uyğulamamda Seekbar yardımıyla kullandığım müzigin rate,speed veya balance ayarlarını değiştirmeyi hedefliyorum. Bunun için soundpool ile gerekli işlemleri yaptığımda "anlık" değişim yerine müzik yeniden başladığında değişim sağlanıyor. Hedefim Seekbar'da değişiklik olduğu zaman "anlık" değişimin olması.Bu konuda yardım edebilecek veya çalışmam için kaynak gösterebilecek var mı?

SoundManager.java

[code]

public class SoundManager 
{
    private Context pContext;
    private SoundPool sndPool;
    private float rate = 1.0f;
    private float masterVolume = 1.0f;
    private float leftVolume = 1.0f;
    private float rightVolume = 1.0f;
    private float balance = 0.5f;
    
    // Constructor, setup the audio manager and store the app context
    public SoundManager(Context appContext)
    {
      sndPool = new SoundPool(16, AudioManager.STREAM_MUSIC, 100);
       pContext = appContext;
    }
    
    // Load up a sound and return the id
    public int load(int sound_id)
    {
        return sndPool.load(pContext, sound_id, 1);
    }
    
    // Play a sound
    public void play(int sound_id)
    {
        sndPool.play(sound_id, leftVolume, rightVolume, 1, 0, rate);     
    }    
    
    // Set volume values based on existing balance value
    public void setVolume(float vol)
    {
        masterVolume = vol;
        
        if(balance < 1.0f)
        {
            leftVolume = masterVolume;
            rightVolume = masterVolume * balance;
        }
        else
        {
            rightVolume = masterVolume;
            leftVolume = masterVolume * ( 2.0f - balance );
        }

    }
    
    public void setSpeed(float speed)
    {
        rate = speed;
        
        // Speed of zero is invalid 
        if(rate < 0.01f)
            rate = 0.01f;
        
        // Speed has a maximum of 2.0
        if(rate > 2.0f)
            rate = 2.0f;
    }
    
    public void setBalance(float balVal)
    {
        balance = balVal;
        
        // Recalculate volume levels
        setVolume(masterVolume);
    }
    

    
    // Free ALL the things!
    public void unloadAll()
    {
        sndPool.release();        
    }
    public void setStop(int sound_id)
    {
        sndPool.stop(sound_id);
    }

[/code]

 

MainActivity.java

[code]

 

snd = new SoundManager(getApplicationContext());

bses3 = snd.load(raw.scratch_1);

barChange = new OnSeekBarChangeListener() {
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }

            @Override
            public void onProgressChanged(SeekBar seekBar, int progress,
                    boolean fromUser) {
                switch (seekBar.getId()) {
                case R.id.VolBar1:
                    snd.setVolume((float) progress / 100.0f);
                    break;

                case R.id.BalBar:
                    snd.setBalance((float) progress / 100.0f);
                    break;

                case R.id.SpeedBar:
                    snd.setSpeed((float) progress / 100.0f);
                    break;

                }
            }
        };

[/code]

 

 

Kod kısmı uzun olduğu için gerekli yerleri yapıştırdım. Eksik veya gözden kaçmış birşey varsa söylerseniz ekleyebilirim.

7 Görüntülenme

1 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-399-1379511904.jpg
halil
12.05.2014 - 05:44


Selam tamamen farazi olarak müziğin değişiklik yapıldığı saniyesini alıp, yeniden başa aldığında o zamana yerleştirmeyi denedin mi?