// Copyright © 2015-2017 winapi-rs developers
// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
// All files in the project carrying such notice may not be copied, modified, or distributed
// except according to those terms
//! this ALWAYS GENERATED file contains the definitions for the interfaces
use ctypes::c_void;
use shared::guiddef::{GUID, REFIID};
use shared::minwindef::{DWORD, LPARAM, LPVOID, UINT};
// use shared::winerror::{ERROR_NOT_FOUND, ERROR_UNSUPPORTED_TYPE, HRESULT_FROM_WIN32};
use shared::wtypes::PROPERTYKEY;
use um::propidl::PROPVARIANT;
use um::propsys::IPropertyStore;
use um::unknwnbase::{IUnknown, IUnknownVtbl};
use um::winnt::{HRESULT, LPCWSTR, LPWSTR};
// pub const E_NOTFOUND: HRESULT = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
// pub const E_UNSUPPORTED_TYPE: HRESULT = HRESULT_FROM_WIN32(ERROR_UNSUPPORTED_TYPE);
pub const DEVICE_STATE_ACTIVE: DWORD = 0x00000001;
pub const DEVICE_STATE_DISABLED: DWORD = 0x00000002;
pub const DEVICE_STATE_NOTPRESENT: DWORD = 0x00000004;
pub const DEVICE_STATE_UNPLUGGED: DWORD = 0x00000008;
pub const DEVICE_STATEMASK_ALL: DWORD = 0x0000000F;
DEFINE_PROPERTYKEY!(PKEY_AudioEndpoint_FormFactor,
    0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 0);
DEFINE_PROPERTYKEY!(PKEY_AudioEndpoint_ControlPanelPageProvider,
    0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 1);
DEFINE_PROPERTYKEY!(PKEY_AudioEndpoint_Association,
    0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 2);
DEFINE_PROPERTYKEY!(PKEY_AudioEndpoint_PhysicalSpeakers,
    0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 3);
DEFINE_PROPERTYKEY!(PKEY_AudioEndpoint_GUID,
    0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 4);
DEFINE_PROPERTYKEY!(PKEY_AudioEndpoint_Disable_SysFx,
    0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 5);
pub const ENDPOINT_SYSFX_ENABLED: DWORD = 0x00000000;
pub const ENDPOINT_SYSFX_DISABLED: DWORD = 0x00000001;
DEFINE_PROPERTYKEY!(PKEY_AudioEndpoint_FullRangeSpeakers,
    0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 6);
DEFINE_PROPERTYKEY!(PKEY_AudioEndpoint_Supports_EventDriven_Mode,
    0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 7);
DEFINE_PROPERTYKEY!(PKEY_AudioEndpoint_JackSubType,
    0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 8);
DEFINE_PROPERTYKEY!(PKEY_AudioEndpoint_Default_VolumeInDb,
    0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 9);
DEFINE_PROPERTYKEY!(PKEY_AudioEngine_DeviceFormat,
    0xf19f064d, 0x82c, 0x4e27, 0xbc, 0x73, 0x68, 0x82, 0xa1, 0xbb, 0x8e, 0x4c, 0);
DEFINE_PROPERTYKEY!(PKEY_AudioEngine_OEMFormat,
    0xe4870e26, 0x3cc5, 0x4cd2, 0xba, 0x46, 0xca, 0xa, 0x9a, 0x70, 0xed, 0x4, 3);
DEFINE_PROPERTYKEY!(PKEY_AudioEndpointLogo_IconEffects,
    0xf1ab780d, 0x2010, 0x4ed3, 0xa3, 0xa6, 0x8b, 0x87, 0xf0, 0xf0, 0xc4, 0x76, 0);
DEFINE_PROPERTYKEY!(PKEY_AudioEndpointLogo_IconPath,
    0xf1ab780d, 0x2010, 0x4ed3, 0xa3, 0xa6, 0x8b, 0x87, 0xf0, 0xf0, 0xc4, 0x76, 1);
DEFINE_PROPERTYKEY!(PKEY_AudioEndpointSettings_MenuText,
    0x14242002, 0x0320, 0x4de4, 0x95, 0x55, 0xa7, 0xd8, 0x2b, 0x73, 0xc2, 0x86, 0);
DEFINE_PROPERTYKEY!(PKEY_AudioEndpointSettings_LaunchContract,
    0x14242002, 0x0320, 0x4de4, 0x95, 0x55, 0xa7, 0xd8, 0x2b, 0x73, 0xc2, 0x86, 1);
