/*** Autogenerated by WIDL 11.6 from include/windows.media.playback.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __windows_media_playback_h__
#define __windows_media_playback_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics ABI::Windows::Media::Playback::IBackgroundMediaPlayerStatics
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                interface IBackgroundMediaPlayerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer ABI::Windows::Media::Playback::IMediaPlayer
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                interface IMediaPlayer;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2 __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2 ABI::Windows::Media::Playback::IMediaPlayer2
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                interface IMediaPlayer2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs ABI::Windows::Media::Playback::IMediaPlayerDataReceivedEventArgs
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                interface IMediaPlayerDataReceivedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs ABI::Windows::Media::Playback::IMediaPlayerFailedEventArgs
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                interface IMediaPlayerFailedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs ABI::Windows::Media::Playback::IMediaPlayerRateChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                interface IMediaPlayerRateChangedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker ABI::Windows::Media::Playback::IPlaybackMediaMarker
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                interface IPlaybackMediaMarker;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory ABI::Windows::Media::Playback::IPlaybackMediaMarkerFactory
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                interface IPlaybackMediaMarkerFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs ABI::Windows::Media::Playback::IPlaybackMediaMarkerReachedEventArgs
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                interface IPlaybackMediaMarkerReachedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence ABI::Windows::Media::Playback::IPlaybackMediaMarkerSequence
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                interface IPlaybackMediaMarkerSequence;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CBackgroundMediaPlayer_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CBackgroundMediaPlayer_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                class BackgroundMediaPlayer;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CPlayback_CBackgroundMediaPlayer __x_ABI_CWindows_CMedia_CPlayback_CBackgroundMediaPlayer;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CPlayback_CBackgroundMediaPlayer_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayer_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayer_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                class MediaPlayer;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayer __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayer;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayer_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerDataReceivedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerDataReceivedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                class MediaPlayerDataReceivedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerDataReceivedEventArgs __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerDataReceivedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerDataReceivedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerFailedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerFailedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                class MediaPlayerFailedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerFailedEventArgs __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerFailedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerFailedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerRateChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerRateChangedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                class MediaPlayerRateChangedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerRateChangedEventArgs __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerRateChangedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerRateChangedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CPlaybackMediaMarker_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CPlaybackMediaMarker_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                class PlaybackMediaMarker;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CPlayback_CPlaybackMediaMarker __x_ABI_CWindows_CMedia_CPlayback_CPlaybackMediaMarker;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CPlayback_CPlaybackMediaMarker_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CPlaybackMediaMarkerSequence_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CPlaybackMediaMarkerSequence_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                class PlaybackMediaMarkerSequence;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CPlayback_CPlaybackMediaMarkerSequence __x_ABI_CWindows_CMedia_CPlayback_CPlaybackMediaMarkerSequence;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CPlayback_CPlaybackMediaMarkerSequence_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CPlaybackMediaMarkerReachedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CPlaybackMediaMarkerReachedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                class PlaybackMediaMarkerReachedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CPlayback_CPlaybackMediaMarkerReachedEventArgs __x_ABI_CWindows_CMedia_CPlayback_CPlaybackMediaMarkerReachedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CPlayback_CPlaybackMediaMarkerReachedEventArgs_FWD_DEFINED__ */

#ifndef ____FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_FWD_DEFINED__
#define ____FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Media::Playback::PlaybackMediaMarker* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_FWD_DEFINED__
#define ____FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Media::Playback::PlaybackMediaMarker* >
#endif /* __cplusplus */
#endif

#ifndef ____FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs_FWD_DEFINED__
#define ____FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs_FWD_DEFINED__
typedef interface __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs;
#ifdef __cplusplus
#define __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs ABI::Windows::Foundation::IEventHandler<ABI::Windows::Media::Playback::MediaPlayerDataReceivedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,ABI::Windows::Media::Playback::MediaPlayerFailedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,ABI::Windows::Media::Playback::MediaPlayerRateChangedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,ABI::Windows::Media::Playback::PlaybackMediaMarkerReachedEventArgs* >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <asyncinfo.h>
#include <eventtoken.h>
#include <windowscontracts.h>
#include <windows.foundation.h>
#include <windows.devices.enumeration.h>
#include <windows.foundation.numerics.h>
#include <windows.graphics.directx.direct3d11.h>
#include <windows.media.h>
#include <windows.media.core.h>
#include <windows.media.mediaproperties.h>
#include <windows.storage.h>
#include <windows.storage.streams.h>
#include <windows.ui.composition.h>

