audio: Add retries for BT proxy port registration
When ModuleBluetooth::createProxy is invoked on BT device connection, the BT stack may not be fully ready yet, and port registration can fail. This is an intermittent state and registration should succeed after retrying. Bug: 320838889 Test: atest pts-bot:A2DP/SRC/REL/BV-02-I Change-Id: I0c7cf7c1c6a8ee03ef55b004f89139e3b56ee9cd
This commit is contained in:
parent
3d6a312a8b
commit
a5c0437327
2 changed files with 9 additions and 1 deletions
|
@ -299,7 +299,13 @@ ndk::ScopedAStatus ModuleBluetooth::createProxy(const AudioPort& audioPort, int3
|
|||
: std::shared_ptr<BluetoothAudioPortAidl>(
|
||||
std::make_shared<BluetoothAudioPortAidlOut>());
|
||||
const auto& devicePort = audioPort.ext.get<AudioPortExt::device>();
|
||||
if (const auto device = devicePort.device.type; !proxy.ptr->registerPort(device)) {
|
||||
const auto device = devicePort.device.type;
|
||||
bool registrationSuccess = false;
|
||||
for (int i = 0; i < kCreateProxyRetries && !registrationSuccess; ++i) {
|
||||
registrationSuccess = proxy.ptr->registerPort(device);
|
||||
usleep(kCreateProxyRetrySleepMs * 1000);
|
||||
}
|
||||
if (!registrationSuccess) {
|
||||
LOG(ERROR) << __func__ << ": failed to register BT port for " << device.toString();
|
||||
return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
|
||||
}
|
||||
|
|
|
@ -85,6 +85,8 @@ class ModuleBluetooth final : public Module {
|
|||
ndk::ScopedAStatus findOrCreateProxy(
|
||||
const ::aidl::android::media::audio::common::AudioPort& audioPort, CachedProxy& proxy);
|
||||
|
||||
static constexpr int kCreateProxyRetries = 5;
|
||||
static constexpr int kCreateProxyRetrySleepMs = 250;
|
||||
ChildInterface<BluetoothA2dp> mBluetoothA2dp;
|
||||
ChildInterface<BluetoothLe> mBluetoothLe;
|
||||
std::map<int32_t /*instantiated device port ID*/, CachedProxy> mProxies;
|
||||
|
|
Loading…
Reference in a new issue