2017-01-22 1 views
0

J'essaie actuellement de construire un oscillateur multi-forme d'onde sur Android en utilisant AudioTrack mais cependant j'essaye d'implémenter la vague carrée je reçois la même erreur fatale, je ne peux pas sembler la trouver, n'importe quelle aide être utile voici mon code:Android AudioTrack Error

package com.example.jack.synthesiser; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.ToggleButton; 

public class MainActivity extends AppCompatActivity implements  View.OnClickListener { 

EditText frequencyInput; 
TextView displayFrequency; 
ToggleButton startStop; 
ToggleButton startStopSquare; 
PlayWave wave = new PlayWave(); 
PlaySquare sWave = new PlaySquare(); 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    initializeView(); 
} 

private void initializeView() { 

    frequencyInput = (EditText) findViewById(R.id.editText); 
    startStop = (ToggleButton) findViewById(R.id.toggleButton); 
    startStopSquare = (ToggleButton) findViewById(R.id.toggleButton2); 
    displayFrequency = (TextView) findViewById(R.id.textView); 
    startStop.setOnClickListener(this); 
} 

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    int frequency = Integer.parseInt(frequencyInput.getText().toString()); 
    displayFrequency.setText(String.valueOf(frequency)); 
    wave.setWave(frequency); 
    sWave.setSquareWave(frequency); 
    boolean on = startStop.isChecked(); 
    boolean square = startStopSquare.isChecked(); 
    if (on) { 
     wave.start(); 
    } else if (!on){ 
     wave.stop(); 
    } 
    //if (square) { 
    // sWave.start(); 
    //} else if (!square) { 
    // sWave.stop(); 
    //} 





} 
} 

Et mon jeu classe d'onde ressemble à ceci:

package com.example.jack.synthesiser; 

import android.media.AudioFormat; 
import android.media.AudioManager; 
import android.media.AudioTrack; 

/** 
    * Created by Jack on 16/01/2017. 
    */ 

public class PlayWave { 

private final int SAMPLE_RATE = 44100; //maximum sample rate Audiotrack can use 
private AudioTrack mAudio; 
int buffsize = AudioTrack.getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT); 
private int sampleCount; 

public PlayWave() { 

    mAudio = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, 
          buffsize, AudioTrack.MODE_STATIC); 
} 

public void setWave (int frequency) { 

    sampleCount = (int) ((float) SAMPLE_RATE/frequency); 
    short samples[] = new short[sampleCount]; //array to hold samples 
    int amplitude = 32767; //max amplitude can reach 
    double twoPi = 8. * Math.atan(1.); //twoPi calculated as the arctangent of 1 multiplied by 8 
    double phase = 0.0; 

    for (int i = 0; i < sampleCount; i++) { 
     samples[i] = (short) (amplitude * Math.sin(phase)); 
     phase += twoPi * frequency/SAMPLE_RATE; 
    } 
    mAudio.write(samples, 0, sampleCount); 
} 

public void setSquareWave (int frequency) { 
    sampleCount = (int) ((float) SAMPLE_RATE/frequency); 
    short samples[] = new short[sampleCount]; 
    int amplitude = 32767; 
    double phase = 0.0; 
    double twoPi = 8. * Math.atan(1.); 
    for (int i = 0; i < sampleCount; i++) { 
     samples[i] = (short) (amplitude * Math.sin(phase)); 
     if (samples[i] > (short) 0.0) { 
      samples[i] = 32767; 
     } 

     if (samples[i] < (short) 0.0) { 
      samples[i] = -32767; 
     } 
     phase += twoPi * frequency/SAMPLE_RATE; 
    } 
} 

public void start() { 
    mAudio.reloadStaticData(); 
    mAudio.setLoopPoints(0, sampleCount, -1); 
    mAudio.play(); 
} 

public void stop() { 
    mAudio.stop(); 

} 
} 

L'erreur que je reçois est la suivante:

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: com.example.jack.synthesiser, PID: 18957 
       java.lang.IllegalStateException: play() called on uninitialized AudioTrack. 
        at android.media.AudioTrack.play(AudioTrack.java:1141) 
        at com.example.jack.synthesiser.PlayWave.start(PlayWave.java:61) 
        at com.example.jack.synthesiser.MainActivity.onClick(MainActivity.java:47) 
        at android.view.View.performClick(View.java:4780) 
        at android.widget.CompoundButton.performClick(CompoundButton.java:120) 
        at android.view.View$PerformClick.run(View.java:19866) 
        at android.os.Handler.handleCallback(Handler.java:739) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:135) 
        at android.app.ActivityThread.main(ActivityThread.java:5254) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Répondre

0

Cocher cette réponse here

Il recommande d'appeler play() avant d'utiliser des méthodes write().