soundpool ile anlık Rate ve balance değiştirmek
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.