USB MIDI: Fix race condition that causes intermittent connections.

Plugging in a USB MIDI device normally works.
But occasionally the device is not seen due to a race condition.
This code retries until the device is ready.

Change-Id: Ifba9c9678e6be0c3d139f3467f895307096a2ad8
Signed-off-by: Phil Burk <philburk@google.com>
This commit is contained in:
Phil Burk
2015-12-03 17:00:42 -08:00
parent 3fe5a65b1c
commit 1852019c39

View File

@@ -43,12 +43,26 @@ android_server_UsbMidiDevice_get_subdevice_count(JNIEnv *env, jobject /* thiz */
jint card, jint device)
{
char path[100];
int fd;
const int kMaxRetries = 10;
const int kSleepMicroseconds = 2000;
snprintf(path, sizeof(path), "/dev/snd/controlC%d", card);
int fd = open(path, O_RDWR);
if (fd < 0) {
ALOGE("could not open %s", path);
return 0;
// This control device may not have been created yet. So we should
// try to open it several times to prevent intermittent failure
// from a race condition.
int retryCounter = 0;
while ((fd = open(path, O_RDWR)) < 0) {
if (++retryCounter > kMaxRetries) {
ALOGE("timed out after %d tries, could not open %s", retryCounter, path);
return 0;
} else {
ALOGW("attempt #%d, could not open %s", retryCounter, path);
// Increase the sleep interval each time.
// 10 retries will total 2 * sum(1..10) = 110 milliseconds.
// Typically the device should be ready in 5-10 milliseconds.
usleep(kSleepMicroseconds * retryCounter);
}
}
struct snd_rawmidi_info info;