关于“用Android播放任意音调”

时间:2013-07-03 04:33:47

标签: android audio

无法找到如何向Steve Pomeroy提出有关“使用Android播放任意语气”的问题,因此开始使用here

是否需要将任何代码添加到xml文件中? 无法让SIM卡发出声音。

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_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length,
            AudioTrack.MODE_STATIC);
    audioTrack.write(generatedSnd, 0, generatedSnd.length);
    audioTrack.play();
}
}

有类似的东西:

activity android:soundEffectsEnabled="true" 

或  uses-permission android:name="android.permission.WRITE_SETTINGS"

需要添加,以便上面的代码会在模拟器中发出声音,比如eclipse?

我添加了活动android:soundEffectsEnabled =“true”并使用-permission android:name =“android.permission.WRITE_SETTINGS”/,但仍然不会发出声音。

认为它是声音的持续时间,因为当持续时间设置为10而不是1时,它会发出哔哔声,但非常短暂。但是,在第三次运行它之后,抛出了inflateException。

超过500的持续时间会导致内存不足错误,这是异常情况。然而,100的持续时间仍然只会发出很短的哔哔声,可以听到大麦的声音,鼠标点击更响亮。

超过250的持续时间是记忆拥抱。

持续时间为10,持续时间为250,持续时间为250。 generatedSnd.length为10使得clickSnd.length长度为15k 已将freqOfTone从100更改为55000。

仍然无法弄清楚如何让声音更长。

1 个答案:

答案 0 :(得分:0)

添加

    int x = 0;
    // Montior playback to find when done
    do
    {                                                     
         if (audioTrack != null) 
             x = audioTrack.getPlaybackHeadPosition(); 
         else 
             x = numSamples;            
    }
    while (x<numSamples);

    // Track play done. Release track.
    if (audioTrack != null) audioTrack.release();

后 audioTrack.play(); 在第一次运行后停止短暂点击。

现在我必须找出为什么当我改变freqOfTone时它不起作用。