Как настроить воспроизведение звука с внешнего динамика? - PullRequest
1 голос
/ 16 апреля 2020

Есть какая-то странная проблема, я использую 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, но все же иногда я слышу звук из внутреннего динамика.

Итак, вопрос - если я что-то здесь упускаю? Может быть, какой-то трюк должен быть реализован или что-то еще?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...