#ifndef INCLUDED_PORTAUDIO_HOSTAPI_HXX
#define INCLUDED_PORTAUDIO_HOSTAPI_HXX

// ---------------------------------------------------------------------------------------

#include "portaudio.h"

#include "portaudiocpp/System.hxx"

// ---------------------------------------------------------------------------------------

// Forward declaration(s):
namespace portaudio
{
    class Device;
}

// ---------------------------------------------------------------------------------------

// Declaration(s):
namespace portaudio
{


    //////
    /// @brief HostApi represents a host API (usually type of driver) in the System.
    ///
    /// A single System can support multiple HostApi's each one typically having
    /// a set of Devices using that HostApi (usually driver type). All Devices in
    /// the HostApi can be enumerated and the default input/output Device for this
    /// HostApi can be retrieved.
    //////
    class HostApi
    {
    public:
        typedef System::DeviceIterator DeviceIterator;

        // query info: id, name, numDevices
        PaHostApiTypeId typeId() const;
        PaHostApiIndex index() const;
        const char *name() const;
        int deviceCount() const;

        // iterate devices
        DeviceIterator devicesBegin();
        DeviceIterator devicesEnd();

        // default devices
        Device &defaultInputDevice() const;
        Device &defaultOutputDevice() const;

        // comparison operators
        bool operator==(const HostApi &rhs) const;
        bool operator!=(const HostApi &rhs) const;

    private:
        const PaHostApiInfo *info_;
        Device **devices_;

    private:
        friend class System;

        explicit HostApi(PaHostApiIndex index);
        ~HostApi();

        HostApi(const HostApi &); // non-copyable
        HostApi &operator=(const HostApi &); // non-copyable
    };


}

// ---------------------------------------------------------------------------------------

#endif // INCLUDED_PORTAUDIO_HOSTAPI_HXX
