summaryrefslogtreecommitdiff
path: root/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.cpp')
-rw-r--r--libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.cpp283
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