Cider Isn't Darwin Emulation, Really
Something went wrong. Try again.
5.3 kB · 130 lines
C++
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131/*This file is part of Darling.
Copyright (C) 2020 Lubos Dolezel
Darling is free software: you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation, either version 3 of the License, or(at your option) any later version.
Darling is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.
You should have received a copy of the GNU General Public Licensealong with Darling. If not, see <http://www.gnu.org/licenses/>.*/
#include "AudioConverter.h"#include "AudioConverterImpl.h"#include <CoreServices/MacErrors.h>#include <stdexcept>#include <cstring>
OSStatus AudioConverterNew(const AudioStreamBasicDescription* inSourceFormat, const AudioStreamBasicDescription* inDestinationFormat, AudioConverterRef* outAudioConverter){ return AudioConverter::create(inSourceFormat, inDestinationFormat, (AudioConverter**)outAudioConverter);}
OSStatus AudioConverterNewSpecific(const AudioStreamBasicDescription* inSourceFormat, const AudioStreamBasicDescription* inDestinationFormat, UInt32 inNumberClassDescriptions, AudioClassDescription* nClassDescriptions, AudioConverterRef* outAudioConverter){ // FIXME return AudioConverterNew(inSourceFormat, inDestinationFormat, outAudioConverter);}
OSStatus AudioConverterReset(AudioConverterRef inAudioConverter){ if (inAudioConverter) { ((AudioConverter*)inAudioConverter)->flush(); return noErr; } else return paramErr;}
OSStatus AudioConverterDispose(AudioConverterRef inAudioConverter){ delete (AudioConverter*)inAudioConverter; return noErr;}
OSStatus AudioConverterGetProperty(AudioConverterRef inAudioConverter, AudioConverterPropertyID inPropertyID, UInt32 *ioPropertyDataSize, void *outPropertyData){ return ((AudioConverter*)inAudioConverter)->getProperty(inPropertyID, ioPropertyDataSize, outPropertyData);}
OSStatus AudioConverterGetPropertyInfo(AudioConverterRef inAudioConverter, AudioConverterPropertyID inPropertyID, UInt32 *outSize, Boolean *outWritable){ return ((AudioConverter*)inAudioConverter)->getPropertyInfo(inPropertyID, outSize, outWritable);}
OSStatus AudioConverterSetProperty(AudioConverterRef inAudioConverter, AudioConverterPropertyID inPropertyID, UInt32 inPropertyDataSize, const void *inPropertyData){ return ((AudioConverter*)inAudioConverter)->setProperty(inPropertyID, inPropertyDataSize, inPropertyData);}
OSStatus AudioConverterConvertBuffer(AudioConverterRef inAudioConverter, UInt32 inInputDataSize, const void* inInputData, UInt32 *ioOutputDataSize, void *outOutputData){ AudioBufferList in, out; OSStatus stat;
in.mNumberBuffers = out.mNumberBuffers = 1;
in.mBuffers[0].mNumberChannels = 2; out.mBuffers[0].mNumberChannels = 2;
in.mBuffers[0].mDataByteSize = inInputDataSize; in.mBuffers[0].mData = const_cast<void*>(inInputData);
out.mBuffers[0].mDataByteSize = *ioOutputDataSize; out.mBuffers[0].mData = outOutputData;
stat = AudioConverterConvertComplexBuffer(inAudioConverter, inInputDataSize/((AudioConverter*)inAudioConverter)->frameSize(), &in, &out); *ioOutputDataSize = out.mBuffers[0].mDataByteSize;
return stat;}
OSStatus AudioConverterFillComplexBuffer(AudioConverterRef inAudioConverter, AudioConverterComplexInputDataProc inInputDataProc, void *inInputDataProcUserData, UInt32 *ioOutputDataPacketSize, AudioBufferList *outOutputData, AudioStreamPacketDescription* outPacketDescription){ return ((AudioConverter*)inAudioConverter)->fillComplex(inInputDataProc, inInputDataProcUserData, ioOutputDataPacketSize, outOutputData, outPacketDescription);}
OSStatus AudioConverterConvertComplexBuffer(AudioConverterRef inAudioConverter, UInt32 inNumberPCMFrames, const AudioBufferList *inInputData, AudioBufferList *outOutputData){ OSStatus status; UInt32 dataPacketSize; int64_t totalOutBytes = 0; typedef OSStatus (^CallbackBlock)(AudioConverterRef audioConverter, UInt32* numberDataPackets, AudioBufferList* data, AudioStreamPacketDescription** dataPacketDescription); CallbackBlock callbackBlock = ^ OSStatus (AudioConverterRef audioConverter, UInt32* numberDataPackets, AudioBufferList* data, AudioStreamPacketDescription** dataPacketDescription) { const AudioBufferList *inInputData = (AudioBufferList*) inInputData;
if (dataPacketDescription) *dataPacketDescription = nullptr; // TODO
return unimpErr; };
// Squeezing a block through a function pointer AudioConverterComplexInputDataProc proc = [](AudioConverterRef audioConverter, UInt32* numberDataPackets, AudioBufferList* data, AudioStreamPacketDescription** dataPacketDescription, void* userData) -> OSStatus { CallbackBlock callbackBlock = (CallbackBlock) userData; return callbackBlock(audioConverter, numberDataPackets, data, dataPacketDescription); };
for (UInt32 i = 0; i < outOutputData->mNumberBuffers; i++) totalOutBytes += outOutputData->mBuffers[i].mDataByteSize;
dataPacketSize = totalOutBytes / ((AudioConverter*)inAudioConverter)->frameSize();
status = AudioConverterFillComplexBuffer(inAudioConverter, proc, (void*) inInputData, &dataPacketSize, outOutputData, nullptr); return status;}