use std::io::{Seek, Write};
use pipewire_wrapper_proc_macro::object_type_impl;
use crate::enum_wrapper;
use crate::spa::pod::array::PodArrayRef;
use crate::spa::pod::id::{PodIdRef, PodIdType};
use crate::spa::pod::object::prop::AudioIec958Codec;
use crate::spa::pod::object::{PodPropKeyType, PodPropRef};
use crate::spa::pod::{
    BasicTypePod, PodError, PodFractionRef, PodIntRef, PodLongRef, PodRectangleRef, PodResult,
};
use crate::wrapper::RawWrapper;
#[allow(non_camel_case_types)]
#[derive(Debug)]
#[repr(u32)]
#[object_type_impl(OBJECT_FORMAT)]
pub enum ObjectFormatType<'a> {
    MEDIA_TYPE(&'a PodIdRef<MediaType>) = Format::MEDIA_TYPE.raw,
    MEDIA_SUBTYPE(&'a PodIdRef<MediaSubType>) = Format::MEDIA_SUBTYPE.raw,
    AUDIO_FORMAT(&'a PodIdRef<AudioFormat>) = Format::AUDIO_FORMAT.raw,
    AUDIO_FLAGS(&'a PodIntRef) = Format::AUDIO_FLAGS.raw,
    AUDIO_RATE(&'a PodIntRef) = Format::AUDIO_RATE.raw,
    AUDIO_CHANNELS(&'a PodIntRef) = Format::AUDIO_CHANNELS.raw,
    AUDIO_POSITION(&'a PodArrayRef<PodIdRef<u32>>) = Format::AUDIO_POSITION.raw, AUDIO_IEC958CODEC(&'a PodIdRef<AudioIec958Codec>) = Format::AUDIO_IEC958CODEC.raw,
    AUDIO_BITORDER(&'a PodIdRef<ParamBitorder>) = Format::AUDIO_BITORDER.raw,
    AUDIO_INTERLEAVE(&'a PodIntRef) = Format::AUDIO_INTERLEAVE.raw,
    VIDEO_FORMAT(&'a PodIdRef<VideoFormat>) = Format::VIDEO_FORMAT.raw,
    VIDEO_MODIFIER(&'a PodLongRef) = Format::VIDEO_MODIFIER.raw,
    VIDEO_SIZE(&'a PodRectangleRef) = Format::VIDEO_SIZE.raw,
    VIDEO_FRAMERATE(&'a PodFractionRef) = Format::VIDEO_FRAMERATE.raw,
    VIDEO_MAX_FRAMERATE(&'a PodFractionRef) = Format::VIDEO_MAX_FRAMERATE.raw,
    VIDEO_VIEWS(&'a PodIntRef) = Format::VIDEO_VIEWS.raw,
    VIDEO_INTERLACE_MODE(&'a PodIdRef<VideoInterlaceMode>) = Format::VIDEO_INTERLACE_MODE.raw,
    VIDEO_PIXEL_ASPECT_RATIO(&'a PodRectangleRef) = Format::VIDEO_PIXEL_ASPECT_RATIO.raw,
    VIDEO_MULTIVIEW_MODE(&'a PodIdRef<VideoMultiviewMode>) = Format::VIDEO_MULTIVIEW_MODE.raw,
    VIDEO_MULTIVIEW_FLAGS(&'a PodIdRef<VideoMultiviewFlags>) = Format::VIDEO_MULTIVIEW_FLAGS.raw,
    VIDEO_CHROMA_SITE(&'a PodIdRef<VideoChromaSite>) = Format::VIDEO_CHROMA_SITE.raw,
    VIDEO_COLOR_RANGE(&'a PodIdRef<VideoColorRange>) = Format::VIDEO_COLOR_RANGE.raw,
    VIDEO_COLOR_MATRIX(&'a PodIdRef<VideoColorMatrix>) = Format::VIDEO_COLOR_MATRIX.raw,
    VIDEO_TRANSFER_FUNCTION(&'a PodIdRef<VideoTransferFunction>) =
        Format::VIDEO_TRANSFER_FUNCTION.raw,
    VIDEO_COLOR_PRIMARIES(&'a PodIdRef<VideoColorPrimaries>) = Format::VIDEO_COLOR_PRIMARIES.raw,
    VIDEO_PROFILE(&'a PodIntRef) = Format::VIDEO_PROFILE.raw,
    VIDEO_LEVEL(&'a PodIntRef) = Format::VIDEO_LEVEL.raw,
    VIDEO_H264_STREAM_FORMAT(&'a PodIdRef<VideoH264StreamFormat>) =
        Format::VIDEO_H264_STREAM_FORMAT.raw,
    VIDEO_H264_ALIGNMENT(&'a PodIdRef<VideoH264Alignment>) = Format::VIDEO_H264_ALIGNMENT.raw,
}
impl<'a> TryFrom<&'a PodPropRef<'a, ObjectFormatType<'a>>> for ObjectFormatType<'a> {
    type Error = PodError;
    fn try_from(value: &'a PodPropRef<'a, ObjectFormatType<'a>>) -> Result<Self, Self::Error> {
        unsafe {
            match Format::from_raw(value.raw.key) {
                Format::MEDIA_TYPE => Ok(ObjectFormatType::MEDIA_TYPE(value.pod().cast()?)),
                Format::MEDIA_SUBTYPE => Ok(ObjectFormatType::MEDIA_SUBTYPE(value.pod().cast()?)),
                Format::AUDIO_FORMAT => Ok(ObjectFormatType::AUDIO_FORMAT(value.pod().cast()?)),
                Format::AUDIO_FLAGS => Ok(ObjectFormatType::AUDIO_FLAGS(value.pod().cast()?)),
                Format::AUDIO_RATE => Ok(ObjectFormatType::AUDIO_RATE(value.pod().cast()?)),
                Format::AUDIO_CHANNELS => Ok(ObjectFormatType::AUDIO_CHANNELS(value.pod().cast()?)),
                Format::AUDIO_POSITION => Ok(ObjectFormatType::AUDIO_POSITION(value.pod().cast()?)),
                Format::AUDIO_IEC958CODEC => {
                    Ok(ObjectFormatType::AUDIO_IEC958CODEC(value.pod().cast()?))
                }
                Format::AUDIO_BITORDER => Ok(ObjectFormatType::AUDIO_BITORDER(value.pod().cast()?)),
                Format::AUDIO_INTERLEAVE => {
                    Ok(ObjectFormatType::AUDIO_INTERLEAVE(value.pod().cast()?))
                }
                Format::VIDEO_FORMAT => Ok(ObjectFormatType::VIDEO_FORMAT(value.pod().cast()?)),
                Format::VIDEO_MODIFIER => Ok(ObjectFormatType::VIDEO_MODIFIER(value.pod().cast()?)),
                Format::VIDEO_SIZE => Ok(ObjectFormatType::VIDEO_SIZE(value.pod().cast()?)),
                Format::VIDEO_FRAMERATE => {
                    Ok(ObjectFormatType::VIDEO_FRAMERATE(value.pod().cast()?))
                }
                Format::VIDEO_MAX_FRAMERATE => {
                    Ok(ObjectFormatType::VIDEO_MAX_FRAMERATE(value.pod().cast()?))
                }
                Format::VIDEO_VIEWS => Ok(ObjectFormatType::VIDEO_VIEWS(value.pod().cast()?)),
                Format::VIDEO_INTERLACE_MODE => {
                    Ok(ObjectFormatType::VIDEO_INTERLACE_MODE(value.pod().cast()?))
                }
                Format::VIDEO_PIXEL_ASPECT_RATIO => Ok(ObjectFormatType::VIDEO_PIXEL_ASPECT_RATIO(
                    value.pod().cast()?,
                )),
                Format::VIDEO_MULTIVIEW_MODE => {
                    Ok(ObjectFormatType::VIDEO_MULTIVIEW_MODE(value.pod().cast()?))
                }
                Format::VIDEO_MULTIVIEW_FLAGS => {
                    Ok(ObjectFormatType::VIDEO_MULTIVIEW_FLAGS(value.pod().cast()?))
                }
                Format::VIDEO_CHROMA_SITE => {
                    Ok(ObjectFormatType::VIDEO_CHROMA_SITE(value.pod().cast()?))
                }
                Format::VIDEO_COLOR_RANGE => {
                    Ok(ObjectFormatType::VIDEO_COLOR_RANGE(value.pod().cast()?))
                }
                Format::VIDEO_COLOR_MATRIX => {
                    Ok(ObjectFormatType::VIDEO_COLOR_MATRIX(value.pod().cast()?))
                }
                Format::VIDEO_TRANSFER_FUNCTION => Ok(ObjectFormatType::VIDEO_TRANSFER_FUNCTION(
                    value.pod().cast()?,
                )),
                Format::VIDEO_COLOR_PRIMARIES => {
                    Ok(ObjectFormatType::VIDEO_COLOR_PRIMARIES(value.pod().cast()?))
                }
                Format::VIDEO_PROFILE => Ok(ObjectFormatType::VIDEO_PROFILE(value.pod().cast()?)),
                Format::VIDEO_LEVEL => Ok(ObjectFormatType::VIDEO_LEVEL(value.pod().cast()?)),
                Format::VIDEO_H264_STREAM_FORMAT => Ok(ObjectFormatType::VIDEO_H264_STREAM_FORMAT(
                    value.pod().cast()?,
                )),
                Format::VIDEO_H264_ALIGNMENT => {
                    Ok(ObjectFormatType::VIDEO_H264_ALIGNMENT(value.pod().cast()?))
                }
                _ => Err(PodError::UnknownPodTypeToDowncast),
            }
        }
    }
}
impl<'a> PodPropKeyType<'a> for ObjectFormatType<'a> {
    fn write_prop<W>(&self, buffer: &mut W) -> PodResult<()>
    where
        W: Write + Seek,
    {
        match self {
            ObjectFormatType::MEDIA_TYPE(pod) => {
                Self::write_pod_prop(buffer, Format::MEDIA_TYPE.raw, 0, pod)
            }
            ObjectFormatType::MEDIA_SUBTYPE(pod) => {
                Self::write_pod_prop(buffer, Format::MEDIA_SUBTYPE.raw, 0, pod)
            }
            ObjectFormatType::AUDIO_FORMAT(pod) => {
                Self::write_pod_prop(buffer, Format::AUDIO_FORMAT.raw, 0, pod)
            }
            ObjectFormatType::AUDIO_FLAGS(pod) => {
                Self::write_pod_prop(buffer, Format::AUDIO_FLAGS.raw, 0, pod)
            }
            ObjectFormatType::AUDIO_RATE(pod) => {
                Self::write_pod_prop(buffer, Format::AUDIO_RATE.raw, 0, pod)
            }
            ObjectFormatType::AUDIO_CHANNELS(pod) => {
                Self::write_pod_prop(buffer, Format::AUDIO_CHANNELS.raw, 0, pod)
            }
            ObjectFormatType::AUDIO_POSITION(pod) => {
                Self::write_pod_prop(buffer, Format::AUDIO_POSITION.raw, 0, pod)
            }
            ObjectFormatType::AUDIO_IEC958CODEC(pod) => {
                Self::write_pod_prop(buffer, Format::AUDIO_IEC958CODEC.raw, 0, pod)
            }
            ObjectFormatType::AUDIO_BITORDER(pod) => {
                Self::write_pod_prop(buffer, Format::AUDIO_BITORDER.raw, 0, pod)
            }
            ObjectFormatType::AUDIO_INTERLEAVE(pod) => {
                Self::write_pod_prop(buffer, Format::AUDIO_INTERLEAVE.raw, 0, pod)
            }
            ObjectFormatType::VIDEO_FORMAT(pod) => {
                Self::write_pod_prop(buffer, Format::VIDEO_FORMAT.raw, 0, pod)
            }
            ObjectFormatType::VIDEO_MODIFIER(pod) => {
                Self::write_pod_prop(buffer, Format::VIDEO_MODIFIER.raw, 0, pod)
            }
            ObjectFormatType::VIDEO_SIZE(pod) => {
                Self::write_pod_prop(buffer, Format::VIDEO_SIZE.raw, 0, pod)
            }
            ObjectFormatType::VIDEO_FRAMERATE(pod) => {
                Self::write_pod_prop(buffer, Format::VIDEO_FRAMERATE.raw, 0, pod)
            }
            ObjectFormatType::VIDEO_MAX_FRAMERATE(pod) => {
                Self::write_pod_prop(buffer, Format::VIDEO_MAX_FRAMERATE.raw, 0, pod)
            }
            ObjectFormatType::VIDEO_VIEWS(pod) => {
                Self::write_pod_prop(buffer, Format::VIDEO_VIEWS.raw, 0, pod)
            }
            ObjectFormatType::VIDEO_INTERLACE_MODE(pod) => {
                Self::write_pod_prop(buffer, Format::VIDEO_INTERLACE_MODE.raw, 0, pod)
            }
            ObjectFormatType::VIDEO_PIXEL_ASPECT_RATIO(pod) => {
                Self::write_pod_prop(buffer, Format::VIDEO_PIXEL_ASPECT_RATIO.raw, 0, pod)
            }
            ObjectFormatType::VIDEO_MULTIVIEW_MODE(pod) => {
                Self::write_pod_prop(buffer, Format::VIDEO_MULTIVIEW_MODE.raw, 0, pod)
            }
            ObjectFormatType::VIDEO_MULTIVIEW_FLAGS(pod) => {
                Self::write_pod_prop(buffer, Format::VIDEO_MULTIVIEW_FLAGS.raw, 0, pod)
            }
            ObjectFormatType::VIDEO_CHROMA_SITE(pod) => {
                Self::write_pod_prop(buffer, Format::VIDEO_CHROMA_SITE.raw, 0, pod)
            }
            ObjectFormatType::VIDEO_COLOR_RANGE(pod) => {
                Self::write_pod_prop(buffer, Format::VIDEO_COLOR_RANGE.raw, 0, pod)
            }
            ObjectFormatType::VIDEO_COLOR_MATRIX(pod) => {
                Self::write_pod_prop(buffer, Format::VIDEO_COLOR_MATRIX.raw, 0, pod)
            }
            ObjectFormatType::VIDEO_TRANSFER_FUNCTION(pod) => {
                Self::write_pod_prop(buffer, Format::VIDEO_TRANSFER_FUNCTION.raw, 0, pod)
            }
            ObjectFormatType::VIDEO_COLOR_PRIMARIES(pod) => {
                Self::write_pod_prop(buffer, Format::VIDEO_COLOR_PRIMARIES.raw, 0, pod)
            }
            ObjectFormatType::VIDEO_PROFILE(pod) => {
                Self::write_pod_prop(buffer, Format::VIDEO_PROFILE.raw, 0, pod)
            }
            ObjectFormatType::VIDEO_LEVEL(pod) => {
                Self::write_pod_prop(buffer, Format::VIDEO_LEVEL.raw, 0, pod)
            }
            ObjectFormatType::VIDEO_H264_STREAM_FORMAT(pod) => {
                Self::write_pod_prop(buffer, Format::VIDEO_H264_STREAM_FORMAT.raw, 0, pod)
            }
            ObjectFormatType::VIDEO_H264_ALIGNMENT(pod) => {
                Self::write_pod_prop(buffer, Format::VIDEO_H264_ALIGNMENT.raw, 0, pod)
            }
        }
    }
}
enum_wrapper!(
    Format,
    spa_sys::spa_format,
    _START: spa_sys::SPA_FORMAT_START,
    MEDIA_TYPE: spa_sys::SPA_FORMAT_mediaType,
    MEDIA_SUBTYPE: spa_sys::SPA_FORMAT_mediaSubtype,
    _START_AUDIO: spa_sys::SPA_FORMAT_START_Audio,
    AUDIO_FORMAT: spa_sys::SPA_FORMAT_AUDIO_format,
    AUDIO_FLAGS: spa_sys::SPA_FORMAT_AUDIO_flags,
    AUDIO_RATE: spa_sys::SPA_FORMAT_AUDIO_rate,
    AUDIO_CHANNELS: spa_sys::SPA_FORMAT_AUDIO_channels,
    AUDIO_POSITION: spa_sys::SPA_FORMAT_AUDIO_position,
    AUDIO_IEC958CODEC: spa_sys::SPA_FORMAT_AUDIO_iec958Codec,
    AUDIO_BITORDER: spa_sys::SPA_FORMAT_AUDIO_bitorder,
    AUDIO_INTERLEAVE: spa_sys::SPA_FORMAT_AUDIO_interleave,
    _START_VIDEO: spa_sys::SPA_FORMAT_START_Video,
    VIDEO_FORMAT: spa_sys::SPA_FORMAT_VIDEO_format,
    VIDEO_MODIFIER: spa_sys::SPA_FORMAT_VIDEO_modifier,
    VIDEO_SIZE: spa_sys::SPA_FORMAT_VIDEO_size,
    VIDEO_FRAMERATE: spa_sys::SPA_FORMAT_VIDEO_framerate,
    VIDEO_MAX_FRAMERATE: spa_sys::SPA_FORMAT_VIDEO_maxFramerate,
    VIDEO_VIEWS: spa_sys::SPA_FORMAT_VIDEO_views,
    VIDEO_INTERLACE_MODE: spa_sys::SPA_FORMAT_VIDEO_interlaceMode,
    VIDEO_PIXEL_ASPECT_RATIO: spa_sys::SPA_FORMAT_VIDEO_pixelAspectRatio,
    VIDEO_MULTIVIEW_MODE: spa_sys::SPA_FORMAT_VIDEO_multiviewMode,
    VIDEO_MULTIVIEW_FLAGS: spa_sys::SPA_FORMAT_VIDEO_multiviewFlags,
    VIDEO_CHROMA_SITE: spa_sys::SPA_FORMAT_VIDEO_chromaSite,
    VIDEO_COLOR_RANGE: spa_sys::SPA_FORMAT_VIDEO_colorRange,
    VIDEO_COLOR_MATRIX: spa_sys::SPA_FORMAT_VIDEO_colorMatrix,
    VIDEO_TRANSFER_FUNCTION: spa_sys::SPA_FORMAT_VIDEO_transferFunction,
    VIDEO_COLOR_PRIMARIES: spa_sys::SPA_FORMAT_VIDEO_colorPrimaries,
    VIDEO_PROFILE: spa_sys::SPA_FORMAT_VIDEO_profile,
    VIDEO_LEVEL: spa_sys::SPA_FORMAT_VIDEO_level,
    VIDEO_H264_STREAM_FORMAT: spa_sys::SPA_FORMAT_VIDEO_H264_streamFormat,
    VIDEO_H264_ALIGNMENT: spa_sys::SPA_FORMAT_VIDEO_H264_alignment,
    _START_IMAGE: spa_sys::SPA_FORMAT_START_Image,
    _START_BINARY: spa_sys::SPA_FORMAT_START_Binary,
    _START_STREAM: spa_sys::SPA_FORMAT_START_Stream,
    _START_APPLICATION: spa_sys::SPA_FORMAT_START_Application,
);
impl PodIdType for Format {}
enum_wrapper!(
    MediaType,
    spa_sys::spa_media_type,
    UNKNOWN: spa_sys::SPA_MEDIA_TYPE_unknown,
    AUDIO: spa_sys::SPA_MEDIA_TYPE_audio,
    VIDEO: spa_sys::SPA_MEDIA_TYPE_video,
    IMAGE: spa_sys::SPA_MEDIA_TYPE_image,
    BINARY: spa_sys::SPA_MEDIA_TYPE_binary,
    STREAM: spa_sys::SPA_MEDIA_TYPE_stream,
    APPLICATION: spa_sys::SPA_MEDIA_TYPE_application,
);
impl PodIdType for MediaType {}
enum_wrapper!(
    MediaSubType,
    spa_sys::spa_media_subtype,
    UNKNOWN: spa_sys::SPA_MEDIA_SUBTYPE_unknown,
    RAW: spa_sys::SPA_MEDIA_SUBTYPE_raw,
    DSP: spa_sys::SPA_MEDIA_SUBTYPE_dsp,
    IEC958: spa_sys::SPA_MEDIA_SUBTYPE_iec958,
    DSD: spa_sys::SPA_MEDIA_SUBTYPE_dsd,
    _START_AUDIO: spa_sys::SPA_MEDIA_SUBTYPE_START_Audio,
    MP3: spa_sys::SPA_MEDIA_SUBTYPE_mp3,
    AAC: spa_sys::SPA_MEDIA_SUBTYPE_aac,
    VORBIS: spa_sys::SPA_MEDIA_SUBTYPE_vorbis,
    WMA: spa_sys::SPA_MEDIA_SUBTYPE_wma,
    RA: spa_sys::SPA_MEDIA_SUBTYPE_ra,
    SBC: spa_sys::SPA_MEDIA_SUBTYPE_sbc,
    ADPCM: spa_sys::SPA_MEDIA_SUBTYPE_adpcm,
    G723: spa_sys::SPA_MEDIA_SUBTYPE_g723,
    G726: spa_sys::SPA_MEDIA_SUBTYPE_g726,
    G729: spa_sys::SPA_MEDIA_SUBTYPE_g729,
    AMR: spa_sys::SPA_MEDIA_SUBTYPE_amr,
    GSM: spa_sys::SPA_MEDIA_SUBTYPE_gsm,
    _START_VIDEO: spa_sys::SPA_MEDIA_SUBTYPE_START_Video,
    H264: spa_sys::SPA_MEDIA_SUBTYPE_h264,
    MJPG: spa_sys::SPA_MEDIA_SUBTYPE_mjpg,
    DV: spa_sys::SPA_MEDIA_SUBTYPE_dv,
    MPEGTS: spa_sys::SPA_MEDIA_SUBTYPE_mpegts,
    H263: spa_sys::SPA_MEDIA_SUBTYPE_h263,
    MPEG1: spa_sys::SPA_MEDIA_SUBTYPE_mpeg1,
    MPEG2: spa_sys::SPA_MEDIA_SUBTYPE_mpeg2,
    MPEG4: spa_sys::SPA_MEDIA_SUBTYPE_mpeg4,
    XVID: spa_sys::SPA_MEDIA_SUBTYPE_xvid,
    VC1: spa_sys::SPA_MEDIA_SUBTYPE_vc1,
    VP8: spa_sys::SPA_MEDIA_SUBTYPE_vp8,
    VP9: spa_sys::SPA_MEDIA_SUBTYPE_vp9,
    BAYER: spa_sys::SPA_MEDIA_SUBTYPE_bayer,
    _START_IMAGE: spa_sys::SPA_MEDIA_SUBTYPE_START_Image,
    JPEG: spa_sys::SPA_MEDIA_SUBTYPE_jpeg,
    _START_BINARY: spa_sys::SPA_MEDIA_SUBTYPE_START_Binary,
    _START_STREAM: spa_sys::SPA_MEDIA_SUBTYPE_START_Stream,
    MIDI: spa_sys::SPA_MEDIA_SUBTYPE_midi,
    _START_APPLICATION: spa_sys::SPA_MEDIA_SUBTYPE_START_Application,
    CONTROL: spa_sys::SPA_MEDIA_SUBTYPE_control,
);
impl PodIdType for MediaSubType {}
enum_wrapper!(
    AudioFormat,
    spa_sys::spa_audio_format,
    UNKNOWN: spa_sys::SPA_AUDIO_FORMAT_UNKNOWN,
    ENCODED: spa_sys::SPA_AUDIO_FORMAT_ENCODED,
    _START_INTERLEAVED: spa_sys::SPA_AUDIO_FORMAT_START_Interleaved,
    S8: spa_sys::SPA_AUDIO_FORMAT_S8,
    U8: spa_sys::SPA_AUDIO_FORMAT_U8,
    S16_LE: spa_sys::SPA_AUDIO_FORMAT_S16_LE,
    S16_BE: spa_sys::SPA_AUDIO_FORMAT_S16_BE,
    U16_LE: spa_sys::SPA_AUDIO_FORMAT_U16_LE,
    U16_BE: spa_sys::SPA_AUDIO_FORMAT_U16_BE,
    S24_32_LE: spa_sys::SPA_AUDIO_FORMAT_S24_32_LE,
    S24_32_BE: spa_sys::SPA_AUDIO_FORMAT_S24_32_BE,
    U24_32_LE: spa_sys::SPA_AUDIO_FORMAT_U24_32_LE,
    U24_32_BE: spa_sys::SPA_AUDIO_FORMAT_U24_32_BE,
    S32_LE: spa_sys::SPA_AUDIO_FORMAT_S32_LE,
    S32_BE: spa_sys::SPA_AUDIO_FORMAT_S32_BE,
    U32_LE: spa_sys::SPA_AUDIO_FORMAT_U32_LE,
    U32_BE: spa_sys::SPA_AUDIO_FORMAT_U32_BE,
    S24_LE: spa_sys::SPA_AUDIO_FORMAT_S24_LE,
    S24_BE: spa_sys::SPA_AUDIO_FORMAT_S24_BE,
    U24_LE: spa_sys::SPA_AUDIO_FORMAT_U24_LE,
    U24_BE: spa_sys::SPA_AUDIO_FORMAT_U24_BE,
    S20_LE: spa_sys::SPA_AUDIO_FORMAT_S20_LE,
    S20_BE: spa_sys::SPA_AUDIO_FORMAT_S20_BE,
    U20_LE: spa_sys::SPA_AUDIO_FORMAT_U20_LE,
    U20_BE: spa_sys::SPA_AUDIO_FORMAT_U20_BE,
    S18_LE: spa_sys::SPA_AUDIO_FORMAT_S18_LE,
    S18_BE: spa_sys::SPA_AUDIO_FORMAT_S18_BE,
    U18_LE: spa_sys::SPA_AUDIO_FORMAT_U18_LE,
    U18_BE: spa_sys::SPA_AUDIO_FORMAT_U18_BE,
    F32_LE: spa_sys::SPA_AUDIO_FORMAT_F32_LE,
    F32_BE: spa_sys::SPA_AUDIO_FORMAT_F32_BE,
    F64_LE: spa_sys::SPA_AUDIO_FORMAT_F64_LE,
    F64_BE: spa_sys::SPA_AUDIO_FORMAT_F64_BE,
    ULAW: spa_sys::SPA_AUDIO_FORMAT_ULAW,
    ALAW: spa_sys::SPA_AUDIO_FORMAT_ALAW,
    _START_PLANAR: spa_sys::SPA_AUDIO_FORMAT_START_Planar,
    U8P: spa_sys::SPA_AUDIO_FORMAT_U8P,
    S16P: spa_sys::SPA_AUDIO_FORMAT_S16P,
    S24_32P: spa_sys::SPA_AUDIO_FORMAT_S24_32P,
    S32P: spa_sys::SPA_AUDIO_FORMAT_S32P,
    S24P: spa_sys::SPA_AUDIO_FORMAT_S24P,
    F32P: spa_sys::SPA_AUDIO_FORMAT_F32P,
    F64P: spa_sys::SPA_AUDIO_FORMAT_F64P,
    S8P: spa_sys::SPA_AUDIO_FORMAT_S8P,
    _START_OTHER: spa_sys::SPA_AUDIO_FORMAT_START_Other,
    DSP_S32: spa_sys::SPA_AUDIO_FORMAT_DSP_S32,
    DSP_F32: spa_sys::SPA_AUDIO_FORMAT_DSP_F32,
    DSP_F64: spa_sys::SPA_AUDIO_FORMAT_DSP_F64,
    S16: spa_sys::SPA_AUDIO_FORMAT_S16,
    U16: spa_sys::SPA_AUDIO_FORMAT_U16,
    S24_32: spa_sys::SPA_AUDIO_FORMAT_S24_32,
    U24_32: spa_sys::SPA_AUDIO_FORMAT_U24_32,
    S32: spa_sys::SPA_AUDIO_FORMAT_S32,
    U32: spa_sys::SPA_AUDIO_FORMAT_U32,
    S24: spa_sys::SPA_AUDIO_FORMAT_S24,
    U24: spa_sys::SPA_AUDIO_FORMAT_U24,
    S20: spa_sys::SPA_AUDIO_FORMAT_S20,
    U20: spa_sys::SPA_AUDIO_FORMAT_U20,
    S18: spa_sys::SPA_AUDIO_FORMAT_S18,
    U18: spa_sys::SPA_AUDIO_FORMAT_U18,
    F32: spa_sys::SPA_AUDIO_FORMAT_F32,
    F64: spa_sys::SPA_AUDIO_FORMAT_F64,
    S16_OE: spa_sys::SPA_AUDIO_FORMAT_S16_OE,
    U16_OE: spa_sys::SPA_AUDIO_FORMAT_U16_OE,
    S24_32_OE: spa_sys::SPA_AUDIO_FORMAT_S24_32_OE,
    U24_32_OE: spa_sys::SPA_AUDIO_FORMAT_U24_32_OE,
    S32_OE: spa_sys::SPA_AUDIO_FORMAT_S32_OE,
    U32_OE: spa_sys::SPA_AUDIO_FORMAT_U32_OE,
    S24_OE: spa_sys::SPA_AUDIO_FORMAT_S24_OE,
    U24_OE: spa_sys::SPA_AUDIO_FORMAT_U24_OE,
    S20_OE: spa_sys::SPA_AUDIO_FORMAT_S20_OE,
    U20_OE: spa_sys::SPA_AUDIO_FORMAT_U20_OE,
    S18_OE: spa_sys::SPA_AUDIO_FORMAT_S18_OE,
    U18_OE: spa_sys::SPA_AUDIO_FORMAT_U18_OE,
    F32_OE: spa_sys::SPA_AUDIO_FORMAT_F32_OE,
    F64_OE: spa_sys::SPA_AUDIO_FORMAT_F64_OE,
);
impl PodIdType for AudioFormat {}
enum_wrapper!(
    VideoFormat,
    spa_sys::spa_video_format,
    UNKNOWN: spa_sys::SPA_VIDEO_FORMAT_UNKNOWN,
    ENCODED: spa_sys::SPA_VIDEO_FORMAT_ENCODED,
    I420: spa_sys::SPA_VIDEO_FORMAT_I420,
    YV12: spa_sys::SPA_VIDEO_FORMAT_YV12,
    YUY2: spa_sys::SPA_VIDEO_FORMAT_YUY2,
    UYVY: spa_sys::SPA_VIDEO_FORMAT_UYVY,
    AYUV: spa_sys::SPA_VIDEO_FORMAT_AYUV,
    RGBX: spa_sys::SPA_VIDEO_FORMAT_RGBx,
    BGRX: spa_sys::SPA_VIDEO_FORMAT_BGRx,
    XRGB: spa_sys::SPA_VIDEO_FORMAT_xRGB,
    XBGR: spa_sys::SPA_VIDEO_FORMAT_xBGR,
    RGBA: spa_sys::SPA_VIDEO_FORMAT_RGBA,
    BGRA: spa_sys::SPA_VIDEO_FORMAT_BGRA,
    ARGB: spa_sys::SPA_VIDEO_FORMAT_ARGB,
    ABGR: spa_sys::SPA_VIDEO_FORMAT_ABGR,
    RGB: spa_sys::SPA_VIDEO_FORMAT_RGB,
    BGR: spa_sys::SPA_VIDEO_FORMAT_BGR,
    Y41B: spa_sys::SPA_VIDEO_FORMAT_Y41B,
    Y42B: spa_sys::SPA_VIDEO_FORMAT_Y42B,
    YVYU: spa_sys::SPA_VIDEO_FORMAT_YVYU,
    Y444: spa_sys::SPA_VIDEO_FORMAT_Y444,
    V210: spa_sys::SPA_VIDEO_FORMAT_v210,
    V216: spa_sys::SPA_VIDEO_FORMAT_v216,
    NV12: spa_sys::SPA_VIDEO_FORMAT_NV12,
    NV21: spa_sys::SPA_VIDEO_FORMAT_NV21,
    GRAY8: spa_sys::SPA_VIDEO_FORMAT_GRAY8,
    GRAY16_BE: spa_sys::SPA_VIDEO_FORMAT_GRAY16_BE,
    GRAY16_LE: spa_sys::SPA_VIDEO_FORMAT_GRAY16_LE,
    V308: spa_sys::SPA_VIDEO_FORMAT_v308,
    RGB16: spa_sys::SPA_VIDEO_FORMAT_RGB16,
    BGR16: spa_sys::SPA_VIDEO_FORMAT_BGR16,
    RGB15: spa_sys::SPA_VIDEO_FORMAT_RGB15,
    BGR15: spa_sys::SPA_VIDEO_FORMAT_BGR15,
    UYVP: spa_sys::SPA_VIDEO_FORMAT_UYVP,
    A420: spa_sys::SPA_VIDEO_FORMAT_A420,
    RGB8P: spa_sys::SPA_VIDEO_FORMAT_RGB8P,
    YUV9: spa_sys::SPA_VIDEO_FORMAT_YUV9,
    YVU9: spa_sys::SPA_VIDEO_FORMAT_YVU9,
    IYU1: spa_sys::SPA_VIDEO_FORMAT_IYU1,
    ARGB64: spa_sys::SPA_VIDEO_FORMAT_ARGB64,
    AYUV64: spa_sys::SPA_VIDEO_FORMAT_AYUV64,
    R210: spa_sys::SPA_VIDEO_FORMAT_r210,
    I420_10BE: spa_sys::SPA_VIDEO_FORMAT_I420_10BE,
    I420_10LE: spa_sys::SPA_VIDEO_FORMAT_I420_10LE,
    I422_10BE: spa_sys::SPA_VIDEO_FORMAT_I422_10BE,
    I422_10LE: spa_sys::SPA_VIDEO_FORMAT_I422_10LE,
    Y444_10BE: spa_sys::SPA_VIDEO_FORMAT_Y444_10BE,
    Y444_10LE: spa_sys::SPA_VIDEO_FORMAT_Y444_10LE,
    GBR: spa_sys::SPA_VIDEO_FORMAT_GBR,
    GBR_10BE: spa_sys::SPA_VIDEO_FORMAT_GBR_10BE,
    GBR_10LE: spa_sys::SPA_VIDEO_FORMAT_GBR_10LE,
    NV16: spa_sys::SPA_VIDEO_FORMAT_NV16,
    NV24: spa_sys::SPA_VIDEO_FORMAT_NV24,
    NV12_64Z32: spa_sys::SPA_VIDEO_FORMAT_NV12_64Z32,
    A420_10BE: spa_sys::SPA_VIDEO_FORMAT_A420_10BE,
    A420_10LE: spa_sys::SPA_VIDEO_FORMAT_A420_10LE,
    A422_10BE: spa_sys::SPA_VIDEO_FORMAT_A422_10BE,
    A422_10LE: spa_sys::SPA_VIDEO_FORMAT_A422_10LE,
    A444_10BE: spa_sys::SPA_VIDEO_FORMAT_A444_10BE,
    A444_10LE: spa_sys::SPA_VIDEO_FORMAT_A444_10LE,
    NV61: spa_sys::SPA_VIDEO_FORMAT_NV61,
    P010_10BE: spa_sys::SPA_VIDEO_FORMAT_P010_10BE,
    P010_10LE: spa_sys::SPA_VIDEO_FORMAT_P010_10LE,
    IYU2: spa_sys::SPA_VIDEO_FORMAT_IYU2,
    VYUY: spa_sys::SPA_VIDEO_FORMAT_VYUY,
    GBRA: spa_sys::SPA_VIDEO_FORMAT_GBRA,
    GBRA_10BE: spa_sys::SPA_VIDEO_FORMAT_GBRA_10BE,
    GBRA_10LE: spa_sys::SPA_VIDEO_FORMAT_GBRA_10LE,
    GBR_12BE: spa_sys::SPA_VIDEO_FORMAT_GBR_12BE,
    GBR_12LE: spa_sys::SPA_VIDEO_FORMAT_GBR_12LE,
    GBRA_12BE: spa_sys::SPA_VIDEO_FORMAT_GBRA_12BE,
    GBRA_12LE: spa_sys::SPA_VIDEO_FORMAT_GBRA_12LE,
    I420_12BE: spa_sys::SPA_VIDEO_FORMAT_I420_12BE,
    I420_12LE: spa_sys::SPA_VIDEO_FORMAT_I420_12LE,
    I422_12BE: spa_sys::SPA_VIDEO_FORMAT_I422_12BE,
    I422_12LE: spa_sys::SPA_VIDEO_FORMAT_I422_12LE,
    Y444_12BE: spa_sys::SPA_VIDEO_FORMAT_Y444_12BE,
    Y444_12LE: spa_sys::SPA_VIDEO_FORMAT_Y444_12LE,
    RGBA_F16: spa_sys::SPA_VIDEO_FORMAT_RGBA_F16,
    RGBA_F32: spa_sys::SPA_VIDEO_FORMAT_RGBA_F32,
    XRGB_210LE: spa_sys::SPA_VIDEO_FORMAT_xRGB_210LE,
    XBGR_210LE: spa_sys::SPA_VIDEO_FORMAT_xBGR_210LE,
    RGBX_102LE: spa_sys::SPA_VIDEO_FORMAT_RGBx_102LE,
    BGRX_102LE: spa_sys::SPA_VIDEO_FORMAT_BGRx_102LE,
    ARGB_210LE: spa_sys::SPA_VIDEO_FORMAT_ARGB_210LE,
    ABGR_210LE: spa_sys::SPA_VIDEO_FORMAT_ABGR_210LE,
    RGBA_102LE: spa_sys::SPA_VIDEO_FORMAT_RGBA_102LE,
    BGRA_102LE: spa_sys::SPA_VIDEO_FORMAT_BGRA_102LE,
    DSP_F32: spa_sys::SPA_VIDEO_FORMAT_DSP_F32,
);
impl PodIdType for VideoFormat {}
enum_wrapper!(
    ParamBitorder,
    spa_sys::spa_param_bitorder,
    UNKNOWN: spa_sys::SPA_PARAM_BITORDER_unknown,
    MSB: spa_sys::SPA_PARAM_BITORDER_msb,
    LSB: spa_sys::SPA_PARAM_BITORDER_lsb,
);
impl PodIdType for ParamBitorder {}
enum_wrapper!(
    VideoInterlaceMode,
    spa_sys::spa_video_interlace_mode,
    PROGRESSIVE: spa_sys::SPA_VIDEO_INTERLACE_MODE_PROGRESSIVE,
    INTERLEAVED: spa_sys::SPA_VIDEO_INTERLACE_MODE_INTERLEAVED,
    MIXED: spa_sys::SPA_VIDEO_INTERLACE_MODE_MIXED,
    FIELDS: spa_sys::SPA_VIDEO_INTERLACE_MODE_FIELDS,
);
impl PodIdType for VideoInterlaceMode {}
enum_wrapper!(
    VideoMultiviewMode,
    spa_sys::spa_video_multiview_mode,
    _NONE: spa_sys::SPA_VIDEO_MULTIVIEW_MODE_NONE, MONO: spa_sys::SPA_VIDEO_MULTIVIEW_MODE_MONO,
    LEFT: spa_sys::SPA_VIDEO_MULTIVIEW_MODE_LEFT,
    RIGHT: spa_sys::SPA_VIDEO_MULTIVIEW_MODE_RIGHT,
    SIDE_BY_SIDE: spa_sys::SPA_VIDEO_MULTIVIEW_MODE_SIDE_BY_SIDE,
    SIDE_BY_SIDE_QUINCUNX: spa_sys::SPA_VIDEO_MULTIVIEW_MODE_SIDE_BY_SIDE_QUINCUNX,
    COLUMN_INTERLEAVED: spa_sys::SPA_VIDEO_MULTIVIEW_MODE_COLUMN_INTERLEAVED,
    ROW_INTERLEAVED: spa_sys::SPA_VIDEO_MULTIVIEW_MODE_ROW_INTERLEAVED,
    TOP_BOTTOM: spa_sys::SPA_VIDEO_MULTIVIEW_MODE_TOP_BOTTOM,
    CHECKERBOARD: spa_sys::SPA_VIDEO_MULTIVIEW_MODE_CHECKERBOARD,
    FRAME_BY_FRAME: spa_sys::SPA_VIDEO_MULTIVIEW_MODE_FRAME_BY_FRAME,
    MULTIVIEW_FRAME_BY_FRAME: spa_sys::SPA_VIDEO_MULTIVIEW_MODE_MULTIVIEW_FRAME_BY_FRAME,
    SEPARATED: spa_sys::SPA_VIDEO_MULTIVIEW_MODE_SEPARATED,
);
impl From<u32> for VideoMultiviewMode {
    fn from(value: u32) -> Self {
        VideoMultiviewMode::from_raw(value as spa_sys::spa_video_multiview_mode)
    }
}
impl From<VideoMultiviewMode> for u32 {
    fn from(value: VideoMultiviewMode) -> Self {
        value.raw as Self
    }
}
impl PodIdType for VideoMultiviewMode {}
enum_wrapper!(
    VideoMultiviewFlags,
    spa_sys::spa_video_multiview_flags,
    NONE: spa_sys::SPA_VIDEO_MULTIVIEW_FLAGS_NONE,
    RIGHT_VIEW_FIRST: spa_sys::SPA_VIDEO_MULTIVIEW_FLAGS_RIGHT_VIEW_FIRST,
    LEFT_FLIPPED: spa_sys::SPA_VIDEO_MULTIVIEW_FLAGS_LEFT_FLIPPED,
    LEFT_FLOPPED: spa_sys::SPA_VIDEO_MULTIVIEW_FLAGS_LEFT_FLOPPED,
    RIGHT_FLIPPED: spa_sys::SPA_VIDEO_MULTIVIEW_FLAGS_RIGHT_FLIPPED,
    RIGHT_FLOPPED: spa_sys::SPA_VIDEO_MULTIVIEW_FLAGS_RIGHT_FLOPPED,
    HALF_ASPECT: spa_sys::SPA_VIDEO_MULTIVIEW_FLAGS_HALF_ASPECT,
    MIXED_MONO: spa_sys::SPA_VIDEO_MULTIVIEW_FLAGS_MIXED_MONO,
);
impl PodIdType for VideoMultiviewFlags {}
enum_wrapper!(
    VideoChromaSite,
    spa_sys::spa_video_chroma_site,
    UNKNOWN: spa_sys::SPA_VIDEO_CHROMA_SITE_UNKNOWN,
    NONE: spa_sys::SPA_VIDEO_CHROMA_SITE_NONE,
    H_COSITED: spa_sys::SPA_VIDEO_CHROMA_SITE_H_COSITED,
    V_COSITED: spa_sys::SPA_VIDEO_CHROMA_SITE_V_COSITED,
    ALT_LINE: spa_sys::SPA_VIDEO_CHROMA_SITE_ALT_LINE,
    COSITED: spa_sys::SPA_VIDEO_CHROMA_SITE_COSITED,
    JPEG: spa_sys::SPA_VIDEO_CHROMA_SITE_JPEG,
    MPEG2: spa_sys::SPA_VIDEO_CHROMA_SITE_MPEG2,
    DV: spa_sys::SPA_VIDEO_CHROMA_SITE_DV,
);
impl PodIdType for VideoChromaSite {}
enum_wrapper!(
    VideoColorRange,
    spa_sys::spa_video_color_range,
    UNKNOWN: spa_sys::SPA_VIDEO_COLOR_RANGE_UNKNOWN,
    RANGE_0_255: spa_sys::SPA_VIDEO_COLOR_RANGE_0_255,
    RANGE_16_235: spa_sys::SPA_VIDEO_COLOR_RANGE_16_235,
);
impl PodIdType for VideoColorRange {}
enum_wrapper!(
    VideoColorMatrix,
    spa_sys::spa_video_color_matrix,
    UNKNOWN: spa_sys::SPA_VIDEO_COLOR_MATRIX_UNKNOWN,
    RGB: spa_sys::SPA_VIDEO_COLOR_MATRIX_RGB,
    FCC: spa_sys::SPA_VIDEO_COLOR_MATRIX_FCC,
    BT709: spa_sys::SPA_VIDEO_COLOR_MATRIX_BT709,
    BT601: spa_sys::SPA_VIDEO_COLOR_MATRIX_BT601,
    SMPTE240M: spa_sys::SPA_VIDEO_COLOR_MATRIX_SMPTE240M,
    BT2020: spa_sys::SPA_VIDEO_COLOR_MATRIX_BT2020,
);
impl PodIdType for VideoColorMatrix {}
enum_wrapper!(
    VideoTransferFunction,
    spa_sys::spa_video_transfer_function,
    UNKNOWN: spa_sys::SPA_VIDEO_TRANSFER_UNKNOWN,
    GAMMA10: spa_sys::SPA_VIDEO_TRANSFER_GAMMA10,
    GAMMA18: spa_sys::SPA_VIDEO_TRANSFER_GAMMA18,
    GAMMA20: spa_sys::SPA_VIDEO_TRANSFER_GAMMA20,
    GAMMA22: spa_sys::SPA_VIDEO_TRANSFER_GAMMA22,
    BT709: spa_sys::SPA_VIDEO_TRANSFER_BT709,
    SMPTE240M: spa_sys::SPA_VIDEO_TRANSFER_SMPTE240M,
    SRGB: spa_sys::SPA_VIDEO_TRANSFER_SRGB,
    GAMMA28: spa_sys::SPA_VIDEO_TRANSFER_GAMMA28,
    LOG100: spa_sys::SPA_VIDEO_TRANSFER_LOG100,
    LOG316: spa_sys::SPA_VIDEO_TRANSFER_LOG316,
    BT2020_12: spa_sys::SPA_VIDEO_TRANSFER_BT2020_12,
    ADOBERGB: spa_sys::SPA_VIDEO_TRANSFER_ADOBERGB,
);
impl PodIdType for VideoTransferFunction {}
enum_wrapper!(
    VideoColorPrimaries,
    spa_sys::spa_video_color_primaries,
    UNKNOWN: spa_sys::SPA_VIDEO_COLOR_PRIMARIES_UNKNOWN,
    BT709: spa_sys::SPA_VIDEO_COLOR_PRIMARIES_BT709,
    BT470M: spa_sys::SPA_VIDEO_COLOR_PRIMARIES_BT470M,
    BT470BG: spa_sys::SPA_VIDEO_COLOR_PRIMARIES_BT470BG,
    SMPTE170M: spa_sys::SPA_VIDEO_COLOR_PRIMARIES_SMPTE170M,
    SMPTE240M: spa_sys::SPA_VIDEO_COLOR_PRIMARIES_SMPTE240M,
    FILM: spa_sys::SPA_VIDEO_COLOR_PRIMARIES_FILM,
    BT2020: spa_sys::SPA_VIDEO_COLOR_PRIMARIES_BT2020,
    ADOBERGB: spa_sys::SPA_VIDEO_COLOR_PRIMARIES_ADOBERGB,
);
impl PodIdType for VideoColorPrimaries {}
enum_wrapper!(
    VideoH264StreamFormat,
    spa_sys::spa_h264_stream_format,
    UNKNOWN: spa_sys::SPA_H264_STREAM_FORMAT_UNKNOWN,
    AVC: spa_sys::SPA_H264_STREAM_FORMAT_AVC,
    AVC3: spa_sys::SPA_H264_STREAM_FORMAT_AVC3,
    BYTESTREAM: spa_sys::SPA_H264_STREAM_FORMAT_BYTESTREAM,
);
impl PodIdType for VideoH264StreamFormat {}
enum_wrapper!(
    VideoH264Alignment,
    spa_sys::spa_h264_alignment,
    UNKNOWN: spa_sys::SPA_H264_ALIGNMENT_UNKNOWN,
    AU: spa_sys::SPA_H264_ALIGNMENT_AU,
    NAL: spa_sys::SPA_H264_ALIGNMENT_NAL,
);
impl PodIdType for VideoH264Alignment {}