Imported Upstream version 0.13.2+dsfg1

This commit is contained in:
Sebastian Ramacher 2016-02-24 00:16:51 +01:00
commit fb3990e9e5
2036 changed files with 287360 additions and 0 deletions

View file

@ -0,0 +1,37 @@
project(coreaudio-encoder)
set(coreaudio-encoder_SOURCES
encoder.cpp)
if (WIN32)
set(coreaudio-encoder_HEADERS windows-imports.h)
set(coreaudio-encoder_LIBS )
if (MINGW)
set_source_files_properties(${coreaudio-encoder_SOURCES}
PROPERTIES COMPILE_FLAGS "-Wno-multichar")
endif()
else()
find_library(COREFOUNDATION CoreFoundation)
find_library(COREAUDIO CoreAudio)
find_library(AUDIOTOOLBOX AudioToolbox)
set(coreaudio-encoder_HEADERS )
set(coreaudio-encoder_LIBS
${COREFOUNDATION}
${COREAUDIO}
${AUDIOTOOLBOX})
include_directories(${COREFOUNDATION}
${COREAUDIO}
${AUDIOTOOLBOX})
endif()
add_library(coreaudio-encoder MODULE
${coreaudio-encoder_SOURCES}
${coreaudio-encoder_HEADERS})
target_link_libraries(coreaudio-encoder
libobs
${coreaudio-encoder_LIBS})
install_obs_plugin_with_data(coreaudio-encoder data)

View file

@ -0,0 +1,3 @@
Bitrate="Битрейт"
AllowHEAAC="Позволи HE-AAC"

View file

@ -0,0 +1,4 @@
CoreAudioAAC="Codificador CoreAudio AAC"
Bitrate="Taxa de bits"
AllowHEAAC="Permet HE-AAC"

View file

@ -0,0 +1,6 @@
CoreAudioAAC="CoreAudio AAC encoder"
Bitrate="Bitrate"
AllowHEAAC="Povolit HE-AAC"
OutputSamplerate="Snímkovací frekvence výstupu"
UseInputSampleRate="Použít vstupní (OBS) vzorkovací frekvenci (může obsahovat nepodporované bitraty)"

View file

@ -0,0 +1,6 @@
CoreAudioAAC="CoreAudio AAC encoder"
Bitrate="Bitrate"
AllowHEAAC="Erlaube HE-AAC"
OutputSamplerate="Ausgabe-Abtastrate"
UseInputSampleRate="Verwenden Sie Eingabe (OBS) Abtastrate (kann nicht unterstützte Bitraten auflisten)"

View file

@ -0,0 +1,4 @@
CoreAudioAAC="Κωδικοποιητής AAC CoreAudio"
Bitrate="Ρυθμός μετάδοσης bit"
AllowHEAAC="Να Επιτρέπεται το HE-AAC"

View file

@ -0,0 +1,5 @@
CoreAudioAAC="CoreAudio AAC encoder"
Bitrate="Bitrate"
AllowHEAAC="Allow HE-AAC"
OutputSamplerate="Output Sample Rate"
UseInputSampleRate="Use Input (OBS) Sample Rate (may list unsupported bitrates)"

View file

@ -0,0 +1,6 @@
CoreAudioAAC="Codificador AAC CoreAudio"
Bitrate="Tasa de bits"
AllowHEAAC="Permitir HE-AAC"
OutputSamplerate="Frecuencia de muestreo de salida"
UseInputSampleRate="Usar las tasa de muestra de la entrada de OBS (puede mostrar tasas de bits no compatibles)"

View file

@ -0,0 +1,6 @@
CoreAudioAAC="CoreAudio AAC kodeatzailea"
Bitrate="Bitneurria"
AllowHEAAC="Ahalbidetu HE-AAC"
OutputSamplerate="Irteera Lagin Neurria"
UseInputSampleRate="Erabili Sarrerako (OBS) Lagin Neurria (badaiteke sostengugabeko bitneurriak zerrendatea)"

