summaryrefslogtreecommitdiff
path: root/libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.h')
-rw-r--r--libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.h372
1 files changed, 372 insertions, 0 deletions
diff --git a/libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.h b/libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.h
new file mode 100644
index 0000000000..6c79c94df9
--- /dev/null
+++ b/libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.h
@@ -0,0 +1,372 @@
+/*
+ File: DataSource.h
+ Abstract: Part of CoreAudio Utility Classes
+ Version: 1.1
+
+ Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
+ Inc. ("Apple") in consideration of your agreement to the following
+ terms, and your use, installation, modification or redistribution of
+ this Apple software constitutes acceptance of these terms. If you do
+ not agree with these terms, please do not use, install, modify or
+ redistribute this Apple software.
+
+ In consideration of your agreement to abide by the following terms, and
+ subject to these terms, Apple grants you a personal, non-exclusive
+ license, under Apple's copyrights in this original Apple software (the
+ "Apple Software"), to use, reproduce, modify and redistribute the Apple
+ Software, with or without modifications, in source and/or binary forms;
+ provided that if you redistribute the Apple Software in its entirety and
+ without modifications, you must retain this notice and the following
+ text and disclaimers in all such redistributions of the Apple Software.
+ Neither the name, trademarks, service marks or logos of Apple Inc. may
+ be used to endorse or promote products derived from the Apple Software
+ without specific prior written permission from Apple. Except as
+ expressly stated in this notice, no other rights or licenses, express or
+ implied, are granted by Apple herein, including but not limited to any
+ patent rights that may be infringed by your derivative works or by other
+ works in which the Apple Software may be incorporated.
+
+ The Apple Software is provided by Apple on an "AS IS" basis. APPLE
+ MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
+ THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
+ FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
+ OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+ IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
+ MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
+ AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
+ STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Copyright (C) 2014 Apple Inc. All Rights Reserved.
+
+*/
+#ifndef __DataSource_h__
+#define __DataSource_h__
+
+#if !defined(__COREAUDIO_USE_FLAT_INCLUDES__)
+ #include <AudioToolbox/AudioFile.h>
+#else
+ #include <ConditionalMacros.h>
+ #include "AudioFile.h"
+#endif
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdexcept>
+#include "CAAutoDisposer.h"
+
+//////////////////////////////////////////////////////////////////////////////////////////
+
+class DataSource
+{
+public:
+
+ DataSource(Boolean inCloseOnDelete);
+ virtual ~DataSource();
+
+ virtual OSStatus GetSize32(UInt32& outSize)
+ {
+ SInt64 size64;
+ OSStatus err = GetSize(size64);
+ if (err) return err;
+ if (size64 > 0x00000000FFFFffffLL) return kAudioFileDoesNotAllow64BitDataSizeError;
+ outSize = (UInt32)size64;
+ return noErr;
+ }
+
+ virtual OSStatus GetSize(SInt64& outSize) =0;
+
+ virtual OSStatus SetSize(SInt64 inSize)=0;
+
+ virtual OSStatus GetPos(SInt64& outPos) const=0;
+
+ /* non seekable data sources should use fsAtMark for the positionMode (or SEEK_CUR with offset zero,
+ or SEEK_SET with offset equal to the current position in the stream, in other words no seeking from the
+ current position is allowed.)
+ */
+
+ virtual OSStatus ReadBytes( UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ void *buffer,
+ UInt32* actualCount)=0;
+
+ virtual OSStatus WriteBytes(UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ const void *buffer,
+ UInt32* actualCount)=0;
+
+ virtual void SetCloseOnDelete(Boolean inFlag) { mCloseOnDelete = inFlag; }
+
+ virtual Boolean CanSeek() const=0;
+ virtual Boolean CanGetSize() const=0;
+ virtual Boolean CanSetSize() const=0;
+ virtual Boolean CanRead() const=0;
+ virtual Boolean CanWrite() const=0;
+
+protected:
+ Boolean mCloseOnDelete;
+
+ /* utility method */
+ SInt64 CalcOffset( UInt16 positionMode,
+ SInt64 positionOffset,
+ SInt64 currentOffset,
+ SInt64 size);
+};
+
+//////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////
+
+/*
+ Initialize with a Macintosh file fork ref num as obtained from FSOpenFork.
+*/
+
+#if 0
+
+class MacFile_DataSource : public DataSource
+{
+ FSIORefNum mFileNum;
+ SInt8 mPermissions;
+
+public:
+
+ MacFile_DataSource( FSIORefNum inForkRefNum, SInt8 inPermissions, Boolean inCloseOnDelete);
+ virtual ~MacFile_DataSource();
+
+ virtual OSStatus GetSize(SInt64& outSize);
+ virtual OSStatus GetPos(SInt64& outPos) const;
+
+ virtual OSStatus SetSize(SInt64 inSize);
+
+ virtual OSStatus ReadBytes( UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ void *buffer,
+ UInt32* actualCount);
+
+ virtual OSStatus WriteBytes(UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ const void *buffer,
+ UInt32* actualCount);
+
+ virtual Boolean CanSeek() const { return true; }
+ virtual Boolean CanGetSize() const { return true; }
+ virtual Boolean CanSetSize() const { return true; }
+
+ virtual Boolean CanRead() const { return mPermissions & kAudioFileReadPermission; }
+ virtual Boolean CanWrite() const { return mPermissions & kAudioFileWritePermission; }
+};
+#endif
+
+
+class UnixFile_DataSource : public DataSource
+{
+ int mFileD;
+ SInt8 mPermissions;
+ UInt32 mNoCache;
+ SInt64 mCachedSize;
+ SInt64 mFilePointer;
+
+public:
+
+ UnixFile_DataSource( int inFD, SInt8 inPermissions, Boolean inCloseOnDelete);
+ virtual ~UnixFile_DataSource();
+
+ virtual OSStatus GetSize(SInt64& outSize);
+ virtual OSStatus GetPos(SInt64& outPos) const;
+
+ virtual OSStatus SetSize(SInt64 inSize);
+
+ virtual OSStatus ReadBytes( UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ void *buffer,
+ UInt32* actualCount);
+
+ virtual OSStatus WriteBytes(UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ const void *buffer,
+ UInt32* actualCount);
+
+ virtual Boolean CanSeek() const { return true; }
+ virtual Boolean CanGetSize() const { return true; }
+ virtual Boolean CanSetSize() const { return true; }
+
+ virtual Boolean CanRead() const { return mPermissions & kAudioFileReadPermission; }
+ virtual Boolean CanWrite() const { return mPermissions & kAudioFileWritePermission; }
+
+private:
+
+ SInt64 UFCurrentOffset (UInt16 positionMode,
+ SInt64 positionOffset);
+};
+
+//////////////////////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////////////////////
+
+/*
+ A wrapper that caches the wrapped source's header.
+*/
+class Cached_DataSource : public DataSource
+{
+ DataSource* mDataSource;
+ CAAutoFree<UInt8> mHeaderCache;
+ UInt32 mHeaderCacheSize;
+ CAAutoFree<UInt8> mBodyCache;
+ UInt32 mBodyCacheSize;
+ UInt32 mBodyCacheCurSize;
+ SInt64 mBodyCacheOffset;
+ SInt64 mOffset;
+ Boolean mOwnDataSource;
+
+public:
+
+ Cached_DataSource(DataSource* inDataSource, UInt32 inHeaderCacheSize = 4096, UInt32 inBodyCacheSize = 32768, Boolean inOwnDataSource = true)
+ : DataSource(false),
+ mDataSource(inDataSource), mHeaderCacheSize(inHeaderCacheSize),
+ mBodyCacheSize(inBodyCacheSize), mBodyCacheCurSize(0), mBodyCacheOffset(-1),
+ mOffset(0),
+ mOwnDataSource(inOwnDataSource)
+ {
+ }
+
+ virtual ~Cached_DataSource()
+ {
+ if (mOwnDataSource) delete mDataSource;
+ }
+
+
+ virtual OSStatus GetSize(SInt64& outSize) { return mDataSource->GetSize(outSize); }
+ virtual OSStatus GetPos(SInt64& outPos) const { return mDataSource->GetPos(outPos); }
+
+ virtual OSStatus SetSize(SInt64 inSize) { return mDataSource->SetSize(inSize); }
+
+ virtual OSStatus ReadBytes( UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ void *buffer,
+ UInt32* actualCount);
+
+ virtual OSStatus WriteBytes( UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ const void *buffer,
+ UInt32* actualCount);
+
+ OSStatus ReadFromHeaderCache( SInt64 offset,
+ UInt32 requestCount,
+ void *buffer,
+ UInt32* actualCount);
+
+ virtual Boolean CanSeek() const { return mDataSource->CanSeek(); }
+ virtual Boolean CanGetSize() const { return mDataSource->CanGetSize(); }
+ virtual Boolean CanSetSize() const { return mDataSource->CanSetSize(); }
+
+ virtual Boolean CanRead() const { return mDataSource->CanRead(); }
+ virtual Boolean CanWrite() const { return mDataSource->CanWrite(); }
+};
+
+//////////////////////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////////////////////
+
+
+/* This class calls user supplied routines on demand. */
+
+class Seekable_DataSource : public DataSource
+{
+ void * mClientData;
+ SInt64 mOffset;
+
+ AudioFile_ReadProc mReadFunc;
+ AudioFile_WriteProc mWriteFunc;
+ AudioFile_GetSizeProc mSizeFunc;
+ AudioFile_SetSizeProc mSetSizeFunc;
+
+public:
+ Seekable_DataSource( void * inClientData,
+ AudioFile_ReadProc inReadFunc,
+ AudioFile_WriteProc inWriteFunc,
+ AudioFile_GetSizeProc inGetSizeFunc,
+ AudioFile_SetSizeProc inSetSizeFunc
+ );
+
+ virtual ~Seekable_DataSource();
+
+ virtual OSStatus GetSize(SInt64& outSize);
+ virtual OSStatus GetPos(SInt64& outPos) const { outPos = mOffset; return noErr; };
+
+ virtual OSStatus SetSize(SInt64 inSize);
+
+ virtual OSStatus ReadBytes( UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ void *buffer,
+ UInt32* actualCount);
+
+ virtual OSStatus WriteBytes(UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ const void *buffer,
+ UInt32* actualCount);
+
+ virtual Boolean CanSeek() const { return true; }
+ virtual Boolean CanGetSize() const { return mSizeFunc != 0; }
+ virtual Boolean CanSetSize() const { return mSetSizeFunc != 0; }
+ virtual Boolean CanRead() const { return mReadFunc != 0; }
+ virtual Boolean CanWrite() const { return mWriteFunc != 0; }
+};
+
+//////////////////////////////////////////////////////////////////////////////////////////
+
+class Buffer_DataSource : public DataSource
+{
+ UInt32 mDataByteSize;
+ const char * mData;
+
+ SInt64 mStartOffset;
+ SInt64 mOffset;
+public:
+ Buffer_DataSource( UInt32 inDataByteSize,
+ const void * inData,
+ SInt64 inStartOffset = 0
+ ) : DataSource(false), mDataByteSize(inDataByteSize), mData((const char*)inData), mStartOffset(inStartOffset), mOffset(mStartOffset) {}
+
+ virtual ~Buffer_DataSource() {}
+
+ virtual OSStatus GetSize(SInt64& outSize) { outSize = mDataByteSize + mStartOffset; return noErr; }
+ virtual OSStatus GetPos(SInt64& outPos) const { outPos = mOffset; return noErr; };
+
+ virtual OSStatus SetSize(SInt64 inSize) { throw std::runtime_error("not writable"); }
+
+ virtual OSStatus ReadBytes( UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ void *buffer,
+ UInt32* actualCount);
+
+ virtual OSStatus WriteBytes(UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ const void *buffer,
+ UInt32* actualCount) { throw std::runtime_error("not writable"); }
+
+ virtual Boolean CanSeek() const { return true; }
+ virtual Boolean CanGetSize() const { return true; }
+ virtual Boolean CanSetSize() const { return false; }
+ virtual Boolean CanRead() const { return true; }
+ virtual Boolean CanWrite() const { return false; }
+};
+
+//////////////////////////////////////////////////////////////////////////////////////////
+
+#endif