Tamam, PCM verilerini donanıma göndermek için AudioTrack kullanan bir frekans üretecim var. İşte bunun için kullanıyorum kodu:Android AudioTrack arabelleğe yükleme sorunları
private class playSoundTask extends AsyncTask<Void, Void, Void> {
float frequency;
float increment;
float angle = 0;
short samples[] = new short[1024];
@Override
protected void onPreExecute() {
int minSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,
minSize, AudioTrack.MODE_STREAM);
track.play();
}
@Override
protected Void doInBackground(Void... params) {
while(Main.this.isPlaying)
{
for(int i = 0; i < samples.length; i++)
{
frequency = (float)Main.this.slider.getProgress();
increment = (float)(2*Math.PI) * frequency/44100;
samples[i] = (short)((float)Math.sin(angle)*Short.MAX_VALUE);
angle += increment;
}
track.write(samples, 0, samples.length);
}
return null;
}
}
frekans bir kayma çubuğu bağlıdır ve doğru değer örnek nesil döngü içinde rapor ediliyor. Uygulamayı başlattığımda her şey yolunda ve iyi. Parmağınızı kaydırma çubuğu boyunca sürüklediğinizde hoş bir süpürme sesi alırsınız. Ancak, yaklaşık 10 saniyelik bir oyun oynadıktan sonra, ses kaygılanmaya başlar. Pürüzsüz bir süpürme yerine, sarsılmış ve sadece her 1000 Hz civarında bir ton değiştirir. Buna neyin sebep olacağı konusunda bir fikrin var mı?
Burada sorun başka bir yerde yatıyor durumunda tüm kod:
public class Main extends Activity implements OnClickListener, OnSeekBarChangeListener {
AudioTrack track;
SeekBar slider;
ImageButton playButton;
TextView display;
boolean isPlaying=false;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
display = (TextView) findViewById(R.id.display);
display.setText("5000 Hz");
slider = (SeekBar) findViewById(R.id.slider);
slider.setMax(20000);
slider.setProgress(5000);
slider.setOnSeekBarChangeListener(this);
playButton = (ImageButton) findViewById(R.id.play);
playButton.setOnClickListener(this);
}
private class playSoundTask extends AsyncTask<Void, Void, Void> {
float frequency;
float increment;
float angle = 0;
short samples[] = new short[1024];
@Override
protected void onPreExecute() {
int minSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,
minSize, AudioTrack.MODE_STREAM);
track.play();
}
@Override
protected Void doInBackground(Void... params) {
while(Main.this.isPlaying)
{
for(int i = 0; i < samples.length; i++)
{
frequency = (float)Main.this.slider.getProgress();
increment = (float)(2*Math.PI) * frequency/44100;
samples[i] = (short)((float)Math.sin(angle)*Short.MAX_VALUE);
angle += increment;
}
track.write(samples, 0, samples.length);
}
return null;
}
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
display.setText(""+progress+" Hz");
}
public void onClick(View v) {
if (isPlaying) {
stop();
} else {
start();
}
}
public void stop() {
isPlaying=false;
playButton.setImageResource(R.drawable.play);
}
public void start() {
isPlaying=true;
playButton.setImageResource(R.drawable.stop);
new playSoundTask().execute();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onStop() {
super.onStop();
//Store state
stop();
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
}
doğrudan sorunuzu yanıtlamıyor, ancak yan not olarak, ilerleme çubuğu ve akış ile ilgili bilinen bir sorun olduğunu unutmayın: http://code.google.com/p/android/issues/detail?id=4124 Sorununuz ilerleme çubuğunun kendisiyle değil, ses akışında. Eğer ses akışı ile çalışmak beri nedenle, sorununuza bir çözünürlük, ancak, bunun bir veya daha fazla açık böcek olduğunu bilmelidir. –
ben de aynı sorun var. Tampon ne kadar büyükse, daha sonra atlama başlar. günlüğüne çok uzun GC'ler bir çok (GC 4200ms 180 nesneleri temizlenmiş) bakınız. Ben herhangi bir tahsis yapıyorum. DDMS ayırma izleyicisinde, AudioTrack'in kendisinin tahsisat yaptığı görülmektedir. GC'lerin atlama ile ilgisi olup olmadığından emin değil. Bunu çözdün mü? –
Hiç "AudioTrack" temizlerim? bellekle ilgili bir sorun olabilir –