gpt4 book ai didi

android - 关于 "Playing an arbitrary tone with Android"

转载 作者:行者123 更新时间:2023-12-03 02:36:16 25 4
gpt4 key购买 nike

找不到如何提出关于 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 等模拟器中发出声音?

我添加了 Activity android:soundEffectsEnabled="true"和使用权限 android:name="android.permission.WRITE_SETTINGS"/,但仍然不会发出声音。

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

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

超过 250 的持续时间是一个内存拥抱。

持续时间为 10 的点击时间与持续时间为 250 的点击时间一样长。
generatedSnd.length 为 10 与 generateSnd.length 为 15k 一样长
已将 freqOfTone 从 100 更改为 55000。

还是想不出怎么让声音变长。

最佳答案

添加

    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 时它​​不起作用。

关于android - 关于 "Playing an arbitrary tone with Android",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17439730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com