diff options
Diffstat (limited to 'libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.cpp')
-rw-r--r-- | libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.cpp | 283 |
1 files changed, 283 insertions, 0 deletions
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.cpp b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.cpp new file mode 100644 index 0000000000..de9599b186 --- /dev/null +++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.cpp @@ -0,0 +1,283 @@ +/* + File: ACPlugInDispatch.cpp + Abstract: ACPlugInDispatch.h + 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. + +*/ +#if AUDIOCODECS_SUPPORT_PLUGINS +#include "ACPlugInDispatch.h" +#include "CAXException.h" +#include "ACCodec.h" +#include <new> + +#define ACPI ((AudioComponentPlugInInstance *)self) +#define ACC ((ACCodec *)&ACPI->mInstanceStorage) + +static OSStatus GetPropertyInfo(void *self, AudioCodecPropertyID inPropertyID, UInt32 *outSize, Boolean *outWritable) +{ + OSStatus result = noErr; + try { + UInt32 size; + Boolean writable; + ACC->GetPropertyInfo(inPropertyID, size, writable); + if (outSize) *outSize = size; + if (outWritable) *outWritable = writable; + } + COMPONENT_CATCH + return result; +} + +static OSStatus GetProperty(void *self, AudioCodecPropertyID inPropertyID, UInt32 *ioPropertyDataSize, void *outPropertyData) +{ + OSStatus result = noErr; + try { + ACC->GetProperty(inPropertyID, *ioPropertyDataSize, outPropertyData); + } + COMPONENT_CATCH + return result; +} + +static OSStatus SetProperty(void *self, AudioCodecPropertyID inPropertyID, UInt32 inPropertyDataSize, const void *inPropertyData) +{ + OSStatus result = noErr; + try { + ACC->SetProperty(inPropertyID, inPropertyDataSize, inPropertyData); + } + COMPONENT_CATCH + return result; +} + + +static OSStatus Initialize(void *self, const AudioStreamBasicDescription *inInputFormat, const AudioStreamBasicDescription *inOutputFormat, const void *inMagicCookie, UInt32 inMagicCookieByteSize) +{ + OSStatus result = noErr; + try { + ACC->Initialize(inInputFormat, inOutputFormat, inMagicCookie, inMagicCookieByteSize); + } + COMPONENT_CATCH + return result; +} + +static OSStatus Uninitialize(void *self) +{ + OSStatus result = noErr; + try { + ACC->Uninitialize(); + } + COMPONENT_CATCH + return result; +} + +static OSStatus AppendInputData(void *self, const void *inInputData, UInt32 *ioInputDataByteSize, UInt32 *ioNumberPackets, const AudioStreamPacketDescription *inPacketDescription) +{ + OSStatus result = noErr; + try { + UInt32 npackets = (ioNumberPackets != NULL) ? *ioNumberPackets : 0; + ACC->AppendInputData(inInputData, *ioInputDataByteSize, npackets, inPacketDescription); + if(ioNumberPackets != NULL) + *ioNumberPackets = npackets; + } + COMPONENT_CATCH + return result; +} + +static OSStatus ProduceOutputPackets(void *self, void *outOutputData, UInt32 *ioOutputDataByteSize, UInt32 *ioNumberPackets, AudioStreamPacketDescription *outPacketDescription, UInt32 *outStatus) +{ + OSStatus result = noErr; + try { + *outStatus = ACC->ProduceOutputPackets(outOutputData, *ioOutputDataByteSize, *ioNumberPackets, outPacketDescription); + if (*outStatus == kAudioCodecProduceOutputPacketFailure) + result = kAudio_ParamError; + } + COMPONENT_CATCH + return result; +} + +static OSStatus Reset(void *self) +{ + OSStatus result = noErr; + try { + ACC->Reset(); + } + COMPONENT_CATCH + return result; +} + +#if AC_NON_INTERLEAVED_SUPPORT +static OSStatus AppendInputBufferList(void *self, const AudioBufferList *ioBufferList, UInt32 *inNumberPackets, const AudioStreamPacketDescription *inPacketDescription, UInt32 *outBytesConsumed) +{ + OSStatus result = noErr; + try { + if((ioBufferList != NULL) && (outBytesConsumed != NULL)) + { + if(inNumberPackets != NULL) + { + ACC->AppendInputBufferList(ioBufferList, *inNumberPackets, inPacketDescription, outBytesConsumed); + } + else + { + UInt32 theNumberPackets = 0; + ACC->AppendInputBufferList(ioBufferList, theNumberPackets, inPacketDescription, outBytesConsumed); + } + } + else + { + result = kAudio_ParamError; + } + } + COMPONENT_CATCH + return result; +} + +static OSStatus ProduceOutputBufferList(void *self, AudioBufferList *ioBufferList, UInt32 *ioNumberPackets, AudioStreamPacketDescription *outPacketDescription, UInt32 *outStatus) +{ + OSStatus result = noErr; + try { + if((ioBufferList != NULL) && (ioNumberPackets != NULL) && (outStatus != NULL)) + { + *outStatus = ACC->ProduceOutputBufferList(ioBufferList, *ioNumberPackets, outPacketDescription); + if(kAudioCodecProduceOutputPacketFailure == *outStatus) + { + result = kAudio_ParamError; + } + } + else + { + result = kAudio_ParamError; + } + } + COMPONENT_CATCH + return result; +} +#endif + +#if TARGET_OS_IPHONE && AUDIOCONV_HAVE_AMC +// The ACTransformerCodecBase class is the base for ALL hardware codecs. +// No need to check for ImplementFeature... +#include "ACTransformerManager.h" +#define ACTM ((ACTransformerCodecBase*)&ACPI->mInstanceStorage) + +static OSStatus AcquireHardware(void *self) +{ + OSStatus result = noErr; + try { + ACTM->AcquireHardware(); + } + COMPONENT_CATCH + return result; +} + +static OSStatus ReleaseHardware(void *self) +{ + OSStatus result = noErr; + try { + ACTM->ReleaseHardware(); + } + COMPONENT_CATCH + return result; +} +#endif // TARGET_OS_IPHONE && AUDIOCONV_HAVE_AMC + + +AudioComponentMethod AudioCodecLookup::Lookup (SInt16 selector) +{ + switch (selector) { + case kAudioCodecGetPropertyInfoSelect: return (AudioComponentMethod)GetPropertyInfo; + case kAudioCodecGetPropertySelect: return (AudioComponentMethod)GetProperty; + case kAudioCodecSetPropertySelect: return (AudioComponentMethod)SetProperty; + case kAudioCodecInitializeSelect: return (AudioComponentMethod)Initialize; + case kAudioCodecUninitializeSelect: return (AudioComponentMethod)Uninitialize; + case kAudioCodecAppendInputDataSelect: return (AudioComponentMethod)AppendInputData; + case kAudioCodecProduceOutputDataSelect: return (AudioComponentMethod)ProduceOutputPackets; + case kAudioCodecResetSelect: return (AudioComponentMethod)Reset; + default: + break; + } + return NULL; +} + +#if AC_NON_INTERLEAVED_SUPPORT +AudioComponentMethod AudioCodecNonInterleavedEncoderLookup::Lookup (SInt16 selector) +{ + AudioComponentMethod method = AudioCodecLookup::Lookup(selector); + if (method) + return method; + + if (selector == kAudioCodecAppendInputBufferListSelect) + return (AudioComponentMethod)AppendInputBufferList; + + return NULL; +} + +AudioComponentMethod AudioCodecNonInterleavedDecoderLookup::Lookup (SInt16 selector) +{ + AudioComponentMethod method = AudioCodecLookup::Lookup(selector); + if (method) + return method; + + if (selector == kAudioCodecProduceOutputBufferListSelect) + return (AudioComponentMethod)ProduceOutputBufferList; + + return NULL; +} +#endif + +#if TARGET_OS_IPHONE && AUDIOCONV_HAVE_AMC +#include "AudioCodecPriv.h" + +AudioComponentMethod AudioCodecHWCodecLookup::Lookup (SInt16 selector) +{ + AudioComponentMethod method = AudioCodecLookup::Lookup(selector); + if (method) return method; + + switch (selector) { + case kAudioCodecAcquireHardwareSelect: return (AudioComponentMethod)AcquireHardware; + case kAudioCodecReleaseHardwareSelect: return (AudioComponentMethod)ReleaseHardware; + default: + break; + } + return NULL; +} +#endif // TARGET_OS_IPHONE && AUDIOCONV_HAVE_AMC + +#endif // AUDIOCODECS_SUPPORT_PLUGINS |