is the output frame rate of a CMIOExtension rounded or capped?

I made a CMIOExtension (a virtual camera) which generates its own output, for use in our in-house software testing. I wanted to make a video source with 29.97, 30, 59.94 and 60fps output.

To this end, I created a CMIOExtensionDeviceSource which creates a CMIOExtensionDevice with one CMIOExtensionStreamSource with various stream formats contained in [CMIOExtensionStreamFormat], including one with both maxFrameDuration and minFrameDuration = CMTimeMake(value: 1000, timescale: 30000) and another with both maxFrameDuration and minFrameDuration = CMTimeMake(value: 1001, timescale: 30000)

I've held off on the creation of the 59.94/60fps source for now until this problem is resolved.

my virtual camera works, it produces a signal, but when I examine its associated AVCaptureDevice in the debugger, I find

(lldb) po self.captureDevice?.formats[0].videoSupportedFrameRateRanges[0].maxFrameDuration
▿ Optional<CMTime>
  ▿ some : CMTime
    - value : 1000000
    - timescale : 30000000
    ▿ flags : CMTimeFlags
      - rawValue : 1
    - epoch : 0

I get the same value, 1000000/30000000, or exactly 30fps, for all the formats of my AVCaptureDevice.

Is there something I'm doing wrong, or do CMIOExtensionDevices always round the frame rates?

I can't force CoreMediaIO to produce frames at exactly my desired frame interval, but I'd like to ensure that the average frame rate is my desired rate. How can I do that? Frame emission is governed by a repeating DispatchSourceTimer with a repeat time specified in nanoseconds with the TimerFlags set to 'strict'.

is the output frame rate of a CMIOExtension rounded or capped?
 
 
Q