livekit / client-sdk-android

LiveKit SDK for Android
https://docs.livekit.io
Apache License 2.0
174 stars 69 forks source link

Earpiece option not visible #251

Closed harshilhp closed 1 year ago

harshilhp commented 1 year ago

Describe the bug While in call when user connect wired headset Earpiece is removed from list. Earpiece is not visible in list even if wired headset is removed at that time only speakerphone option is visible.

To Reproduce Steps to reproduce the behavior:

  1. Connected in room
  2. Connected wired headset in device (Earpiece is removed from list as expected)
  3. Removed wired headset from device (Earpiece is not there in list)

Expected behavior Earpiece option should be added again after removing wired headset from device

Screenshots list view

Device Info: I think it is not device specific issue i checked in few devices and they all have same issue

usayplz commented 1 year ago

2 reasons:

  1. if userSelectedAudioDevice = Earpiece it does not check in onDeviceConnected after removing Earpiece. "this.availableUniqueAudioDevices.removeAll { it is Earpiece }"

com.twilio.audioswitch.AbstractAudioSwitch

override fun onDeviceConnected(audioDevice: AudioDevice) { this.logger.d(TAG_AUDIO_SWITCH, "onDeviceConnected($audioDevice)") if (audioDevice is Earpiece && this.availableAudioDevices.contains(WiredHeadset())) { return } val wasAdded = this.availableUniqueAudioDevices.add(audioDevice) if (audioDevice is WiredHeadset) { this.availableUniqueAudioDevices.removeAll { it is Earpiece } } this.selectAudioDevice(wasListChanged = wasAdded) }

  1. After wiredhandset disconnected Earpiece never add back. Because of "wasChanged = true" condition does not execute: this.availableUniqueAudioDevices.add(Earpiece())

com.twilio.audioswitch.AudioSwitch override fun onDeviceDisconnected(audioDevice: AudioDevice) { this.logger.d(TAG_AUDIO_SWITCH, "onDeviceDisconnected($audioDevice)") var wasChanged = this.availableUniqueAudioDevices.remove(audioDevice) if (this.userSelectedAudioDevice == audioDevice) { this.userSelectedAudioDevice = null }

    if (audioDevice is WiredHeadset && this.audioDeviceManager.hasEarpiece()) {
        wasChanged = wasChanged || this.availableUniqueAudioDevices.add(Earpiece())
    }
    this.selectAudioDevice(wasChanged)
}
davidliu commented 1 year ago

Have a fix coming soon.