2013-08-08 4 views
7

私のアプリの主なアクティビティの中で、正弦波を連続的に生成して再生するためのコードを入れ、正弦波でテストするためのPresetReverbオブジェクトを作成しました。しかし、私は、アプリのクラッシュを、それを起動し、そしてそれはlogcatでこれを生成するたびに:ここでアンドロイドアプリがクラッシュするaudioEffectエラーコード-1

08-08 14:36:10.566: E/AudioEffect(19466): set(): AudioFlinger could not create effect, status: -1 
08-08 14:36:10.566: E/AudioEffects-JNI(19466): AudioEffect initCheck failed -1 
08-08 14:36:10.566: E/AudioEffect-JAVA(19466): Error code -1 when initializing AudioEffect. 
08-08 14:36:10.566: W/dalvikvm(19466): threadid=11: thread exiting with uncaught exception (group=0x40ac2228) 
08-08 14:36:10.576: E/AndroidRuntime(19466): FATAL EXCEPTION: Thread-11436 
08-08 14:36:10.576: E/AndroidRuntime(19466): java.lang.RuntimeException: Cannot initialize effect engine for type: 47382d60-ddd8-11db-bf3a-0002a5d5c51bError: -1 
08-08 14:36:10.576: E/AndroidRuntime(19466): at android.media.audiofx.AudioEffect.<init>(AudioEffect.java:387) 
08-08 14:36:10.576: E/AndroidRuntime(19466): at android.media.audiofx.PresetReverb.<init>(PresetReverb.java:136) 
08-08 14:36:10.576: E/AndroidRuntime(19466): at me.kevinossia.mystuff.MainScreen$2.run(MainScreen.java:47) 

は、活動のためのコードです:

package me.kevinossia.mystuff; 


import me.kevinossia.mystuff.tutorial.R; 
import android.app.Activity; 
import android.content.Intent; 
import android.media.AudioFormat; 
import android.media.AudioManager; 
import android.media.AudioTrack; 
import android.media.audiofx.PresetReverb; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 

public class MainScreen extends Activity 
{ 
Thread t; 
int sr = 44100; 
boolean isRunning=true; 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.mainscreen); 

    Button goBack = (Button) findViewById(R.id.back); 

    goBack.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View v) 
     { 
      Intent goBack = new Intent(getApplicationContext(), HomeScreen.class); 
      startActivity(goBack); 
     } 
    }); 

    t = new Thread() 
    { 
     public void run() 
     { 
      setPriority(Thread.MAX_PRIORITY); 
      int buffsize = AudioTrack.getMinBufferSize(sr, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT); 

      AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sr, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, buffsize, AudioTrack.MODE_STREAM); 

      PresetReverb reverb = new PresetReverb(0,0); 

      audioTrack.attachAuxEffect(reverb.getId()); 
      reverb.setPreset(PresetReverb.PRESET_LARGEROOM); 
      reverb.setEnabled(true); 
      audioTrack.setAuxEffectSendLevel(1.0f); 

      short samples[] = new short[buffsize]; 
      int amp = 32767; 
      double twopi = 2*Math.PI; 
      double fr = 262.f; 
      double ph = 0.0; 

      audioTrack.play(); 

      while(isRunning) 
      { 
       fr = 262; 

       for(int i=0; i < buffsize; i++) 
       { 
        samples[i] = (short) (amp*Math.sin(ph)); 
        ph += twopi*fr/sr; 
       } 
       audioTrack.write(samples, 0, buffsize); 
      } 
      audioTrack.stop(); 
      audioTrack.release(); 

     } 
    }; 
    t.start(); 

} 
@Override 
public void onPause() 
{ 
    super.onPause(); 
    isRunning = false; 
    try 
    { 
     t.join(); 
    } catch (InterruptedException e) 
    { 
     e.printStackTrace(); 
    } 
    t = null; 
} 


} 

はどうやらラインに問題がありますPresetReverbオブジェクトを作成する...しかし、私は理由を理解することはできません。私のアプリがクラッシュする原因は何ですか?マニフェストファイルにあなたの許可リストに

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

を追加

+0

デバイスまたはエミュレータでこれを実行していますか? – frogmanx

+0

私はHTC Vivid上で実行しています。 –

+0

マニフェストとテストにこれを追加してみてください。 – frogmanx

答えて

14

してみてください。

+0

Android 6.0を実行しているNexus 5で動作しませんでした – WideFide

+0

Android 6.0を実行しているNexus 9で動作しませんでした – JellicleCat

+0

MODIFY_AUDIO_SETTINGS権限の動的アクセス権を実装しようとしましたか?これはAPI lvl 23+を対象としていることを前提としています。 – frogmanx

関連する問題