root/src/add-ons/kernel/drivers/audio/usb/AudioStreamingInterface.h
/*
 *      Driver for USB Audio Device Class devices.
 *      Copyright (c) 2009-13 S.Zharski <imker@gmx.li>
 *      Distributed under the terms of the MIT license.
 *
 */
#ifndef _AUDIO_STREAMING_INTERFACE_H_
#define _AUDIO_STREAMING_INTERFACE_H_


#include <USB3.h>
#include <util/VectorMap.h>

#include "AudioControlInterface.h"


class ASInterfaceDescriptor {
public:
                                                        ASInterfaceDescriptor(
                                                                usb_audio_streaming_interface_descriptor*
                                                                Descriptor);
                                                        ~ASInterfaceDescriptor();

// protected:
                        uint8                   fTerminalLink;
                        uint8                   fDelay;
                        uint16                  fFormatTag;
};


class ASEndpointDescriptor {
public:
                                                        ASEndpointDescriptor(
                                                                usb_endpoint_descriptor* Endpoint,
                                                                usb_audio_streaming_endpoint_descriptor*
                                                                Descriptor);
                                                        ~ASEndpointDescriptor();

// protected:
                        uint8                   fCSAttributes;
                        uint8                   fLockDelayUnits;
                        uint16                  fLockDelay;
                        uint16                  fMaxPacketSize;
                        uint8                   fEndpointAddress;
                        uint8                   fEndpointAttributes;
};


class _ASFormatDescriptor {
public:
                                                        _ASFormatDescriptor(
                                                                usb_audio_format_descriptor* Descriptor);
        virtual                                 ~_ASFormatDescriptor();

// protected:
                        uint8                   fFormatType;
        static  uint32                  GetSamFreq(const usb_audio_sampling_freq& freq);
        static  usb_audio_sampling_freq GetSamFreq(uint32 rate);
};


class TypeIFormatDescriptor : public _ASFormatDescriptor {
public:
                                                        TypeIFormatDescriptor(
                                                                usb_audio_format_descriptor* Descriptor);
        virtual                                 ~TypeIFormatDescriptor();

                        status_t                Init(usb_audio_format_descriptor* Descriptor);

// protected:
                        uint8                   fNumChannels;
                        uint8                   fSubframeSize;
                        uint8                   fBitResolution;
                        uint8                   fSampleFrequencyType;
                        Vector<uint32>  fSampleFrequencies;
};


class TypeIIFormatDescriptor : public _ASFormatDescriptor {
public:
                                                        TypeIIFormatDescriptor(
                                                                usb_audio_format_descriptor* Descriptor);
        virtual                                 ~TypeIIFormatDescriptor();

// protected:
                        uint16                  fMaxBitRate;
                        uint16                  fSamplesPerFrame;
                        uint8                   fSampleFrequencyType;
                        Vector<uint32>  fSampleFrequencies;
};


class TypeIIIFormatDescriptor : public TypeIFormatDescriptor {
public:
                                                        TypeIIIFormatDescriptor(
                                                                usb_audio_format_descriptor* Descriptor);
        virtual                                 ~TypeIIIFormatDescriptor();

// protected:
};


class AudioStreamAlternate {
public:
                                                                        AudioStreamAlternate(size_t alternate,
                                                                                ASInterfaceDescriptor* interface,
                                                                                ASEndpointDescriptor* endpoint,
                                                                                _ASFormatDescriptor* format);
                                                                        ~AudioStreamAlternate();

                        ASInterfaceDescriptor*  Interface()     { return fInterface; }
                        ASEndpointDescriptor*   Endpoint()      { return fEndpoint;      }
                        _ASFormatDescriptor*    Format()        { return fFormat;        }

                        status_t                                SetSamplingRate(uint32 newRate);
                        status_t                                SetSamplingRateById(uint32 newId);
                        uint32                                  GetSamplingRate() { return fSamplingRate; }
                        uint32                                  GetSamplingRateId(uint32 rate);
                        uint32                                  GetSamplingRateIds();
                        uint32                                  GetFormatId();
                        status_t                                SetFormatId(uint32 newFormatId);
                        uint32                                  SamplingRateFromId(uint32 id);

protected:

                        size_t                                  fAlternate;
                        ASInterfaceDescriptor*  fInterface;
                        ASEndpointDescriptor*   fEndpoint;
                        _ASFormatDescriptor*    fFormat;
                        uint32                                  fSamplingRate;
};


class AudioStreamingInterface {
public:
                                                                AudioStreamingInterface(
                                                                        AudioControlInterface*  controlInterface,
                                                                        size_t interface, usb_interface_list* List);
                                                                ~AudioStreamingInterface();

        //              status_t                        InitCheck() { return fStatus; }
                        uint8                           TerminalLink();
                        bool                            IsInput() { return fIsInput; }

                        AudioChannelCluster* ChannelCluster();

                        void                            GetFormatsAndRates(
                                                                        multi_description* Description);
protected:
                        size_t                          fInterface;
                        AudioControlInterface*  fControlInterface;

        //              status_t                        fStatus;
                        bool                            fIsInput;
                // alternates of the streams
                        Vector<AudioStreamAlternate*>   fAlternates;
                        size_t                          fActiveAlternate;
};


#endif // _AUDIO_STREAMING_INTERFACE_H_