theallelectricsmartgrid

Published-source investigation: iPad / MAYA44 USB+ periodic holes

Research date: 2026-09-09. Read-only investigation; no app code, deployment, firmware, or device settings changed. Evidence packet and latest tone capture take precedence over reports from other users.

Finding: No public Apple/JUCE/ESI report located identifies this exact failure or defines AUAAudioDevice_updateTimeStamp ioDriftNS. The strongest current lead comes from our own data: paired input-transfer anomalies precede cumulative driver timestamp steps, despite an output-only app and uninterrupted callback sample times. Published material makes a clock/timestamp coupling mechanism plausible, but does not identify whether the initiating fault is device, hub, host-controller scheduling, USB driver, or app/session setup.

What is corroborated

Local /Users/joyo/JUCE/modules/juce_core/system/juce_StandardHeader.h:42 declares JUCE 8.0.2. The local iOS source predates substantial upstream negotiation changes. The app-local patches described in the evidence packet only remove the duration numerator’s +1 and change the physical-device default buffer size. They do not contain the later complete upstream sequence below.

The tone session establishes that normal Nonagon DSP and its direct MIDI sending are unnecessary for this periodic symptom. It does not remove JUCE, RemoteIO, app threads, session setup, or the USB path. Its 512-frame period is an observation about the analog symptom, not proof of where silence was inserted.

Apple’s TN3190, USB audio device design considerations, first published 2025-10-07 and replacing TN2274, documents:

Application limit: Full speed and continued IN traffic alone do not establish ADC1, implicit feedback, or the actual clock chosen for this MAYA. The documentation does not explain ioDriftNS, zlpCount, the 97-frame conversion, or the observed recovery. Its architecture discussion supports investigating input timing, not asserting a diagnosed feedback bug.

Our desktop control runs macOS 15.7.4; the iPad runs 26.6.1 and visibly uses usbaudiod. Together with Apple’s documented macOS 26 transition, this makes driver generation a meaningful confounder. A clean desktop run does not test an identical OS driver path merely because the physical class-compliant interface is the same. The public note does not date the iPad’s internal driver transition or establish binary equivalence across platforms.

Apple’s QA1631, updated 2015-10-14, recommends setting preferred duration/rate while inactive and reading actual values after activation. Preferences are hints; reconfiguration can stop/restart I/O. Non-mixable sessions have greater preference priority. This explains why requested, cached, and delivered sizes must be distinguished. It does not explain a late fault while delivered frames/rate remain stable.

JUCE changes after 8.0.2

Dates below are committer dates, verified from the upstream file history API, saved as juce-ios-history.json beside this report. Author dates sometimes precede these dates. Four detailed JSON diffs are also saved here.

Date Verified upstream change Relevance and limit
2024-10-03 d3e254e2: exact requested duration on iOS 18; retain old +1 behavior on older iOS. Our local duration patch covers the iOS 26 aspect of this change. It cannot now explain the continuing tone fault by itself.
2024-10-03–04 70c9c5bf: wait for a temporary RemoteIO callback after activation; 7e73ed7c: use suggested power-of-two buffer sizes instead of active probing on iOS 18. Maintainers reproduced asynchronous duration reporting and found repeated probing unreliable. This directly matters to our startup/restart sequence and stale 4096 property.
2024-10-21–11-21 6f20de54: restore rate after probing; 3506d66f: deactivate before preference changes; 55fb6dbe: refresh rate/size even when explicit rates bypass probing. Addresses incorrect startup reports and callbacks larger than announced. Confirmed constant 512 callbacks argue against a simple stale-size explanation of the late holes.
2025-02-12–13 0864d614, bd7eff07: AudioQueue workaround for unreliable iOS 18 rate discovery/reporting. Configuration concern; later narrowed for newer OS versions.
2025-02-27 5008d349: remove session deactivation/reactivation around rate changes to prevent glitches. 4cbbf203: likewise simplify buffer requests, avoid redundant requests, and assume eventual requested size on iOS 18. Important: later upstream reversed parts of the October workaround. Do not treat the 2024 solution as the current complete implementation.
2025-02-27 462c1c85: cache supported rates by route, avoid redundant requests; a433e4dc: set targets before hardware queries; f985cf0c: restore rate after probing. Material reduction in configuration churn; no published claim that these fix our persistent periodic USB symptom.
2025-05-27 457de394: remove buffer-size assertion. Further reason not to equate a reported device size with every callback.
2025-09-16; 2026-06-01 99d8b9b5: iOS 26 sample-rate detection fix; 30ba9c31: avoid AudioQueue workaround from iOS 18.7.3 onward. These fix a newer workaround absent in local 8.0.2. Their titles alone are not evidence that 8.0.2 has that same startup error.

The JUCE maintainers’ October 2024 discussion records a reproduced iOS 18 contract change, the callback-wait approach, and remaining failure under repeated changes. Their January 2025 clarification says 8.0.5 included the then-linked changes; later work still followed. The iOS 26 / 18.7.3 discussion confirms the later workaround restrictions.

The current upstream iOS source still uses RemoteIO, still has an activation callback wait, caches rates, and skips active buffer-range probing on newer iOS. Its xrun detector examines callback sample-time continuity, as the local source does. It is not an end-to-end USB/DAC fault counter. Nothing located establishes that upgrading fixes our symptom; the missing changes make current JUCE a meaningful later comparison, not a proved remedy.

Zero-length transfers and timestamp ambiguity

