///
/// AudioSet.swift
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/nitro
/// Copyright © Marc Rousavy @ Margelo
///

import NitroModules

/**
 * Represents an instance of `AudioSet`, backed by a C++ struct.
 */
public typealias AudioSet = margelo.nitro.sound.AudioSet

public extension AudioSet {
  private typealias bridge = margelo.nitro.sound.bridge.swift

  /**
   * Create a new instance of `AudioSet`.
   */
  init(AVEncoderAudioQualityKeyIOS: AVEncoderAudioQualityIOSType?, AVModeIOS: AVModeIOSOption?, AVEncodingOptionIOS: AVEncodingOption?, AVFormatIDKeyIOS: AVEncodingOption?, AVNumberOfChannelsKeyIOS: Double?, AVLinearPCMBitDepthKeyIOS: AVLinearPCMBitDepthKeyIOSType?, AVLinearPCMIsBigEndianKeyIOS: Bool?, AVLinearPCMIsFloatKeyIOS: Bool?, AVLinearPCMIsNonInterleavedIOS: Bool?, AVSampleRateKeyIOS: Double?, AudioSourceAndroid: AudioSourceAndroidType?, OutputFormatAndroid: OutputFormatAndroidType?, AudioEncoderAndroid: AudioEncoderAndroidType?, AudioQuality: AudioQualityType?, AudioChannels: Double?, AudioSamplingRate: Double?, AudioEncodingBitRate: Double?, IncludeBase64: Bool?) {
    self.init({ () -> bridge.std__optional_AVEncoderAudioQualityIOSType_ in
      if let __unwrappedValue = AVEncoderAudioQualityKeyIOS {
        return bridge.create_std__optional_AVEncoderAudioQualityIOSType_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_AVModeIOSOption_ in
      if let __unwrappedValue = AVModeIOS {
        return bridge.create_std__optional_AVModeIOSOption_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_AVEncodingOption_ in
      if let __unwrappedValue = AVEncodingOptionIOS {
        return bridge.create_std__optional_AVEncodingOption_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_AVEncodingOption_ in
      if let __unwrappedValue = AVFormatIDKeyIOS {
        return bridge.create_std__optional_AVEncodingOption_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = AVNumberOfChannelsKeyIOS {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_AVLinearPCMBitDepthKeyIOSType_ in
      if let __unwrappedValue = AVLinearPCMBitDepthKeyIOS {
        return bridge.create_std__optional_AVLinearPCMBitDepthKeyIOSType_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_bool_ in
      if let __unwrappedValue = AVLinearPCMIsBigEndianKeyIOS {
        return bridge.create_std__optional_bool_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_bool_ in
      if let __unwrappedValue = AVLinearPCMIsFloatKeyIOS {
        return bridge.create_std__optional_bool_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_bool_ in
      if let __unwrappedValue = AVLinearPCMIsNonInterleavedIOS {
        return bridge.create_std__optional_bool_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = AVSampleRateKeyIOS {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_AudioSourceAndroidType_ in
      if let __unwrappedValue = AudioSourceAndroid {
        return bridge.create_std__optional_AudioSourceAndroidType_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_OutputFormatAndroidType_ in
      if let __unwrappedValue = OutputFormatAndroid {
        return bridge.create_std__optional_OutputFormatAndroidType_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_AudioEncoderAndroidType_ in
      if let __unwrappedValue = AudioEncoderAndroid {
        return bridge.create_std__optional_AudioEncoderAndroidType_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_AudioQualityType_ in
      if let __unwrappedValue = AudioQuality {
        return bridge.create_std__optional_AudioQualityType_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = AudioChannels {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = AudioSamplingRate {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = AudioEncodingBitRate {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_bool_ in
      if let __unwrappedValue = IncludeBase64 {
        return bridge.create_std__optional_bool_(__unwrappedValue)
      } else {
        return .init()
      }
    }())
  }

  @inline(__always)
  var AVEncoderAudioQualityKeyIOS: AVEncoderAudioQualityIOSType? {
    return self.__AVEncoderAudioQualityKeyIOS.has_value() ? self.__AVEncoderAudioQualityKeyIOS.pointee : nil
  }
  
  @inline(__always)
  var AVModeIOS: AVModeIOSOption? {
    return self.__AVModeIOS.value
  }
  
  @inline(__always)
  var AVEncodingOptionIOS: AVEncodingOption? {
    return self.__AVEncodingOptionIOS.value
  }
  
  @inline(__always)
  var AVFormatIDKeyIOS: AVEncodingOption? {
    return self.__AVFormatIDKeyIOS.value
  }
  
  @inline(__always)
  var AVNumberOfChannelsKeyIOS: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__AVNumberOfChannelsKeyIOS) {
        let __unwrapped = bridge.get_std__optional_double_(self.__AVNumberOfChannelsKeyIOS)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var AVLinearPCMBitDepthKeyIOS: AVLinearPCMBitDepthKeyIOSType? {
    return self.__AVLinearPCMBitDepthKeyIOS.has_value() ? self.__AVLinearPCMBitDepthKeyIOS.pointee : nil
  }
  
  @inline(__always)
  var AVLinearPCMIsBigEndianKeyIOS: Bool? {
    return { () -> Bool? in
      if bridge.has_value_std__optional_bool_(self.__AVLinearPCMIsBigEndianKeyIOS) {
        let __unwrapped = bridge.get_std__optional_bool_(self.__AVLinearPCMIsBigEndianKeyIOS)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var AVLinearPCMIsFloatKeyIOS: Bool? {
    return { () -> Bool? in
      if bridge.has_value_std__optional_bool_(self.__AVLinearPCMIsFloatKeyIOS) {
        let __unwrapped = bridge.get_std__optional_bool_(self.__AVLinearPCMIsFloatKeyIOS)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var AVLinearPCMIsNonInterleavedIOS: Bool? {
    return { () -> Bool? in
      if bridge.has_value_std__optional_bool_(self.__AVLinearPCMIsNonInterleavedIOS) {
        let __unwrapped = bridge.get_std__optional_bool_(self.__AVLinearPCMIsNonInterleavedIOS)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var AVSampleRateKeyIOS: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__AVSampleRateKeyIOS) {
        let __unwrapped = bridge.get_std__optional_double_(self.__AVSampleRateKeyIOS)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var AudioSourceAndroid: AudioSourceAndroidType? {
    return self.__AudioSourceAndroid.has_value() ? self.__AudioSourceAndroid.pointee : nil
  }
  
  @inline(__always)
  var OutputFormatAndroid: OutputFormatAndroidType? {
    return self.__OutputFormatAndroid.has_value() ? self.__OutputFormatAndroid.pointee : nil
  }
  
  @inline(__always)
  var AudioEncoderAndroid: AudioEncoderAndroidType? {
    return self.__AudioEncoderAndroid.has_value() ? self.__AudioEncoderAndroid.pointee : nil
  }
  
  @inline(__always)
  var AudioQuality: AudioQualityType? {
    return self.__AudioQuality.value
  }
  
  @inline(__always)
  var AudioChannels: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__AudioChannels) {
        let __unwrapped = bridge.get_std__optional_double_(self.__AudioChannels)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var AudioSamplingRate: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__AudioSamplingRate) {
        let __unwrapped = bridge.get_std__optional_double_(self.__AudioSamplingRate)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var AudioEncodingBitRate: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__AudioEncodingBitRate) {
        let __unwrapped = bridge.get_std__optional_double_(self.__AudioEncodingBitRate)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var IncludeBase64: Bool? {
    return { () -> Bool? in
      if bridge.has_value_std__optional_bool_(self.__IncludeBase64) {
        let __unwrapped = bridge.get_std__optional_bool_(self.__IncludeBase64)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
}
