Воспроизведение 2-х музыкальных произведений с помощью двух разных звуковых карт одновременно

Попытка что-то довольно из коробки... У меня есть простое приложение с кнопкой, которая при нажатии, воспроизводит музыку из аудиоразъема моего Android-планшета.

public void btn1 (View view) {
    MediaPlayer mp = MediaPlayer.create(this, R.raw.xxx);
    mp.start();
}

Теперь я добавил аудиоинтерфейс usb (через адаптер micro usb), и я слышу звук из него.

Я могу перечислить звуковые карты с помощью этого

AudioDeviceInfo[] devices = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);

for (AudioDeviceInfo device : devices) {
    int b = device.getId();
    int d = device.getType();
    CharSequence productName = device.getProductName();
}

Как мне маршрутизировать музыку, чтобы я мог одновременно воспроизводить 2 разных музыки, один через USB, а другой через разъем для наушников?

Ответ 1

Согласно документации MediaPlayer, вы можете установить аудиоустройство с помощью setPreferredDevice которые получают AudioDeviceInfo в качестве параметра, см. Https://developer.android.com/reference/android/media/MediaPlayer.html#setPreferredDevice(android.media.AudioDeviceInfo ).

Затем вам необходимо создать один MediaPlayer для воспроизведения на каждом устройстве.

Ответ 2

он работает примерно так:

protected void playAudio() {
    this.playByDeviceIdx(0, R.raw.xxx);
    this.playByDeviceIdx(1, R.raw.yyy);
}

protected void playByDeviceIdx(int deviceIndex, @IdRes int resId) {

    /* obtain audio-output device-infos */
    deviceInfos[] devices = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);

    /* check, if the desired index is even within bounds */
    if(deviceInfos.length < deviceIndex) {

        /* create an instance of MediaPlayer */
        MediaPlayer mp = MediaPlayer.create(this, resId);

        /* assign a preferred device to the MediaPlayer instance */
        mp.setPreferredDevice(deviceInfos[deviceIndex]);

       /* start the playback (only if a device exists at the index) */
       mp.start();
    }
}

вы также можете фильтровать для подключения штепсельной вилки разъема/разъединения:

IntentFilter intentFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
Intent intent = context.registerReceiver(null, intentFilter);
boolean isConnected = intent.getIntExtra("state", 0) == 1;

sources: me, на основе документации SDK для MediaPlayer.