View file

@ -0,0 +1,6 @@
CoreAudioAAC="CoreAudio AAC -enkooderi"
Bitrate="Bitrate"
AllowHEAAC="Salli HE-AAC"
OutputSamplerate="Ulostulon näytetaajuus"
UseInputSampleRate="Käytä sisääntulon näytetaajuutta (saattaa sisältää myös epäsopivia arvoja)"

View file

@ -0,0 +1,6 @@
CoreAudioAAC="Encodeur AAC CoreAudio"
Bitrate="Débit"
AllowHEAAC="Autoriser le HE-AAC"
OutputSamplerate="Fréquence d'échantillonnage de sortie"
UseInputSampleRate="Utiliser la fréquence déchantillonnage d'entrée (OBS) (pourrait lister des débits non-supportés)"

View file

@ -0,0 +1,4 @@
CoreAudioAAC="Codificador CoreAudio AAC"
Bitrate="Velocidade de bits"
AllowHEAAC="Permitir HE-AAC"

View file

@ -0,0 +1,6 @@
CoreAudioAAC="CoreAudio AAC nekoder"
Bitrate="Protok"
AllowHEAAC="Dozvoli HE-AAC"
OutputSamplerate="Izlazni sample-rate"
UseInputSampleRate="Koristi ulazni (OBS) sample-rate (mogu biti prikazani nepodržani bitrate-ovi)"

View file

@ -0,0 +1,6 @@
CoreAudioAAC="CoreAudio AAC kódoló"
Bitrate="Bitráta"
AllowHEAAC="HE-AAC Engedélyezése"
OutputSamplerate="Kimeneti Mintavételráta"
UseInputSampleRate="Beviteli (OBS) Minta Rátájának használata (kilistázza a nem támogatott bitrátákat)"

View file

@ -0,0 +1,4 @@
CoreAudioAAC="Encoder CoreAudio AAC"
Bitrate="Bitrate"
AllowHEAAC="Consenti l'HE-AAC"

View file

@ -0,0 +1,6 @@
CoreAudioAAC="CoreAudio AAC エンコーダ"
Bitrate="ビットレート"
AllowHEAAC="HE-AAC を許可"
OutputSamplerate="出力のサンプルレート"
UseInputSampleRate="(OBSで) 入力したサンプルレートを使用(サポートされていないビットレートをリストする可能性があります)"

View file

@ -0,0 +1,6 @@
CoreAudioAAC="CoreAudio AAC 인코더"
Bitrate="품질 (비트레이트)"
AllowHEAAC="HE-AAC 허용"
OutputSamplerate="출력 샘플 레이트"
UseInputSampleRate="입력 (OBS) 샘플 레이트 사용 (지원하지 않는 비트레이트가 제공될 수 있음)"

View file

@ -0,0 +1,4 @@
CoreAudioAAC="CoreAudio AAC-koder"
Bitrate="Bitrate"
AllowHEAAC="Tillat HE-AAC-koding"

View file

@ -0,0 +1,6 @@
CoreAudioAAC="CoreAudio AAC encoder"
Bitrate="Bitrate"
AllowHEAAC="HE-AAC toestaan"
OutputSamplerate="Uitvoer Sample Rate"
UseInputSampleRate="Gebruik Invoer (OBS) Sample Rate (kan niet-ondersteunde bitrates tonen)"

View file

@ -0,0 +1,6 @@
CoreAudioAAC="Enkoder CoreAudio AAC"
Bitrate="Przepływność (bitrate)"
AllowHEAAC="Zezwalaj na HE-AAC"
OutputSamplerate="Próbkowanie wyjściowe"
UseInputSampleRate="Użyj próbkowania wejściowego (może oferować niekompatybilne próbkowania)"

View file

@ -0,0 +1,4 @@
CoreAudioAAC="Codec de AAC CoreAudio"
Bitrate="Bitrate"
AllowHEAAC="Permitir HE-AAC"

View file

