3 Abstract: Part of CoreAudio Utility Classes
6 Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
7 Inc. ("Apple") in consideration of your agreement to the following
8 terms, and your use, installation, modification or redistribution of
9 this Apple software constitutes acceptance of these terms. If you do
10 not agree with these terms, please do not use, install, modify or
11 redistribute this Apple software.
13 In consideration of your agreement to abide by the following terms, and
14 subject to these terms, Apple grants you a personal, non-exclusive
15 license, under Apple's copyrights in this original Apple software (the
16 "Apple Software"), to use, reproduce, modify and redistribute the Apple
17 Software, with or without modifications, in source and/or binary forms;
18 provided that if you redistribute the Apple Software in its entirety and
19 without modifications, you must retain this notice and the following
20 text and disclaimers in all such redistributions of the Apple Software.
21 Neither the name, trademarks, service marks or logos of Apple Inc. may
22 be used to endorse or promote products derived from the Apple Software
23 without specific prior written permission from Apple. Except as
24 expressly stated in this notice, no other rights or licenses, express or
25 implied, are granted by Apple herein, including but not limited to any
26 patent rights that may be infringed by your derivative works or by other
27 works in which the Apple Software may be incorporated.
29 The Apple Software is provided by Apple on an "AS IS" basis. APPLE
30 MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
31 THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
32 FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
33 OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
35 IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
36 OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
37 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
38 INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
39 MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
40 AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
41 STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
42 POSSIBILITY OF SUCH DAMAGE.
44 Copyright (C) 2014 Apple Inc. All Rights Reserved.
47 #ifndef __DataSource_h__
48 #define __DataSource_h__
50 #if !defined(__COREAUDIO_USE_FLAT_INCLUDES__)
51 #include <AudioToolbox/AudioFile.h>
53 #include <ConditionalMacros.h>
54 #include "AudioFile.h"
59 #include "CAAutoDisposer.h"
61 //////////////////////////////////////////////////////////////////////////////////////////
67 DataSource(Boolean inCloseOnDelete);
68 virtual ~DataSource();
70 virtual OSStatus GetSize32(UInt32& outSize)
73 OSStatus err = GetSize(size64);
75 if (size64 > 0x00000000FFFFffffLL) return kAudioFileDoesNotAllow64BitDataSizeError;
76 outSize = (UInt32)size64;
80 virtual OSStatus GetSize(SInt64& outSize) =0;
82 virtual OSStatus SetSize(SInt64 inSize)=0;
84 virtual OSStatus GetPos(SInt64& outPos) const=0;
86 /* non seekable data sources should use fsAtMark for the positionMode (or SEEK_CUR with offset zero,
87 or SEEK_SET with offset equal to the current position in the stream, in other words no seeking from the
88 current position is allowed.)
91 virtual OSStatus ReadBytes( UInt16 positionMode,
92 SInt64 positionOffset,
95 UInt32* actualCount)=0;
97 virtual OSStatus WriteBytes(UInt16 positionMode,
98 SInt64 positionOffset,
101 UInt32* actualCount)=0;
103 virtual void SetCloseOnDelete(Boolean inFlag) { mCloseOnDelete = inFlag; }
105 virtual Boolean CanSeek() const=0;
106 virtual Boolean CanGetSize() const=0;
107 virtual Boolean CanSetSize() const=0;
108 virtual Boolean CanRead() const=0;
109 virtual Boolean CanWrite() const=0;
112 Boolean mCloseOnDelete;
115 SInt64 CalcOffset( UInt16 positionMode,
116 SInt64 positionOffset,
117 SInt64 currentOffset,
121 //////////////////////////////////////////////////////////////////////////////////////////
122 //////////////////////////////////////////////////////////////////////////////////////////
125 Initialize with a Macintosh file fork ref num as obtained from FSOpenFork.
130 class MacFile_DataSource : public DataSource
137 MacFile_DataSource( FSIORefNum inForkRefNum, SInt8 inPermissions, Boolean inCloseOnDelete);
138 virtual ~MacFile_DataSource();
140 virtual OSStatus GetSize(SInt64& outSize);
141 virtual OSStatus GetPos(SInt64& outPos) const;
143 virtual OSStatus SetSize(SInt64 inSize);
145 virtual OSStatus ReadBytes( UInt16 positionMode,
146 SInt64 positionOffset,
149 UInt32* actualCount);
151 virtual OSStatus WriteBytes(UInt16 positionMode,
152 SInt64 positionOffset,
155 UInt32* actualCount);
157 virtual Boolean CanSeek() const { return true; }
158 virtual Boolean CanGetSize() const { return true; }
159 virtual Boolean CanSetSize() const { return true; }
161 virtual Boolean CanRead() const { return mPermissions & kAudioFileReadPermission; }
162 virtual Boolean CanWrite() const { return mPermissions & kAudioFileWritePermission; }
167 class UnixFile_DataSource : public DataSource
177 UnixFile_DataSource( int inFD, SInt8 inPermissions, Boolean inCloseOnDelete);
178 virtual ~UnixFile_DataSource();
180 virtual OSStatus GetSize(SInt64& outSize);
181 virtual OSStatus GetPos(SInt64& outPos) const;
183 virtual OSStatus SetSize(SInt64 inSize);
185 virtual OSStatus ReadBytes( UInt16 positionMode,
186 SInt64 positionOffset,
189 UInt32* actualCount);
191 virtual OSStatus WriteBytes(UInt16 positionMode,
192 SInt64 positionOffset,
195 UInt32* actualCount);
197 virtual Boolean CanSeek() const { return true; }
198 virtual Boolean CanGetSize() const { return true; }
199 virtual Boolean CanSetSize() const { return true; }
201 virtual Boolean CanRead() const { return mPermissions & kAudioFileReadPermission; }
202 virtual Boolean CanWrite() const { return mPermissions & kAudioFileWritePermission; }
206 SInt64 UFCurrentOffset (UInt16 positionMode,
207 SInt64 positionOffset);
210 //////////////////////////////////////////////////////////////////////////////////////////
212 //////////////////////////////////////////////////////////////////////////////////////////
215 A wrapper that caches the wrapped source's header.
217 class Cached_DataSource : public DataSource
219 DataSource* mDataSource;
220 CAAutoFree<UInt8> mHeaderCache;
221 UInt32 mHeaderCacheSize;
222 CAAutoFree<UInt8> mBodyCache;
223 UInt32 mBodyCacheSize;
224 UInt32 mBodyCacheCurSize;
225 SInt64 mBodyCacheOffset;
227 Boolean mOwnDataSource;
231 Cached_DataSource(DataSource* inDataSource, UInt32 inHeaderCacheSize = 4096, UInt32 inBodyCacheSize = 32768, Boolean inOwnDataSource = true)
233 mDataSource(inDataSource), mHeaderCacheSize(inHeaderCacheSize),
234 mBodyCacheSize(inBodyCacheSize), mBodyCacheCurSize(0), mBodyCacheOffset(-1),
236 mOwnDataSource(inOwnDataSource)
240 virtual ~Cached_DataSource()
242 if (mOwnDataSource) delete mDataSource;
246 virtual OSStatus GetSize(SInt64& outSize) { return mDataSource->GetSize(outSize); }
247 virtual OSStatus GetPos(SInt64& outPos) const { return mDataSource->GetPos(outPos); }
249 virtual OSStatus SetSize(SInt64 inSize) { return mDataSource->SetSize(inSize); }
251 virtual OSStatus ReadBytes( UInt16 positionMode,
252 SInt64 positionOffset,
255 UInt32* actualCount);
257 virtual OSStatus WriteBytes( UInt16 positionMode,
258 SInt64 positionOffset,
261 UInt32* actualCount);
263 OSStatus ReadFromHeaderCache( SInt64 offset,
266 UInt32* actualCount);
268 virtual Boolean CanSeek() const { return mDataSource->CanSeek(); }
269 virtual Boolean CanGetSize() const { return mDataSource->CanGetSize(); }
270 virtual Boolean CanSetSize() const { return mDataSource->CanSetSize(); }
272 virtual Boolean CanRead() const { return mDataSource->CanRead(); }
273 virtual Boolean CanWrite() const { return mDataSource->CanWrite(); }
276 //////////////////////////////////////////////////////////////////////////////////////////
278 //////////////////////////////////////////////////////////////////////////////////////////
280 //////////////////////////////////////////////////////////////////////////////////////////
283 /* This class calls user supplied routines on demand. */
285 class Seekable_DataSource : public DataSource
290 AudioFile_ReadProc mReadFunc;
291 AudioFile_WriteProc mWriteFunc;
292 AudioFile_GetSizeProc mSizeFunc;
293 AudioFile_SetSizeProc mSetSizeFunc;
296 Seekable_DataSource( void * inClientData,
297 AudioFile_ReadProc inReadFunc,
298 AudioFile_WriteProc inWriteFunc,
299 AudioFile_GetSizeProc inGetSizeFunc,
300 AudioFile_SetSizeProc inSetSizeFunc
303 virtual ~Seekable_DataSource();
305 virtual OSStatus GetSize(SInt64& outSize);
306 virtual OSStatus GetPos(SInt64& outPos) const { outPos = mOffset; return noErr; };
308 virtual OSStatus SetSize(SInt64 inSize);
310 virtual OSStatus ReadBytes( UInt16 positionMode,
311 SInt64 positionOffset,
314 UInt32* actualCount);
316 virtual OSStatus WriteBytes(UInt16 positionMode,
317 SInt64 positionOffset,
320 UInt32* actualCount);
322 virtual Boolean CanSeek() const { return true; }
323 virtual Boolean CanGetSize() const { return mSizeFunc != 0; }
324 virtual Boolean CanSetSize() const { return mSetSizeFunc != 0; }
325 virtual Boolean CanRead() const { return mReadFunc != 0; }
326 virtual Boolean CanWrite() const { return mWriteFunc != 0; }
329 //////////////////////////////////////////////////////////////////////////////////////////
331 class Buffer_DataSource : public DataSource
333 UInt32 mDataByteSize;
339 Buffer_DataSource( UInt32 inDataByteSize,
341 SInt64 inStartOffset = 0
342 ) : DataSource(false), mDataByteSize(inDataByteSize), mData((const char*)inData), mStartOffset(inStartOffset), mOffset(mStartOffset) {}
344 virtual ~Buffer_DataSource() {}
346 virtual OSStatus GetSize(SInt64& outSize) { outSize = mDataByteSize + mStartOffset; return noErr; }
347 virtual OSStatus GetPos(SInt64& outPos) const { outPos = mOffset; return noErr; };
349 virtual OSStatus SetSize(SInt64 inSize) { throw std::runtime_error("not writable"); }
351 virtual OSStatus ReadBytes( UInt16 positionMode,
352 SInt64 positionOffset,
355 UInt32* actualCount);
357 virtual OSStatus WriteBytes(UInt16 positionMode,
358 SInt64 positionOffset,
361 UInt32* actualCount) { throw std::runtime_error("not writable"); }
363 virtual Boolean CanSeek() const { return true; }
364 virtual Boolean CanGetSize() const { return true; }
365 virtual Boolean CanSetSize() const { return false; }
366 virtual Boolean CanRead() const { return true; }
367 virtual Boolean CanWrite() const { return false; }
370 //////////////////////////////////////////////////////////////////////////////////////////