release と new で各トラックの mediaplayer を再作成します。しかし、ビジュアライザーをどのように再作成するのでしょうか? リリースを呼び出して新しいビジュアライザーを作成すると、古いスレッドが自動的にファイナライズされないため、新しいスレッド ビジュアライザーが作成されます。ビジュアライザーを再作成しないと、AudioSessionId が間違っています。ビジュアライザーの使い方??? mediaplayerが各トラックを再作成する場合、mediaplayerを使用しますか??
たとえば、いくつかのコード(私の大きなアプリから):
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;
}
}
そして、私は多くのビジュアライザーを持っています: