SORU
9 Mart 2010, Salı


Oyun Android ile keyfi bir ton

Android keyfi frekanslı bir ses yayan yapmak için herhangi bir yolu (yani, önceden kaydedilmiş ses dosyaları var istemiyorum) var mı?

Etrafıma baktım ve ToneGenerator çok yakındı, ama sadece standart SESLERDİR bu sesleri çıkış kapasitesine sahip gibi görünüyor bulabildiğim tek şey buydu.

Herhangi bir fikir?

CEVAP
16 EYLÜL 2010, PERŞEMBE


Ben aslında bir blog this example code buldum, ama bazı korkunç sesler oluşturan bazı hatalar vardı. Hataları düzelttim ve işte sonuç koduyla gönderildi. Benim için iyi iş gibi görünüyor

public class PlaySound extends Activity {
    // originally from http://marblemice.blogspot.com/2010/04/generate-and-play-tone-in-android.html
    // and modified by Steve Pomeroy <steve@staticfree.info>
    private final int duration = 3; // seconds
    private final int sampleRate = 8000;
    private final int numSamples = duration * sampleRate;
    private final double sample[] = new double[numSamples];
    private final double freqOfTone = 440; // hz

    private final byte generatedSnd[] = new byte[2 * numSamples];

    Handler handler = new Handler();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    @Override
    protected void onResume() {
        super.onResume();

        // Use a new tread as this can take a while
        final Thread thread = new Thread(new Runnable() {
            public void run() {
                genTone();
                handler.post(new Runnable() {

                    public void run() {
                        playSound();
                    }
                });
            }
        });
        thread.start();
    }

    void genTone(){
        // fill out the array
        for (int i = 0; i < numSamples;   i) {
            sample[i] = Math.sin(2 * Math.PI * i / (sampleRate/freqOfTone));
        }

        // convert to 16 bit pcm sound array
        // assumes the sample buffer is normalised.
        int idx = 0;
        for (final double dVal : sample) {
            // scale to maximum amplitude
            final short val = (short) ((dVal * 32767));
            // in 16 bit wav PCM, first byte is the low order byte
            generatedSnd[idx  ] = (byte) (val & 0x00ff);
            generatedSnd[idx  ] = (byte) ((val & 0xff00) >>> 8);

        }
    }

    void playSound(){
        final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                sampleRate, AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length,
                AudioTrack.MODE_STATIC);
        audioTrack.write(generatedSnd, 0, generatedSnd.length);
        audioTrack.play();
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • brokenbellsVEVO

    brokenbellsV

    11 EYLÜL 2009
  • NewsyTech

    NewsyTech

    2 AĞUSTOS 2010
  • Orson Wang

    Orson Wang

    28 EKİM 2006