2017-02-20 65 views
0

我正在尝试(重新)创建一个前段时间使用原始TarsosDSP项目的分支进行编码的声学调谐器,使其可用于Android。这一次,我使用JorenSix更新的TarsosDSP for Android项目,据我所知,我没有改变我以前的代码中的任何结构重要的东西,但是当我尝试运行该应用程序时,我收到以下错误:TarsosDSP for Android AudioRecord对象不是从LibGDX项目内初始化

E/AudioRecord: AudioFlinger could not create record track, status: -1 
E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed with status -1. 
E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object. 
D/libEGL: eglTerminate EGLDisplay = 0x7f90cf2e28 
E/AndroidRuntime: FATAL EXCEPTION: GLThread 2218 
       Process: com.fraserjohnstone.tuner, PID: 19923 
       java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord. 
        at android.media.AudioRecord.startRecording(AudioRecord.java:943) 
        at be.tarsos.dsp.io.android.AudioDispatcherFactory.fromDefaultMicrophone(Unknown Source) 
        at com.fraserjohnstone.tuner.screens.TunerScreen.initTuner(TunerScreen.java:238) 
        at com.fraserjohnstone.tuner.screens.TunerScreen.show(TunerScreen.java:123) 
        at com.badlogic.gdx.Game.setScreen(Game.java:61) 
        at com.fraserjohnstone.tuner.screens.SplashScreen.goToTunerScreen(SplashScreen.java:148) 
        at com.fraserjohnstone.tuner.screens.SplashScreen.render(SplashScreen.java:131) 
        at com.badlogic.gdx.Game.render(Game.java:46) 
        at com.fraserjohnstone.tuner.Tuner.render(Tuner.java:73) 
        at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:459) 
        at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1649) 
        at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1354) 
E/AndroidGraphics: waiting for pause synchronization took too long; assuming deadlock and killing 

我初始化在从构造函数调用的方法initTuner()调谐器:

private void initTuner(){ 
    if(dispatcher == null){ 
       //set initial tuner values 
       algo = PitchEstimationAlgorithm.FFT_YIN; 
       currentHertz = 440.00;    
       sampleRate = 44100;     
       bufferSize = 2048;    
       sampleOverlap = 1536;    
       offsetInCents = 0;     
       sharpOrFlat = "";     
       targetNote = "A";     
       targetRotation = 0;     

       dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(sampleRate, bufferSize, sampleOverlap); 

       PitchDetectionHandler printPitch = new PitchDetectionHandler() { 
        @Override 
        public void handlePitch(PitchDetectionResult pitchDetectionResult, AudioEvent audioEvent) { 
         double pitch = pitchDetectionResult.getPitch(); 
         if(pitch != -1 && !audioEvent.isSilence(silenceThreshold)){ 
          audioDetected = true; 
          currentHertz = pitch; 
         } 
         else{ 
          audioDetected = false; 
          offsetInCents = 0.00; 
         } 
        } 
       }; 
       AudioProcessor audioProcessor = new PitchProcessor(algo, sampleRate, bufferSize, printPitch); 
       dispatcher.addAudioProcessor(audioProcessor); 

     new Thread(dispatcher,"Audio Dispatcher").start(); 
    } 
} 

我的Android清单文件:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.fraserjohnstone.tuner" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-permission android:name="android.permission.RECORD_AUDIO" /> 

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="24" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/GdxTheme" > 
    <activity 
     android:name="com.fraserjohnstone.tuner.AndroidLauncher" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait" 
     android:configChanges="keyboard|keyboardHidden|orientation|screenSize"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

任何帮助,将不胜感激。

回答

0

已解决。

尽管我在我的Android清单文件中声明了权限RECORD_AUDIO,但我并没有意识到这是一个dangerous权限,因此我必须在运行时获得权限,因为我的目标是Android 6.0及更高版本。