USB Audio Hal: Fix CTS timestamp handling am: 61583424ff

Original change: https://googleplex-android-review.googlesource.com/c/platform/hardware/libhardware/+/15190378

Change-Id: Ic90d8c34a120a2a98d576d583eadcc2392da844b
diff --git a/modules/usbaudio/audio_hal.c b/modules/usbaudio/audio_hal.c
index cc9e4f7..39c0fb5 100644
--- a/modules/usbaudio/audio_hal.c
+++ b/modules/usbaudio/audio_hal.c
@@ -1652,6 +1652,15 @@
     stream_standby_l(alsa_devices, out == NULL ? &in->standby : &out->standby);
     device_unlock(adev);
 
+    // Timestamps:
+    // Audio timestamps assume continuous PCM frame counts which are maintained
+    // with the device proxy.transferred variable.  Technically it would be better
+    // associated with in or out stream, not the device; here we save and restore
+    // using the first alsa device as a simplification.
+    uint64_t saved_transferred_frames = 0;
+    struct alsa_device_info *device_info = stream_get_first_alsa_device(alsa_devices);
+    if (device_info != NULL) saved_transferred_frames = device_info->proxy.transferred;
+
     int ret = stream_set_new_devices(config, alsa_devices, num_configs, cards, devices, direction);
 
     if (ret != 0) {
@@ -1661,6 +1670,13 @@
     } else {
         *patch_handle = *handle;
     }
+
+    // Timestamps: Restore transferred frames.
+    if (saved_transferred_frames != 0) {
+        device_info = stream_get_first_alsa_device(alsa_devices);
+        if (device_info != NULL) device_info->proxy.transferred = saved_transferred_frames;
+    }
+
     if (!wasStandby) {
         device_lock(adev);
         if (in != NULL) {