ठीक है तो मैं एक आवृत्ति जनरेटर जो हार्डवेयर के लिए पीसीएम डेटा भेजने के लिए audiotrack का उपयोग करता है। यहाँ कोड मैं उस के लिए उपयोग कर रहा हूँ है:एंड्रॉयड audiotrack बफरिंग समस्याओं
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;
}
}
आवृत्ति एक स्लाइड बार से जुड़ा हुआ है, और सही मान नमूना पीढ़ी पाश में सूचना दी जा रही है। जब मैं ऐप शुरू करता हूं तो सबकुछ ठीक और बेवकूफ होता है। जब आप स्लाइड बार के साथ अपनी अंगुली खींचते हैं तो आपको एक अच्छी व्यापक ध्वनि मिलती है। लेकिन इसके साथ खेलने के लगभग 10 सेकंड के बाद, ऑडियो अजीब हो जाना शुरू होता है। एक चिकनी स्वीप के बजाय, यह घबरा गया है, और केवल हर 1000 हर्ट्ज या उसके आसपास टोन बदलता है। इस पर क्या विचार हो सकता है पर कोई विचार?
यहाँ मामले में सभी कोड है समस्या कहीं और झूठ:
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
}
}
आपके सवाल का सीधे जवाब दे नहीं लेकिन एक पक्ष नोट के रूप में, ध्यान दें प्रगति बार और स्ट्रीमिंग के साथ एक ज्ञात मुद्दा यह है कि: http://code.google.com/p/android/issues/detail?id=4124 हालांकि आपकी समस्या प्रगति पट्टी के साथ ही नहीं बल्कि ऑडियो स्ट्रीम के साथ है। इसलिए, आपकी समस्या का समाधान नहीं है, लेकिन जब से आप ऑडियो स्ट्रीम के साथ काम करते हैं, तो आपको अवगत होना चाहिए कि इसमें एक या अधिक खुली बग हैं। –
मुझे बिल्कुल वही समस्या है। बड़ा बफर है, बाद में कूदना शुरू होता है। लॉग में मैं बहुत लंबे जीसी देखता हूं (जीसी ने 4200 एमएमएस में 180 वस्तुओं को साफ किया)। मैं कोई आवंटन नहीं कर रहा हूं। डीडीएमएस आवंटन ट्रैकर में ऐसा लगता है कि ऑडियोट्रैक ही आवंटन कर रहा है। यकीन नहीं है कि जीसी को कूदने के साथ क्या करना है। क्या आपने इसे हल किया है? –
क्या आपने कभी अपना "ऑडियोटैक" साफ़ किया है? यह एक स्मृति संबंधित मुद्दा हो सकता है –