# Wie bringe ich 2 BarVisualizers zum Laufen?



## RezaScript (7. Apr 2021)

Hallo, ich verwende audio-visualizer-android und möchte 2 BarVisualizers zum Laufen bringen. So bringe ich 1 BarVisualizer zum Laufen:


```
int audioSessionId = mediaPlayer.getAudioSessionId();
if (audioSessionId != -1) {
    _barTop.setAudioSessionId(audioSessionId);
}
```

Das klappt wunderbar.
Und so versuche ich 2 BarVisualizers zum Laufen zu bringen:


```
int audioSessionId = mediaPlayer.getAudioSessionId();
if (audioSessionId != -1) {
    _barTop.setAudioSessionId(audioSessionId);
    _barBottom.setAudioSessionId(audioSessionId);
}
```

Das klappt so nicht. Die App crasht und ich bekomme den Error:


> java.lang.IllegalStateException: setCaptureSize() called in wrong state: 2


Kann mir jemand weiterhelfen?


----------



## RezaScript (20. Apr 2021)

Die Library unterstützt das anscheinend nicht. Mir hat jemand anders mit einem "Hack" geholfen. 

Und zwar kopiert er einfach den Visualizer mit folgendem Code:


```
public class CopyBarVisualizer extends BarVisualizer {
    private List<UpdateListener> listeners = new ArrayList<>();

    public CopyBarVisualizer(Context context) {
        super(context);
    }

    public CopyBarVisualizer(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public CopyBarVisualizer(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public void addUpdateListener(UpdateListener listener) {
        listeners.add(listener);
    }

    public void copyFrom(CopyBarVisualizer other) {
        other.addUpdateListener(new UpdateListener() {
            @Override
            public void update(byte[] data) {
                mRawAudioBytes = data;
                CopyBarVisualizer.this.invalidate();
            }
        });
    }

    @Override
    public void invalidate() {
        super.invalidate();
        for (UpdateListener listener : listeners) {
            listener.update(mRawAudioBytes);
        }
    }

    public interface UpdateListener {
        void update(byte[] data);
    }
}
```

Initialisieren geht dann so:

```
copyVisualizer.setAudioSessionId(audioSessionId);
copyVisualizer2.copyFrom(copyVisualizer);
```

Das funktioniert eigentlich ziemlich gut aber nur mit 2 Visualizers. Wenn ich mehr als 2 haben möchte, also so


```
copyVisualizer.setAudioSessionId(audioSessionId);
copyVisualizer2.copyFrom(copyVisualizer);
copyVisualizer3.copyFrom(copyVisualizer);
```

bekomm ich die Fehlermeldung


> Attempt to invoke virtual method 'void com.example.app.classes.CopyBarVisualizer.copyFrom(com.example.app.classes.CopyBarVisualizer)' on a null object reference



Versteht jemand was darunter?


----------

