如何将AudioSessionId设置为可视化工具?

时间:2014-07-19 20:33:04

标签: android visualizer

我使用release和new重新创建每个音轨的媒体播放器。但是如何重新创建可视化工具?当我调用release并创建新的可视化工具时,我有了新的线程可视化工具,因为旧线程没有自动完成。如果我不重新创建可视化器,那么他的错误AudioSessionId。 怎么用visualizer ???有媒体播放器,如果媒体播放器确实重新创建了每个音轨吗?

例如某些代码(来自我的大应用):

public class VisualizerView extends View {
  private static final String TAG = "VisualizerView";

  private byte[] mBytes;
  private byte[] mFFTBytes;
  private Rect mRect = new Rect();
  private static Visualizer mVisualizer;

  private static Set<Renderer> mRenderers;

  private Paint mFlashPaint = new Paint();
  private Paint mFadePaint = new Paint();

  public VisualizerView(Context context, AttributeSet attrs, int defStyle)
  {
    super(context, attrs);
    init();
  }


public void link(MediaPlayer player)
  {
    if(player == null)
    {
      throw new NullPointerException("Cannot link to null MediaPlayer");
    }
    // Pass through Visualizer data to VisualizerView
    Visualizer.OnDataCaptureListener captureListener = new Visualizer.OnDataCaptureListener()
    {
      @Override
      public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes,
          int samplingRate)
      {
        updateVisualizer(bytes);
      }

      @Override
      public void onFftDataCapture(Visualizer visualizer, byte[] bytes,
          int samplingRate)
      {
        updateVisualizerFFT(bytes);
      }
    };
    // Create the Visualizer object and attach it to our media player.
    if (mVisualizer==null) {
    mVisualizer = new Visualizer(player.getAudioSessionId());
    mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
   mVisualizer.setDataCaptureListener(captureListener, Visualizer.getMaxCaptureRate() / 2, true, true);
   // Enabled Visualizer and disable when we're done with the stream
    mVisualizer.setEnabled(true);
    addBarGraphRenderers();
  } else {
   mVisualizer.setDataCaptureListener(captureListener,
   Visualizer.getMaxCaptureRate() , true, true);
   mVisualizer.setEnabled(true); 
  }}

Upd1: 我为呼叫终结重写了可视化工具,但这对我没有帮助:

public class visualizer1 extends Visualizer {

    public visualizer1(int audioSession) throws UnsupportedOperationException,
            RuntimeException {
        super(audioSession);
    }
    @Override 
    public void finalize() {
            super.finalize();
    }
}

public void release() {
    if (mVisualizer!=null) {
        mVisualizer.release();
        mVisualizer.finalize();
        mVisualizer=null;
    }
}

我有很多可视化器: my problem

1 个答案:

答案 0 :(得分:0)

解决了这个问题。当我设置mVisualizer.setEnabled(false);在发布可视化工具之前自动完成:

 public void release()
  {
    if (mVisualizer!=null) {
    mVisualizer.setEnabled(false);
    mVisualizer.release();
    mVisualizer=null;
   }
  }
UPD:我测试了我的代码很长一段时间(大约一年),发现如果我这样做了,那么很少有应用程序在“mVisualizer.release();”行上发生致命错误而崩溃。这不能使用库来跟踪,例如crashlytics。 所以我删除了“mVisualizer.setEnabled(false);”。 在Android 7.0中,我最多有3-4个Visualizer线程,这不会导致内存泄漏。

UPD2: 我找到了崩溃应用程序的原因。问题是mVisualizer.release()命令;有时它是在可视化渲染时执行的。 我添加了一个布尔变量来避免这种情况,现在崩溃消失了。享受!

private boolean release = false;
public void release() {
    if (mVisualizer != null) {
        if (cameraLed == true) {
            barGraphRendererBottom.stopCamera();
        }
        if (isShown())
            release = true;
        else {
            release = false;
            mVisualizer.setEnabled(false);
            mVisualizer.release();
            mVisualizer = null;
        }
    }
}
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if (release) {
        release = false;
        mVisualizer.setEnabled(false);
        mVisualizer.release();
        mVisualizer = null;
    } else {
        mRect.set(0, 0, getWidth(), getHeight());
        if (mCanvasBitmap == null) {
            mCanvasBitmap = Bitmap.createBitmap(canvas.getWidth(),
                    canvas.getHeight(), Config.RGB_565);
        }
        if (mCanvas == null) {
            mCanvas = new Canvas(mCanvasBitmap);
        }

        canvas.drawBitmap(mCanvasBitmap, new Matrix(), null);
    }
}