declare module "windows.media.streaming.adaptive" {
  export enum AdaptiveMediaSourceCreationStatus {
    success,
    manifestDownloadFailure,
    manifestParseFailure,
    unsupportedManifestContentType,
    unsupportedManifestVersion,
    unsupportedManifestProfile,
    unknownFailure,
  }

  export enum AdaptiveMediaSourceResourceType {
    manifest,
    initializationSegment,
    mediaSegment,
    key,
    initializationVector,
  }

  export class AdaptiveMediaSource {
    initialBitrate: Number;
    inboundBitsPerSecondWindow: Number;
    desiredLiveOffset: Number;
    desiredMaxBitrate: Number;
    desiredMinBitrate: Number;
    currentPlaybackBitrate: Number;
    audioOnlyPlayback: Boolean;
    inboundBitsPerSecond: Number;
    availableBitrates: Object;
    currentDownloadBitrate: Number;
    isLive: Boolean;
    advancedSettings: AdaptiveMediaSourceAdvancedSettings;
    constructor();

    static createFromUriAsync(uri: Object, callback: (error: Error, result: AdaptiveMediaSourceCreationResult) => void): void ;
    static createFromUriAsync(uri: Object, httpClient: Object, callback: (error: Error, result: AdaptiveMediaSourceCreationResult) => void): void ;


    static createFromStreamAsync(stream: Object, uri: Object, contentType: String, callback: (error: Error, result: AdaptiveMediaSourceCreationResult) => void): void ;
    static createFromStreamAsync(stream: Object, uri: Object, contentType: String, httpClient: Object, callback: (error: Error, result: AdaptiveMediaSourceCreationResult) => void): void ;


    static isContentTypeSupported(contentType: String): Boolean;


    addListener(type: "DownloadBitrateChanged", listener: (ev: Event) => void): void ;
    removeListener(type: "DownloadBitrateChanged", listener: (ev: Event) => void): void ;
    on(type: "DownloadBitrateChanged", listener: (ev: Event) => void): void ;
    off(type: "DownloadBitrateChanged", listener: (ev: Event) => void): void ;
    
    addListener(type: "DownloadCompleted", listener: (ev: Event) => void): void ;
    removeListener(type: "DownloadCompleted", listener: (ev: Event) => void): void ;
    on(type: "DownloadCompleted", listener: (ev: Event) => void): void ;
    off(type: "DownloadCompleted", listener: (ev: Event) => void): void ;
    
    addListener(type: "DownloadFailed", listener: (ev: Event) => void): void ;
    removeListener(type: "DownloadFailed", listener: (ev: Event) => void): void ;
    on(type: "DownloadFailed", listener: (ev: Event) => void): void ;
    off(type: "DownloadFailed", listener: (ev: Event) => void): void ;
    
    addListener(type: "DownloadRequested", listener: (ev: Event) => void): void ;
    removeListener(type: "DownloadRequested", listener: (ev: Event) => void): void ;
    on(type: "DownloadRequested", listener: (ev: Event) => void): void ;
    off(type: "DownloadRequested", listener: (ev: Event) => void): void ;
    
    addListener(type: "PlaybackBitrateChanged", listener: (ev: Event) => void): void ;
    removeListener(type: "PlaybackBitrateChanged", listener: (ev: Event) => void): void ;
    on(type: "PlaybackBitrateChanged", listener: (ev: Event) => void): void ;
    off(type: "PlaybackBitrateChanged", listener: (ev: Event) => void): void ;
    
    addListener(type: string, listener: (ev: Event) => void): void ;
    removeListener(type: string, listener: (ev: Event) => void): void ;
    on(type: string, listener: (ev: Event) => void): void ;
    off(type: string, listener: (ev: Event) => void): void ;
    

  }

  export class AdaptiveMediaSourceCreationResult {
    httpResponseMessage: Object;
    mediaSource: AdaptiveMediaSource;
    status: AdaptiveMediaSourceCreationStatus;
    constructor();

  }

  export class AdaptiveMediaSourceDownloadBitrateChangedEventArgs {
    newValue: Number;
    oldValue: Number;
    constructor();

  }

  export class AdaptiveMediaSourcePlaybackBitrateChangedEventArgs {
    audioOnly: Boolean;
    newValue: Number;
    oldValue: Number;
    constructor();

  }

  export class AdaptiveMediaSourceDownloadRequestedEventArgs {
    resourceByteRangeLength: Number;
    resourceByteRangeOffset: Number;
    resourceType: AdaptiveMediaSourceResourceType;
    resourceUri: Object;
    result: AdaptiveMediaSourceDownloadResult;
    constructor();

    getDeferral(): AdaptiveMediaSourceDownloadRequestedDeferral;

  }

  export class AdaptiveMediaSourceDownloadCompletedEventArgs {
    httpResponseMessage: Object;
    resourceByteRangeLength: Number;
    resourceByteRangeOffset: Number;
    resourceType: AdaptiveMediaSourceResourceType;
    resourceUri: Object;
    constructor();

  }

  export class AdaptiveMediaSourceDownloadFailedEventArgs {
    httpResponseMessage: Object;
    resourceByteRangeLength: Number;
    resourceByteRangeOffset: Number;
    resourceType: AdaptiveMediaSourceResourceType;
    resourceUri: Object;
    constructor();

  }

  export class AdaptiveMediaSourceAdvancedSettings {
    desiredBitrateHeadroomRatio: Number;
    bitrateDowngradeTriggerRatio: Number;
    allSegmentsIndependent: Boolean;
    constructor();

  }

  export class AdaptiveMediaSourceDownloadResult {
    resourceUri: Object;
    inputStream: Object;
    extendedStatus: Number;
    contentType: String;
    buffer: Object;
    resourceByteRangeOffset: Number;
    resourceByteRangeLength: Number;
    constructor();

  }

  export class AdaptiveMediaSourceDownloadRequestedDeferral {
    constructor();

    complete(): void;

  }

}