@ -0,0 +1,4 @@
CoreAudioAAC="Codificador CoreAudio AAC"
Bitrate="Bitrate"
AllowHEAAC="Permitir HE-AAC"

View file

@ -0,0 +1,6 @@
CoreAudioAAC="CoreAudio AAC Encoder"
Bitrate="Rata biti / Bitrate"
AllowHEAAC="Permite HE-AAC"
OutputSamplerate="Mostra Ratei de Output"
UseInputSampleRate="Utilizeaza Mostra de Rata (OBS) ca Input (pot enumera bitrate-uri neacceptate)"

View file

@ -0,0 +1,4 @@
CoreAudioAAC="Кодировщик CoreAudio AAC"
Bitrate="Битрейт"
AllowHEAAC="Разрешить HE-AAC"

View file

@ -0,0 +1,4 @@
CoreAudioAAC="CoreAudio AAC enkodér"
Bitrate="Dátový tok"
AllowHEAAC="Povoliť HE-AAC"

View file

@ -0,0 +1,6 @@
CoreAudioAAC="CoreAudio AAC nekoder"
Bitrate="Protok"
AllowHEAAC="Dozvoli HE-AAC"
OutputSamplerate="Izlazni sample-rate"
UseInputSampleRate="Koristi ulazni (OBS) sample-rate (mogu biti prikazani nepodržani bitrate-ovi)"

View file

@ -0,0 +1,6 @@
CoreAudioAAC="CoreAudio AAC енкодер"
Bitrate="Проток"
AllowHEAAC="Дозволи HE-AAC"
OutputSamplerate="Излазни sample-rate"
UseInputSampleRate="Користи улазни sample-rate (OBS) (могу бити приказани неподржани bitrate-ови)"

View file

@ -0,0 +1,4 @@
CoreAudioAAC="CoreAudio AAC-kodare"
Bitrate="Bitrate"
AllowHEAAC="Tillåt HE-AAC"

View file

@ -0,0 +1,4 @@
CoreAudioAAC="CoreAudio AAC kodlayıcısı"
Bitrate="Bit hızı"
AllowHEAAC="HE-ACC'ye izin ver"

View file

@ -0,0 +1,6 @@
CoreAudioAAC="CoreAudio AAC 编码器"
Bitrate="比特率"
AllowHEAAC="允许 HE-AAC"
OutputSamplerate="输出采样率"
UseInputSampleRate="使用输入 (OBS) 采样率 (可能会列出不支持的比特率)"

View file

