Есть какая-то странная проблема, я использую oboe
lib https://github.com/google/oboe для воспроизведения звука. Или, конечно, вы можете выбрать вывод звука в соответствии с android настройками
https://developer.android.com/reference/android/media/AudioDeviceInfo
Так что, если мне нужно установить точный выходной канал, мне нужно установить его на гобой lib.
Кстати выходной канал, который мне нужен, это TYPE_BUILTIN_SPEAKER
, но на некоторых устройствах (иногда не постоянно) я слышу звук от TYPE_BUILTIN_EARPIECE
Как я делая это, у меня есть такой метод, чтобы получить необходимый идентификатор канала
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
lib. Oboe
lib является родной lib, поэтому с помощью 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
(фактически это 3) и выше до того момента, когда я установил его в качестве параметра на oboe
lib, но все же иногда я слышу звук из внутреннего динамика.
Итак, вопрос - если я что-то здесь упускаю? Может быть, какой-то трюк должен быть реализован или что-то еще?