getAudioStream method

Future<StreamSubscription?> getAudioStream({
  1. required dynamic onAudioReceived(
    1. List<int>
    ),
})

Implementation

Future<StreamSubscription?> getAudioStream({
  required Function(List<int>) onAudioReceived,
}) async {
  if (!isConnected || _connectedDevice == null) {
    throw Exception('Device not connected');
  }

  try {
    final services = await _connectedDevice!.discoverServices();
    final audioService = services.firstWhere(
      (s) =>
          s.uuid.str128.toLowerCase() ==
          DeviceConstants.omiServiceUuid.toLowerCase(),
      orElse: () => throw Exception('Audio service not found'),
    );

    final audioCharacteristic = audioService.characteristics.firstWhere(
      (c) =>
          c.uuid.str128.toLowerCase() ==
          DeviceConstants.audioCharacteristicUuid.toLowerCase(),
      orElse: () => throw Exception('Audio characteristic not found'),
    );

    if (Platform.isAndroid &&
        _connectedDevice!.mtuNow < DeviceConstants.defaultMtuSize) {
      await _connectedDevice!.requestMtu(DeviceConstants.defaultMtuSize);
    }

    await audioCharacteristic.setNotifyValue(true);

    final subscription = audioCharacteristic.lastValueStream.listen((value) {
      if (value.isNotEmpty) {
        onAudioReceived(value);
      }
    });

    _connectedDevice!.cancelWhenDisconnected(subscription);
    return subscription;
  } catch (e) {
    throw Exception('Failed to setup audio stream: $e');
  }
}