Как установить проигрывание звука с внешнего динамика?
Я использую oboe либу https://github.com/google/oboe, для проигрывания звука. И конечно тут есть возможность выбрать какой выход использовать для звука. Возможные подключения описаны здесь
https://developer.android.com/reference/android/media/AudioDeviceInfo
Так, что для того, чтоб установить как нужно проигрывать звук мне нужно передать id нужного канала в либу
Кстати канал который мне нужнен TYPE_BUILTIN_SPEAKER, но на некоторых устройсвах я слышу, что звук (иногда, но не всегда) идет из TYPE_BUILTIN_EARPIECE.
Теперь об имплементации, мне нужно получить нужный id канала
fun findAudioDevice(app: Application,
deviceFlag: Int,
deviceType: Int): AudioDeviceInfo?
{
var result: AudioDeviceInfo? = null
val manager = app.getSystemService(Context.AUDIO_SERVICE) as AudioManager
val adis = manager.getDevices(deviceFlag)
for (adi in adis)
{
if (adi.type == deviceType)
{
result = adi
break
}
}
return result
}
Использование
val id = getAudioDeviceInfoId(getBuildInSpeakerInfo())
private fun getBuildInSpeakerInfo(): AudioDeviceInfo?
{
return com.tetavi.ar.basedomain.utils.Utils.findAudioDevice( //
getApplication<Application>(), //
AudioManager.GET_DEVICES_OUTPUTS, //
AudioDeviceInfo.TYPE_BUILTIN_SPEAKER //
)
}
private fun getAudioDeviceInfoId(info: AudioDeviceInfo?): Int
{
var result = -1
if (info != null)
{
result = info.id
}
return result
}
Теперь полученый id нужно установить в oboe. Поскольку эта библиотека нативная я использую JNI
oboe::Result oboe_engine::createPlaybackStream()
{
oboe::AudioStreamBuilder builder;
const oboe::SharingMode sharingMode = oboe::SharingMode::Exclusive;
const int32_t sampleRate = mBackingTrack->getSampleRate();
const oboe::AudioFormat audioFormat = oboe::AudioFormat::Float;
const oboe::PerformanceMode performanceMode = oboe::PerformanceMode::PowerSaving;
builder.setSharingMode(sharingMode)
->setPerformanceMode(performanceMode)
->setFormat(audioFormat)
->setCallback(this)
->setSampleRate(sampleRate);
if (m_output_playback_chanel_id != EMPTY_NUM)
{
//set output playback chanel (like internal or external speaker)
builder.setDeviceId(m_output_playback_chanel_id); <------------- THIS LINE
}
return builder.openStream(&mAudioStream);
}
Проблема в том, что на некоторых устройствах я все еще слышу(иногда, не постоянно), что звук идет из внутреннего канала TYPE_BUILTIN_EARPIECE не смотря на то, что явно указывается внешний канал TYPE_BUILTIN_SPEAKER.
Я несколько раз проверил логику от момента получения id (id кстати 3) и до момента установки его в либу, но все равно иногда это не срабатывает.
Так, что вопрос в том, что я упускаю? Может есть какой то workaround тут или что то еще?