#ifdef __cplusplus
extern "C" {
#endif

#if !defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)
#define WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION 0xe0000
#endif // defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioCategory_ENUM_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioCategory_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                enum MediaPlayerAudioCategory {
                    MediaPlayerAudioCategory_Other = 0,
                    MediaPlayerAudioCategory_Communications = 3,
                    MediaPlayerAudioCategory_Alerts = 4,
                    MediaPlayerAudioCategory_SoundEffects = 5,
                    MediaPlayerAudioCategory_GameEffects = 6,
                    MediaPlayerAudioCategory_GameMedia = 7,
                    MediaPlayerAudioCategory_GameChat = 8,
                    MediaPlayerAudioCategory_Speech = 9,
                    MediaPlayerAudioCategory_Movie = 10,
                    MediaPlayerAudioCategory_Media = 11
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioCategory {
    MediaPlayerAudioCategory_Other = 0,
    MediaPlayerAudioCategory_Communications = 3,
    MediaPlayerAudioCategory_Alerts = 4,
    MediaPlayerAudioCategory_SoundEffects = 5,
    MediaPlayerAudioCategory_GameEffects = 6,
    MediaPlayerAudioCategory_GameMedia = 7,
    MediaPlayerAudioCategory_GameChat = 8,
    MediaPlayerAudioCategory_Speech = 9,
    MediaPlayerAudioCategory_Movie = 10,
    MediaPlayerAudioCategory_Media = 11
};
#ifdef WIDL_using_Windows_Media_Playback
#define MediaPlayerAudioCategory __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioCategory
#endif /* WIDL_using_Windows_Media_Playback */
#endif

#endif /* ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioCategory_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioCategory __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioCategory;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioDeviceType_ENUM_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioDeviceType_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                enum MediaPlayerAudioDeviceType {
                    MediaPlayerAudioDeviceType_Console = 0,
                    MediaPlayerAudioDeviceType_Multimedia = 1,
                    MediaPlayerAudioDeviceType_Communications = 2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioDeviceType {
    MediaPlayerAudioDeviceType_Console = 0,
    MediaPlayerAudioDeviceType_Multimedia = 1,
    MediaPlayerAudioDeviceType_Communications = 2
};
#ifdef WIDL_using_Windows_Media_Playback
#define MediaPlayerAudioDeviceType __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioDeviceType
#endif /* WIDL_using_Windows_Media_Playback */
#endif

#endif /* ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioDeviceType_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioDeviceType __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioDeviceType;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerError_ENUM_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerError_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                enum MediaPlayerError {
                    MediaPlayerError_Unknown = 0,
                    MediaPlayerError_Aborted = 1,
                    MediaPlayerError_NetworkError = 2,
                    MediaPlayerError_DecodingError = 3,
                    MediaPlayerError_SourceNotSupported = 4
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerError {
    MediaPlayerError_Unknown = 0,
    MediaPlayerError_Aborted = 1,
    MediaPlayerError_NetworkError = 2,
    MediaPlayerError_DecodingError = 3,
    MediaPlayerError_SourceNotSupported = 4
};
#ifdef WIDL_using_Windows_Media_Playback
#define MediaPlayerError __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerError
#endif /* WIDL_using_Windows_Media_Playback */
#endif

#endif /* ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerError_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerError __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerError;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerState_ENUM_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerState_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                enum MediaPlayerState {
                    MediaPlayerState_Closed = 0,
                    MediaPlayerState_Opening = 1,
                    MediaPlayerState_Buffering = 2,
                    MediaPlayerState_Playing = 3,
                    MediaPlayerState_Paused = 4,
                    MediaPlayerState_Stopped = 5
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerState {
    MediaPlayerState_Closed = 0,
    MediaPlayerState_Opening = 1,
    MediaPlayerState_Buffering = 2,
    MediaPlayerState_Playing = 3,
    MediaPlayerState_Paused = 4,
    MediaPlayerState_Stopped = 5
};
#ifdef WIDL_using_Windows_Media_Playback
#define MediaPlayerState __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerState
#endif /* WIDL_using_Windows_Media_Playback */
#endif

#endif /* ____x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerState_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerState __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerState;
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics ABI::Windows::Media::Playback::IBackgroundMediaPlayerStatics
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                interface IBackgroundMediaPlayerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer ABI::Windows::Media::Playback::IMediaPlayer
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                interface IMediaPlayer;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2 __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2 ABI::Windows::Media::Playback::IMediaPlayer2
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                interface IMediaPlayer2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs ABI::Windows::Media::Playback::IMediaPlayerDataReceivedEventArgs
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                interface IMediaPlayerDataReceivedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs ABI::Windows::Media::Playback::IMediaPlayerFailedEventArgs
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                interface IMediaPlayerFailedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs ABI::Windows::Media::Playback::IMediaPlayerRateChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                interface IMediaPlayerRateChangedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker ABI::Windows::Media::Playback::IPlaybackMediaMarker
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                interface IPlaybackMediaMarker;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory ABI::Windows::Media::Playback::IPlaybackMediaMarkerFactory
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                interface IPlaybackMediaMarkerFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs ABI::Windows::Media::Playback::IPlaybackMediaMarkerReachedEventArgs
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                interface IPlaybackMediaMarkerReachedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence ABI::Windows::Media::Playback::IPlaybackMediaMarkerSequence
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                interface IPlaybackMediaMarkerSequence;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_FWD_DEFINED__
#define ____FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Media::Playback::PlaybackMediaMarker* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_FWD_DEFINED__
#define ____FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Media::Playback::PlaybackMediaMarker* >
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IBackgroundMediaPlayerStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics, 0x856ddbc1, 0x55f7, 0x471f, 0xa0,0xf2, 0x68,0xac,0x4c,0x90,0x45,0x92);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                MIDL_INTERFACE("856ddbc1-55f7-471f-a0f2-68ac4c904592")
                IBackgroundMediaPlayerStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Current(
                        ABI::Windows::Media::Playback::IMediaPlayer **player) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_MessageReceivedFromBackground(
                        ABI::Windows::Foundation::IEventHandler<ABI::Windows::Media::Playback::MediaPlayerDataReceivedEventArgs* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_MessageReceivedFromBackground(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_MessageReceivedFromForeground(
                        ABI::Windows::Foundation::IEventHandler<ABI::Windows::Media::Playback::MediaPlayerDataReceivedEventArgs* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_MessageReceivedFromForeground(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SendMessageToBackground(
                        ABI::Windows::Foundation::Collections::IPropertySet *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SendMessageToForeground(
                        ABI::Windows::Foundation::Collections::IPropertySet *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE IsMediaPlaying(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Shutdown(
                        ) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics, 0x856ddbc1, 0x55f7, 0x471f, 0xa0,0xf2, 0x68,0xac,0x4c,0x90,0x45,0x92)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStaticsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics *This,
        TrustLevel *trustLevel);

    /*** IBackgroundMediaPlayerStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics *This,
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer **player);

    HRESULT (STDMETHODCALLTYPE *add_MessageReceivedFromBackground)(
        __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics *This,
        __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_MessageReceivedFromBackground)(
        __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_MessageReceivedFromForeground)(
        __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics *This,
        __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_MessageReceivedFromForeground)(
        __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *SendMessageToBackground)(
        __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics *This,
        __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet *value);

    HRESULT (STDMETHODCALLTYPE *SendMessageToForeground)(
        __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics *This,
        __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet *value);

    HRESULT (STDMETHODCALLTYPE *IsMediaPlaying)(
        __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *Shutdown)(
        __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics *This);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStaticsVtbl;

interface __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics {
    CONST_VTBL __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBackgroundMediaPlayerStatics methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_get_Current(This,player) (This)->lpVtbl->get_Current(This,player)
#define __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_add_MessageReceivedFromBackground(This,value,token) (This)->lpVtbl->add_MessageReceivedFromBackground(This,value,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_remove_MessageReceivedFromBackground(This,token) (This)->lpVtbl->remove_MessageReceivedFromBackground(This,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_add_MessageReceivedFromForeground(This,value,token) (This)->lpVtbl->add_MessageReceivedFromForeground(This,value,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_remove_MessageReceivedFromForeground(This,token) (This)->lpVtbl->remove_MessageReceivedFromForeground(This,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_SendMessageToBackground(This,value) (This)->lpVtbl->SendMessageToBackground(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_SendMessageToForeground(This,value) (This)->lpVtbl->SendMessageToForeground(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_IsMediaPlaying(This,value) (This)->lpVtbl->IsMediaPlaying(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_Shutdown(This) (This)->lpVtbl->Shutdown(This)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_QueryInterface(__x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_AddRef(__x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_Release(__x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_GetIids(__x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_GetTrustLevel(__x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBackgroundMediaPlayerStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_get_Current(__x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics* This,__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer **player) {
    return This->lpVtbl->get_Current(This,player);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_add_MessageReceivedFromBackground(__x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics* This,__FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_MessageReceivedFromBackground(This,value,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_remove_MessageReceivedFromBackground(__x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_MessageReceivedFromBackground(This,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_add_MessageReceivedFromForeground(__x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics* This,__FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_MessageReceivedFromForeground(This,value,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_remove_MessageReceivedFromForeground(__x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_MessageReceivedFromForeground(This,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_SendMessageToBackground(__x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics* This,__x_ABI_CWindows_CFoundation_CCollections_CIPropertySet *value) {
    return This->lpVtbl->SendMessageToBackground(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_SendMessageToForeground(__x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics* This,__x_ABI_CWindows_CFoundation_CCollections_CIPropertySet *value) {
    return This->lpVtbl->SendMessageToForeground(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_IsMediaPlaying(__x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics* This,boolean *value) {
    return This->lpVtbl->IsMediaPlaying(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_Shutdown(__x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics* This) {
    return This->lpVtbl->Shutdown(This);
}
#endif
#ifdef WIDL_using_Windows_Media_Playback
#define IID_IBackgroundMediaPlayerStatics IID___x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics
#define IBackgroundMediaPlayerStaticsVtbl __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStaticsVtbl
#define IBackgroundMediaPlayerStatics __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics
#define IBackgroundMediaPlayerStatics_QueryInterface __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_QueryInterface
#define IBackgroundMediaPlayerStatics_AddRef __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_AddRef
#define IBackgroundMediaPlayerStatics_Release __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_Release
#define IBackgroundMediaPlayerStatics_GetIids __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_GetIids
#define IBackgroundMediaPlayerStatics_GetRuntimeClassName __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_GetRuntimeClassName
#define IBackgroundMediaPlayerStatics_GetTrustLevel __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_GetTrustLevel
#define IBackgroundMediaPlayerStatics_get_Current __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_get_Current
#define IBackgroundMediaPlayerStatics_add_MessageReceivedFromBackground __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_add_MessageReceivedFromBackground
#define IBackgroundMediaPlayerStatics_remove_MessageReceivedFromBackground __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_remove_MessageReceivedFromBackground
#define IBackgroundMediaPlayerStatics_add_MessageReceivedFromForeground __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_add_MessageReceivedFromForeground
#define IBackgroundMediaPlayerStatics_remove_MessageReceivedFromForeground __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_remove_MessageReceivedFromForeground
#define IBackgroundMediaPlayerStatics_SendMessageToBackground __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_SendMessageToBackground
#define IBackgroundMediaPlayerStatics_SendMessageToForeground __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_SendMessageToForeground
#define IBackgroundMediaPlayerStatics_IsMediaPlaying __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_IsMediaPlaying
#define IBackgroundMediaPlayerStatics_Shutdown __x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_Shutdown
#endif /* WIDL_using_Windows_Media_Playback */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CMedia_CPlayback_CIBackgroundMediaPlayerStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IMediaPlayer interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer, 0x381a83cb, 0x6fff, 0x499b, 0x8d,0x64, 0x28,0x85,0xdf,0xc1,0x24,0x9e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                MIDL_INTERFACE("381a83cb-6fff-499b-8d64-2885dfc1249e")
                IMediaPlayer : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_AutoPlay(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_AutoPlay(
                        boolean value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_NaturalDuration(
                        ABI::Windows::Foundation::TimeSpan *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Position(
                        ABI::Windows::Foundation::TimeSpan *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Position(
                        ABI::Windows::Foundation::TimeSpan value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_BufferingProgress(
                        DOUBLE *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_CurrentState(
                        ABI::Windows::Media::Playback::MediaPlayerState *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_CanSeek(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_CanPause(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_IsLoopingEnabled(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_IsLoopingEnabled(
                        boolean value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_IsProtected(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_IsMuted(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_IsMuted(
                        boolean value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_PlaybackRate(
                        DOUBLE *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_PlaybackRate(
                        DOUBLE value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Volume(
                        DOUBLE *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Volume(
                        DOUBLE value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_PlaybackMediaMarkers(
                        ABI::Windows::Media::Playback::IPlaybackMediaMarkerSequence **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_MediaOpened(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,IInspectable* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_MediaOpened(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_MediaEnded(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,IInspectable* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_MediaEnded(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_MediaFailed(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,ABI::Windows::Media::Playback::MediaPlayerFailedEventArgs* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_MediaFailed(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_CurrentStateChanged(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,IInspectable* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_CurrentStateChanged(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_PlaybackMediaMarkerReached(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,ABI::Windows::Media::Playback::PlaybackMediaMarkerReachedEventArgs* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_PlaybackMediaMarkerReached(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_MediaPlayerRateChanged(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,ABI::Windows::Media::Playback::MediaPlayerRateChangedEventArgs* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_MediaPlayerRateChanged(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_VolumeChanged(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,IInspectable* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_VolumeChanged(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_SeekCompleted(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,IInspectable* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_SeekCompleted(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_BufferingStarted(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,IInspectable* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_BufferingStarted(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_BufferingEnded(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,IInspectable* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_BufferingEnded(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Play(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Pause(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetUriSource(
                        ABI::Windows::Foundation::IUriRuntimeClass *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer, 0x381a83cb, 0x6fff, 0x499b, 0x8d,0x64, 0x28,0x85,0xdf,0xc1,0x24,0x9e)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        TrustLevel *trustLevel);

    /*** IMediaPlayer methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AutoPlay)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_AutoPlay)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_NaturalDuration)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan *value);

    HRESULT (STDMETHODCALLTYPE *get_Position)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan *value);

    HRESULT (STDMETHODCALLTYPE *put_Position)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan value);

    HRESULT (STDMETHODCALLTYPE *get_BufferingProgress)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        DOUBLE *value);

    HRESULT (STDMETHODCALLTYPE *get_CurrentState)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerState *value);

    HRESULT (STDMETHODCALLTYPE *get_CanSeek)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_CanPause)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsLoopingEnabled)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_IsLoopingEnabled)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_IsProtected)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsMuted)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_IsMuted)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_PlaybackRate)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        DOUBLE *value);

    HRESULT (STDMETHODCALLTYPE *put_PlaybackRate)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        DOUBLE value);

    HRESULT (STDMETHODCALLTYPE *get_Volume)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        DOUBLE *value);

    HRESULT (STDMETHODCALLTYPE *put_Volume)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        DOUBLE value);

    HRESULT (STDMETHODCALLTYPE *get_PlaybackMediaMarkers)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence **value);

    HRESULT (STDMETHODCALLTYPE *add_MediaOpened)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_MediaOpened)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_MediaEnded)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_MediaEnded)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_MediaFailed)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_MediaFailed)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_CurrentStateChanged)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_CurrentStateChanged)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_PlaybackMediaMarkerReached)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_PlaybackMediaMarkerReached)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_MediaPlayerRateChanged)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_MediaPlayerRateChanged)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_VolumeChanged)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_VolumeChanged)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_SeekCompleted)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_SeekCompleted)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_BufferingStarted)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_BufferingStarted)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_BufferingEnded)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_BufferingEnded)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *Play)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This);

    HRESULT (STDMETHODCALLTYPE *Pause)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This);

    HRESULT (STDMETHODCALLTYPE *SetUriSource)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerVtbl;

interface __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer {
    CONST_VTBL __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMediaPlayer methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_AutoPlay(This,value) (This)->lpVtbl->get_AutoPlay(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_put_AutoPlay(This,value) (This)->lpVtbl->put_AutoPlay(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_NaturalDuration(This,value) (This)->lpVtbl->get_NaturalDuration(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_Position(This,value) (This)->lpVtbl->get_Position(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_put_Position(This,value) (This)->lpVtbl->put_Position(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_BufferingProgress(This,value) (This)->lpVtbl->get_BufferingProgress(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_CurrentState(This,value) (This)->lpVtbl->get_CurrentState(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_CanSeek(This,value) (This)->lpVtbl->get_CanSeek(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_CanPause(This,value) (This)->lpVtbl->get_CanPause(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_IsLoopingEnabled(This,value) (This)->lpVtbl->get_IsLoopingEnabled(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_put_IsLoopingEnabled(This,value) (This)->lpVtbl->put_IsLoopingEnabled(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_IsProtected(This,value) (This)->lpVtbl->get_IsProtected(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_IsMuted(This,value) (This)->lpVtbl->get_IsMuted(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_put_IsMuted(This,value) (This)->lpVtbl->put_IsMuted(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_PlaybackRate(This,value) (This)->lpVtbl->get_PlaybackRate(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_put_PlaybackRate(This,value) (This)->lpVtbl->put_PlaybackRate(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_Volume(This,value) (This)->lpVtbl->get_Volume(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_put_Volume(This,value) (This)->lpVtbl->put_Volume(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_PlaybackMediaMarkers(This,value) (This)->lpVtbl->get_PlaybackMediaMarkers(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_MediaOpened(This,value,token) (This)->lpVtbl->add_MediaOpened(This,value,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_MediaOpened(This,token) (This)->lpVtbl->remove_MediaOpened(This,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_MediaEnded(This,value,token) (This)->lpVtbl->add_MediaEnded(This,value,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_MediaEnded(This,token) (This)->lpVtbl->remove_MediaEnded(This,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_MediaFailed(This,value,token) (This)->lpVtbl->add_MediaFailed(This,value,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_MediaFailed(This,token) (This)->lpVtbl->remove_MediaFailed(This,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_CurrentStateChanged(This,value,token) (This)->lpVtbl->add_CurrentStateChanged(This,value,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_CurrentStateChanged(This,token) (This)->lpVtbl->remove_CurrentStateChanged(This,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_PlaybackMediaMarkerReached(This,value,token) (This)->lpVtbl->add_PlaybackMediaMarkerReached(This,value,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_PlaybackMediaMarkerReached(This,token) (This)->lpVtbl->remove_PlaybackMediaMarkerReached(This,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_MediaPlayerRateChanged(This,value,token) (This)->lpVtbl->add_MediaPlayerRateChanged(This,value,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_MediaPlayerRateChanged(This,token) (This)->lpVtbl->remove_MediaPlayerRateChanged(This,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_VolumeChanged(This,value,token) (This)->lpVtbl->add_VolumeChanged(This,value,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_VolumeChanged(This,token) (This)->lpVtbl->remove_VolumeChanged(This,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_SeekCompleted(This,value,token) (This)->lpVtbl->add_SeekCompleted(This,value,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_SeekCompleted(This,token) (This)->lpVtbl->remove_SeekCompleted(This,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_BufferingStarted(This,value,token) (This)->lpVtbl->add_BufferingStarted(This,value,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_BufferingStarted(This,token) (This)->lpVtbl->remove_BufferingStarted(This,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_BufferingEnded(This,value,token) (This)->lpVtbl->add_BufferingEnded(This,value,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_BufferingEnded(This,token) (This)->lpVtbl->remove_BufferingEnded(This,token)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_Play(This) (This)->lpVtbl->Play(This)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_Pause(This) (This)->lpVtbl->Pause(This)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_SetUriSource(This,value) (This)->lpVtbl->SetUriSource(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_QueryInterface(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_AddRef(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_Release(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_GetIids(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_GetTrustLevel(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMediaPlayer methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_AutoPlay(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,boolean *value) {
    return This->lpVtbl->get_AutoPlay(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_put_AutoPlay(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,boolean value) {
    return This->lpVtbl->put_AutoPlay(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_NaturalDuration(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,__x_ABI_CWindows_CFoundation_CTimeSpan *value) {
    return This->lpVtbl->get_NaturalDuration(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_Position(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,__x_ABI_CWindows_CFoundation_CTimeSpan *value) {
    return This->lpVtbl->get_Position(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_put_Position(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,__x_ABI_CWindows_CFoundation_CTimeSpan value) {
    return This->lpVtbl->put_Position(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_BufferingProgress(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,DOUBLE *value) {
    return This->lpVtbl->get_BufferingProgress(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_CurrentState(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,__x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerState *value) {
    return This->lpVtbl->get_CurrentState(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_CanSeek(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,boolean *value) {
    return This->lpVtbl->get_CanSeek(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_CanPause(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,boolean *value) {
    return This->lpVtbl->get_CanPause(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_IsLoopingEnabled(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,boolean *value) {
    return This->lpVtbl->get_IsLoopingEnabled(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_put_IsLoopingEnabled(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,boolean value) {
    return This->lpVtbl->put_IsLoopingEnabled(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_IsProtected(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,boolean *value) {
    return This->lpVtbl->get_IsProtected(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_IsMuted(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,boolean *value) {
    return This->lpVtbl->get_IsMuted(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_put_IsMuted(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,boolean value) {
    return This->lpVtbl->put_IsMuted(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_PlaybackRate(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,DOUBLE *value) {
    return This->lpVtbl->get_PlaybackRate(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_put_PlaybackRate(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,DOUBLE value) {
    return This->lpVtbl->put_PlaybackRate(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_Volume(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,DOUBLE *value) {
    return This->lpVtbl->get_Volume(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_put_Volume(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,DOUBLE value) {
    return This->lpVtbl->put_Volume(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_PlaybackMediaMarkers(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence **value) {
    return This->lpVtbl->get_PlaybackMediaMarkers(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_MediaOpened(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_MediaOpened(This,value,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_MediaOpened(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_MediaOpened(This,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_MediaEnded(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_MediaEnded(This,value,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_MediaEnded(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_MediaEnded(This,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_MediaFailed(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_MediaFailed(This,value,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_MediaFailed(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_MediaFailed(This,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_CurrentStateChanged(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_CurrentStateChanged(This,value,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_CurrentStateChanged(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_CurrentStateChanged(This,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_PlaybackMediaMarkerReached(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_PlaybackMediaMarkerReached(This,value,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_PlaybackMediaMarkerReached(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_PlaybackMediaMarkerReached(This,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_MediaPlayerRateChanged(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_MediaPlayerRateChanged(This,value,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_MediaPlayerRateChanged(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_MediaPlayerRateChanged(This,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_VolumeChanged(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_VolumeChanged(This,value,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_VolumeChanged(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_VolumeChanged(This,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_SeekCompleted(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_SeekCompleted(This,value,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_SeekCompleted(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_SeekCompleted(This,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_BufferingStarted(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_BufferingStarted(This,value,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_BufferingStarted(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_BufferingStarted(This,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_BufferingEnded(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_BufferingEnded(This,value,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_BufferingEnded(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_BufferingEnded(This,token);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_Play(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This) {
    return This->lpVtbl->Play(This);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_Pause(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This) {
    return This->lpVtbl->Pause(This);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_SetUriSource(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *value) {
    return This->lpVtbl->SetUriSource(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_Playback
#define IID_IMediaPlayer IID___x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer
#define IMediaPlayerVtbl __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerVtbl
#define IMediaPlayer __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer
#define IMediaPlayer_QueryInterface __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_QueryInterface
#define IMediaPlayer_AddRef __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_AddRef
#define IMediaPlayer_Release __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_Release
#define IMediaPlayer_GetIids __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_GetIids
#define IMediaPlayer_GetRuntimeClassName __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_GetRuntimeClassName
#define IMediaPlayer_GetTrustLevel __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_GetTrustLevel
#define IMediaPlayer_get_AutoPlay __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_AutoPlay
#define IMediaPlayer_put_AutoPlay __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_put_AutoPlay
#define IMediaPlayer_get_NaturalDuration __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_NaturalDuration
#define IMediaPlayer_get_Position __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_Position
#define IMediaPlayer_put_Position __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_put_Position
#define IMediaPlayer_get_BufferingProgress __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_BufferingProgress
#define IMediaPlayer_get_CurrentState __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_CurrentState
#define IMediaPlayer_get_CanSeek __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_CanSeek
#define IMediaPlayer_get_CanPause __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_CanPause
#define IMediaPlayer_get_IsLoopingEnabled __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_IsLoopingEnabled
#define IMediaPlayer_put_IsLoopingEnabled __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_put_IsLoopingEnabled
#define IMediaPlayer_get_IsProtected __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_IsProtected
#define IMediaPlayer_get_IsMuted __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_IsMuted
#define IMediaPlayer_put_IsMuted __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_put_IsMuted
#define IMediaPlayer_get_PlaybackRate __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_PlaybackRate
#define IMediaPlayer_put_PlaybackRate __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_put_PlaybackRate
#define IMediaPlayer_get_Volume __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_Volume
#define IMediaPlayer_put_Volume __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_put_Volume
#define IMediaPlayer_get_PlaybackMediaMarkers __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_get_PlaybackMediaMarkers
#define IMediaPlayer_add_MediaOpened __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_MediaOpened
#define IMediaPlayer_remove_MediaOpened __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_MediaOpened
#define IMediaPlayer_add_MediaEnded __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_MediaEnded
#define IMediaPlayer_remove_MediaEnded __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_MediaEnded
#define IMediaPlayer_add_MediaFailed __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_MediaFailed
#define IMediaPlayer_remove_MediaFailed __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_MediaFailed
#define IMediaPlayer_add_CurrentStateChanged __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_CurrentStateChanged
#define IMediaPlayer_remove_CurrentStateChanged __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_CurrentStateChanged
#define IMediaPlayer_add_PlaybackMediaMarkerReached __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_PlaybackMediaMarkerReached
#define IMediaPlayer_remove_PlaybackMediaMarkerReached __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_PlaybackMediaMarkerReached
#define IMediaPlayer_add_MediaPlayerRateChanged __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_MediaPlayerRateChanged
#define IMediaPlayer_remove_MediaPlayerRateChanged __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_MediaPlayerRateChanged
#define IMediaPlayer_add_VolumeChanged __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_VolumeChanged
#define IMediaPlayer_remove_VolumeChanged __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_VolumeChanged
#define IMediaPlayer_add_SeekCompleted __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_SeekCompleted
#define IMediaPlayer_remove_SeekCompleted __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_SeekCompleted
#define IMediaPlayer_add_BufferingStarted __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_BufferingStarted
#define IMediaPlayer_remove_BufferingStarted __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_BufferingStarted
#define IMediaPlayer_add_BufferingEnded __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_add_BufferingEnded
#define IMediaPlayer_remove_BufferingEnded __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_remove_BufferingEnded
#define IMediaPlayer_Play __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_Play
#define IMediaPlayer_Pause __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_Pause
#define IMediaPlayer_SetUriSource __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_SetUriSource
#endif /* WIDL_using_Windows_Media_Playback */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IMediaPlayer2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2, 0x3c841218, 0x2123, 0x4fc5, 0x90,0x82, 0x2f,0x88,0x3f,0x77,0xbd,0xf5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                MIDL_INTERFACE("3c841218-2123-4fc5-9082-2f883f77bdf5")
                IMediaPlayer2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_SystemMediaTransportControls(
                        ABI::Windows::Media::ISystemMediaTransportControls **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_AudioCategory(
                        ABI::Windows::Media::Playback::MediaPlayerAudioCategory *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_AudioCategory(
                        ABI::Windows::Media::Playback::MediaPlayerAudioCategory value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_AudioDeviceType(
                        ABI::Windows::Media::Playback::MediaPlayerAudioDeviceType *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_AudioDeviceType(
                        ABI::Windows::Media::Playback::MediaPlayerAudioDeviceType value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2, 0x3c841218, 0x2123, 0x4fc5, 0x90,0x82, 0x2f,0x88,0x3f,0x77,0xbd,0xf5)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2 *This,
        TrustLevel *trustLevel);

    /*** IMediaPlayer2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_SystemMediaTransportControls)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2 *This,
        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls **value);

    HRESULT (STDMETHODCALLTYPE *get_AudioCategory)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2 *This,
        __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioCategory *value);

    HRESULT (STDMETHODCALLTYPE *put_AudioCategory)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2 *This,
        __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioCategory value);

    HRESULT (STDMETHODCALLTYPE *get_AudioDeviceType)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2 *This,
        __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioDeviceType *value);

    HRESULT (STDMETHODCALLTYPE *put_AudioDeviceType)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2 *This,
        __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioDeviceType value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2Vtbl;

interface __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2 {
    CONST_VTBL __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMediaPlayer2 methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_get_SystemMediaTransportControls(This,value) (This)->lpVtbl->get_SystemMediaTransportControls(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_get_AudioCategory(This,value) (This)->lpVtbl->get_AudioCategory(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_put_AudioCategory(This,value) (This)->lpVtbl->put_AudioCategory(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_get_AudioDeviceType(This,value) (This)->lpVtbl->get_AudioDeviceType(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_put_AudioDeviceType(This,value) (This)->lpVtbl->put_AudioDeviceType(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_QueryInterface(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_AddRef(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_Release(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_GetIids(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_GetTrustLevel(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMediaPlayer2 methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_get_SystemMediaTransportControls(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2* This,__x_ABI_CWindows_CMedia_CISystemMediaTransportControls **value) {
    return This->lpVtbl->get_SystemMediaTransportControls(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_get_AudioCategory(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2* This,__x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioCategory *value) {
    return This->lpVtbl->get_AudioCategory(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_put_AudioCategory(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2* This,__x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioCategory value) {
    return This->lpVtbl->put_AudioCategory(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_get_AudioDeviceType(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2* This,__x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioDeviceType *value) {
    return This->lpVtbl->get_AudioDeviceType(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_put_AudioDeviceType(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2* This,__x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerAudioDeviceType value) {
    return This->lpVtbl->put_AudioDeviceType(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_Playback
#define IID_IMediaPlayer2 IID___x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2
#define IMediaPlayer2Vtbl __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2Vtbl
#define IMediaPlayer2 __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2
#define IMediaPlayer2_QueryInterface __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_QueryInterface
#define IMediaPlayer2_AddRef __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_AddRef
#define IMediaPlayer2_Release __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_Release
#define IMediaPlayer2_GetIids __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_GetIids
#define IMediaPlayer2_GetRuntimeClassName __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_GetRuntimeClassName
#define IMediaPlayer2_GetTrustLevel __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_GetTrustLevel
#define IMediaPlayer2_get_SystemMediaTransportControls __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_get_SystemMediaTransportControls
#define IMediaPlayer2_get_AudioCategory __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_get_AudioCategory
#define IMediaPlayer2_put_AudioCategory __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_put_AudioCategory
#define IMediaPlayer2_get_AudioDeviceType __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_get_AudioDeviceType
#define IMediaPlayer2_put_AudioDeviceType __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_put_AudioDeviceType
#endif /* WIDL_using_Windows_Media_Playback */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IMediaPlayerDataReceivedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs, 0xc75a9405, 0xc801, 0x412a, 0x83,0x5b, 0x83,0xfc,0x0e,0x62,0x2a,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                MIDL_INTERFACE("c75a9405-c801-412a-835b-83fc0e622a8e")
                IMediaPlayerDataReceivedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Data(
                        ABI::Windows::Foundation::Collections::IPropertySet **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs, 0xc75a9405, 0xc801, 0x412a, 0x83,0x5b, 0x83,0xfc,0x0e,0x62,0x2a,0x8e)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs *This,
        TrustLevel *trustLevel);

    /*** IMediaPlayerDataReceivedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Data)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs *This,
        __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet **value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgsVtbl;

interface __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMediaPlayerDataReceivedEventArgs methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_get_Data(This,value) (This)->lpVtbl->get_Data(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_QueryInterface(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_AddRef(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_Release(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_GetIids(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_GetTrustLevel(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMediaPlayerDataReceivedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_get_Data(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs* This,__x_ABI_CWindows_CFoundation_CCollections_CIPropertySet **value) {
    return This->lpVtbl->get_Data(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_Playback
#define IID_IMediaPlayerDataReceivedEventArgs IID___x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs
#define IMediaPlayerDataReceivedEventArgsVtbl __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgsVtbl
#define IMediaPlayerDataReceivedEventArgs __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs
#define IMediaPlayerDataReceivedEventArgs_QueryInterface __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_QueryInterface
#define IMediaPlayerDataReceivedEventArgs_AddRef __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_AddRef
#define IMediaPlayerDataReceivedEventArgs_Release __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_Release
#define IMediaPlayerDataReceivedEventArgs_GetIids __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_GetIids
#define IMediaPlayerDataReceivedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_GetRuntimeClassName
#define IMediaPlayerDataReceivedEventArgs_GetTrustLevel __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_GetTrustLevel
#define IMediaPlayerDataReceivedEventArgs_get_Data __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_get_Data
#endif /* WIDL_using_Windows_Media_Playback */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IMediaPlayerFailedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs, 0x2744e9b9, 0xa7e3, 0x4f16, 0xba,0xc4, 0x79,0x14,0xeb,0xc0,0x83,0x01);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                MIDL_INTERFACE("2744e9b9-a7e3-4f16-bac4-7914ebc08301")
                IMediaPlayerFailedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Error(
                        ABI::Windows::Media::Playback::MediaPlayerError *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ExtendedErrorCode(
                        HRESULT *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ErrorMessage(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs, 0x2744e9b9, 0xa7e3, 0x4f16, 0xba,0xc4, 0x79,0x14,0xeb,0xc0,0x83,0x01)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs *This,
        TrustLevel *trustLevel);

    /*** IMediaPlayerFailedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Error)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs *This,
        __x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerError *value);

    HRESULT (STDMETHODCALLTYPE *get_ExtendedErrorCode)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs *This,
        HRESULT *value);

    HRESULT (STDMETHODCALLTYPE *get_ErrorMessage)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgsVtbl;

interface __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMediaPlayerFailedEventArgs methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_get_Error(This,value) (This)->lpVtbl->get_Error(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_get_ExtendedErrorCode(This,value) (This)->lpVtbl->get_ExtendedErrorCode(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_get_ErrorMessage(This,value) (This)->lpVtbl->get_ErrorMessage(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_QueryInterface(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_AddRef(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_Release(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_GetIids(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_GetTrustLevel(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMediaPlayerFailedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_get_Error(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs* This,__x_ABI_CWindows_CMedia_CPlayback_CMediaPlayerError *value) {
    return This->lpVtbl->get_Error(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_get_ExtendedErrorCode(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs* This,HRESULT *value) {
    return This->lpVtbl->get_ExtendedErrorCode(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_get_ErrorMessage(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs* This,HSTRING *value) {
    return This->lpVtbl->get_ErrorMessage(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_Playback
#define IID_IMediaPlayerFailedEventArgs IID___x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs
#define IMediaPlayerFailedEventArgsVtbl __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgsVtbl
#define IMediaPlayerFailedEventArgs __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs
#define IMediaPlayerFailedEventArgs_QueryInterface __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_QueryInterface
#define IMediaPlayerFailedEventArgs_AddRef __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_AddRef
#define IMediaPlayerFailedEventArgs_Release __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_Release
#define IMediaPlayerFailedEventArgs_GetIids __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_GetIids
#define IMediaPlayerFailedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_GetRuntimeClassName
#define IMediaPlayerFailedEventArgs_GetTrustLevel __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_GetTrustLevel
#define IMediaPlayerFailedEventArgs_get_Error __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_get_Error
#define IMediaPlayerFailedEventArgs_get_ExtendedErrorCode __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_get_ExtendedErrorCode
#define IMediaPlayerFailedEventArgs_get_ErrorMessage __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_get_ErrorMessage
#endif /* WIDL_using_Windows_Media_Playback */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IMediaPlayerRateChangedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs, 0x40600d58, 0x3b61, 0x4bb2, 0x98,0x9f, 0xfc,0x65,0x60,0x8b,0x6c,0xab);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                MIDL_INTERFACE("40600d58-3b61-4bb2-989f-fc65608b6cab")
                IMediaPlayerRateChangedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_NewRate(
                        DOUBLE *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs, 0x40600d58, 0x3b61, 0x4bb2, 0x98,0x9f, 0xfc,0x65,0x60,0x8b,0x6c,0xab)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs *This,
        TrustLevel *trustLevel);

    /*** IMediaPlayerRateChangedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_NewRate)(
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs *This,
        DOUBLE *value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgsVtbl;

interface __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMediaPlayerRateChangedEventArgs methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_get_NewRate(This,value) (This)->lpVtbl->get_NewRate(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_QueryInterface(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_AddRef(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_Release(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_GetIids(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_GetTrustLevel(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMediaPlayerRateChangedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_get_NewRate(__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs* This,DOUBLE *value) {
    return This->lpVtbl->get_NewRate(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_Playback
#define IID_IMediaPlayerRateChangedEventArgs IID___x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs
#define IMediaPlayerRateChangedEventArgsVtbl __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgsVtbl
#define IMediaPlayerRateChangedEventArgs __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs
#define IMediaPlayerRateChangedEventArgs_QueryInterface __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_QueryInterface
#define IMediaPlayerRateChangedEventArgs_AddRef __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_AddRef
#define IMediaPlayerRateChangedEventArgs_Release __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_Release
#define IMediaPlayerRateChangedEventArgs_GetIids __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_GetIids
#define IMediaPlayerRateChangedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_GetRuntimeClassName
#define IMediaPlayerRateChangedEventArgs_GetTrustLevel __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_GetTrustLevel
#define IMediaPlayerRateChangedEventArgs_get_NewRate __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_get_NewRate
#endif /* WIDL_using_Windows_Media_Playback */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IPlaybackMediaMarker interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker, 0xc4d22f5c, 0x3c1c, 0x4444, 0xb6,0xb9, 0x77,0x8b,0x04,0x22,0xd4,0x1a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                MIDL_INTERFACE("c4d22f5c-3c1c-4444-b6b9-778b0422d41a")
                IPlaybackMediaMarker : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Time(
                        ABI::Windows::Foundation::TimeSpan *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_MediaMarkerType(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Text(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker, 0xc4d22f5c, 0x3c1c, 0x4444, 0xb6,0xb9, 0x77,0x8b,0x04,0x22,0xd4,0x1a)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker *This,
        TrustLevel *trustLevel);

    /*** IPlaybackMediaMarker methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Time)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan *value);

    HRESULT (STDMETHODCALLTYPE *get_MediaMarkerType)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Text)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerVtbl;

interface __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker {
    CONST_VTBL __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPlaybackMediaMarker methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_get_Time(This,value) (This)->lpVtbl->get_Time(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_get_MediaMarkerType(This,value) (This)->lpVtbl->get_MediaMarkerType(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_get_Text(This,value) (This)->lpVtbl->get_Text(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_QueryInterface(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_AddRef(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_Release(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_GetIids(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_GetTrustLevel(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPlaybackMediaMarker methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_get_Time(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker* This,__x_ABI_CWindows_CFoundation_CTimeSpan *value) {
    return This->lpVtbl->get_Time(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_get_MediaMarkerType(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker* This,HSTRING *value) {
    return This->lpVtbl->get_MediaMarkerType(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_get_Text(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker* This,HSTRING *value) {
    return This->lpVtbl->get_Text(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_Playback
#define IID_IPlaybackMediaMarker IID___x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker
#define IPlaybackMediaMarkerVtbl __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerVtbl
#define IPlaybackMediaMarker __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker
#define IPlaybackMediaMarker_QueryInterface __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_QueryInterface
#define IPlaybackMediaMarker_AddRef __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_AddRef
#define IPlaybackMediaMarker_Release __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_Release
#define IPlaybackMediaMarker_GetIids __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_GetIids
#define IPlaybackMediaMarker_GetRuntimeClassName __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_GetRuntimeClassName
#define IPlaybackMediaMarker_GetTrustLevel __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_GetTrustLevel
#define IPlaybackMediaMarker_get_Time __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_get_Time
#define IPlaybackMediaMarker_get_MediaMarkerType __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_get_MediaMarkerType
#define IPlaybackMediaMarker_get_Text __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_get_Text
#endif /* WIDL_using_Windows_Media_Playback */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IPlaybackMediaMarkerFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory, 0x8c530a78, 0xe0ae, 0x4e1a, 0xa8,0xc8, 0xe2,0x3f,0x98,0x2a,0x93,0x7b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                MIDL_INTERFACE("8c530a78-e0ae-4e1a-a8c8-e23f982a937b")
                IPlaybackMediaMarkerFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateFromTime(
                        ABI::Windows::Foundation::TimeSpan value,
                        ABI::Windows::Media::Playback::IPlaybackMediaMarker **marker) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Create(
                        ABI::Windows::Foundation::TimeSpan value,
                        HSTRING media_market_type,
                        HSTRING text,
                        ABI::Windows::Media::Playback::IPlaybackMediaMarker **marker) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory, 0x8c530a78, 0xe0ae, 0x4e1a, 0xa8,0xc8, 0xe2,0x3f,0x98,0x2a,0x93,0x7b)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory *This,
        TrustLevel *trustLevel);

    /*** IPlaybackMediaMarkerFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateFromTime)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan value,
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker **marker);

    HRESULT (STDMETHODCALLTYPE *Create)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan value,
        HSTRING media_market_type,
        HSTRING text,
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker **marker);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactoryVtbl;

interface __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory {
    CONST_VTBL __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPlaybackMediaMarkerFactory methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_CreateFromTime(This,value,marker) (This)->lpVtbl->CreateFromTime(This,value,marker)
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_Create(This,value,media_market_type,text,marker) (This)->lpVtbl->Create(This,value,media_market_type,text,marker)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_QueryInterface(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_AddRef(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_Release(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_GetIids(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_GetTrustLevel(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPlaybackMediaMarkerFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_CreateFromTime(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory* This,__x_ABI_CWindows_CFoundation_CTimeSpan value,__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker **marker) {
    return This->lpVtbl->CreateFromTime(This,value,marker);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_Create(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory* This,__x_ABI_CWindows_CFoundation_CTimeSpan value,HSTRING media_market_type,HSTRING text,__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker **marker) {
    return This->lpVtbl->Create(This,value,media_market_type,text,marker);
}
#endif
#ifdef WIDL_using_Windows_Media_Playback
#define IID_IPlaybackMediaMarkerFactory IID___x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory
#define IPlaybackMediaMarkerFactoryVtbl __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactoryVtbl
#define IPlaybackMediaMarkerFactory __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory
#define IPlaybackMediaMarkerFactory_QueryInterface __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_QueryInterface
#define IPlaybackMediaMarkerFactory_AddRef __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_AddRef
#define IPlaybackMediaMarkerFactory_Release __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_Release
#define IPlaybackMediaMarkerFactory_GetIids __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_GetIids
#define IPlaybackMediaMarkerFactory_GetRuntimeClassName __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_GetRuntimeClassName
#define IPlaybackMediaMarkerFactory_GetTrustLevel __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_GetTrustLevel
#define IPlaybackMediaMarkerFactory_CreateFromTime __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_CreateFromTime
#define IPlaybackMediaMarkerFactory_Create __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_Create
#endif /* WIDL_using_Windows_Media_Playback */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IPlaybackMediaMarkerReachedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs, 0x578cd1b9, 0x90e2, 0x4e60, 0xab,0xc4, 0x87,0x40,0xb0,0x1f,0x61,0x96);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                MIDL_INTERFACE("578cd1b9-90e2-4e60-abc4-8740b01f6196")
                IPlaybackMediaMarkerReachedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_PlaybackMediaMarker(
                        ABI::Windows::Media::Playback::IPlaybackMediaMarker **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs, 0x578cd1b9, 0x90e2, 0x4e60, 0xab,0xc4, 0x87,0x40,0xb0,0x1f,0x61,0x96)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs *This,
        TrustLevel *trustLevel);

    /*** IPlaybackMediaMarkerReachedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_PlaybackMediaMarker)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs *This,
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker **value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgsVtbl;

interface __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPlaybackMediaMarkerReachedEventArgs methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_get_PlaybackMediaMarker(This,value) (This)->lpVtbl->get_PlaybackMediaMarker(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_QueryInterface(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_AddRef(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_Release(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_GetIids(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_GetTrustLevel(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPlaybackMediaMarkerReachedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_get_PlaybackMediaMarker(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs* This,__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker **value) {
    return This->lpVtbl->get_PlaybackMediaMarker(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_Playback
#define IID_IPlaybackMediaMarkerReachedEventArgs IID___x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs
#define IPlaybackMediaMarkerReachedEventArgsVtbl __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgsVtbl
#define IPlaybackMediaMarkerReachedEventArgs __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs
#define IPlaybackMediaMarkerReachedEventArgs_QueryInterface __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_QueryInterface
#define IPlaybackMediaMarkerReachedEventArgs_AddRef __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_AddRef
#define IPlaybackMediaMarkerReachedEventArgs_Release __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_Release
#define IPlaybackMediaMarkerReachedEventArgs_GetIids __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_GetIids
#define IPlaybackMediaMarkerReachedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_GetRuntimeClassName
#define IPlaybackMediaMarkerReachedEventArgs_GetTrustLevel __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_GetTrustLevel
#define IPlaybackMediaMarkerReachedEventArgs_get_PlaybackMediaMarker __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_get_PlaybackMediaMarker
#endif /* WIDL_using_Windows_Media_Playback */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IPlaybackMediaMarkerSequence interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence, 0xf2810cee, 0x638b, 0x46cf, 0x88,0x17, 0x1d,0x11,0x1f,0xe9,0xd8,0xc4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Playback {
                MIDL_INTERFACE("f2810cee-638b-46cf-8817-1d111fe9d8c4")
                IPlaybackMediaMarkerSequence : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Size(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Insert(
                        ABI::Windows::Media::Playback::IPlaybackMediaMarker *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Clear(
                        ) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence, 0xf2810cee, 0x638b, 0x46cf, 0x88,0x17, 0x1d,0x11,0x1f,0xe9,0xd8,0xc4)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequenceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence *This,
        TrustLevel *trustLevel);

    /*** IPlaybackMediaMarkerSequence methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *Insert)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence *This,
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker *value);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence *This);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequenceVtbl;

interface __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence {
    CONST_VTBL __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequenceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPlaybackMediaMarkerSequence methods ***/
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_Insert(This,value) (This)->lpVtbl->Insert(This,value)
#define __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_Clear(This) (This)->lpVtbl->Clear(This)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_QueryInterface(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_AddRef(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_Release(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_GetIids(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_GetTrustLevel(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPlaybackMediaMarkerSequence methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_get_Size(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_Insert(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence* This,__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker *value) {
    return This->lpVtbl->Insert(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_Clear(__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence* This) {
    return This->lpVtbl->Clear(This);
}
#endif
#ifdef WIDL_using_Windows_Media_Playback
#define IID_IPlaybackMediaMarkerSequence IID___x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence
#define IPlaybackMediaMarkerSequenceVtbl __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequenceVtbl
#define IPlaybackMediaMarkerSequence __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence
#define IPlaybackMediaMarkerSequence_QueryInterface __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_QueryInterface
#define IPlaybackMediaMarkerSequence_AddRef __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_AddRef
#define IPlaybackMediaMarkerSequence_Release __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_Release
#define IPlaybackMediaMarkerSequence_GetIids __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_GetIids
#define IPlaybackMediaMarkerSequence_GetRuntimeClassName __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_GetRuntimeClassName
#define IPlaybackMediaMarkerSequence_GetTrustLevel __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_GetTrustLevel
#define IPlaybackMediaMarkerSequence_get_Size __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_get_Size
#define IPlaybackMediaMarkerSequence_Insert __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_Insert
#define IPlaybackMediaMarkerSequence_Clear __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_Clear
#endif /* WIDL_using_Windows_Media_Playback */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerSequence_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.Playback.BackgroundMediaPlayer
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_Playback_BackgroundMediaPlayer_DEFINED
#define RUNTIMECLASS_Windows_Media_Playback_BackgroundMediaPlayer_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_Playback_BackgroundMediaPlayer[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','P','l','a','y','b','a','c','k','.','B','a','c','k','g','r','o','u','n','d','M','e','d','i','a','P','l','a','y','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_Playback_BackgroundMediaPlayer[] = L"Windows.Media.Playback.BackgroundMediaPlayer";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_Playback_BackgroundMediaPlayer[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','P','l','a','y','b','a','c','k','.','B','a','c','k','g','r','o','u','n','d','M','e','d','i','a','P','l','a','y','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_Playback_BackgroundMediaPlayer_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.Playback.MediaPlayer
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_Playback_MediaPlayer_DEFINED
#define RUNTIMECLASS_Windows_Media_Playback_MediaPlayer_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_Playback_MediaPlayer[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','P','l','a','y','b','a','c','k','.','M','e','d','i','a','P','l','a','y','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_Playback_MediaPlayer[] = L"Windows.Media.Playback.MediaPlayer";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_Playback_MediaPlayer[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','P','l','a','y','b','a','c','k','.','M','e','d','i','a','P','l','a','y','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_Playback_MediaPlayer_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.Playback.MediaPlayerDataReceivedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_Playback_MediaPlayerDataReceivedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_Media_Playback_MediaPlayerDataReceivedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_Playback_MediaPlayerDataReceivedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','P','l','a','y','b','a','c','k','.','M','e','d','i','a','P','l','a','y','e','r','D','a','t','a','R','e','c','e','i','v','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_Playback_MediaPlayerDataReceivedEventArgs[] = L"Windows.Media.Playback.MediaPlayerDataReceivedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_Playback_MediaPlayerDataReceivedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','P','l','a','y','b','a','c','k','.','M','e','d','i','a','P','l','a','y','e','r','D','a','t','a','R','e','c','e','i','v','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_Playback_MediaPlayerDataReceivedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.Playback.MediaPlayerFailedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_Playback_MediaPlayerFailedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_Media_Playback_MediaPlayerFailedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_Playback_MediaPlayerFailedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','P','l','a','y','b','a','c','k','.','M','e','d','i','a','P','l','a','y','e','r','F','a','i','l','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_Playback_MediaPlayerFailedEventArgs[] = L"Windows.Media.Playback.MediaPlayerFailedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_Playback_MediaPlayerFailedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','P','l','a','y','b','a','c','k','.','M','e','d','i','a','P','l','a','y','e','r','F','a','i','l','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_Playback_MediaPlayerFailedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.Playback.MediaPlayerRateChangedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_Playback_MediaPlayerRateChangedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_Media_Playback_MediaPlayerRateChangedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_Playback_MediaPlayerRateChangedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','P','l','a','y','b','a','c','k','.','M','e','d','i','a','P','l','a','y','e','r','R','a','t','e','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_Playback_MediaPlayerRateChangedEventArgs[] = L"Windows.Media.Playback.MediaPlayerRateChangedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_Playback_MediaPlayerRateChangedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','P','l','a','y','b','a','c','k','.','M','e','d','i','a','P','l','a','y','e','r','R','a','t','e','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_Playback_MediaPlayerRateChangedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.Playback.PlaybackMediaMarker
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_Playback_PlaybackMediaMarker_DEFINED
#define RUNTIMECLASS_Windows_Media_Playback_PlaybackMediaMarker_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_Playback_PlaybackMediaMarker[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','P','l','a','y','b','a','c','k','.','P','l','a','y','b','a','c','k','M','e','d','i','a','M','a','r','k','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_Playback_PlaybackMediaMarker[] = L"Windows.Media.Playback.PlaybackMediaMarker";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_Playback_PlaybackMediaMarker[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','P','l','a','y','b','a','c','k','.','P','l','a','y','b','a','c','k','M','e','d','i','a','M','a','r','k','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_Playback_PlaybackMediaMarker_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.Playback.PlaybackMediaMarkerSequence
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_Playback_PlaybackMediaMarkerSequence_DEFINED
#define RUNTIMECLASS_Windows_Media_Playback_PlaybackMediaMarkerSequence_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_Playback_PlaybackMediaMarkerSequence[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','P','l','a','y','b','a','c','k','.','P','l','a','y','b','a','c','k','M','e','d','i','a','M','a','r','k','e','r','S','e','q','u','e','n','c','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_Playback_PlaybackMediaMarkerSequence[] = L"Windows.Media.Playback.PlaybackMediaMarkerSequence";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_Playback_PlaybackMediaMarkerSequence[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','P','l','a','y','b','a','c','k','.','P','l','a','y','b','a','c','k','M','e','d','i','a','M','a','r','k','e','r','S','e','q','u','e','n','c','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_Playback_PlaybackMediaMarkerSequence_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.Playback.PlaybackMediaMarkerReachedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_Playback_PlaybackMediaMarkerReachedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_Media_Playback_PlaybackMediaMarkerReachedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_Playback_PlaybackMediaMarkerReachedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','P','l','a','y','b','a','c','k','.','P','l','a','y','b','a','c','k','M','e','d','i','a','M','a','r','k','e','r','R','e','a','c','h','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_Playback_PlaybackMediaMarkerReachedEventArgs[] = L"Windows.Media.Playback.PlaybackMediaMarkerReachedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_Playback_PlaybackMediaMarkerReachedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','P','l','a','y','b','a','c','k','.','P','l','a','y','b','a','c','k','M','e','d','i','a','M','a','r','k','e','r','R','e','a','c','h','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_Playback_PlaybackMediaMarkerReachedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IIterable<ABI::Windows::Media::Playback::PlaybackMediaMarker* > interface
 */
#ifndef ____FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker, 0xdeeccfe9, 0x6c01, 0x576f, 0x95,0xf2, 0x93,0x51,0x5a,0xe4,0x0e,0xbf);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("deeccfe9-6c01-576f-95f2-93515ae40ebf")
                IIterable<ABI::Windows::Media::Playback::PlaybackMediaMarker* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::Playback::PlaybackMediaMarker*, ABI::Windows::Media::Playback::IPlaybackMediaMarker* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker, 0xdeeccfe9, 0x6c01, 0x576f, 0x95,0xf2, 0x93,0x51,0x5a,0xe4,0x0e,0xbf)
#endif
#else
typedef struct __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarkerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::Media::Playback::PlaybackMediaMarker* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker *This,
        __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker **value);

    END_INTERFACE
} __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarkerVtbl;

interface __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker {
    CONST_VTBL __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarkerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Media::Playback::PlaybackMediaMarker* > methods ***/
#define __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_QueryInterface(__FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_AddRef(__FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_Release(__FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_GetIids(__FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_GetRuntimeClassName(__FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_GetTrustLevel(__FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Media::Playback::PlaybackMediaMarker* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_First(__FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker* This,__FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_PlaybackMediaMarker IID___FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker
#define IIterable_PlaybackMediaMarkerVtbl __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarkerVtbl
#define IIterable_PlaybackMediaMarker __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker
#define IIterable_PlaybackMediaMarker_QueryInterface __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_QueryInterface
#define IIterable_PlaybackMediaMarker_AddRef __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_AddRef
#define IIterable_PlaybackMediaMarker_Release __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_Release
#define IIterable_PlaybackMediaMarker_GetIids __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_GetIids
#define IIterable_PlaybackMediaMarker_GetRuntimeClassName __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_GetRuntimeClassName
#define IIterable_PlaybackMediaMarker_GetTrustLevel __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_GetTrustLevel
#define IIterable_PlaybackMediaMarker_First __FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Media::Playback::PlaybackMediaMarker* > interface
 */
#ifndef ____FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker, 0x28607d6b, 0xdaa4, 0x5eef, 0x9f,0x81, 0xcc,0x08,0xa8,0x29,0x71,0x82);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("28607d6b-daa4-5eef-9f81-cc08a8297182")
                IIterator<ABI::Windows::Media::Playback::PlaybackMediaMarker* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::Playback::PlaybackMediaMarker*, ABI::Windows::Media::Playback::IPlaybackMediaMarker* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker, 0x28607d6b, 0xdaa4, 0x5eef, 0x9f,0x81, 0xcc,0x08,0xa8,0x29,0x71,0x82)
#endif
#else
typedef struct __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarkerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::Media::Playback::PlaybackMediaMarker* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker *This,
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker *This,
        UINT32 items_size,
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarkerVtbl;

interface __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker {
    CONST_VTBL __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarkerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Media::Playback::PlaybackMediaMarker* > methods ***/
#define __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_QueryInterface(__FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_AddRef(__FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_Release(__FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_GetIids(__FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_GetRuntimeClassName(__FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_GetTrustLevel(__FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Media::Playback::PlaybackMediaMarker* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_get_Current(__FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker* This,__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_get_HasCurrent(__FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_MoveNext(__FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_GetMany(__FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker* This,UINT32 items_size,__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarker **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_PlaybackMediaMarker IID___FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker
#define IIterator_PlaybackMediaMarkerVtbl __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarkerVtbl
#define IIterator_PlaybackMediaMarker __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker
#define IIterator_PlaybackMediaMarker_QueryInterface __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_QueryInterface
#define IIterator_PlaybackMediaMarker_AddRef __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_AddRef
#define IIterator_PlaybackMediaMarker_Release __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_Release
#define IIterator_PlaybackMediaMarker_GetIids __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_GetIids
#define IIterator_PlaybackMediaMarker_GetRuntimeClassName __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_GetRuntimeClassName
#define IIterator_PlaybackMediaMarker_GetTrustLevel __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_GetTrustLevel
#define IIterator_PlaybackMediaMarker_get_Current __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_get_Current
#define IIterator_PlaybackMediaMarker_get_HasCurrent __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_get_HasCurrent
#define IIterator_PlaybackMediaMarker_MoveNext __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_MoveNext
#define IIterator_PlaybackMediaMarker_GetMany __FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CMedia__CPlayback__CPlaybackMediaMarker_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEventHandler<ABI::Windows::Media::Playback::MediaPlayerDataReceivedEventArgs* > interface
 */
#ifndef ____FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs_INTERFACE_DEFINED__
#define ____FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs, 0x078fc818, 0x19f5, 0x5b8a, 0xac,0x82, 0x25,0x19,0x3b,0xea,0x56,0xee);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("078fc818-19f5-5b8a-ac82-25193bea56ee")
            IEventHandler<ABI::Windows::Media::Playback::MediaPlayerDataReceivedEventArgs* > : IEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::Playback::MediaPlayerDataReceivedEventArgs*, ABI::Windows::Media::Playback::IMediaPlayerDataReceivedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs, 0x078fc818, 0x19f5, 0x5b8a, 0xac,0x82, 0x25,0x19,0x3b,0xea,0x56,0xee)
#endif
#else
typedef struct __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs *This);

    /*** IEventHandler<ABI::Windows::Media::Playback::MediaPlayerDataReceivedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs *This,
        IInspectable *sender,
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs *args);

    END_INTERFACE
} __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgsVtbl;

interface __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs {
    CONST_VTBL __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IEventHandler<ABI::Windows::Media::Playback::MediaPlayerDataReceivedEventArgs* > methods ***/
#define __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs_QueryInterface(__FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs_AddRef(__FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs_Release(__FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IEventHandler<ABI::Windows::Media::Playback::MediaPlayerDataReceivedEventArgs* > methods ***/
static inline HRESULT __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs_Invoke(__FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs* This,IInspectable *sender,__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerDataReceivedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IEventHandler_MediaPlayerDataReceivedEventArgs IID___FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs
#define IEventHandler_MediaPlayerDataReceivedEventArgsVtbl __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgsVtbl
#define IEventHandler_MediaPlayerDataReceivedEventArgs __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs
#define IEventHandler_MediaPlayerDataReceivedEventArgs_QueryInterface __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs_QueryInterface
#define IEventHandler_MediaPlayerDataReceivedEventArgs_AddRef __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs_AddRef
#define IEventHandler_MediaPlayerDataReceivedEventArgs_Release __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs_Release
#define IEventHandler_MediaPlayerDataReceivedEventArgs_Invoke __FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIEventHandler_1_Windows__CMedia__CPlayback__CMediaPlayerDataReceivedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,IInspectable* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable, 0xf1a6a51e, 0xd078, 0x5c40, 0xba,0x3f, 0x34,0x88,0x70,0xba,0x5c,0x87);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("f1a6a51e-d078-5c40-ba3f-348870ba5c87")
            ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,IInspectable* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::Playback::MediaPlayer*, ABI::Windows::Media::Playback::IMediaPlayer* >, IInspectable* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable, 0xf1a6a51e, 0xd078, 0x5c40, 0xba,0x3f, 0x34,0x88,0x70,0xba,0x5c,0x87)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectableVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable *This);

    /*** ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable *This,
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *sender,
        IInspectable *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectableVtbl;

interface __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable {
    CONST_VTBL __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,IInspectable* > methods ***/
#define __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable_QueryInterface(__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable_AddRef(__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable_Release(__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,IInspectable* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable_Invoke(__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable* This,__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *sender,IInspectable *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_MediaPlayer_IInspectable IID___FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable
#define ITypedEventHandler_MediaPlayer_IInspectableVtbl __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectableVtbl
#define ITypedEventHandler_MediaPlayer_IInspectable __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable
#define ITypedEventHandler_MediaPlayer_IInspectable_QueryInterface __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable_QueryInterface
#define ITypedEventHandler_MediaPlayer_IInspectable_AddRef __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable_AddRef
#define ITypedEventHandler_MediaPlayer_IInspectable_Release __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable_Release
#define ITypedEventHandler_MediaPlayer_IInspectable_Invoke __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,ABI::Windows::Media::Playback::MediaPlayerFailedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs, 0x362c45a7, 0x3a0a, 0x5e27, 0x99,0xce, 0xcf,0xf6,0xd1,0xb7,0x70,0xe1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("362c45a7-3a0a-5e27-99ce-cff6d1b770e1")
            ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,ABI::Windows::Media::Playback::MediaPlayerFailedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::Playback::MediaPlayer*, ABI::Windows::Media::Playback::IMediaPlayer* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::Playback::MediaPlayerFailedEventArgs*, ABI::Windows::Media::Playback::IMediaPlayerFailedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs, 0x362c45a7, 0x3a0a, 0x5e27, 0x99,0xce, 0xcf,0xf6,0xd1,0xb7,0x70,0xe1)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs *This);

    /*** ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,ABI::Windows::Media::Playback::MediaPlayerFailedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs *This,
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *sender,
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,ABI::Windows::Media::Playback::MediaPlayerFailedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs_Release(__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,ABI::Windows::Media::Playback::MediaPlayerFailedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs* This,__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *sender,__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerFailedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_MediaPlayer_MediaPlayerFailedEventArgs IID___FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs
#define ITypedEventHandler_MediaPlayer_MediaPlayerFailedEventArgsVtbl __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgsVtbl
#define ITypedEventHandler_MediaPlayer_MediaPlayerFailedEventArgs __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs
#define ITypedEventHandler_MediaPlayer_MediaPlayerFailedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs_QueryInterface
#define ITypedEventHandler_MediaPlayer_MediaPlayerFailedEventArgs_AddRef __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs_AddRef
#define ITypedEventHandler_MediaPlayer_MediaPlayerFailedEventArgs_Release __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs_Release
#define ITypedEventHandler_MediaPlayer_MediaPlayerFailedEventArgs_Invoke __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerFailedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,ABI::Windows::Media::Playback::MediaPlayerRateChangedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs, 0xba51d31a, 0x5688, 0x5d4d, 0xaf,0x42, 0x12,0x20,0x70,0xb1,0xee,0xfa);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("ba51d31a-5688-5d4d-af42-122070b1eefa")
            ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,ABI::Windows::Media::Playback::MediaPlayerRateChangedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::Playback::MediaPlayer*, ABI::Windows::Media::Playback::IMediaPlayer* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::Playback::MediaPlayerRateChangedEventArgs*, ABI::Windows::Media::Playback::IMediaPlayerRateChangedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs, 0xba51d31a, 0x5688, 0x5d4d, 0xaf,0x42, 0x12,0x20,0x70,0xb1,0xee,0xfa)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs *This);

    /*** ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,ABI::Windows::Media::Playback::MediaPlayerRateChangedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs *This,
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *sender,
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,ABI::Windows::Media::Playback::MediaPlayerRateChangedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs_Release(__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,ABI::Windows::Media::Playback::MediaPlayerRateChangedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs* This,__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *sender,__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayerRateChangedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_MediaPlayer_MediaPlayerRateChangedEventArgs IID___FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs
#define ITypedEventHandler_MediaPlayer_MediaPlayerRateChangedEventArgsVtbl __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgsVtbl
#define ITypedEventHandler_MediaPlayer_MediaPlayerRateChangedEventArgs __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs
#define ITypedEventHandler_MediaPlayer_MediaPlayerRateChangedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs_QueryInterface
#define ITypedEventHandler_MediaPlayer_MediaPlayerRateChangedEventArgs_AddRef __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs_AddRef
#define ITypedEventHandler_MediaPlayer_MediaPlayerRateChangedEventArgs_Release __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs_Release
#define ITypedEventHandler_MediaPlayer_MediaPlayerRateChangedEventArgs_Invoke __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CMediaPlayerRateChangedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,ABI::Windows::Media::Playback::PlaybackMediaMarkerReachedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs, 0x67a4f43c, 0xc254, 0x57f0, 0xa3,0x9d, 0xa4,0x75,0xa3,0x42,0xd2,0x1d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("67a4f43c-c254-57f0-a39d-a475a342d21d")
            ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,ABI::Windows::Media::Playback::PlaybackMediaMarkerReachedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::Playback::MediaPlayer*, ABI::Windows::Media::Playback::IMediaPlayer* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::Playback::PlaybackMediaMarkerReachedEventArgs*, ABI::Windows::Media::Playback::IPlaybackMediaMarkerReachedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs, 0x67a4f43c, 0xc254, 0x57f0, 0xa3,0x9d, 0xa4,0x75,0xa3,0x42,0xd2,0x1d)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs *This);

    /*** ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,ABI::Windows::Media::Playback::PlaybackMediaMarkerReachedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs *This,
        __x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *sender,
        __x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,ABI::Windows::Media::Playback::PlaybackMediaMarkerReachedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs_Release(__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::Media::Playback::MediaPlayer*,ABI::Windows::Media::Playback::PlaybackMediaMarkerReachedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs* This,__x_ABI_CWindows_CMedia_CPlayback_CIMediaPlayer *sender,__x_ABI_CWindows_CMedia_CPlayback_CIPlaybackMediaMarkerReachedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_MediaPlayer_PlaybackMediaMarkerReachedEventArgs IID___FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs
#define ITypedEventHandler_MediaPlayer_PlaybackMediaMarkerReachedEventArgsVtbl __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgsVtbl
#define ITypedEventHandler_MediaPlayer_PlaybackMediaMarkerReachedEventArgs __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs
#define ITypedEventHandler_MediaPlayer_PlaybackMediaMarkerReachedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs_QueryInterface
#define ITypedEventHandler_MediaPlayer_PlaybackMediaMarkerReachedEventArgs_AddRef __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs_AddRef
#define ITypedEventHandler_MediaPlayer_PlaybackMediaMarkerReachedEventArgs_Release __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs_Release
#define ITypedEventHandler_MediaPlayer_PlaybackMediaMarkerReachedEventArgs_Invoke __FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CMedia__CPlayback__CMediaPlayer_Windows__CMedia__CPlayback__CPlaybackMediaMarkerReachedEventArgs_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER HSTRING_UserSize     (ULONG *, ULONG, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserMarshal  (ULONG *, unsigned char *, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
void            __RPC_USER HSTRING_UserFree     (ULONG *, HSTRING *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_media_playback_h__ */
