2014-10-20 107 views
0

我有一個應用程序可以播放MediaPlayer類中的音頻文件。Android更新Visualizer音頻會話ID

我已經將Visualizer附加到當前的音頻會話ID,它工作正常。

當我更改音頻軌道,從而更改音頻會話ID時,我需要重新創建Visualizer,因爲我找不到設置新的音頻會話ID的方法。

這就產生了一個新的VisualizerView被添加到我的佈局的問題。如何更新當前的音頻會話ID,或者刪除VisualizerView的當前實例並添加新的?

代碼:

public class PlaySongActivity extends Activity{ 
    private static final float VISUALIZER_HEIGHT_DIP = 50f; 
    private Visualizer mVisualizer; 
    private VisualizerView mVisualizerView; 
    private LinearLayout mLinearLayout; 

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

     mLinearLayout = (LinearLayout) findViewById(R.id.LayoutViewVisualizer); 

     playSong(); 
    } 

    /* Below methods are used with buttons to play/play next/play previous song */ 

    private void playSong(Bundle extras) { 
     //playing music from a service 
     service.playMusic(); 
     setupVisualizerFx(); 
     mVisualizer.setEnabled(true); 
    } 

    private void playPreviousSong() { 
     service.playPrevious(); 
     setupVisualizerFx(); 
     mVisualizer.setEnabled(true); 
    } 

    private void playNextSong() { 
     service.playNext(); 
     setupVisualizerFx(); 
     mVisualizer.setEnabled(true); 
    } 

/* 
* Below code that is used for the Visualizer is taken from: 
* http://www.vogella.com/code/ApiDemos/src/com/example/android/apis/media/AudioFxDemo.html 
*/ 

private void setupVisualizerFx() {   
    // Create a VisualizerView (defined below), which will render the simplified audio 
    // wave form to a Canvas. 
    mVisualizerView = new VisualizerView(this); 
    mVisualizerView.setLayoutParams(new ViewGroup.LayoutParams(
      ViewGroup.LayoutParams.MATCH_PARENT, 
      (int)(VISUALIZER_HEIGHT_DIP * getResources().getDisplayMetrics().density))); 
    mLinearLayout.addView(mVisualizerView); 
    // Create the Visualizer object and attach it to 
    int audioSessionId = service.getAudioSessionId(); 
    mVisualizer = new Visualizer(audioSessionId); 
    mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]); 
    mVisualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener() { 
     public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes, 
       int samplingRate) { 
      mVisualizerView.updateVisualizer(bytes); 
     } 

     public void onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {} 
    }, Visualizer.getMaxCaptureRate()/2, true, false); 
} 

/** 
* A simple class that draws waveform data received from a 
* {@link Visualizer.OnDataCaptureListener#onWaveFormDataCapture } 
*/ 
class VisualizerView extends View { 
    private byte[] mBytes; 
    private float[] mPoints; 
    private Rect mRect = new Rect(); 

    private Paint mForePaint = new Paint(); 

    public VisualizerView(Context context) { 
     super(context); 
     init(); 
    } 

    private void init() { 
     mBytes = null; 

     mForePaint.setStrokeWidth(1f); 
     mForePaint.setAntiAlias(true); 
     mForePaint.setColor(getResources().getColor(R.color.green)); 
    } 

    public void updateVisualizer(byte[] bytes) { 
     mBytes = bytes; 
     invalidate(); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     if (mBytes == null) { 
      return; 
     } 

     if (mPoints == null || mPoints.length < mBytes.length * 4) { 
      mPoints = new float[mBytes.length * 4]; 
     } 

     mRect.set(0, 0, getWidth(), getHeight()); 

     for (int i = 0; i < mBytes.length - 1; i++) { 
      mPoints[i * 4] = mRect.width() * i/(mBytes.length - 1); 
      mPoints[i * 4 + 1] = mRect.height()/2 
        + ((byte) (mBytes[i] + 128)) * (mRect.height()/2)/128; 
      mPoints[i * 4 + 2] = mRect.width() * (i + 1)/(mBytes.length - 1); 
      mPoints[i * 4 + 3] = mRect.height()/2 
        + ((byte) (mBytes[i + 1] + 128)) * (mRect.height()/2)/128; 
     } 

     canvas.drawLines(mPoints, mForePaint); 
    } 
} 

} 

這是我的代碼目前的結果,呼籲playNext()或playPrevious()時:

result

正如你可以看到VisualizerViews保持堆放彼此。我希望新的VisualizerView替換舊的,或者更新當前音頻會話ID(如果可能的話)。任何幫助是極大的讚賞。

if(mVisualizer != null) 
     mVisualizer.setEnabled(false); 

現在該方法看起來像:

private void setupVisualizerFx() {  
    if(mVisualizer != null) 
     mVisualizer.setEnabled(false); 
    // Create the Visualizer object and attach it to 
    int audioSessionId = service.getAudioSessionId(); 
    mVisualizer = new Visualizer(audioSessionId); 

    mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]); 
    mVisualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener() { 
     public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes, 
       int samplingRate) { 
      mVisualizerView.updateVisualizer(bytes); 
     } 

     public void onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {} 
    }, Visualizer.getMaxCaptureRate()/2, true, false); 
} 

編輯:一些代碼爲移動的

馬庫斯

回答

1

通過在setupVisualizerFx添加這些代碼行()方法來解決這個改爲onCreate方法