/*** Autogenerated by WIDL 11.0-rc1 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__ */
