#ifndef _IOKIT_IOAUDIOSTREAM_H
#define _IOKIT_IOAUDIOSTREAM_H
#include <IOKit/IOService.h>
#include <IOKit/audio/IOAudioTypes.h>
class OSSymbol;
class OSArray;
class OSDictionary;
class IOAudioDMAEngine;
class IOCommandGate;
class IOAudioControl;
typedef enum _IOAudioStreamDirection
{
kAudioOutput = 0,
kAudioInput
} IOAudioStreamDirection;
class IOAudioStream : public IOService
{
OSDeclareDefaultStructors(IOAudioStream)
friend class IOAudioDMAEngineUserClient;
public:
static const OSSymbol *gDirectionKey;
static const OSSymbol *gNumChannelsKey;
static const OSSymbol *gSampleFormatKey;
static const OSSymbol *gNumericRepresentationKey;
static const OSSymbol *gBitDepthKey;
static const OSSymbol *gBitWidthKey;
static const OSSymbol *gAlignmentKey;
static const OSSymbol *gByteOrderKey;
static const OSSymbol *gIsMixableKey;
static const OSSymbol *gMinimumSampleRateKey;
static const OSSymbol *gMaximumSampleRateKey;
static void initKeys();
static OSDictionary *createDictionaryFromFormat(const IOAudioStreamFormat *streamFormat, OSDictionary *formatDict = 0);
static IOAudioStreamFormat *createFormatFromDictionary(const OSDictionary *formatDict, IOAudioStreamFormat *streamFormat = 0);
IOAudioDMAEngine *audioDMAEngine;
IOWorkLoop *workLoop;
IOCommandGate *commandGate;
IORecursiveLock *streamIOLock;
UInt32 numClients;
IOAudioStreamDirection direction;
IOAudioStreamFormat format;
OSArray *availableFormats;
void *sampleBuffer;
UInt32 sampleBufferSize;
void *mixBuffer;
UInt32 mixBufferSize;
virtual bool initWithAudioDMAEngine(IOAudioDMAEngine *dmaEngine, IOAudioStreamDirection dir, OSDictionary *properties = 0);
virtual void free();
virtual void stop(IOService *provider);
virtual IOWorkLoop *getWorkLoop();
virtual IOReturn setProperties(OSObject *properties);
virtual IOAudioStreamDirection getDirection();
virtual void setSampleBuffer(void *buffer, UInt32 size);
virtual void *getSampleBuffer();
virtual UInt32 getSampleBufferSize();
virtual void setMixBuffer(void *buffer, UInt32 size);
virtual void *getMixBuffer();
virtual UInt32 getMixBufferSize();
virtual void clearSampleBuffer();
virtual const IOAudioStreamFormat *getFormat();
static IOReturn setFormatAction(OSObject *owner, void *arg1, void *arg2, void *arg3, void *arg4);
virtual IOReturn setFormat(const IOAudioStreamFormat *streamFormat);
virtual IOReturn setFormat(OSDictionary *formatDict);
virtual IOReturn setFormat(const IOAudioStreamFormat *streamFormat, OSDictionary *formatDict);
virtual void addAvailableFormat(const IOAudioStreamFormat *streamFormat, const IOAudioSampleRate *minRate, const IOAudioSampleRate *maxRate);
virtual void clearAvailableFormats();
virtual bool validateFormat(const IOAudioStreamFormat *streamFormat);
virtual bool addDefaultAudioControl(IOAudioControl *defaultAudioControl);
virtual void removeDefaultAudioControl(IOAudioControl *defaultAudioControl);
protected:
virtual void lockStreamForIO();
virtual void unlockStreamForIO();
virtual void updateNumClients();
virtual void addClient();
virtual void removeClient();
private:
virtual void setDirection(IOAudioStreamDirection dir);
};
#endif