STRUCT!{struct DIRECTX_AUDIO_ACTIVATION_PARAMS {
    cbDirectXAudioActivationParams: DWORD,
    guidAudioSession: GUID,
    dwAudioStreamFlags: DWORD,
}}
pub type PDIRECTX_AUDIO_ACTIVATION_PARAMS = *mut DIRECTX_AUDIO_ACTIVATION_PARAMS;
ENUM!{enum EDataFlow {
    eRender,
    eCapture,
    eAll,
    EDataFlow_enum_count,
}}
ENUM!{enum ERole {
    eConsole,
    eMultimedia,
    eCommunications,
    ERole_enum_count,
}}
ENUM!{enum EndpointFormFactor {
    RemoteNetworkDevice,
    Speakers,
    LineLevel,
    Headphones,
    Microphone,
    Headset,
    Handset,
    UnknownDigitalPassthrough,
    SPDIF,
    DigitalAudioDisplayDevice,
    UnknownFormFactor,
    EndpointFormFactor_enum_count,
}}
pub const HDMI: EndpointFormFactor = DigitalAudioDisplayDevice;
DEFINE_GUID!(DEVINTERFACE_AUDIO_RENDER,
    0xe6327cad, 0xdcec, 0x4949, 0xae, 0x8a, 0x99, 0x1e, 0x97, 0x6a, 0x79, 0xd2);
DEFINE_GUID!(DEVINTERFACE_AUDIO_CAPTURE,
    0x2eef81be, 0x33fa, 0x4800, 0x96, 0x70, 0x1c, 0xd4, 0x74, 0x97, 0x2c, 0x3f);
DEFINE_GUID!(DEVINTERFACE_MIDI_OUTPUT,
    0x6dc23320, 0xab33, 0x4ce4, 0x80, 0xd4, 0xbb, 0xb3, 0xeb, 0xbf, 0x28, 0x14);
DEFINE_GUID!(DEVINTERFACE_MIDI_INPUT,
    0x504be32c, 0xccf6, 0x4d2c, 0xb7, 0x3f, 0x6f, 0x8b, 0x37, 0x47, 0xe2, 0x2b);
