Как установить проигрывание звука с внешнего динамика?

Я использую 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 тут или что то еще?


Ответы (0 шт):