import { AgoraRteAudioRawDataConfig, AgoraRteBeautyOptions, AgoraRteCameraPosition, AgoraRteScreenCaptureParams, AgoraRteScreenCaptureType, AgoraRteVirtualBackgroundOptions, AgoraRteVideoOrientation, AgoraRteCameraCaptureParams, AgoraRtcAudioOutputRouting } from '../imports';
import { FcrDeviceInfo, FcrDeviceType, FcrDisplayInfo, FcrRenderView, FcrWindowInfo } from '../type';
import { FcrMediaSourceState, FcrVideoRenderMode, FcrAiDenoiseLevel, FcrVideoSourceType, FcrAudioSourceType, FcrCapability } from '..';
export type FcrAudioOutputRouting = AgoraRtcAudioOutputRouting;
export type FcrDesktopMediaObserver = {
    /**
     * Callback to receive the auto play failed event.
     */
    onAutoPlayFailed?(): void;
    /**
     * Callback when a camera is added.
     * @param device
     */
    onCameraAdded?(device: FcrDeviceInfo): void;
    /**
     * Callback when a camera is removed.
     * @param device
     */
    onCameraRemoved?(device: FcrDeviceInfo): void;
    /**
     * Callback when a microphone is added.
     * @param device
     */
    onMicrophoneAdded?(device: FcrDeviceInfo): void;
    /**
     * Callback when a microphone is removed.
     * @param device
     */
    onMicrophoneRemoved?(device: FcrDeviceInfo): void;
    /**
     * Callback when a speaker is added.
     * @param device
     */
    onSpeakerAdded?(device: FcrDeviceInfo): void;
    /**
     * Callback when a speaker is removed.
     * @param device
     */
    onSpeakerRemoved?(device: FcrDeviceInfo): void;
    /**
     * Callback to receive the volume indication of the speaker test.
     * @param volume
     */
    onSpeakerTestVolumeIndicationUpdated?(volume: number): void;
    /**
     * Callback to receive the volume changes of the selected speaker.
     * @param volume
     * @param muted
     */
    onSelectedSpeakerVolumeUpdated?(volume: number, muted: boolean): void;
};
export type FcrMobileMediaObserver = {
    /**
     * Callback to receive the auto play failed event.
     */
    onAutoPlayFailed?(): void;
    onCameraStateUpdated?(state: FcrMediaSourceState): void;
    onMicrophoneStateUpdated?(state: FcrMediaSourceState): void;
    onMicrophoneVolumeIndicationUpdated?(volume: number): void;
    onOutputVolumeIndicationUpdated?(volume: number): void;
    onAudioOutputRoutingUpdated?(routing: FcrAudioOutputRouting): void;
    onScreenCaptureStateUpdated?(state: FcrMediaSourceState): void;
};
export type FcrScreenTrackObserver = {
    /**
     * Callback to receive the state changes of the screen video track.
     * @param sourceId
     * @param state
     */
    onScreenCaptureStateUpdated?(sourceId: string, state: FcrMediaSourceState): void;
};
export type FcrMicrophoneTrackObserver = {
    /**
     * Callback to receive the state changes of the microphone audio track.
     * @param deviceId
     * @param state
     */
    onMicrophoneStateUpdated?(deviceId: string, state: FcrMediaSourceState): void;
    /**
     * Callback to receive the volume indication of the microphone.
     * @param deviceId
     * @param volume
     */
    onVolumeIndicationUpdated?(deviceId: string, volume: number): void;
};
export type FcrCameraTrackObserver = {
    /**
     * Callback to receive the state changes of the camera video track.
     * @param deviceId
     * @param state
     */
    onCameraStateUpdated?: (deviceId: string, state: FcrMediaSourceState) => void;
};
export type FcrLoopbackObserver = {
    /**
     * Callback to receive the state changes of the loopback audio track.
     * @param deviceId
     * @param state
     */
    onLoopbackStateUpdated?: (deviceId: string, state: FcrMediaSourceState) => void;
};
export type FcrRenderConfig = {
    renderMode: FcrVideoRenderMode;
    isMirror: boolean;
};
export type FcrBeautyOptions = AgoraRteBeautyOptions;
export type FcrVirtualBackgroundOptions = AgoraRteVirtualBackgroundOptions;
export type FcrCameraPosition = AgoraRteCameraPosition;
export type FcrAudioRawDataConfig = AgoraRteAudioRawDataConfig;
export type FcrScreenCaptureParams = AgoraRteScreenCaptureParams;
export type FcrScreenCaptureType = AgoraRteScreenCaptureType;
export type FcrCameraCaptureParams = AgoraRteCameraCaptureParams;
export type FcrVideoOrientation = AgoraRteVideoOrientation;
export interface FcrAudioEffectEnhancer {
    /**
     * Enables the AI denoiser for the audio track.
     */
    enableAiDenoiser(): void;
    /**
     * Disables the AI denoiser for the audio track.
     */
    disableAiDenoiser(): void;
    /**
     * Sets the AI denoiser level for the audio track.
     * @param level The AI denoiser level to set.
     */
    setAiDenoiseLevel(level: FcrAiDenoiseLevel): void;
    /**
     * Enables HiFi mode for the audio track.
     */
    enableHiFiMode(): void;
    /**
     * Disables HiFi mode for the audio track.
     */
    disableHiFiMode(): void;
    /**
     * Enables echo cancellation for the audio track.
     */
    enableEchoCancellation(): void;
    /**
     * Disables echo cancellation for the audio track.
     */
    disableEchoCancellation(): void;
    /**
     * Enables stereo mode for the audio track.
     */
    enableStereoMode(): void;
    /**
     * Disables stereo mode for the audio track.
     */
    disableStereoMode(): void;
    /**
     * Enables original sound mode for the audio track.
     */
    enableOriginalSoundMode(): void;
    /**
     * Disables original sound mode for the audio track.
     */
    disableOriginalSoundMode(): void;
}
export interface FcrVideoEffectEnhancer {
    /**
     * Sets the beauty options for the video track.
     * @param options The beauty options.
     * @param view The HTML element to render the video on.
     */
    setBeautyOptions(options: FcrBeautyOptions): void;
    /**
     * Enables the beauty effect for the video track.
     */
    enableBeauty(): void;
    /**
     * Disables the beauty effect for the video track.
     */
    disableBeauty(): void;
    /**
     * Sets the virtual background options for the video track.
     * @param options The virtual background options.
     */
    setVirtualBackgroundOptions(options: FcrVirtualBackgroundOptions): void;
    /**
     * Enables the virtual background for the video track.
     */
    enableVirtualBackground(): void;
    /**
     * Disables the virtual background for the video track.
     */
    disableVirtualBackground(): void;
    /**
     * Enables lowlight enhancement for the video track.
     *
     * This method enhances the video quality in low-light conditions by adjusting
     * the brightness and contrast to improve visibility.
     */
    enableLowlightEnhancement(): void;
    /**
     * Disables lowlight enhancement for the video track.
     *
     * This method turns off the lowlight enhancement feature, reverting any adjustments
     * made to the brightness and contrast for low-light conditions.
     */
    disableLowlightEnhancement(): void;
    /**
     * Enables the video denoiser for the video track.
     *
     * This method reduces noise in the video stream, resulting in a clearer and more
     * visually appealing video output.
     */
    enableVideoDenoiser(): void;
    /**
     * Disables the video denoiser for the video track.
     *
     * This method turns off the video denoiser feature, allowing the video stream
     * to be displayed without noise reduction.
     */
    disableVideoDenoiser(): void;
    /**
     * Enables the hardware encoder for the video track.
     *
     * This method utilizes the hardware encoder of the device to encode the video stream,
     * which can improve performance and reduce CPU usage.
     */
    enableHardwareEncoder(): void;
    /**
     * Disables the hardware encoder for the video track.
     *
     * This method stops using the hardware encoder of the device to encode the video stream,
     * potentially increasing CPU usage but providing more flexibility in software encoding.
     */
    disableHardwareEncoder(): void;
    /**
     * Checks if the system satisfies the requirements for using virtual backgrounds.
     *
     * This method verifies if the current system meets the necessary conditions to enable
     * virtual backgrounds, such as hardware capabilities and software configurations.
     *
     * @returns {boolean} True if the system satisfies the requirements, false otherwise.
     */
    checkSatisfyVirtualBackgroundRequirements(): boolean;
    /**
     * Checks if the system satisfies the requirements for using beauty effects.
     *
     * This method verifies if the current system meets the necessary conditions to enable
     * beauty effects, such as hardware capabilities and software configurations.
     *
     * @returns {boolean} True if the system satisfies the requirements, false otherwise.
     */
    checkSatisfyBeautyRequirements(): boolean;
}
export interface FcrCameraTrack {
    /**
     * Gets the device ID of the camera.
     * @returns The device ID of the camera.
     */
    getDeviceId(): string;
    /**
     * Gets the current state of the camera.
     * @returns The current state of the camera.
     */
    getState(): FcrMediaSourceState;
    /**
     * Gets the video source type.
     * @returns The video source type.
     */
    getVideoSourceType(): FcrVideoSourceType;
    /**
     * Starts the camera.
     */
    start(): void;
    /**
     * Stops the camera.
     */
    stop(): void;
    /**
     * Starts the camera test.
     */
    startTest(): void;
    /**
     * Stops the camera test.
     */
    stopTest(): void;
    /**
     * Starts the camera preview with the specified configuration and view.
     * @param config The configuration for the video render.
     * @param view The HTML element to render the video on.
     */
    startPreview(config: FcrRenderConfig, view: FcrRenderView): void;
    /**
     * Stops the camera preview.
     * @param view The HTML element to render the video on.
     */
    stopPreview(view: FcrRenderView): void;
    /**
     * Sets the capture parameters for the camera.
     * @param params The parameters for the video capture.
     */
    setCaptureParams(params: FcrCameraCaptureParams): void;
    /**
     * Retrieves the video effect enhancer.
     *
     * This method returns an instance of the video effect enhancer, which is used to apply various effects to the video.
     *
     * @returns {VideoEffectEnhancer} An instance of the video effect enhancer.
     */
    getVideoEffectEnhancer(): FcrVideoEffectEnhancer;
    /**
     * Sets the video orientation for the camera.
     * @param orientation orientation of the camera video.
     */
    setVideoOrientation(orientation: FcrVideoOrientation): void;
    /**
     *
     * @param observer
     */
    addObserver(observer: FcrCameraTrackObserver): void;
    /**
     *
     * @param observer
     */
    removeObserver(observer: FcrCameraTrackObserver): void;
}
export interface FcrLoopbackTrack {
    /**
     * Gets the device ID of the loopback audio track.
     * @returns The device ID of the loopback audio track.
     */
    getDeviceId(): string;
    /**
     * Gets the state of the loopback audio track.
     * @returns The state of the loopback audio track.
     */
    getState(): FcrMediaSourceState;
    /**
     * Gets the audio source type of the loopback audio track.
     */
    getAudioSourceType(): FcrAudioSourceType;
    /**
     * Starts the loopback audio track.
     */
    start(): void;
    /**
     * Stops the loopback audio track.
     */
    stop(): void;
    /**
     * Updates the signal volume for the loopback audio track.
     * @param volume Range from 0 to 400. 100 is the default volume.
     */
    adjustVolume(volume: number): void;
    /**
     *
     * @param observer
     */
    addObserver(observer: FcrLoopbackObserver): void;
    /**
     *
     * @param observer
     */
    removeObserver(observer: FcrLoopbackObserver): void;
}
export interface FcrMicrophoneTrack {
    /**
     * Gets the device ID of the microphone.
     */
    getDeviceId(): string;
    /**
     * Gets the state of the microphone audio track.
     */
    getState(): FcrMediaSourceState;
    /**
     * Gets the audio source type of the microphone audio track.
     */
    getAudioSourceType(): FcrAudioSourceType;
    /**
     * Sets the audio raw data configuration for the track.
     * @param config The audio raw data configuration.
     */
    /**
     * Adds an observer for the audio raw data.
     * @param observer The observer for the audio raw data.
     */
    /**
     * Removes an observer for the audio raw data.
     * @param observer The observer for the audio raw data.
     */
    /**
     * Starts the microphone audio track for the specified device.
     * onLocalMicrophoneAudioStateUpdated callback will be triggered when the state of the microphone changes.
     * Note:
     * - {@link startTest} should be called after this method when you are not in a channel,
     * otherwise onLocalMicrophoneAudioStateUpdated may not be triggered in electron.
     */
    start(): void;
    /**
     * Stops the microphone audio track for the specified device.
     */
    stop(): void;
    /**
     * Starts the microphone test for the specified device.
     * @param interval The interval for the microphone test.
     */
    startTest(interval: number): void;
    /**
     * Stops the microphone test for the specified device.
     */
    stopTest(): void;
    /**
     * Updates the signal volume for the microphone audio track.
     * @param volume Range from 0 to 400. 100 is the default volume.
     */
    adjustVolume(volume: number): void;
    /**
     * Retrieves the audio effect enhancer.
     *
     * This method returns an instance of the audio effect enhancer, which is used to apply various effects to the audio stream.
     *
     * @returns {AudioEffectEnhancer} An instance of the audio effect enhancer.
     */
    getAudioEffectEnhancer(): FcrAudioEffectEnhancer;
    addObserver(observer: FcrMicrophoneTrackObserver): void;
    removeObserver(observer: FcrMicrophoneTrackObserver): void;
}
export interface FcrScreenTrack {
    /**
     * Gets the device ID of the screen.
     * @returns The device ID of the screen.
     */
    getSourceId(): string;
    /**
     * Gets the current state of the screen.
     * @returns The current state of the screen.
     */
    getState(): FcrMediaSourceState;
    /**
     * Gets the video source type.
     * @returns The video source type.
     */
    getVideoSourceType(): FcrVideoSourceType;
    /**
     * Starts the screen preview with the specified configuration and view.
     * @param config The configuration for the video render.
     * @param view The HTML element to render the video on.
     */
    startPreview(config: FcrRenderConfig, view: FcrRenderView): void;
    /**
     * Stops the screen preview.
     * @param view The HTML element to render the video on.
     */
    stopPreview(view: FcrRenderView): void;
    /**
     * Sets the capture parameters for the screen.
     * @param params The parameters for the video capture.
     */
    setCaptureParams(params: FcrScreenCaptureParams): void;
    /**
     * Starts the screen video track with the specified type and parameters.
     * @param type The type of screen capture.
     * @param params The parameters for the screen capture.
     * @returns A promise that resolves when the start is successful.
     */
    start(type: FcrScreenCaptureType, params: FcrScreenCaptureParams): void;
    /**
     * Stops the screen video track for the specified source.
     * @returns A promise that resolves when the stop is successful.
     */
    stop(): void;
    /**
     * Adds an observer for the screen video track.
     * @param observer The observer for the screen video track.
     */
    addObserver(observer: FcrScreenTrackObserver): void;
    /**
     * Removes an observer for the screen video track.
     * @param observer The observer for the screen video track.
     */
    removeObserver(observer: FcrScreenTrackObserver): void;
}
export interface FcrDesktopMediaControl {
    /**
     * Get the list of cameras.
     * @returns An array of device information for each camera.
     */
    getCameraList(): Promise<FcrDeviceInfo[]>;
    /**
     * Get the list of microphones.
     * @returns An array of device information for each microphone.
     */
    getMicrophoneList(): Promise<FcrDeviceInfo[]>;
    /**
     * Get the list of speakers.
     * @returns An array of device information for each speaker.
     */
    getSpeakerList(): Promise<FcrDeviceInfo[]>;
    /**
     * Get the system selected microphone.
     * @returns The system selected microphone, could be undefined if no microphone device.
     */
    getSystemSelectedMicrophone(): Promise<FcrDeviceInfo | undefined>;
    /**
     * Get the system selected speaker.
     * @returns The system selected speaker, could be undefined if no speaker device.
     */
    getSystemSelectedSpeaker(): Promise<FcrDeviceInfo | undefined>;
    /**
     * Get the list of windows.
     * @returns A promise that resolves with an array of window information.
     */
    getWindowList(): Promise<FcrWindowInfo[]>;
    /**
     * Get the list of displays.
     * @returns A promise that resolves with an array of display information.
     */
    getDisplayList(): Promise<FcrDisplayInfo[]>;
    /**
     * Get the video track of the specified camera.
     * @param deviceId The ID of the camera.
     * @returns The video track of the camera.
     */
    getCameraTrack(deviceId: string): FcrCameraTrack;
    /**
     * Get the audio track of the specified microphone.
     * @param deviceId The ID of the microphone.
     * @returns The audio track of the microphone.
     */
    getMicrophoneTrack(deviceId: string): FcrMicrophoneTrack;
    /**
     * Get the video track of the specified screen.
     * @param sourceId The ID of the screen.
     * @returns The video track of the screen.
     */
    getScreenTrack(sourceId: string): FcrScreenTrack;
    /**
     * Get the audio track of the specified loopback source.
     * @param sourceId The ID of the loopback source.
     * @returns The audio track of the loopback source.
     */
    getLoopbackTrack(sourceId: string): FcrLoopbackTrack;
    /**
     * Set the specified device as the speaker.
     * @param deviceId The ID of the device to set as the speaker.
     */
    setSelectedSpeaker(deviceId: string): void;
    /**
     * Start a speaker test with the specified URL and interval.
     * @param url The URL to use for the test, which can be a base64 URL in browsers or absolute file path in Electron.
     * @param interval The interval between every time `onLocalMicrophoneAudioVolumeUpdated` is called.
     */
    startSelectedSpeakerTest(url: string, interval: number): void;
    /**
     * Stop the speaker test.
     */
    stopSelectedSpeakerTest(): void;
    /**
     * Adjust the output volume.
     * @param volume Range from 0 to 400. 100 is the default volume.
     */
    adjustOutputVolume(volume: number): void;
    /**
     * Check if the media control supports the specified capability.
     * @param capability
     * @returns Whether the media control supports the specified capability.
     */
    isCapabilitySupported(capability: FcrCapability): boolean;
    /**
     * Add an observer to the media control.
     * @param observer The observer to add.
     */
    addObserver(observer: FcrDesktopMediaObserver): void;
    /**
     * Remove an observer from the media control.
     * @param observer The observer to remove.
     */
    removeObserver(observer: FcrDesktopMediaObserver): void;
    /**
     * Set the volume of the speaker.
     * @param volume Range from 0 to 100.
     */
    setSelectedSpeakerVolume(volume: number): void;
    /**
     * Get the volume of the speaker.
     * @returns The volume of the speaker. Range from 0 to 100.
     */
    getSelectedSpeakerVolume(): number;
    /**
     * Check loopback device status
     * @returns 0 if the loopback device is available; otherwise,
     * 1 if not downloaded,
     * 2 if not installed/activated
     */
    checkLoopbackDevice(): Promise<number>;
    /**
     * Follow the system speaker.
     * @param follow
     */
    followSystemSpeaker(follow: boolean): void;
    /**
     * Follow the system microphone.
     * @param follow
     */
    followSystemMicrophone(follow: boolean): void;
}
export interface FcrMobileMediaControl {
    /**
     * Open the specified device.
     * @param deviceType The type of the device to open.
     */
    openDevice(deviceType: FcrDeviceType): void;
    /**
     * Close the specified device.
     * @param deviceType The type of the device to close.
     */
    closeDevice(deviceType: FcrDeviceType): void;
    getDeviceId(deviceType: FcrDeviceType): string;
    getDeviceState(deviceType: FcrDeviceType): FcrMediaSourceState;
    adjustOutputVolume(volume: number): void;
    /**
     * Switch the camera position.
     * @returns The new camera position.
     */
    switchCamera(): FcrCameraPosition;
    /**
     * Get the current camera position.
     * @returns The current camera position.
     */
    getCameraPosition(): FcrCameraPosition;
    startCameraTest(): void;
    stopCameraTest(): void;
    startCameraPreview(view: string | object, config: FcrRenderConfig): void;
    stopCameraPreview(view: string | object): void;
    stopCameraPreviewOnAllCanvas(): void;
    isCapabilitySupported(capability: FcrCapability): boolean;
    startScreenCapture(params: FcrScreenCaptureParams): void;
    updateScreenCapture(hasAudio: boolean): void;
    stopScreenCapture(): void;
    getScreenCaptureState(): FcrMediaSourceState;
    enableSpeaker(enable: boolean): void;
    getAudioOutputRouting(): FcrAudioOutputRouting;
    getAudioEffectEnhancer(): FcrAudioEffectEnhancer;
    getVideoEffectEnhancer(): FcrVideoEffectEnhancer;
    /**
     * Add an observer to the media control.
     * @param observer The observer to add.
     */
    addObserver(observer: FcrMobileMediaObserver): void;
    /**
     * Remove an observer from the media control.
     * @param observer The observer to remove.
     */
    removeObserver(observer: FcrMobileMediaObserver): void;
}