RIDL!(#[uuid(0x7991eec9, 0x7e89, 0x4d85, 0x83, 0x90, 0x6c, 0x70, 0x3c, 0xec, 0x60, 0xc0)]
interface IMMNotificationClient(IMMNotificationClientVtbl): IUnknown(IUnknownVtbl) {
    fn OnDeviceStateChanged(
        pwstrDeviceId: LPCWSTR,
        dwNewState: DWORD,
    ) -> HRESULT,
    fn OnDeviceAdded(
        pwstrDeviceId: LPCWSTR,
    ) -> HRESULT,
    fn OnDeviceRemoved(
        pwstrDeviceId: LPCWSTR,
    ) -> HRESULT,
    fn OnDefaultDeviceChanged(
        flow: EDataFlow,
        role: ERole,
        pwstrDefaultDeviceId: LPCWSTR,
    ) -> HRESULT,
    fn OnPropertyValueChanged(
        pwstrDeviceId: LPCWSTR,
        key: PROPERTYKEY,
    ) -> HRESULT,
}
);
RIDL!(#[uuid(0xd666063f, 0x1587, 0x4e43, 0x81, 0xf1, 0xb9, 0x48, 0xe8, 0x07, 0x36, 0x3f)]
interface IMMDevice(IMMDeviceVtbl): IUnknown(IUnknownVtbl) {
    fn Activate(
        iid: REFIID,
        dwClsCtx: DWORD,
        pActivationParams: *mut PROPVARIANT,
        ppInterface: *mut LPVOID,
    ) -> HRESULT,
    fn OpenPropertyStore(
        stgmAccess: DWORD,
        ppProperties: *mut *mut IPropertyStore,
    ) -> HRESULT,
    fn GetId(
        ppstrId: *mut LPWSTR,
    ) -> HRESULT,
    fn GetState(
        pdwState: *mut DWORD,
    ) -> HRESULT,
}
);
RIDL!(#[uuid(0x0bd7a1be, 0x7a1a, 0x44db, 0x83, 0x97, 0xcc, 0x53, 0x92, 0x38, 0x7b, 0x5e)]
interface IMMDeviceCollection(IMMDeviceCollectionVtbl): IUnknown(IUnknownVtbl) {
    fn GetCount(
        pcDevices: *const UINT,
    ) -> HRESULT,
    fn Item(
        nDevice: UINT,
        ppDevice: *mut *mut IMMDevice,
    ) -> HRESULT,
}
);
RIDL!(#[uuid(0x1be09788, 0x6894, 0x4089, 0x85, 0x86, 0x9a, 0x2a, 0x6c, 0x26, 0x5a, 0xc5)]
interface IMMEndpoint(IMMEndpointVtbl): IUnknown(IUnknownVtbl) {
    fn GetDataFlow(
        pDataFlow: *mut EDataFlow,
    ) -> HRESULT,
}
);
RIDL!(#[uuid(0xa95664d2, 0x9614, 0x4f35, 0xa7, 0x46, 0xde, 0x8d, 0xb6, 0x36, 0x17, 0xe6)]
interface IMMDeviceEnumerator(IMMDeviceEnumeratorVtbl): IUnknown(IUnknownVtbl) {
    fn EnumAudioEndpoints(
        dataFlow: EDataFlow,
        dwStateMask: DWORD,
        ppDevices: *mut *mut IMMDeviceCollection,
    ) -> HRESULT,
    fn GetDefaultAudioEndpoint(
        dataFlow: EDataFlow,
        role: ERole,
        ppEndpoint: *mut *mut IMMDevice,
    ) -> HRESULT,
    fn GetDevice(
        pwstrId: LPCWSTR,
        ppDevices: *mut *mut IMMDevice,
    ) -> HRESULT,
    fn RegisterEndpointNotificationCallback(
        pClient: *mut IMMNotificationClient,
    ) -> HRESULT,
    fn UnregisterEndpointNotificationCallback(
        pClient: *mut IMMNotificationClient,
    ) -> HRESULT,
}
);
RIDL!(#[uuid(0x3b0d0ea4, 0xd0a9, 0x4b0e, 0x93, 0x5b, 0x09, 0x51, 0x67, 0x46, 0xfa, 0xc0)]
interface IMMDeviceActivator(IMMDeviceActivatorVtbl): IUnknown(IUnknownVtbl) {
    fn Activate(
        iid: REFIID,
        pDevice: *mut IMMDevice,
        pActivationParams: *mut PROPVARIANT,
        ppInterface: *mut *mut c_void,
    ) -> HRESULT,
}
);
RIDL!(#[uuid(0x41d949ab, 0x9862, 0x444a, 0x80, 0xf6, 0xc2, 0x61, 0x33, 0x4d, 0xa5, 0xeb)]
interface IActivateAudioInterfaceCompletionHandler(IActivateAudioInterfaceCompletionHandlerVtbl):
    IUnknown(IUnknownVtbl) {
    fn ActivateCompleted(
        activateOperation: *mut IActivateAudioInterfaceAsyncOperation,
    ) -> HRESULT,
}
);
RIDL!(#[uuid(0x72a22d78, 0xcde4, 0x431d, 0xb8, 0xcc, 0x84, 0x3a, 0x71, 0x19, 0x9b, 0x6d)]
interface IActivateAudioInterfaceAsyncOperation(IActivateAudioInterfaceAsyncOperationVtbl):
    IUnknown(IUnknownVtbl) {
    fn GetActivateResult(
        activateResult: *mut HRESULT,
        activatedInterface: *mut *mut IUnknown,
    ) -> HRESULT,
}
);
extern "system" {
    pub fn ActivateAudioInterfaceAsync(
        deviceInterfacePath: LPCWSTR,
        riid: REFIID,
        activationParams: *mut PROPVARIANT,
        completionHandler: *mut IActivateAudioInterfaceCompletionHandler,
        activationOperation: *mut *mut IActivateAudioInterfaceAsyncOperation,
    ) -> HRESULT;
}
STRUCT!{struct AudioExtensionParams {
    AddPageParam: LPARAM,
    pEndpoint: *mut IMMDevice,
    pPnpInterface: *mut IMMDevice,
    pPnpDevnode: *mut IMMDevice,
}}
DEFINE_GUID!(CLSID_MMDeviceEnumerator, 0xBCDE0395, 0xE52F, 0x467C,
    0x8E, 0x3D, 0xC4, 0x57, 0x92, 0x91, 0x69, 0x2E);
