我在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);
}
}
什么是计算正弦波的一个周期并将值作为数组中的短路,twopi和sinemax是先前定义的常数,而sigBuffer是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仿真器顺便工作,它不会去任何地方。
答案 0 :(得分:1)
我找不到关于sigbuffer
究竟是什么的任何细节,除了它似乎更多的是输出而不是输入通道。您的问题可能是HTC One / S4速度太快,sigbuffer
是DMA接口,因此数据在发送到音频子系统之前会被覆盖。看[这里的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);
}
答案 1 :(得分:0)
我在S4上也发现了这一点。非常讨厌。看起来像FloatMath仍然有效,虽然linter不推荐它,因为它更慢。遗憾的是没有找到更好的解决方案