2013-08-08 12 views
7

Wprowadziłem kod do ciągłego generowania i odtwarzania sinusoidy wewnątrz mojej głównej aktywności dla mojej aplikacji i stworzyłem obiekt PresetReverb, aby przetestować go na fali sinusoidalnej. Ale za każdym razem, kiedy go uruchomić, Aplikacja ulega awarii, a to generuje to w LogCat:Aplikacja na Androida powoduje awarię kodu błędu 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) 

Oto kod dla aktywności:

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; 
} 


} 

Podobno tam jest problem z linią który tworzy obiekt PresetReverb ... ale nie mogę zrozumieć dlaczego. Co dokładnie powoduje awarię mojej aplikacji?

+0

Czy używasz tego na urządzeniu lub emulatorze? – frogmanx

+0

Używam go w telefonie HTC Vivid. –

+0

spróbuj dodać to do swojego manifestu i testu. – frogmanx

Odpowiedz

14

spróbuj dodać

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

do listy uprawnień w pliku manifestu.

+0

Nie działa na moim Nexusie 5 z systemem Android 6.0 – WideFide

+0

Nie działa na moim Nexusie 9 z systemem Android 6.0 – JellicleCat

+0

Czy próbowałeś/aś wdrożyć uprawnienia dynamiczne dla uprawnienia MODIFY_AUDIO_SETTINGS? Zakłada to, że celujesz w interfejs API lvl 23+. – frogmanx

Powiązane problemy