android - 数组在 HTC One/Galaxy S4 上使用 Android 4.1.2 写入全零

标签 android libgdx

我在 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/

相关文章:

java - LibGDX - 如何添加背景图片

android - Listview改变键盘打开其他 View 的位置

java - Android 相机在人像模式下保存图片

Android:以编程方式更改应用程序标签?

android - 在 libgdx 中构建一个一侧带有纹理的盒子 - 性能

java - Libgdx-如何缩放动画

java - Kotlin 房间 :Entities and Pojos must have a usable public constructor

android - 返回键弹出 fragment 显示重叠 fragment

java - 如何从像素数组在 libGDX 中创建图像文件

ios - 使用RoboVM和IDEA部署iOS libGDX游戏时出现UnsatisfiedLinkError