@ -0,0 +1,6 @@
CoreAudioAAC="CoreAudio AAC 編碼器"
Bitrate="位元率"
AllowHEAAC="允許 HE-AAC"
OutputSamplerate="輸出取樣頻率"
UseInputSampleRate="使用輸入 (OBS) 取樣頻率 (可能會列出不支援的位元率)"

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,484 @@
#define NO_MIN_MAX 1
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <ShlObj.h>
#include <util/dstr.h>
typedef unsigned long UInt32;
typedef signed long SInt32;
typedef signed long long SInt64;
typedef double Float64;
typedef SInt32 OSStatus;
typedef unsigned char Boolean;
typedef UInt32 AudioFormatPropertyID;
enum {
kVariableLengthArray = 1
};
struct OpaqueAudioConverter;
typedef struct OpaqueAudioConverter *AudioConverterRef;
typedef UInt32 AudioConverterPropertyID;
struct AudioValueRange {
Float64 mMinimum;
Float64 mMaximum;
};
typedef struct AudioValueRange AudioValueRange;
struct AudioBuffer {
UInt32 mNumberChannels;
UInt32 mDataByteSize;
void* mData;
};
typedef struct AudioBuffer AudioBuffer;
struct AudioBufferList {
UInt32 mNumberBuffers;
AudioBuffer mBuffers[kVariableLengthArray];
};
typedef struct AudioBufferList AudioBufferList;
struct AudioStreamBasicDescription {
Float64 mSampleRate;
UInt32 mFormatID;
UInt32 mFormatFlags;
UInt32 mBytesPerPacket;
UInt32 mFramesPerPacket;
UInt32 mBytesPerFrame;
UInt32 mChannelsPerFrame;
UInt32 mBitsPerChannel;
UInt32 mReserved;
};
typedef struct AudioStreamBasicDescription AudioStreamBasicDescription;
struct AudioStreamPacketDescription {
SInt64 mStartOffset;
UInt32 mVariableFramesInPacket;
UInt32 mDataByteSize;
};
typedef struct AudioStreamPacketDescription AudioStreamPacketDescription;
typedef OSStatus (*AudioConverterComplexInputDataProc) (
AudioConverterRef inAudioConverter,
UInt32 *ioNumberDataPackets,
AudioBufferList *ioData,
AudioStreamPacketDescription **outDataPacketDescription,
void *inUserData
);
enum {
kAudioCodecPropertyNameCFString = 'lnam',
kAudioCodecPropertyManufacturerCFString = 'lmak',
kAudioCodecPropertyFormatCFString = 'lfor',
//kAudioCodecPropertyHasVariablePacketByteSizes = 'vpk?',
kAudioCodecPropertySupportedInputFormats = 'ifm#',
kAudioCodecPropertySupportedOutputFormats = 'ofm#',
kAudioCodecPropertyAvailableInputSampleRates = 'aisr',
kAudioCodecPropertyAvailableOutputSampleRates = 'aosr',
kAudioCodecPropertyAvailableBitRateRange = 'abrt',
kAudioCodecPropertyMinimumNumberInputPackets = 'mnip',
kAudioCodecPropertyMinimumNumberOutputPackets = 'mnop',
kAudioCodecPropertyAvailableNumberChannels = 'cmnc',
kAudioCodecPropertyDoesSampleRateConversion = 'lmrc',
kAudioCodecPropertyAvailableInputChannelLayoutTags = 'aicl',
kAudioCodecPropertyAvailableOutputChannelLayoutTags = 'aocl',
kAudioCodecPropertyInputFormatsForOutputFormat = 'if4o',
kAudioCodecPropertyOutputFormatsForInputFormat = 'of4i',
kAudioCodecPropertyFormatInfo = 'acfi',
};
enum {
kAudioCodecPropertyInputBufferSize = 'tbuf',
kAudioCodecPropertyPacketFrameSize = 'pakf',
kAudioCodecPropertyMaximumPacketByteSize = 'pakb',
kAudioCodecPropertyCurrentInputFormat = 'ifmt',
kAudioCodecPropertyCurrentOutputFormat = 'ofmt',
kAudioCodecPropertyMagicCookie = 'kuki',
kAudioCodecPropertyUsedInputBufferSize = 'ubuf',
kAudioCodecPropertyIsInitialized = 'init',
kAudioCodecPropertyCurrentTargetBitRate = 'brat',
kAudioCodecPropertyCurrentInputSampleRate = 'cisr',
kAudioCodecPropertyCurrentOutputSampleRate = 'cosr',
kAudioCodecPropertyQualitySetting = 'srcq',
kAudioCodecPropertyApplicableBitRateRange = 'brta',
kAudioCodecPropertyApplicableInputSampleRates = 'isra',
kAudioCodecPropertyApplicableOutputSampleRates = 'osra',
kAudioCodecPropertyPaddedZeros = 'pad0',
kAudioCodecPropertyPrimeMethod = 'prmm',
kAudioCodecPropertyPrimeInfo = 'prim',
kAudioCodecPropertyCurrentInputChannelLayout = 'icl ',
kAudioCodecPropertyCurrentOutputChannelLayout = 'ocl ',
kAudioCodecPropertySettings = 'acs ',
kAudioCodecPropertyFormatList = 'acfl',
kAudioCodecPropertyBitRateControlMode = 'acbf',
kAudioCodecPropertySoundQualityForVBR = 'vbrq',
kAudioCodecPropertyMinimumDelayMode = 'mdel'
};
enum {
kAudioCodecBitRateControlMode_Constant = 0,
kAudioCodecBitRateControlMode_LongTermAverage = 1,
kAudioCodecBitRateControlMode_VariableConstrained = 2,
kAudioCodecBitRateControlMode_Variable = 3,
};
enum {
kAudioFormatLinearPCM = 'lpcm',
kAudioFormatAC3 = 'ac-3',
kAudioFormat60958AC3 = 'cac3',
kAudioFormatAppleIMA4 = 'ima4',
kAudioFormatMPEG4AAC = 'aac ',
kAudioFormatMPEG4CELP = 'celp',
kAudioFormatMPEG4HVXC = 'hvxc',
kAudioFormatMPEG4TwinVQ = 'twvq',
kAudioFormatMACE3 = 'MAC3',
kAudioFormatMACE6 = 'MAC6',
kAudioFormatULaw = 'ulaw',
kAudioFormatALaw = 'alaw',
kAudioFormatQDesign = 'QDMC',
kAudioFormatQDesign2 = 'QDM2',
kAudioFormatQUALCOMM = 'Qclp',
kAudioFormatMPEGLayer1 = '.mp1',
kAudioFormatMPEGLayer2 = '.mp2',
kAudioFormatMPEGLayer3 = '.mp3',
kAudioFormatTimeCode = 'time',
kAudioFormatMIDIStream = 'midi',
kAudioFormatParameterValueStream = 'apvs',
kAudioFormatAppleLossless = 'alac',
kAudioFormatMPEG4AAC_HE = 'aach',
kAudioFormatMPEG4AAC_LD = 'aacl',
kAudioFormatMPEG4AAC_ELD = 'aace',
kAudioFormatMPEG4AAC_ELD_SBR = 'aacf',
kAudioFormatMPEG4AAC_ELD_V2 = 'aacg',
kAudioFormatMPEG4AAC_HE_V2 = 'aacp',
kAudioFormatMPEG4AAC_Spatial = 'aacs',
kAudioFormatAMR = 'samr',
kAudioFormatAudible = 'AUDB',
kAudioFormatiLBC = 'ilbc',
kAudioFormatDVIIntelIMA = 0x6D730011,
kAudioFormatMicrosoftGSM = 0x6D730031,
kAudioFormatAES3 = 'aes3'
};
enum {
kAudioFormatFlagIsFloat = (1L << 0),
kAudioFormatFlagIsBigEndian = (1L << 1),
kAudioFormatFlagIsSignedInteger = (1L << 2),
kAudioFormatFlagIsPacked = (1L << 3),
kAudioFormatFlagIsAlignedHigh = (1L << 4),
kAudioFormatFlagIsNonInterleaved = (1L << 5),
kAudioFormatFlagIsNonMixable = (1L << 6),
kAudioFormatFlagsAreAllClear = (1L << 31),
kLinearPCMFormatFlagIsFloat =
kAudioFormatFlagIsFloat,
kLinearPCMFormatFlagIsBigEndian =
kAudioFormatFlagIsBigEndian,
kLinearPCMFormatFlagIsSignedInteger =
kAudioFormatFlagIsSignedInteger,
kLinearPCMFormatFlagIsPacked =
kAudioFormatFlagIsPacked,
kLinearPCMFormatFlagIsAlignedHigh =
kAudioFormatFlagIsAlignedHigh,
kLinearPCMFormatFlagIsNonInterleaved =
kAudioFormatFlagIsNonInterleaved,
kLinearPCMFormatFlagIsNonMixable =
kAudioFormatFlagIsNonMixable,
kLinearPCMFormatFlagsAreAllClear =
kAudioFormatFlagsAreAllClear,
kAppleLosslessFormatFlag_16BitSourceData = 1,
kAppleLosslessFormatFlag_20BitSourceData = 2,
kAppleLosslessFormatFlag_24BitSourceData = 3,
kAppleLosslessFormatFlag_32BitSourceData = 4
};
enum {
kAudioFormatFlagsNativeEndian = 0,
};
enum {
// AudioStreamBasicDescription structure properties
kAudioFormatProperty_FormatInfo = 'fmti',
kAudioFormatProperty_FormatName = 'fnam',
kAudioFormatProperty_EncodeFormatIDs = 'acof',
kAudioFormatProperty_DecodeFormatIDs = 'acif',
kAudioFormatProperty_FormatList = 'flst',
kAudioFormatProperty_ASBDFromESDS = 'essd',
kAudioFormatProperty_ChannelLayoutFromESDS = 'escl',
kAudioFormatProperty_OutputFormatList = 'ofls',
kAudioFormatProperty_Encoders = 'aven',
kAudioFormatProperty_Decoders = 'avde',
kAudioFormatProperty_FormatIsVBR = 'fvbr',
kAudioFormatProperty_FormatIsExternallyFramed = 'fexf',
kAudioFormatProperty_AvailableEncodeBitRates = 'aebr',
kAudioFormatProperty_AvailableEncodeSampleRates = 'aesr',
kAudioFormatProperty_AvailableEncodeChannelLayoutTags = 'aecl',
kAudioFormatProperty_AvailableEncodeNumberChannels = 'avnc',
kAudioFormatProperty_ASBDFromMPEGPacket = 'admp',
//
// AudioChannelLayout structure properties
kAudioFormatProperty_BitmapForLayoutTag = 'bmtg',
kAudioFormatProperty_MatrixMixMap = 'mmap',
kAudioFormatProperty_ChannelMap = 'chmp',
kAudioFormatProperty_NumberOfChannelsForLayout = 'nchm',
kAudioFormatProperty_ValidateChannelLayout = 'vacl',
kAudioFormatProperty_ChannelLayoutForTag = 'cmpl',
kAudioFormatProperty_TagForChannelLayout = 'cmpt',
kAudioFormatProperty_ChannelLayoutName = 'lonm',
kAudioFormatProperty_ChannelLayoutSimpleName = 'lsnm',
kAudioFormatProperty_ChannelLayoutForBitmap = 'cmpb',
kAudioFormatProperty_ChannelName = 'cnam',
kAudioFormatProperty_ChannelShortName = 'csnm',
kAudioFormatProperty_TagsForNumberOfChannels = 'tagc',
kAudioFormatProperty_PanningMatrix = 'panm',
kAudioFormatProperty_BalanceFade = 'balf',
//
// ID3 tag (MP3 metadata) properties
kAudioFormatProperty_ID3TagSize = 'id3s',
kAudioFormatProperty_ID3TagToDictionary = 'id3d'
};
enum {
kAudioConverterPropertyMinimumInputBufferSize = 'mibs',
kAudioConverterPropertyMinimumOutputBufferSize = 'mobs',
kAudioConverterPropertyMaximumInputBufferSize = 'xibs',
kAudioConverterPropertyMaximumInputPacketSize = 'xips',
kAudioConverterPropertyMaximumOutputPacketSize = 'xops',
kAudioConverterPropertyCalculateInputBufferSize = 'cibs',
kAudioConverterPropertyCalculateOutputBufferSize = 'cobs',
kAudioConverterPropertyInputCodecParameters = 'icdp',
kAudioConverterPropertyOutputCodecParameters = 'ocdp',
kAudioConverterSampleRateConverterAlgorithm = 'srci',
kAudioConverterSampleRateConverterComplexity = 'srca',
kAudioConverterSampleRateConverterQuality = 'srcq',
kAudioConverterSampleRateConverterInitialPhase = 'srcp',
kAudioConverterCodecQuality = 'cdqu',
kAudioConverterPrimeMethod = 'prmm',
kAudioConverterPrimeInfo = 'prim',
kAudioConverterChannelMap = 'chmp',
kAudioConverterDecompressionMagicCookie = 'dmgc',
kAudioConverterCompressionMagicCookie = 'cmgc',
kAudioConverterEncodeBitRate = 'brat',
kAudioConverterEncodeAdjustableSampleRate = 'ajsr',
kAudioConverterInputChannelLayout = 'icl ',
kAudioConverterOutputChannelLayout = 'ocl ',
kAudioConverterApplicableEncodeBitRates = 'aebr',
kAudioConverterAvailableEncodeBitRates = 'vebr',
kAudioConverterApplicableEncodeSampleRates = 'aesr',
kAudioConverterAvailableEncodeSampleRates = 'vesr',
kAudioConverterAvailableEncodeChannelLayoutTags = 'aecl',
kAudioConverterCurrentOutputStreamDescription = 'acod',
kAudioConverterCurrentInputStreamDescription = 'acid',
kAudioConverterPropertySettings = 'acps',
kAudioConverterPropertyBitDepthHint = 'acbd',
kAudioConverterPropertyFormatList = 'flst',
};
enum {
kAudioConverterQuality_Max = 0x7F,
kAudioConverterQuality_High = 0x60,
kAudioConverterQuality_Medium = 0x40,
kAudioConverterQuality_Low = 0x20,
kAudioConverterQuality_Min = 0
};
enum {
kAudio_UnimplementedError = -4,
kAudio_FileNotFoundError = -43,
kAudio_FilePermissionError = -54,
kAudio_TooManyFilesOpenError = -42,
kAudio_BadFilePathError = '!pth', // 0x21707468, 561017960
kAudio_ParamError = -50,
kAudio_MemFullError = -108,
kAudioConverterErr_FormatNotSupported = 'fmt?',
kAudioConverterErr_OperationNotSupported = 0x6F703F3F,
// 'op??', integer used because of trigraph
kAudioConverterErr_PropertyNotSupported = 'prop',
kAudioConverterErr_InvalidInputSize = 'insz',
kAudioConverterErr_InvalidOutputSize = 'otsz',
// e.g. byte size is not a multiple of the frame size
kAudioConverterErr_UnspecifiedError = 'what',
kAudioConverterErr_BadPropertySizeError = '!siz',
kAudioConverterErr_RequiresPacketDescriptionsError = '!pkd',
kAudioConverterErr_InputSampleRateOutOfRange = '!isr',
kAudioConverterErr_OutputSampleRateOutOfRange = '!osr'
};
typedef OSStatus (*AudioConverterNew_t) (
const AudioStreamBasicDescription *inSourceFormat,
const AudioStreamBasicDescription *inDestinationFormat,
AudioConverterRef *outAudioConverter
);
typedef OSStatus (*AudioConverterDispose_t) (
AudioConverterRef inAudioConverter
);
typedef OSStatus (*AudioConverterReset_t) (
AudioConverterRef inAudioConverter
);
typedef OSStatus (*AudioConverterGetProperty_t) (
AudioConverterRef inAudioConverter,
AudioConverterPropertyID inPropertyID,
UInt32 *ioPropertyDataSize,
void *outPropertyData
);
typedef OSStatus (*AudioConverterGetPropertyInfo_t) (
AudioConverterRef inAudioConverter,
AudioConverterPropertyID inPropertyID,
UInt32 *outSize,
Boolean *outWritable
);
typedef OSStatus (*AudioConverterSetProperty_t) (
AudioConverterRef inAudioConverter,
AudioConverterPropertyID inPropertyID,
UInt32 inPropertyDataSize,
const void *inPropertyData
);
typedef OSStatus (*AudioConverterFillComplexBuffer_t) (
AudioConverterRef inAudioConverter,
AudioConverterComplexInputDataProc inInputDataProc,
void *inInputDataProcUserData,
UInt32 *ioOutputDataPacketSize,
AudioBufferList *outOutputData,
AudioStreamPacketDescription *outPacketDescription
);
typedef OSStatus (*AudioFormatGetProperty_t) (
AudioFormatPropertyID inPropertyID,
UInt32 inSpecifierSize,
const void *inSpecifier,
UInt32 *ioPropertyDataSize,
void *outPropertyData
);
typedef OSStatus (*AudioFormatGetPropertyInfo_t) (
AudioFormatPropertyID inPropertyID,
UInt32 inSpecifierSize,
const void *inSpecifier,
UInt32 *outPropertyDataSize
);
static AudioConverterNew_t AudioConverterNew = NULL;
static AudioConverterDispose_t AudioConverterDispose = NULL;
static AudioConverterReset_t AudioConverterReset = NULL;
static AudioConverterGetProperty_t AudioConverterGetProperty = NULL;
static AudioConverterGetPropertyInfo_t AudioConverterGetPropertyInfo = NULL;
static AudioConverterSetProperty_t AudioConverterSetProperty = NULL;
static AudioConverterFillComplexBuffer_t AudioConverterFillComplexBuffer = NULL;
static AudioFormatGetProperty_t AudioFormatGetProperty = NULL;
static AudioFormatGetPropertyInfo_t AudioFormatGetPropertyInfo = NULL;
static HMODULE audio_toolbox = NULL;
static void release_lib(void)
{
#define RELEASE_LIB(x) if (x) { \
FreeLibrary(x); \
x = NULL; \
}
RELEASE_LIB(audio_toolbox);
#undef RELEASE_LIB
}
static bool load_lib(void)
{
PWSTR common_path;
if (SHGetKnownFolderPath(FOLDERID_ProgramFilesCommon, 0, NULL,
&common_path) != S_OK) {
CA_LOG(LOG_WARNING, "Could not retrieve common files path");
return false;
}
struct dstr path = { 0 };
dstr_printf(&path, "%S\\Apple\\Apple Application Support", common_path);
CoTaskMemFree(common_path);
wchar_t *w_path = dstr_to_wcs(&path);
dstr_free(&path);
SetDllDirectory(w_path);
bfree(w_path);
#define LOAD_LIB(x, n) x = LoadLibrary(TEXT(n)); \
if (!x) \
CA_LOG(LOG_WARNING, "Failed loading library '" n "'");
LOAD_LIB(audio_toolbox, "CoreAudioToolbox.dll");
#undef LOAD_LIB
SetDllDirectory(NULL);
if (audio_toolbox)
return true;
release_lib();
return false;
}
static void unload_core_audio(void)
{
AudioConverterNew = NULL;
AudioConverterDispose = NULL;
AudioConverterReset = NULL;
AudioConverterGetProperty = NULL;
AudioConverterGetPropertyInfo = NULL;
AudioConverterSetProperty = NULL;
AudioConverterFillComplexBuffer = NULL;
AudioFormatGetProperty = NULL;
AudioFormatGetPropertyInfo = NULL;
release_lib();
}
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable: 4706)
#endif
static bool load_core_audio(void)
{
if (!load_lib())
return false;
#define LOAD_SYM_FROM_LIB(sym, lib, dll) \
if (!(sym = (sym ## _t)GetProcAddress(lib, #sym))) { \
DWORD err = GetLastError(); \
CA_LOG(LOG_ERROR, "Couldn't load " #sym " from " \
dll ": %lu (0x%lx)", err, err); \
goto unload_everything; \
}
#define LOAD_SYM(sym) \
LOAD_SYM_FROM_LIB(sym, audio_toolbox, "CoreAudioToolbox.dll")
LOAD_SYM(AudioConverterNew);
LOAD_SYM(AudioConverterDispose);
LOAD_SYM(AudioConverterReset);
LOAD_SYM(AudioConverterGetProperty);
LOAD_SYM(AudioConverterGetPropertyInfo);
LOAD_SYM(AudioConverterSetProperty);
LOAD_SYM(AudioConverterFillComplexBuffer);
LOAD_SYM(AudioFormatGetProperty);
LOAD_SYM(AudioFormatGetPropertyInfo);
#undef LOAD_SYM
return true;
unload_everything:
unload_core_audio();
return false;
}
#ifdef _MSC_VER
#pragma warning(pop)
#endif