我在 Android Play 商店中有两个应用程序,到目前为止都没有问题。最近有一项功能在 HTC one 和 Galaxy S4 上不起作用。我已经能够在运行 Android 4.1.2 版的 HTC 上试用它。违规代码如下:
public void loadsine(){
for (int j=0; j<44100; j++){
double val = Math.sin(twopi*j/44100);
AndroidAudioDevice.sigBuffer[j]= (short) (val*sinemax);
}
}
它所做的是计算一个正弦波的一个周期,并将值作为一个 short 放在一个数组中,twopi 和 sinemax 是先前定义的常量,而 sigBuffer 是 short 的数组 44100 长。
除了在 HTC one 和 S4 上数组用零填充外,这工作正常。我发现我可以通过在循环中浪费一些处理周期来使其工作,如下所示:
public void loadsine(){
for (int j=0; j<44100; j++){
double val = Math.sin(twopi*j/44100); //val between -1 and +1
AndroidAudioDevice.sigBuffer[j]= (short) (val*sinemax);
for (int i=0; i<4; i++){}
}
}
例如,除了无用的 for 循环,我还可以写入调试窗口。这是怎么回事,是 HTC 和/或三星的覆盖导致问题还是 4.1.2 问题。顺便说一句,我无法让 4.1.2 模拟器工作,它哪儿也去不了。
最佳答案
我找不到关于 sigbuffer
到底是什么的任何详细信息,除了它似乎更像是一个输出 channel 而不是输入 channel 。你的问题可能是 HTC One/S4 太快了,而 sigbuffer
是一个 DMA 接口(interface),所以数据在发送到音频子系统之前就被覆盖了。查看 [此处的 API](http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/audio/AudioDevice.html#writeSamples(short[], int, int)),也许您会更好:
public void loadsine(){
short values[44100];
for (int j=0; j<44100; j++){
double val = Math.sin(twopi*j/44100);
values[j] = (short) (val*sinemax);
}
androidAudioDevice.writeSamples(values, 0, 44100);
}
关于android - 数组在 HTC One/Galaxy S4 上使用 Android 4.1.2 写入全零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17269394/