// -----------------------------------------
// SoundScribe (TM) and related software.
// 
// Copyright (C) 2007-2011 Vannatech
// http://www.vannatech.com
// All rights reserved.
// 
// This source code is subject to the MIT License.
// http://www.opensource.org/licenses/mit-license.php
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
// -----------------------------------------
// milligan22963 - ported to nAudio
// -----------------------------------------
using System;
using System.Runtime.InteropServices;
namespace NAudio.CoreAudioApi.Interfaces
{
    /// 
    /// Windows CoreAudio IAudioSessionControl interface
    /// Defined in AudioPolicy.h
    /// 
    [Guid("F4B1A599-7266-4319-A8CA-E70ACB11E8CD"),
     InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
     ComImport]
    public interface IAudioSessionControl
    {
        /// 
        /// Retrieves the current state of the audio session.
        /// 
        /// Receives the current session state.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        int GetState(
            [Out] out AudioSessionState state);
        /// 
        /// Retrieves the display name for the audio session.
        /// 
        /// Receives a string that contains the display name.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        int GetDisplayName(
            [Out] [MarshalAs(UnmanagedType.LPWStr)] out string displayName);
        /// 
        /// Assigns a display name to the current audio session.
        /// 
        /// A string that contains the new display name for the session.
        /// A user context value that is passed to the notification callback.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        int SetDisplayName(
            [In] [MarshalAs(UnmanagedType.LPWStr)] string displayName,
            [In] [MarshalAs(UnmanagedType.LPStruct)] Guid eventContext);
        /// 
        /// Retrieves the path for the display icon for the audio session.
        /// 
        /// Receives a string that specifies the fully qualified path of the file that contains the icon.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        int GetIconPath(
            [Out] [MarshalAs(UnmanagedType.LPWStr)] out string iconPath);
        /// 
        /// Assigns a display icon to the current session.
        /// 
        /// A string that specifies the fully qualified path of the file that contains the new icon.
        /// A user context value that is passed to the notification callback.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        int SetIconPath(
            [In] [MarshalAs(UnmanagedType.LPWStr)] string iconPath,
            [In] [MarshalAs(UnmanagedType.LPStruct)] Guid eventContext);
        /// 
        /// Retrieves the grouping parameter of the audio session.
        /// 
        /// Receives the grouping parameter ID.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        int GetGroupingParam(
            [Out] out Guid groupingId);
        /// 
        /// Assigns a session to a grouping of sessions.
        /// 
        /// The new grouping parameter ID.
        /// A user context value that is passed to the notification callback.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        int SetGroupingParam(
            [In] [MarshalAs(UnmanagedType.LPStruct)] Guid groupingId,
            [In] [MarshalAs(UnmanagedType.LPStruct)] Guid eventContext);
        /// 
        /// Registers the client to receive notifications of session events, including changes in the session state.
        /// 
        /// A client-implemented  interface.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        int RegisterAudioSessionNotification(
            [In] IAudioSessionEvents client);
        /// 
        /// Deletes a previous registration by the client to receive notifications.
        /// 
        /// A client-implemented  interface.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        int UnregisterAudioSessionNotification(
            [In] IAudioSessionEvents client);
    }
    /// 
    /// Windows CoreAudio IAudioSessionControl interface
    /// Defined in AudioPolicy.h
    /// 
    [Guid("bfb7ff88-7239-4fc9-8fa2-07c950be9c6d"),
     InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
     ComImport]
    public interface IAudioSessionControl2 : IAudioSessionControl
    {
        /// 
        /// Retrieves the current state of the audio session.
        /// 
        /// Receives the current session state.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        new int GetState(
            [Out] out AudioSessionState state);
        /// 
        /// Retrieves the display name for the audio session.
        /// 
        /// Receives a string that contains the display name.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        new int GetDisplayName(
            [Out] [MarshalAs(UnmanagedType.LPWStr)] out string displayName);
        /// 
        /// Assigns a display name to the current audio session.
        /// 
        /// A string that contains the new display name for the session.
        /// A user context value that is passed to the notification callback.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        new int SetDisplayName(
            [In] [MarshalAs(UnmanagedType.LPWStr)] string displayName,
            [In] [MarshalAs(UnmanagedType.LPStruct)] Guid eventContext);
        /// 
        /// Retrieves the path for the display icon for the audio session.
        /// 
        /// Receives a string that specifies the fully qualified path of the file that contains the icon.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        new int GetIconPath(
            [Out] [MarshalAs(UnmanagedType.LPWStr)] out string iconPath);
        /// 
        /// Assigns a display icon to the current session.
        /// 
        /// A string that specifies the fully qualified path of the file that contains the new icon.
        /// A user context value that is passed to the notification callback.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        new int SetIconPath(
            [In] [MarshalAs(UnmanagedType.LPWStr)] string iconPath,
            [In] [MarshalAs(UnmanagedType.LPStruct)] Guid eventContext);
        /// 
        /// Retrieves the grouping parameter of the audio session.
        /// 
        /// Receives the grouping parameter ID.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        new int GetGroupingParam(
            [Out] out Guid groupingId);
        /// 
        /// Assigns a session to a grouping of sessions.
        /// 
        /// The new grouping parameter ID.
        /// A user context value that is passed to the notification callback.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        new int SetGroupingParam(
            [In] [MarshalAs(UnmanagedType.LPStruct)] Guid groupingId,
            [In] [MarshalAs(UnmanagedType.LPStruct)] Guid eventContext);
        /// 
        /// Registers the client to receive notifications of session events, including changes in the session state.
        /// 
        /// A client-implemented  interface.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        new int RegisterAudioSessionNotification(
            [In] IAudioSessionEvents client);
        /// 
        /// Deletes a previous registration by the client to receive notifications.
        /// 
        /// A client-implemented  interface.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        new int UnregisterAudioSessionNotification(
            [In] IAudioSessionEvents client);
    /// 
        /// Retrieves the identifier for the audio session.
        /// 
        /// Receives the session identifier.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        int GetSessionIdentifier(
            [Out] [MarshalAs(UnmanagedType.LPWStr)] out string retVal);
        /// 
        /// Retrieves the identifier of the audio session instance.
        /// 
        /// Receives the identifier of a particular instance.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        int GetSessionInstanceIdentifier(
            [Out] [MarshalAs(UnmanagedType.LPWStr)] out string retVal);
        /// 
        /// Retrieves the process identifier of the audio session.
        /// 
        /// Receives the process identifier of the audio session.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        int GetProcessId(
            [Out] out UInt32 retVal);
        /// 
        /// Indicates whether the session is a system sounds session.
        /// 
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        int IsSystemSoundsSession();
        /// 
        /// Enables or disables the default stream attenuation experience (auto-ducking) provided by the system.
        /// 
        /// A variable that enables or disables system auto-ducking.
        /// An HRESULT code indicating whether the operation succeeded of failed.
        [PreserveSig]
        int SetDuckingPreference(bool optOut);
    }
}