2

我在 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 是44100 long 的short 数组。

这工作正常,除了在 HTC 1 和 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 模拟器工作,它哪儿也去不了。

4

2 回答 2

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);
}
于 2013-06-26T05:21:43.117 回答
0

我在 S4 上也发现了这个。非常烦人。似乎 FloatMath 仍然有效,尽管 linter 不推荐它,因为它速度较慢。不幸的是没有找到更好的解决方法

于 2013-09-18T21:34:09.220 回答