1/*
2 * Copyright (c) 1998-2014 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License").  You may not use this file except in compliance with the
9 * License.  Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
11 *
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
17 * License for the specific language governing rights and limitations
18 * under the License.
19 *
20 * @APPLE_LICENSE_HEADER_END@
21 */
22
23#ifndef _IOKIT_IOAUDIOSTREAM_H
24#define _IOKIT_IOAUDIOSTREAM_H
25
26#include <IOKit/IOService.h>
27#include <AvailabilityMacros.h>
28
29#ifndef IOAUDIOFAMILY_SELF_BUILD
30#include <IOKit/audio/IOAudioEngine.h>
31#include <IOKit/audio/IOAudioTypes.h>
32#else
33#include "IOAudioEngine.h"
34#include "IOAudioTypes.h"
35#endif
36
37class OSSymbol;
38class OSArray;
39class OSDictionary;
40class OSSet;
41
42class IOCommandGate;
43class IOAudioControl;
44
45struct IOAudioClientBuffer;
46struct IOAudioStreamFormatDesc;
47
48/*!
49 * @class IOAudioStream
50 * @abstract This class wraps a single sample buffer in an audio driver.
51 * @discussion An IOAudioStream represents one hardware sample buffer as well as the direction
52 *  of that buffer, the mix buffer that multiple clients mix into as well as a list of
53 *  all of the formats to which this buffer can be set.
54 *
55 *  When an IOAudioEngine is created during init time in the driver, an IOAudioStream must be
56 *  created for each sample buffer in the device.  Typically, the sample buffer will be interleaved
57 *  (or single channel), as a non-interleaved buffer should be divided into multiple single-channel
58 *  buffers (and multiple IOAudioStreams).
59 *
60 *  Additionally, when an IOAudioStream is created it must have all of the possible formats (and
61 *  allowed sample rates for each format) set and must have the currently set format specified
62 *  (addAvailableFormat() and setFormat()).
63 */
64
65class IOAudioStream : public IOService
66{
67    OSDeclareDefaultStructors(IOAudioStream)
68
69    friend class IOAudioEngine;
70    friend class IOAudioEngineUserClient;
71
72public:
73
74    typedef IOReturn (*AudioIOFunction)(const void *mixBuf, void *sampleBuf, UInt32 firstSampleFrame, UInt32 numSampleFrames, const IOAudioStreamFormat *streamFormat, IOAudioStream *audioStream) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
75
76    static const OSSymbol	*gDirectionKey;
77    static const OSSymbol	*gNumChannelsKey;
78    static const OSSymbol	*gSampleFormatKey;
79    static const OSSymbol	*gNumericRepresentationKey;
80    static const OSSymbol	*gBitDepthKey;
81    static const OSSymbol	*gBitWidthKey;
82    static const OSSymbol	*gAlignmentKey;
83    static const OSSymbol	*gByteOrderKey;
84    static const OSSymbol	*gIsMixableKey;
85    static const OSSymbol	*gDriverTagKey;
86    static const OSSymbol	*gMinimumSampleRateKey;
87    static const OSSymbol	*gMaximumSampleRateKey;
88
89    static void initKeys() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
90
91    static OSDictionary *createDictionaryFromFormat(const IOAudioStreamFormat *streamFormat, const IOAudioStreamFormatExtension *formatExtension, OSDictionary *formatDict = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
92    static IOAudioStreamFormat *createFormatFromDictionary(const OSDictionary *formatDict, IOAudioStreamFormat *streamFormat = 0, IOAudioStreamFormatExtension *formatExtension = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
93
94    IOAudioEngine 				*audioEngine;
95    IOWorkLoop					*workLoop;
96    IOCommandGate				*commandGate;
97    IORecursiveLock				*streamIOLock;
98
99    UInt32						numClients;
100
101    IOAudioStreamDirection		direction;
102
103    IOAudioStreamFormat			format;
104    IOAudioStreamFormatDesc		*availableFormats;
105    OSArray						*availableFormatDictionaries;
106    UInt32						numAvailableFormats;
107
108    UInt32						startingChannelID;
109    UInt32						maxNumChannels;
110
111    void						*sampleBuffer;
112    UInt32						sampleBufferSize;
113
114    void						*mixBuffer;
115    UInt32						mixBufferSize;
116    bool						streamAllocatedMixBuffer;
117
118    AudioIOFunction				*audioIOFunctions;
119    UInt32						numIOFunctions;
120
121    bool						streamAvailable;
122
123    OSSet						*defaultAudioControls;
124
125    IOAudioEnginePosition		startingPosition;
126    IOAudioEnginePosition		clippedPosition;
127
128    IOAudioClientBuffer			*clientBufferListStart;
129    IOAudioClientBuffer			*clientBufferListEnd;
130
131    IOAudioClientBuffer			*userClientList;
132
133protected:
134
135	enum {
136		kErrorLogClipMoreThanOneBufferAhead = 0,
137		kErrorLogClipMoreThanOneBufferAheadPart2,
138		kErrorLogClipPositionIsOff,
139		kErrorLogAlreadyClipped,
140		kErrorLogClipBuffersAreNULL,
141		kErrorLogClipReturnsAnError,
142		kErrorLogNumberOfCounters,			// needs to be after the last counter
143		kErrorLogDumpCounters = 0xFFFF
144	};
145
146    struct ExpansionData {
147		IOAudioStreamFormatExtension	streamFormatExtension;
148		UInt32							mSampleFramesReadByEngine;
149		IOReturn						mClipOutputStatus;
150		unsigned int					mStreamErrorCounts[kErrorLogNumberOfCounters];
151		bool							mStreamErrorCountsUpdated;
152	};
153
154    ExpansionData *reserved;
155
156public:
157// New code added here:
158	// OSMetaClassDeclareReservedUsed(IOAudioStream, 0);
159    virtual const IOAudioStreamFormatExtension *getFormatExtension() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
160	// OSMetaClassDeclareReservedUsed(IOAudioStream, 1);
161    virtual IOReturn setFormat(const IOAudioStreamFormat *streamFormat, const IOAudioStreamFormatExtension *formatExtension, bool callDriver = true) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
162	// OSMetaClassDeclareReservedUsed(IOAudioStream, 2);
163    virtual IOReturn setFormat(const IOAudioStreamFormat *streamFormat, const IOAudioStreamFormatExtension *formatExtension, OSDictionary *formatDict, bool callDriver = true) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
164	// OSMetaClassDeclareReservedUsed(IOAudioStream, 3);
165    virtual void addAvailableFormat(const IOAudioStreamFormat *streamFormat, const IOAudioStreamFormatExtension *formatExtension, const IOAudioSampleRate *minRate, const IOAudioSampleRate *maxRate, const AudioIOFunction *ioFunctionList = NULL, UInt32 numFunctions = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
166	// OSMetaClassDeclareReservedUsed(IOAudioStream, 4);
167    virtual void addAvailableFormat(const IOAudioStreamFormat *streamFormat, const IOAudioStreamFormatExtension *formatExtension, const IOAudioSampleRate *minRate, const IOAudioSampleRate *maxRate, AudioIOFunction ioFunction) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
168	// OSMetaClassDeclareReservedUsed(IOAudioStream, 5);
169    virtual bool validateFormat(IOAudioStreamFormat *streamFormat, IOAudioStreamFormatExtension *formatExtension, IOAudioStreamFormatDesc *formatDesc) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
170	// OSMetaClassDeclareReservedUsed(IOAudioStream, 6);
171	virtual void setTerminalType(const UInt32 terminalType) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
172	// OSMetaClassDeclareReservedUsed(IOAudioStream, 7);
173	virtual IOReturn mixOutputSamples(const void *sourceBuf, void *mixBuf, UInt32 firstSampleFrame, UInt32 numSampleFrames, const IOAudioStreamFormat *streamFormat, IOAudioStream *audioStream) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
174	// OSMetaClassDeclareReservedUsed(IOAudioStream, 8);
175	virtual void setSampleLatency(UInt32 numSamples) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
176	// OSMetaClassDeclareReservedUsed(IOAudioStream, 9);
177	virtual bool validateFormat(IOAudioStreamFormat *streamFormat, IOAudioStreamFormatExtension *formatExtension, IOAudioStreamFormatDesc *formatDesc, const IOAudioSampleRate *sampleRate) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
178	// OSMetaClassDeclareReservedUsed(IOAudioStream, 10);
179	virtual UInt32 getNumSampleFramesRead() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
180	// OSMetaClassDeclareReservedUsed(IOAudioStream, 11);
181	virtual void setDefaultNumSampleFramesRead(UInt32) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
182
183private:
184    OSMetaClassDeclareReservedUsed(IOAudioStream, 0);
185    OSMetaClassDeclareReservedUsed(IOAudioStream, 1);
186    OSMetaClassDeclareReservedUsed(IOAudioStream, 2);
187    OSMetaClassDeclareReservedUsed(IOAudioStream, 3);
188    OSMetaClassDeclareReservedUsed(IOAudioStream, 4);
189    OSMetaClassDeclareReservedUsed(IOAudioStream, 5);
190    OSMetaClassDeclareReservedUsed(IOAudioStream, 6);
191    OSMetaClassDeclareReservedUsed(IOAudioStream, 7);
192    OSMetaClassDeclareReservedUsed(IOAudioStream, 8);
193    OSMetaClassDeclareReservedUsed(IOAudioStream, 9);
194    OSMetaClassDeclareReservedUsed(IOAudioStream, 10);
195    OSMetaClassDeclareReservedUsed(IOAudioStream, 11);
196
197    OSMetaClassDeclareReservedUnused(IOAudioStream, 12);
198    OSMetaClassDeclareReservedUnused(IOAudioStream, 13);
199    OSMetaClassDeclareReservedUnused(IOAudioStream, 14);
200    OSMetaClassDeclareReservedUnused(IOAudioStream, 15);
201    OSMetaClassDeclareReservedUnused(IOAudioStream, 16);
202    OSMetaClassDeclareReservedUnused(IOAudioStream, 17);
203    OSMetaClassDeclareReservedUnused(IOAudioStream, 18);
204    OSMetaClassDeclareReservedUnused(IOAudioStream, 19);
205    OSMetaClassDeclareReservedUnused(IOAudioStream, 20);
206    OSMetaClassDeclareReservedUnused(IOAudioStream, 21);
207    OSMetaClassDeclareReservedUnused(IOAudioStream, 22);
208    OSMetaClassDeclareReservedUnused(IOAudioStream, 23);
209    OSMetaClassDeclareReservedUnused(IOAudioStream, 24);
210    OSMetaClassDeclareReservedUnused(IOAudioStream, 25);
211    OSMetaClassDeclareReservedUnused(IOAudioStream, 26);
212    OSMetaClassDeclareReservedUnused(IOAudioStream, 27);
213    OSMetaClassDeclareReservedUnused(IOAudioStream, 28);
214    OSMetaClassDeclareReservedUnused(IOAudioStream, 29);
215    OSMetaClassDeclareReservedUnused(IOAudioStream, 30);
216    OSMetaClassDeclareReservedUnused(IOAudioStream, 31);
217    OSMetaClassDeclareReservedUnused(IOAudioStream, 32);
218    OSMetaClassDeclareReservedUnused(IOAudioStream, 33);
219    OSMetaClassDeclareReservedUnused(IOAudioStream, 34);
220    OSMetaClassDeclareReservedUnused(IOAudioStream, 35);
221    OSMetaClassDeclareReservedUnused(IOAudioStream, 36);
222    OSMetaClassDeclareReservedUnused(IOAudioStream, 37);
223    OSMetaClassDeclareReservedUnused(IOAudioStream, 38);
224    OSMetaClassDeclareReservedUnused(IOAudioStream, 39);
225    OSMetaClassDeclareReservedUnused(IOAudioStream, 40);
226    OSMetaClassDeclareReservedUnused(IOAudioStream, 41);
227    OSMetaClassDeclareReservedUnused(IOAudioStream, 42);
228    OSMetaClassDeclareReservedUnused(IOAudioStream, 43);
229    OSMetaClassDeclareReservedUnused(IOAudioStream, 44);
230    OSMetaClassDeclareReservedUnused(IOAudioStream, 45);
231    OSMetaClassDeclareReservedUnused(IOAudioStream, 46);
232    OSMetaClassDeclareReservedUnused(IOAudioStream, 47);
233
234public:
235    virtual bool initWithAudioEngine(IOAudioEngine *engine, IOAudioStreamDirection dir, UInt32 startChannelID, const char *streamDescription = NULL, OSDictionary *properties = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
236    virtual void free() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
237
238    virtual void stop(IOService *provider) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
239
240    virtual IOWorkLoop *getWorkLoop() const;
241
242    virtual IOReturn setProperties(OSObject *properties) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
243
244    virtual IOAudioStreamDirection getDirection() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
245
246    virtual void setSampleBuffer(void *buffer, UInt32 size) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
247    virtual void *getSampleBuffer() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
248    virtual UInt32 getSampleBufferSize() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
249
250    virtual void setMixBuffer(void *buffer, UInt32 size) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
251    virtual void *getMixBuffer() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
252    virtual UInt32 getMixBufferSize() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
253
254    virtual void numSampleFramesPerBufferChanged() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
255
256    virtual void clearSampleBuffer() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
257
258    virtual void setIOFunction(AudioIOFunction ioFunction) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
259    virtual void setIOFunctionList(const AudioIOFunction *ioFunctionList, UInt32 numFunctions) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
260
261    virtual const IOAudioStreamFormat *getFormat() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
262    static IOReturn setFormatAction(OSObject *owner, void *arg1, void *arg2, void *arg3, void *arg4) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
263	static IOReturn _setFormatAction(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;	// <rdar://8568040,8691669>
264    virtual IOReturn setFormat(const IOAudioStreamFormat *streamFormat, bool callDriver = true) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
265    virtual IOReturn setFormat(OSDictionary *formatDict) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
266    virtual IOReturn setFormat(const IOAudioStreamFormat *streamFormat, OSDictionary *formatDict, bool callDriver = true) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
267    virtual IOReturn hardwareFormatChanged(const IOAudioStreamFormat *streamFormat) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
268    virtual void addAvailableFormat(const IOAudioStreamFormat *streamFormat, const IOAudioSampleRate *minRate, const IOAudioSampleRate *maxRate, const AudioIOFunction *ioFunctionList = NULL, UInt32 numFunctions = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
269    virtual void addAvailableFormat(const IOAudioStreamFormat *streamFormat, const IOAudioSampleRate *minRate, const IOAudioSampleRate *maxRate, AudioIOFunction ioFunction) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
270    virtual void clearAvailableFormats() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
271    virtual bool validateFormat(IOAudioStreamFormat *streamFormat, IOAudioStreamFormatDesc *formatDesc) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
272
273    virtual UInt32 getStartingChannelID() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
274    virtual UInt32 getMaxNumChannels() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
275
276    virtual void setStreamAvailable(bool available) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
277    virtual bool getStreamAvailable() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
278
279    virtual IOReturn addDefaultAudioControl(IOAudioControl *defaultAudioControl) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
280    virtual void removeDefaultAudioControls() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
281
282protected:
283    virtual void lockStreamForIO() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
284    virtual void unlockStreamForIO() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
285
286    virtual void updateNumClients() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
287    virtual IOReturn addClient(IOAudioClientBuffer *clientBuffer) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
288    virtual void removeClient(IOAudioClientBuffer *clientBuffer) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
289    virtual UInt32 getNumClients() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
290
291    virtual IOReturn processOutputSamples(IOAudioClientBuffer *clientBuffer, UInt32 firstSampleFrame, UInt32 loopCount, bool samplesAvailable) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
292    virtual IOReturn readInputSamples(IOAudioClientBuffer *clientBuffer, UInt32 firstSampleFrame) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
293
294    virtual void resetClipInfo() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
295    virtual void clipIfNecessary() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
296    virtual void clipOutputSamples(UInt32 startingSampleFrame, UInt32 numSampleFrames) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
297
298    virtual void setStartingChannelNumber(UInt32 channelNumber) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
299
300private:
301    virtual void setDirection(IOAudioStreamDirection dir) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
302
303	void safeLogError(int error , long unsigned int arg1 , long unsigned int arg2 , long unsigned int arg3 , long unsigned int arg4 , void* arg5, void* arg6) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10;
304
305};
306
307#endif /* _IOKIT_IOAUDIOSTREAM_H */
308