windows-imports.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  1. #define WIN32_LEAN_AND_MEAN
  2. #include <windows.h>
  3. #include <ShlObj.h>
  4. #include <util/dstr.h>
  5. typedef unsigned long UInt32;
  6. typedef signed long SInt32;
  7. typedef signed long long SInt64;
  8. typedef double Float64;
  9. typedef SInt32 OSStatus;
  10. typedef unsigned char Boolean;
  11. typedef UInt32 AudioFormatPropertyID;
  12. enum {
  13. kVariableLengthArray = 1,
  14. };
  15. struct OpaqueAudioConverter;
  16. typedef struct OpaqueAudioConverter *AudioConverterRef;
  17. typedef UInt32 AudioConverterPropertyID;
  18. struct AudioValueRange {
  19. Float64 mMinimum;
  20. Float64 mMaximum;
  21. };
  22. typedef struct AudioValueRange AudioValueRange;
  23. struct AudioBuffer {
  24. UInt32 mNumberChannels;
  25. UInt32 mDataByteSize;
  26. void *mData;
  27. };
  28. typedef struct AudioBuffer AudioBuffer;
  29. struct AudioBufferList {
  30. UInt32 mNumberBuffers;
  31. AudioBuffer mBuffers[kVariableLengthArray];
  32. };
  33. typedef struct AudioBufferList AudioBufferList;
  34. struct AudioStreamBasicDescription {
  35. Float64 mSampleRate;
  36. UInt32 mFormatID;
  37. UInt32 mFormatFlags;
  38. UInt32 mBytesPerPacket;
  39. UInt32 mFramesPerPacket;
  40. UInt32 mBytesPerFrame;
  41. UInt32 mChannelsPerFrame;
  42. UInt32 mBitsPerChannel;
  43. UInt32 mReserved;
  44. };
  45. typedef struct AudioStreamBasicDescription AudioStreamBasicDescription;
  46. struct AudioStreamPacketDescription {
  47. SInt64 mStartOffset;
  48. UInt32 mVariableFramesInPacket;
  49. UInt32 mDataByteSize;
  50. };
  51. typedef struct AudioStreamPacketDescription AudioStreamPacketDescription;
  52. typedef UInt32 AudioChannelLabel;
  53. typedef UInt32 AudioChannelLayoutTag;
  54. struct AudioChannelDescription {
  55. AudioChannelLabel mChannelLabel;
  56. UInt32 mChannelFlags;
  57. float mCoordinates[3];
  58. };
  59. typedef struct AudioChannelDescription AudioChannelDescription;
  60. struct AudioChannelLayout {
  61. AudioChannelLayoutTag mChannelLayoutTag;
  62. UInt32 mChannelBitmap;
  63. UInt32 mNumberChannelDescriptions;
  64. AudioChannelDescription mChannelDescriptions[kVariableLengthArray];
  65. };
  66. typedef struct AudioChannelLayout AudioChannelLayout;
  67. struct AudioConverterPrimeInfo {
  68. UInt32 leadingFrames;
  69. UInt32 trailingFrames;
  70. };
  71. typedef struct AudioConverterPrimeInfo AudioConverterPrimeInfo;
  72. typedef OSStatus (*AudioConverterComplexInputDataProc)(
  73. AudioConverterRef inAudioConverter, UInt32 *ioNumberDataPackets,
  74. AudioBufferList *ioData,
  75. AudioStreamPacketDescription **outDataPacketDescription,
  76. void *inUserData);
  77. enum {
  78. kAudioCodecPropertyNameCFString = 'lnam',
  79. kAudioCodecPropertyManufacturerCFString = 'lmak',
  80. kAudioCodecPropertyFormatCFString = 'lfor',
  81. //kAudioCodecPropertyHasVariablePacketByteSizes = 'vpk?',
  82. kAudioCodecPropertySupportedInputFormats = 'ifm#',
  83. kAudioCodecPropertySupportedOutputFormats = 'ofm#',
  84. kAudioCodecPropertyAvailableInputSampleRates = 'aisr',
  85. kAudioCodecPropertyAvailableOutputSampleRates = 'aosr',
  86. kAudioCodecPropertyAvailableBitRateRange = 'abrt',
  87. kAudioCodecPropertyMinimumNumberInputPackets = 'mnip',
  88. kAudioCodecPropertyMinimumNumberOutputPackets = 'mnop',
  89. kAudioCodecPropertyAvailableNumberChannels = 'cmnc',
  90. kAudioCodecPropertyDoesSampleRateConversion = 'lmrc',
  91. kAudioCodecPropertyAvailableInputChannelLayoutTags = 'aicl',
  92. kAudioCodecPropertyAvailableOutputChannelLayoutTags = 'aocl',
  93. kAudioCodecPropertyInputFormatsForOutputFormat = 'if4o',
  94. kAudioCodecPropertyOutputFormatsForInputFormat = 'of4i',
  95. kAudioCodecPropertyFormatInfo = 'acfi',
  96. };
  97. enum {
  98. kAudioCodecPropertyInputBufferSize = 'tbuf',
  99. kAudioCodecPropertyPacketFrameSize = 'pakf',
  100. kAudioCodecPropertyMaximumPacketByteSize = 'pakb',
  101. kAudioCodecPropertyCurrentInputFormat = 'ifmt',
  102. kAudioCodecPropertyCurrentOutputFormat = 'ofmt',
  103. kAudioCodecPropertyMagicCookie = 'kuki',
  104. kAudioCodecPropertyUsedInputBufferSize = 'ubuf',
  105. kAudioCodecPropertyIsInitialized = 'init',
  106. kAudioCodecPropertyCurrentTargetBitRate = 'brat',
  107. kAudioCodecPropertyCurrentInputSampleRate = 'cisr',
  108. kAudioCodecPropertyCurrentOutputSampleRate = 'cosr',
  109. kAudioCodecPropertyQualitySetting = 'srcq',
  110. kAudioCodecPropertyApplicableBitRateRange = 'brta',
  111. kAudioCodecPropertyApplicableInputSampleRates = 'isra',
  112. kAudioCodecPropertyApplicableOutputSampleRates = 'osra',
  113. kAudioCodecPropertyPaddedZeros = 'pad0',
  114. kAudioCodecPropertyPrimeMethod = 'prmm',
  115. kAudioCodecPropertyPrimeInfo = 'prim',
  116. kAudioCodecPropertyCurrentInputChannelLayout = 'icl ',
  117. kAudioCodecPropertyCurrentOutputChannelLayout = 'ocl ',
  118. kAudioCodecPropertySettings = 'acs ',
  119. kAudioCodecPropertyFormatList = 'acfl',
  120. kAudioCodecPropertyBitRateControlMode = 'acbf',
  121. kAudioCodecPropertySoundQualityForVBR = 'vbrq',
  122. kAudioCodecPropertyMinimumDelayMode = 'mdel'
  123. };
  124. enum {
  125. kAudioCodecBitRateControlMode_Constant = 0,
  126. kAudioCodecBitRateControlMode_LongTermAverage = 1,
  127. kAudioCodecBitRateControlMode_VariableConstrained = 2,
  128. kAudioCodecBitRateControlMode_Variable = 3,
  129. };
  130. enum {
  131. kAudioFormatLinearPCM = 'lpcm',
  132. kAudioFormatAC3 = 'ac-3',
  133. kAudioFormat60958AC3 = 'cac3',
  134. kAudioFormatAppleIMA4 = 'ima4',
  135. kAudioFormatMPEG4AAC = 'aac ',
  136. kAudioFormatMPEG4CELP = 'celp',
  137. kAudioFormatMPEG4HVXC = 'hvxc',
  138. kAudioFormatMPEG4TwinVQ = 'twvq',
  139. kAudioFormatMACE3 = 'MAC3',
  140. kAudioFormatMACE6 = 'MAC6',
  141. kAudioFormatULaw = 'ulaw',
  142. kAudioFormatALaw = 'alaw',
  143. kAudioFormatQDesign = 'QDMC',
  144. kAudioFormatQDesign2 = 'QDM2',
  145. kAudioFormatQUALCOMM = 'Qclp',
  146. kAudioFormatMPEGLayer1 = '.mp1',
  147. kAudioFormatMPEGLayer2 = '.mp2',
  148. kAudioFormatMPEGLayer3 = '.mp3',
  149. kAudioFormatTimeCode = 'time',
  150. kAudioFormatMIDIStream = 'midi',
  151. kAudioFormatParameterValueStream = 'apvs',
  152. kAudioFormatAppleLossless = 'alac',
  153. kAudioFormatMPEG4AAC_HE = 'aach',
  154. kAudioFormatMPEG4AAC_LD = 'aacl',
  155. kAudioFormatMPEG4AAC_ELD = 'aace',
  156. kAudioFormatMPEG4AAC_ELD_SBR = 'aacf',
  157. kAudioFormatMPEG4AAC_ELD_V2 = 'aacg',
  158. kAudioFormatMPEG4AAC_HE_V2 = 'aacp',
  159. kAudioFormatMPEG4AAC_Spatial = 'aacs',
  160. kAudioFormatAMR = 'samr',
  161. kAudioFormatAudible = 'AUDB',
  162. kAudioFormatiLBC = 'ilbc',
  163. kAudioFormatDVIIntelIMA = 0x6D730011,
  164. kAudioFormatMicrosoftGSM = 0x6D730031,
  165. kAudioFormatAES3 = 'aes3',
  166. };
  167. enum {
  168. kAudioFormatFlagIsFloat = (1L << 0),
  169. kAudioFormatFlagIsBigEndian = (1L << 1),
  170. kAudioFormatFlagIsSignedInteger = (1L << 2),
  171. kAudioFormatFlagIsPacked = (1L << 3),
  172. kAudioFormatFlagIsAlignedHigh = (1L << 4),
  173. kAudioFormatFlagIsNonInterleaved = (1L << 5),
  174. kAudioFormatFlagIsNonMixable = (1L << 6),
  175. kAudioFormatFlagsAreAllClear = (1L << 31),
  176. kLinearPCMFormatFlagIsFloat = kAudioFormatFlagIsFloat,
  177. kLinearPCMFormatFlagIsBigEndian = kAudioFormatFlagIsBigEndian,
  178. kLinearPCMFormatFlagIsSignedInteger = kAudioFormatFlagIsSignedInteger,
  179. kLinearPCMFormatFlagIsPacked = kAudioFormatFlagIsPacked,
  180. kLinearPCMFormatFlagIsAlignedHigh = kAudioFormatFlagIsAlignedHigh,
  181. kLinearPCMFormatFlagIsNonInterleaved = kAudioFormatFlagIsNonInterleaved,
  182. kLinearPCMFormatFlagIsNonMixable = kAudioFormatFlagIsNonMixable,
  183. kLinearPCMFormatFlagsAreAllClear = kAudioFormatFlagsAreAllClear,
  184. kAppleLosslessFormatFlag_16BitSourceData = 1,
  185. kAppleLosslessFormatFlag_20BitSourceData = 2,
  186. kAppleLosslessFormatFlag_24BitSourceData = 3,
  187. kAppleLosslessFormatFlag_32BitSourceData = 4,
  188. };
  189. enum { kAudioFormatFlagsNativeEndian = 0 };
  190. enum {
  191. // AudioStreamBasicDescription structure properties
  192. kAudioFormatProperty_FormatInfo = 'fmti',
  193. kAudioFormatProperty_FormatName = 'fnam',
  194. kAudioFormatProperty_EncodeFormatIDs = 'acof',
  195. kAudioFormatProperty_DecodeFormatIDs = 'acif',
  196. kAudioFormatProperty_FormatList = 'flst',
  197. kAudioFormatProperty_ASBDFromESDS = 'essd',
  198. kAudioFormatProperty_ChannelLayoutFromESDS = 'escl',
  199. kAudioFormatProperty_OutputFormatList = 'ofls',
  200. kAudioFormatProperty_Encoders = 'aven',
  201. kAudioFormatProperty_Decoders = 'avde',
  202. kAudioFormatProperty_FormatIsVBR = 'fvbr',
  203. kAudioFormatProperty_FormatIsExternallyFramed = 'fexf',
  204. kAudioFormatProperty_AvailableEncodeBitRates = 'aebr',
  205. kAudioFormatProperty_AvailableEncodeSampleRates = 'aesr',
  206. kAudioFormatProperty_AvailableEncodeChannelLayoutTags = 'aecl',
  207. kAudioFormatProperty_AvailableEncodeNumberChannels = 'avnc',
  208. kAudioFormatProperty_ASBDFromMPEGPacket = 'admp',
  209. //
  210. // AudioChannelLayout structure properties
  211. kAudioFormatProperty_BitmapForLayoutTag = 'bmtg',
  212. kAudioFormatProperty_MatrixMixMap = 'mmap',
  213. kAudioFormatProperty_ChannelMap = 'chmp',
  214. kAudioFormatProperty_NumberOfChannelsForLayout = 'nchm',
  215. kAudioFormatProperty_ValidateChannelLayout = 'vacl',
  216. kAudioFormatProperty_ChannelLayoutForTag = 'cmpl',
  217. kAudioFormatProperty_TagForChannelLayout = 'cmpt',
  218. kAudioFormatProperty_ChannelLayoutName = 'lonm',
  219. kAudioFormatProperty_ChannelLayoutSimpleName = 'lsnm',
  220. kAudioFormatProperty_ChannelLayoutForBitmap = 'cmpb',
  221. kAudioFormatProperty_ChannelName = 'cnam',
  222. kAudioFormatProperty_ChannelShortName = 'csnm',
  223. kAudioFormatProperty_TagsForNumberOfChannels = 'tagc',
  224. kAudioFormatProperty_PanningMatrix = 'panm',
  225. kAudioFormatProperty_BalanceFade = 'balf',
  226. //
  227. // ID3 tag (MP3 metadata) properties
  228. kAudioFormatProperty_ID3TagSize = 'id3s',
  229. kAudioFormatProperty_ID3TagToDictionary = 'id3d',
  230. };
  231. enum {
  232. kAudioConverterPropertyMinimumInputBufferSize = 'mibs',
  233. kAudioConverterPropertyMinimumOutputBufferSize = 'mobs',
  234. kAudioConverterPropertyMaximumInputBufferSize = 'xibs',
  235. kAudioConverterPropertyMaximumInputPacketSize = 'xips',
  236. kAudioConverterPropertyMaximumOutputPacketSize = 'xops',
  237. kAudioConverterPropertyCalculateInputBufferSize = 'cibs',
  238. kAudioConverterPropertyCalculateOutputBufferSize = 'cobs',
  239. kAudioConverterPropertyInputCodecParameters = 'icdp',
  240. kAudioConverterPropertyOutputCodecParameters = 'ocdp',
  241. kAudioConverterSampleRateConverterAlgorithm = 'srci',
  242. kAudioConverterSampleRateConverterComplexity = 'srca',
  243. kAudioConverterSampleRateConverterQuality = 'srcq',
  244. kAudioConverterSampleRateConverterInitialPhase = 'srcp',
  245. kAudioConverterCodecQuality = 'cdqu',
  246. kAudioConverterPrimeMethod = 'prmm',
  247. kAudioConverterPrimeInfo = 'prim',
  248. kAudioConverterChannelMap = 'chmp',
  249. kAudioConverterDecompressionMagicCookie = 'dmgc',
  250. kAudioConverterCompressionMagicCookie = 'cmgc',
  251. kAudioConverterEncodeBitRate = 'brat',
  252. kAudioConverterEncodeAdjustableSampleRate = 'ajsr',
  253. kAudioConverterInputChannelLayout = 'icl ',
  254. kAudioConverterOutputChannelLayout = 'ocl ',
  255. kAudioConverterApplicableEncodeBitRates = 'aebr',
  256. kAudioConverterAvailableEncodeBitRates = 'vebr',
  257. kAudioConverterApplicableEncodeSampleRates = 'aesr',
  258. kAudioConverterAvailableEncodeSampleRates = 'vesr',
  259. kAudioConverterAvailableEncodeChannelLayoutTags = 'aecl',
  260. kAudioConverterCurrentOutputStreamDescription = 'acod',
  261. kAudioConverterCurrentInputStreamDescription = 'acid',
  262. kAudioConverterPropertySettings = 'acps',
  263. kAudioConverterPropertyBitDepthHint = 'acbd',
  264. kAudioConverterPropertyFormatList = 'flst',
  265. };
  266. enum {
  267. kAudioConverterQuality_Max = 0x7F,
  268. kAudioConverterQuality_High = 0x60,
  269. kAudioConverterQuality_Medium = 0x40,
  270. kAudioConverterQuality_Low = 0x20,
  271. kAudioConverterQuality_Min = 0,
  272. };
  273. enum {
  274. kAudio_UnimplementedError = -4,
  275. kAudio_FileNotFoundError = -43,
  276. kAudio_FilePermissionError = -54,
  277. kAudio_TooManyFilesOpenError = -42,
  278. kAudio_BadFilePathError = '!pth', // 0x21707468, 561017960
  279. kAudio_ParamError = -50,
  280. kAudio_MemFullError = -108,
  281. kAudioConverterErr_FormatNotSupported = 'fmt?',
  282. kAudioConverterErr_OperationNotSupported = 0x6F703F3F,
  283. // 'op??', integer used because of trigraph
  284. kAudioConverterErr_PropertyNotSupported = 'prop',
  285. kAudioConverterErr_InvalidInputSize = 'insz',
  286. kAudioConverterErr_InvalidOutputSize = 'otsz',
  287. // e.g. byte size is not a multiple of the frame size
  288. kAudioConverterErr_UnspecifiedError = 'what',
  289. kAudioConverterErr_BadPropertySizeError = '!siz',
  290. kAudioConverterErr_RequiresPacketDescriptionsError = '!pkd',
  291. kAudioConverterErr_InputSampleRateOutOfRange = '!isr',
  292. kAudioConverterErr_OutputSampleRateOutOfRange = '!osr',
  293. };
  294. typedef OSStatus (*AudioConverterNew_t)(
  295. const AudioStreamBasicDescription *inSourceFormat,
  296. const AudioStreamBasicDescription *inDestinationFormat,
  297. AudioConverterRef *outAudioConverter);
  298. typedef OSStatus (*AudioConverterDispose_t)(AudioConverterRef inAudioConverter);
  299. typedef OSStatus (*AudioConverterReset_t)(AudioConverterRef inAudioConverter);
  300. typedef OSStatus (*AudioConverterGetProperty_t)(
  301. AudioConverterRef inAudioConverter,
  302. AudioConverterPropertyID inPropertyID, UInt32 *ioPropertyDataSize,
  303. void *outPropertyData);
  304. typedef OSStatus (*AudioConverterGetPropertyInfo_t)(
  305. AudioConverterRef inAudioConverter,
  306. AudioConverterPropertyID inPropertyID, UInt32 *outSize,
  307. Boolean *outWritable);
  308. typedef OSStatus (*AudioConverterSetProperty_t)(
  309. AudioConverterRef inAudioConverter,
  310. AudioConverterPropertyID inPropertyID, UInt32 inPropertyDataSize,
  311. const void *inPropertyData);
  312. typedef OSStatus (*AudioConverterFillComplexBuffer_t)(
  313. AudioConverterRef inAudioConverter,
  314. AudioConverterComplexInputDataProc inInputDataProc,
  315. void *inInputDataProcUserData, UInt32 *ioOutputDataPacketSize,
  316. AudioBufferList *outOutputData,
  317. AudioStreamPacketDescription *outPacketDescription);
  318. typedef OSStatus (*AudioFormatGetProperty_t)(AudioFormatPropertyID inPropertyID,
  319. UInt32 inSpecifierSize,
  320. const void *inSpecifier,
  321. UInt32 *ioPropertyDataSize,
  322. void *outPropertyData);
  323. typedef OSStatus (*AudioFormatGetPropertyInfo_t)(
  324. AudioFormatPropertyID inPropertyID, UInt32 inSpecifierSize,
  325. const void *inSpecifier, UInt32 *outPropertyDataSize);
  326. static AudioConverterNew_t AudioConverterNew = NULL;
  327. static AudioConverterDispose_t AudioConverterDispose = NULL;
  328. static AudioConverterReset_t AudioConverterReset = NULL;
  329. static AudioConverterGetProperty_t AudioConverterGetProperty = NULL;
  330. static AudioConverterGetPropertyInfo_t AudioConverterGetPropertyInfo = NULL;
  331. static AudioConverterSetProperty_t AudioConverterSetProperty = NULL;
  332. static AudioConverterFillComplexBuffer_t AudioConverterFillComplexBuffer = NULL;
  333. static AudioFormatGetProperty_t AudioFormatGetProperty = NULL;
  334. static AudioFormatGetPropertyInfo_t AudioFormatGetPropertyInfo = NULL;
  335. static HMODULE audio_toolbox = NULL;
  336. static void release_lib(void)
  337. {
  338. if (audio_toolbox) {
  339. FreeLibrary(audio_toolbox);
  340. audio_toolbox = NULL;
  341. }
  342. }
  343. static bool load_from_shell_path(REFKNOWNFOLDERID rfid, const wchar_t *subpath)
  344. {
  345. wchar_t *sh_path;
  346. if (SHGetKnownFolderPath(rfid, 0, NULL, &sh_path) != S_OK) {
  347. CA_LOG(LOG_WARNING, "Could not retrieve shell path");
  348. return false;
  349. }
  350. wchar_t path[MAX_PATH];
  351. _snwprintf(path, MAX_PATH, L"%s\\%s", sh_path, subpath);
  352. CoTaskMemFree(sh_path);
  353. SetDllDirectory(path);
  354. audio_toolbox = LoadLibraryW(L"CoreAudioToolbox.dll");
  355. SetDllDirectory(nullptr);
  356. return !!audio_toolbox;
  357. }
  358. static bool load_lib(void)
  359. {
  360. /* -------------------------------------------- */
  361. /* attempt to load from path */
  362. audio_toolbox = LoadLibraryW(L"CoreAudioToolbox.dll");
  363. if (!!audio_toolbox)
  364. return true;
  365. /* -------------------------------------------- */
  366. /* attempt to load from known install locations */
  367. struct path_list_t {
  368. REFKNOWNFOLDERID rfid;
  369. const wchar_t *subpath;
  370. };
  371. path_list_t path_list[] = {
  372. {FOLDERID_ProgramFilesCommon,
  373. L"Apple\\Apple Application Support"},
  374. {FOLDERID_ProgramFiles, L"iTunes"},
  375. };
  376. for (auto &val : path_list) {
  377. if (load_from_shell_path(val.rfid, val.subpath)) {
  378. return true;
  379. }
  380. }
  381. return false;
  382. }
  383. static void unload_core_audio(void)
  384. {
  385. AudioConverterNew = NULL;
  386. AudioConverterDispose = NULL;
  387. AudioConverterReset = NULL;
  388. AudioConverterGetProperty = NULL;
  389. AudioConverterGetPropertyInfo = NULL;
  390. AudioConverterSetProperty = NULL;
  391. AudioConverterFillComplexBuffer = NULL;
  392. AudioFormatGetProperty = NULL;
  393. AudioFormatGetPropertyInfo = NULL;
  394. release_lib();
  395. }
  396. #ifdef _MSC_VER
  397. #pragma warning(push)
  398. #pragma warning(disable : 4706)
  399. #endif
  400. static bool load_core_audio(void)
  401. {
  402. if (!load_lib())
  403. return false;
  404. #define LOAD_SYM_FROM_LIB(sym, lib, dll) \
  405. if (!(sym = (sym##_t)GetProcAddress(lib, #sym))) { \
  406. DWORD err = GetLastError(); \
  407. CA_LOG(LOG_ERROR, \
  408. "Couldn't load " #sym " from " dll ": %lu (0x%lx)", \
  409. err, err); \
  410. goto unload_everything; \
  411. }
  412. #define LOAD_SYM(sym) \
  413. LOAD_SYM_FROM_LIB(sym, audio_toolbox, "CoreAudioToolbox.dll")
  414. LOAD_SYM(AudioConverterNew);
  415. LOAD_SYM(AudioConverterDispose);
  416. LOAD_SYM(AudioConverterReset);
  417. LOAD_SYM(AudioConverterGetProperty);
  418. LOAD_SYM(AudioConverterGetPropertyInfo);
  419. LOAD_SYM(AudioConverterSetProperty);
  420. LOAD_SYM(AudioConverterFillComplexBuffer);
  421. LOAD_SYM(AudioFormatGetProperty);
  422. LOAD_SYM(AudioFormatGetPropertyInfo);
  423. #undef LOAD_SYM
  424. return true;
  425. unload_everything:
  426. unload_core_audio();
  427. return false;
  428. }
  429. #ifdef _MSC_VER
  430. #pragma warning(pop)
  431. #endif