2013-06-24 20 views
2

我在Android Play商店中有兩個應用程序,至今尚未有任何問題。最近有一個功能在HTC One和Galaxy S4上沒有工作。我已經能夠在Android 4.1.2版本上運行的HTC上試用它。有問題的代碼如下:陣列在HTC One/Galaxy S4上使用Android 4.1.2編寫全零字符

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的一個和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++){} 
    } 
} 

而不是無用的環我也可以寫例如調試窗口。發生什麼事情是HTC和/或三星的覆蓋問題,或者是4.1.2的問題。我無法讓4.1.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); 
} 
+0

謝謝您的回答。實際上,sigBuffer只是一個長度爲44100的短路陣列。這個例程只用一個週期的輸出信號來填充sigBuffer陣列。信號生成例程然後將sigBuffer數組中的選擇值複製到Android trackbuffer以實際生成信號。這也可以在HTC one和S4上正常工作 – user2514931

0

我在S4上也發現了這個。非常討厭。看起來像FloatMath仍然有效,雖然linter不推薦它,因爲它比較慢。遺憾的是還沒有找到更好的修復方案