Playing 2 musics through 2 different sound cards at same time

亡梦爱人 提交于 2019-12-04 16:53:57

问题


Trying something pretty out of the box... I have a simple app with a button that when pushed, plays music out of the audio jack of my android tablet.

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

I've now added a usb audio interface (through a micro usb adapter) and I can hear audio out of it.

I'm able to list the sound cards with this

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

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

How do I route music so that I can play 2 different music at once, one through usb and the other through the headphone jack?


回答1:


According to the MediaPlayer documentation, you can set the audio device using setPreferredDevice which receive an AudioDeviceInfo as a parameter, see https://developer.android.com/reference/android/media/MediaPlayer.html#setPreferredDevice(android.media.AudioDeviceInfo).

You will then have to create one MediaPlayer to play on each device.




回答2:


it works about like this:

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();
    }
}

you could also filter for the headset jack plug/unplug event:

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

sources: me, based upon the SDK documentation for the MediaPlayer.



来源:https://stackoverflow.com/questions/52138934/playing-2-musics-through-2-different-sound-cards-at-same-time

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!