Our own stable tone logs contain 26 zero-length input transfers, two preceding each major drift step, with no USB transaction-error log during playback. Parent analysis independently counted this. Some pairs straddle adjacent 8 ms transfer-manager blocks. This connects the private driver’s input-transfer bookkeeping with its timing corrections more tightly than a generic CPU-load explanation.

However, zlpCount is the driver’s label, not an analyzer trace of wire packets. A mirror of AppleUSBAudio 273.4.1, copyright 1998–2010 documents an old case where device oversupply caused an overrun but a controller reported actual byte count zero. That code substituted requested length to preserve timing and could restart a multistream engine after repeated overruns. Historical analogy only: it is an Apple-authored source mirror, not verified current iPad driver source; our logs do not show that old overrun status. It cautions against interpreting a zero reported length as proof of a valid empty packet deliberately emitted by MAYA.

The time conversion 2.020833 ms × 48 kHz ≈ 97 frames is valid. The conclusions “97 input frames were missing”, “97 output frames were dropped”, and “the driver added exactly two USB packets of latency” are unproved. The two empty-transfer association makes those testable ideas, not definitions of the private field.

ESI and other published reports

ESI explicitly supports MAYA44 USB+ with iPad/Traktor DJ, historically iOS 6+ with Apple’s adapter and an externally powered hub. Its current product page also advertises Cubasis LE for iPhone/iPad. These establish intended iPad use, not certification of this M3/iPadOS 26.6.1 combination.

The MAYA44 USB+ download listing lists Windows driver/control-panel 4.2 dated 2022-12-19 and manuals dated Q3 2021. No separately named MAYA44 USB+ firmware update or release note documenting periodic iOS gaps was found. This is a search result, not proof no internal firmware revision exists. The local device revision is 0x0301 / 3.01, which must not be confused with Windows driver versions.

ESI’s Mac clicks/dropouts article KB00163EN attributes problems on some OS X 10.7-era Macs to changed Apple hardware/USB performance. Its old Intel Mac boot-argument advice is not an applicable iPad remedy. Linux upstream mixer maps recognize this exact VID/PID, 2573:0008. The MAYA changes located in history concern mixer names/controls and a malformed mixer descriptor, not a documented periodic clocking fix. Current quirks.c and implicit.c downloads contain no MAYA/2573 entry; absence is not proof of compliance or lack of generic driver behavior.

A macOS Tahoe user report describes progressively worsening USB-headphone crackle and current microframe timestamp calcError logs. It is an anecdotal lead on a different device/OS, without an Apple-confirmed cause. Do not use it to identify our bug or treat every calcError line as an error event. JUCE issue 1456, opened 2024-10-22, concerns JUCE 8.0.3, iPadOS 17.6.1, and an unsupported 8 kHz Bluetooth preference; it is a configuration analogy, not a close match to stable 48 kHz MAYA playback.

Most discriminating checks using existing data

  1. Three timelines: compare each input-transfer pair, driver step, and callback-time step, preserving measured uncertainty. The driver logs sample times on a 12,000-frame/250 ms cadence, so about 250 ms between a logged step and callback response should not automatically be called a queue latency. Recover any richer timing records from the archive before assigning semantics.
  2. Phase continuity around holes: fit the surviving tone before and after each gap. Distinguish elapsed-time phase continuity (silence replacing scheduled output) from a delayed or skipped source phase. A 1 kHz tone repeats every 48 frames, so a 97-frame displacement aliases to one frame modulo 48; a sine alone cannot establish the whole-frame loss count.
  3. Fold hole positions over 512 frames, 384 frames/8 ms, and their 1,536-frame/32 ms common period. A stable 32 ms pattern could distinguish callback/transfer alignment from random starvation. This is arithmetic using the observed geometries, not a published Apple mechanism. Include widening and recovery while drift continues rising; a simple monotonic “more drift means worse holes” model must survive that counterexample.
  4. Cross-run negative controls: compare zero-length counts and cumulative drift with the surviving Drambo/SmartGrid data, keeping startup and disconnect excluded. Short clean SmartGrid with a small step shows that a step alone is insufficient. Zero anomalous input transfers in the longer Drambo run is stronger than zero transaction errors alone, but not yet a controlled same-duration startup-history comparison.
  5. Check configuration history without rebuilding: compare rates/activation/restarts before final settle and look for any hardware-change notification near onset. Stable callback sizes and lack of late reconfiguration weaken a direct size-switch explanation; startup state could still predispose the lower path to a later fault.

Descriptor gap: The existing mac-maya-device-state.txt, smartgrid-macos-20260909-usb-audio.json, smartgrid-ipad-usb-session.txt, and tone extract confirm identity, full speed, interfaces, formats, and a HID report descriptor. Searches found no audio configuration/endpoint descriptor bytes. The HID descriptor does not reveal audio synchronization. Needed fields include audio-class version, streaming alternate settings, endpoint bmAttributes, wMaxPacketSize, bInterval, bSynchAddress, and any clock entities. If an older full IORegistry/USBProber capture or sysdiagnose contains those, decode it first. Apple’s IOUSBHost descriptor APIs provide a later retrieval route, but querying the device would be new evidence, and no device was opened/reset/claimed here. A descriptor from another unit is only corroborative unless identity/revision match; descriptors still cannot prove current wire timing.

The report supports prioritizing the observed input-transfer/timestamp chain and auditing the pre-stream negotiation sequence. It does not justify choosing a single owner of the defect or applying an old workaround as a confirmed fix.