diff options
Diffstat (limited to 'libs/appleutility/CAAudioFile.h')
-rw-r--r-- | libs/appleutility/CAAudioFile.h | 439 |
1 files changed, 0 insertions, 439 deletions
diff --git a/libs/appleutility/CAAudioFile.h b/libs/appleutility/CAAudioFile.h deleted file mode 100644 index 2cfb4f3031..0000000000 --- a/libs/appleutility/CAAudioFile.h +++ /dev/null @@ -1,439 +0,0 @@ -/* Copyright: © Copyright 2005 Apple Computer, Inc. All rights reserved. - - Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, 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 Computer, 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. -*/ -/*============================================================================= - CAAudioFile.h - -=============================================================================*/ - -#ifndef __CAAudioFile_h__ -#define __CAAudioFile_h__ - -#include <AvailabilityMacros.h> - -#if !defined(__COREAUDIO_USE_FLAT_INCLUDES__) - #include <AudioToolbox/AudioToolbox.h> -#else - #include <AudioToolbox.h> -#endif - -#include "CAStreamBasicDescription.h" -#include "CABufferList.h" -#include "CAAudioChannelLayout.h" -#include "CAXException.h" -#include "CAMath.h" - -#ifndef CAAF_USE_EXTAUDIOFILE -// option: use AudioToolbox/ExtAudioFile.h? Only available on Tiger. - #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_3 - // we are building software that must be deployable on Panther or earlier - #define CAAF_USE_EXTAUDIOFILE 0 - #else - // else we require Tiger and can use the API - #define CAAF_USE_EXTAUDIOFILE 1 - #endif -#endif - -#ifndef MAC_OS_X_VERSION_10_4 - // we have pre-Tiger headers; add our own declarations - typedef UInt32 AudioFileTypeID; - enum { - kExtAudioFileError_InvalidProperty = -66561, - kExtAudioFileError_InvalidPropertySize = -66562, - kExtAudioFileError_NonPCMClientFormat = -66563, - kExtAudioFileError_InvalidChannelMap = -66564, // number of channels doesn't match format - kExtAudioFileError_InvalidOperationOrder = -66565, - kExtAudioFileError_InvalidDataFormat = -66566, - kExtAudioFileError_MaxPacketSizeUnknown = -66567, - kExtAudioFileError_InvalidSeek = -66568, // writing, or offset out of bounds - kExtAudioFileError_AsyncWriteTooLarge = -66569, - kExtAudioFileError_AsyncWriteBufferOverflow = -66570 // an async write could not be completed in time - }; -#else - #if !defined(__COREAUDIO_USE_FLAT_INCLUDES__) - #include <AudioToolbox/ExtendedAudioFile.h> - #else - #include "ExtendedAudioFile.h" - #endif -#endif - -// _______________________________________________________________________________________ -// Wrapper class for an AudioFile, supporting encode/decode to/from a PCM client format -class CAAudioFile { -public: - // implementation-independent helpers - void Open(const char *filePath) { - FSRef fsref; - XThrowIfError(FSPathMakeRef((UInt8 *)filePath, &fsref, NULL), "locate audio file"); - Open(fsref); - } - - bool HasConverter() const { return GetConverter() != NULL; } - - double GetDurationSeconds() { - double sr = GetFileDataFormat().mSampleRate; - return fnonzero(sr) ? GetNumberFrames() / sr : 0.; - } - // will be 0 if the file's frames/packet is 0 (variable) - // or the file's sample rate is 0 (unknown) - -#if CAAF_USE_EXTAUDIOFILE -public: - CAAudioFile() : mExtAF(NULL) { } - virtual ~CAAudioFile() { if (mExtAF) Close(); } - - void Open(const FSRef &fsref) { - // open an existing file - XThrowIfError(ExtAudioFileOpen(&fsref, &mExtAF), "ExtAudioFileOpen failed"); - } - - void CreateNew(const FSRef &inParentDir, CFStringRef inFileName, AudioFileTypeID inFileType, const AudioStreamBasicDescription &inStreamDesc, const AudioChannelLayout *inChannelLayout=NULL) { - XThrowIfError(ExtAudioFileCreateNew(&inParentDir, inFileName, inFileType, &inStreamDesc, inChannelLayout, &mExtAF), "ExtAudioFileCreateNew failed"); - } - - void Wrap(AudioFileID fileID, bool forWriting) { - // use this to wrap an AudioFileID opened externally - XThrowIfError(ExtAudioFileWrapAudioFileID(fileID, forWriting, &mExtAF), "ExtAudioFileWrapAudioFileID failed"); - } - - void Close() { - XThrowIfError(ExtAudioFileDispose(mExtAF), "ExtAudioFileClose failed"); - mExtAF = NULL; - } - - const CAStreamBasicDescription &GetFileDataFormat() { - UInt32 size = sizeof(mFileDataFormat); - XThrowIfError(ExtAudioFileGetProperty(mExtAF, kExtAudioFileProperty_FileDataFormat, &size, &mFileDataFormat), "Couldn't get file's data format"); - return mFileDataFormat; - } - - const CAAudioChannelLayout & GetFileChannelLayout() { - return FetchChannelLayout(mFileChannelLayout, kExtAudioFileProperty_FileChannelLayout); - } - - void SetFileChannelLayout(const CAAudioChannelLayout &layout) { - XThrowIfError(ExtAudioFileSetProperty(mExtAF, kExtAudioFileProperty_FileChannelLayout, layout.Size(), &layout.Layout()), "Couldn't set file's channel layout"); - mFileChannelLayout = layout; - } - - const CAStreamBasicDescription &GetClientDataFormat() { - UInt32 size = sizeof(mClientDataFormat); - XThrowIfError(ExtAudioFileGetProperty(mExtAF, kExtAudioFileProperty_ClientDataFormat, &size, &mClientDataFormat), "Couldn't get client data format"); - return mClientDataFormat; - } - - const CAAudioChannelLayout & GetClientChannelLayout() { - return FetchChannelLayout(mClientChannelLayout, kExtAudioFileProperty_ClientChannelLayout); - } - - void SetClientFormat(const CAStreamBasicDescription &dataFormat, const CAAudioChannelLayout *layout=NULL) { - XThrowIfError(ExtAudioFileSetProperty(mExtAF, kExtAudioFileProperty_ClientDataFormat, sizeof(dataFormat), &dataFormat), "Couldn't set client format"); - if (layout) - SetClientChannelLayout(*layout); - } - - void SetClientChannelLayout(const CAAudioChannelLayout &layout) { - XThrowIfError(ExtAudioFileSetProperty(mExtAF, kExtAudioFileProperty_ClientChannelLayout, layout.Size(), &layout.Layout()), "Couldn't set client channel layout"); - } - - AudioConverterRef GetConverter() const { - UInt32 size = sizeof(AudioConverterRef); - AudioConverterRef converter; - XThrowIfError(ExtAudioFileGetProperty(mExtAF, kExtAudioFileProperty_AudioConverter, &size, &converter), "Couldn't get file's AudioConverter"); - return converter; - } - - OSStatus SetConverterProperty(AudioConverterPropertyID inPropertyID, UInt32 inPropertyDataSize, const void *inPropertyData, bool inCanFail=false) - { - OSStatus err = AudioConverterSetProperty(GetConverter(), inPropertyID, inPropertyDataSize, inPropertyData); - if (!inCanFail) - XThrowIfError(err, "Couldn't set audio converter property"); - if (!err) { - // must tell the file that we have changed the converter; a NULL converter config is sufficient - CFPropertyListRef config = NULL; - XThrowIfError(ExtAudioFileSetProperty(mExtAF, kExtAudioFileProperty_ConverterConfig, sizeof(CFPropertyListRef), &config), "couldn't signal the file that the converter has changed"); - } - return err; - } - - SInt64 GetNumberFrames() { - SInt64 length; - UInt32 size = sizeof(SInt64); - XThrowIfError(ExtAudioFileGetProperty(mExtAF, kExtAudioFileProperty_FileLengthFrames, &size, &length), "Couldn't get file's length"); - return length; - } - - void SetNumberFrames(SInt64 length) { - XThrowIfError(ExtAudioFileSetProperty(mExtAF, kExtAudioFileProperty_FileLengthFrames, sizeof(SInt64), &length), "Couldn't set file's length"); - } - - void Seek(SInt64 pos) { - XThrowIfError(ExtAudioFileSeek(mExtAF, pos), "Couldn't seek in audio file"); - } - - SInt64 Tell() { - SInt64 pos; - XThrowIfError(ExtAudioFileTell(mExtAF, &pos), "Couldn't get file's mark"); - return pos; - } - - void Read(UInt32 &ioFrames, AudioBufferList *ioData) { - XThrowIfError(ExtAudioFileRead(mExtAF, &ioFrames, ioData), "Couldn't read audio file"); - } - - void Write(UInt32 inFrames, const AudioBufferList *inData) { - XThrowIfError(ExtAudioFileWrite(mExtAF, inFrames, inData), "Couldn't write audio file"); - } - - void SetIOBufferSizeBytes(UInt32 bufferSizeBytes) { - XThrowIfError(ExtAudioFileSetProperty(mExtAF, kExtAudioFileProperty_IOBufferSizeBytes, sizeof(UInt32), &bufferSizeBytes), "Couldn't set audio file's I/O buffer size"); - } - -private: - const CAAudioChannelLayout & FetchChannelLayout(CAAudioChannelLayout &layoutObj, ExtAudioFilePropertyID propID) { - UInt32 size; - XThrowIfError(ExtAudioFileGetPropertyInfo(mExtAF, propID, &size, NULL), "Couldn't get info about channel layout"); - AudioChannelLayout *layout = (AudioChannelLayout *)malloc(size); - OSStatus err = ExtAudioFileGetProperty(mExtAF, propID, &size, layout); - if (err) { - free(layout); - XThrowIfError(err, "Couldn't get channel layout"); - } - layoutObj = layout; - free(layout); - return layoutObj; - } - - -private: - ExtAudioFileRef mExtAF; - - CAStreamBasicDescription mFileDataFormat; - CAAudioChannelLayout mFileChannelLayout; - - CAStreamBasicDescription mClientDataFormat; - CAAudioChannelLayout mClientChannelLayout; -#endif - -#if !CAAF_USE_EXTAUDIOFILE - CAAudioFile(); - virtual ~CAAudioFile(); - - // --- second-stage initializers --- - // Use exactly one of the following: - // - Open - // - PrepareNew followed by Create - // - Wrap - - void Open(const FSRef &fsref); - // open an existing file - - void CreateNew(const FSRef &inParentDir, CFStringRef inFileName, AudioFileTypeID inFileType, const AudioStreamBasicDescription &inStreamDesc, const AudioChannelLayout *inChannelLayout=NULL); - - void Wrap(AudioFileID fileID, bool forWriting); - // use this to wrap an AudioFileID opened externally - - // --- - - void Close(); - // In case you want to close the file before the destructor executes - - // --- Data formats --- - - // Allow specifying the file's channel layout. Must be called before SetClientFormat. - // When writing, the specified channel layout is written to the file (if the file format supports - // the channel layout). When reading, the specified layout overrides the one read from the file, - // if any. - void SetFileChannelLayout(const CAAudioChannelLayout &layout); - - // This specifies the data format which the client will use for reading/writing the file, - // which may be different from the file's format. An AudioConverter is created if necessary. - // The client format must be linear PCM. - void SetClientFormat(const CAStreamBasicDescription &dataFormat, const CAAudioChannelLayout *layout=NULL); - void SetClientDataFormat(const CAStreamBasicDescription &dataFormat) { SetClientFormat(dataFormat, NULL); } - void SetClientChannelLayout(const CAAudioChannelLayout &layout) { SetClientFormat(mClientDataFormat, &layout); } - - // Wrapping the underlying converter, if there is one - OSStatus SetConverterProperty(AudioConverterPropertyID inPropertyID, - UInt32 inPropertyDataSize, - const void * inPropertyData, - bool inCanFail = false); - void SetConverterConfig(CFArrayRef config) { - SetConverterProperty(kAudioConverterPropertySettings, sizeof(config), &config); } - CFArrayRef GetConverterConfig(); - - // --- I/O --- - // All I/O is sequential, but you can seek to an arbitrary position when reading. - // SeekToPacket and TellPacket's packet numbers are in the file's data format, not the client's. - // However, ReadPackets/WritePackets use packet counts in the client data format. - - void Read(UInt32 &ioNumFrames, AudioBufferList *ioData); - void Write(UInt32 numFrames, const AudioBufferList *data); - - // These can fail for files without a constant mFramesPerPacket - void Seek(SInt64 frameNumber); - SInt64 Tell() const; // frameNumber - - // --- Accessors --- - // note: client parameters only valid if SetClientFormat has been called - AudioFileID GetAudioFileID() const { return mAudioFile; } - const CAStreamBasicDescription &GetFileDataFormat() const { return mFileDataFormat; } - const CAStreamBasicDescription &GetClientDataFormat() const { return mClientDataFormat; } - const CAAudioChannelLayout & GetFileChannelLayout() const { return mFileChannelLayout; } - const CAAudioChannelLayout & GetClientChannelLayout() const { return mClientChannelLayout; } - AudioConverterRef GetConverter() const { return mConverter; } - - UInt32 GetFileMaxPacketSize() const { return mFileMaxPacketSize; } - UInt32 GetClientMaxPacketSize() const { return mClientMaxPacketSize; } - SInt64 GetNumberPackets() const { - SInt64 npackets; - UInt32 propertySize = sizeof(npackets); - XThrowIfError(AudioFileGetProperty(mAudioFile, kAudioFilePropertyAudioDataPacketCount, &propertySize, &npackets), "get audio file's packet count"); - return npackets; - } - SInt64 GetNumberFrames() const; - // will be 0 if the file's frames/packet is 0 (variable) - void SetNumberFrames(SInt64 length); // should only be set on a PCM file - - // --- Tunable performance parameters --- - void SetUseCache(bool b) { mUseCache = b; } - void SetIOBufferSizeBytes(UInt32 bufferSizeBytes) { mIOBufferSizeBytes = bufferSizeBytes; } - UInt32 GetIOBufferSizeBytes() { return mIOBufferSizeBytes; } - void * GetIOBuffer() { return mIOBufferList.mBuffers[0].mData; } - void SetIOBuffer(void *buf); - - // -- Profiling --- -#if CAAUDIOFILE_PROFILE - void EnableProfiling(bool b) { mProfiling = b; } - UInt64 TicksInConverter() const { return (mTicksInConverter > 0) ? (mTicksInConverter - mTicksInReadInConverter) : 0; } - UInt64 TicksInIO() const { return mTicksInIO; } -#endif - -// _______________________________________________________________________________________ -private: - SInt64 FileDataOffset(); - void SeekToPacket(SInt64 packetNumber); - SInt64 TellPacket() const { return mPacketMark; } // will be imprecise if SeekToFrame was called - - void SetConverterChannelLayout(bool output, const CAAudioChannelLayout &layout); - void WritePacketsFromCallback( - AudioConverterComplexInputDataProc inInputDataProc, - void * inInputDataProcUserData); - // will use I/O buffer size - void InitFileMaxPacketSize(); - void FileFormatChanged(const FSRef *parentDir=0, CFStringRef filename=0, AudioFileTypeID filetype=0); - - void GetExistingFileInfo(); - void FlushEncoder(); - void CloseConverter(); - void UpdateClientMaxPacketSize(); - void AllocateBuffers(bool okToFail=false); - SInt64 PacketToFrame(SInt64 packet) const; - SInt64 FrameToPacket(SInt64 inFrame) const; - - static OSStatus ReadInputProc( AudioConverterRef inAudioConverter, - UInt32* ioNumberDataPackets, - AudioBufferList* ioData, - AudioStreamPacketDescription** outDataPacketDescription, - void* inUserData); - - static OSStatus WriteInputProc( AudioConverterRef inAudioConverter, - UInt32* ioNumberDataPackets, - AudioBufferList* ioData, - AudioStreamPacketDescription** outDataPacketDescription, - void* inUserData); -// _______________________________________________________________________________________ -private: - - // the file - FSRef mFSRef; - AudioFileID mAudioFile; - bool mOwnOpenFile; - bool mUseCache; - bool mFinishingEncoding; - enum { kClosed, kReading, kPreparingToCreate, kPreparingToWrite, kWriting } mMode; - -// SInt64 mNumberPackets; // in file's format - SInt64 mFileDataOffset; - SInt64 mPacketMark; // in file's format - SInt64 mFrameMark; // this may be offset from the start of the file - // by the codec's latency; i.e. our frame 0 could - // lie at frame 2112 of a decoded AAC file - SInt32 mFrame0Offset; - UInt32 mFramesToSkipFollowingSeek; - - // buffers - UInt32 mIOBufferSizeBytes; - UInt32 mIOBufferSizePackets; - AudioBufferList mIOBufferList; // only one buffer -- USE ACCESSOR so it can be lazily initialized - bool mClientOwnsIOBuffer; - AudioStreamPacketDescription *mPacketDescs; - UInt32 mNumPacketDescs; - - // formats/conversion - AudioConverterRef mConverter; - CAStreamBasicDescription mFileDataFormat; - CAStreamBasicDescription mClientDataFormat; - CAAudioChannelLayout mFileChannelLayout; - CAAudioChannelLayout mClientChannelLayout; - UInt32 mFileMaxPacketSize; - UInt32 mClientMaxPacketSize; - - // cookie - Byte * mMagicCookie; - UInt32 mMagicCookieSize; - - // for ReadPackets - UInt32 mMaxPacketsToRead; - - // for WritePackets - UInt32 mWritePackets; - CABufferList * mWriteBufferList; - -#if CAAUDIOFILE_PROFILE - // performance - bool mProfiling; - UInt64 mTicksInConverter; - UInt64 mTicksInReadInConverter; - UInt64 mTicksInIO; - bool mInConverter; -#endif - -#endif // CAAF_USE_EXTAUDIOFILE -}; - -#endif // __CAAudioFile_h__ |