Воспроизведение 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.