enumerateDevices method

  1. @override
Future<List<MiniAVDeviceInfo>> enumerateDevices()
override

Enumerate available loopback (output) devices.

Implementation

@override
Future<List<MiniAVDeviceInfo>> enumerateDevices() async {
  final devicesPtrPtr = calloc<ffi.Pointer<bindings.MiniAVDeviceInfo>>();
  final countPtr = calloc<ffi.Uint32>();

  try {
    final res = bindings.MiniAV_Loopback_EnumerateTargets(
      bindings.MiniAVLoopbackTargetType.MINIAV_LOOPBACK_TARGET_SYSTEM_AUDIO,
      devicesPtrPtr,
      countPtr,
    );

    if (res != bindings.MiniAVResultCode.MINIAV_SUCCESS) {
      throw Exception('Failed to enumerate loopback devices: ${res.name}');
    }

    final count = countPtr.value;
    if (count == 0) {
      return [];
    }

    final devicesPtr = devicesPtrPtr.value;
    final devices = <MiniAVDeviceInfo>[];
    for (int i = 0; i < count; i++) {
      final deviceInfoC = devicesPtr.elementAt(i).ref;
      devices.add(
        DeviceInfoFFIToPlatform.fromNative(deviceInfoC).toPlatformType(),
      );
    }

    bindings.MiniAV_FreeDeviceList(devicesPtr, count);
    return devices;
  } finally {
    calloc.free(devicesPtrPtr);
    calloc.free(countPtr);
  }
}