PXR_Audio_Spatializer_API.cs 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254
  1. // Copyright © 2015-2022 Pico Technology Co., Ltd. All Rights Reserved.
  2. using System;
  3. using System.Runtime.InteropServices;
  4. using UnityEngine;
  5. namespace PXR_Audio
  6. {
  7. namespace Spatializer
  8. {
  9. public abstract class Api
  10. {
  11. public abstract string GetVersion(ref int major, ref int minor, ref int patch);
  12. public abstract Result CreateContext(ref IntPtr ctx, RenderingMode mode, uint framesPerBuffer,
  13. uint sampleRate);
  14. public abstract Result InitializeContext(IntPtr ctx);
  15. public abstract Result SubmitMesh(
  16. IntPtr ctx,
  17. float[] vertices,
  18. int verticesCount,
  19. int[] indices,
  20. int indicesCount,
  21. AcousticsMaterial material,
  22. ref int geometryId);
  23. public abstract Result SubmitMeshAndMaterialFactor(
  24. IntPtr ctx,
  25. float[] vertices,
  26. int verticesCount,
  27. int[] indices,
  28. int indicesCount,
  29. float[] absorptionFactor,
  30. float scatteringFactor,
  31. float transmissionFactor,
  32. ref int geometryId);
  33. public abstract Result SubmitMeshWithConfig(
  34. IntPtr ctx,
  35. float[] vertices,
  36. int verticesCount,
  37. int[] indices,
  38. int indicesCount,
  39. ref MeshConfig config,
  40. ref int geometryId);
  41. public abstract Result RemoveMesh(IntPtr ctx, int geometryId);
  42. public abstract Result SetMeshConfig(
  43. IntPtr ctx,
  44. int geometryId,
  45. ref MeshConfig config,
  46. uint propertyMask);
  47. public abstract Result GetAbsorptionFactor(
  48. AcousticsMaterial material,
  49. float[] absorptionFactor);
  50. public abstract Result GetScatteringFactor(
  51. AcousticsMaterial material,
  52. ref float scatteringFactor);
  53. public abstract Result GetTransmissionFactor(
  54. AcousticsMaterial material,
  55. ref float transmissionFactor);
  56. public abstract Result CommitScene(IntPtr ctx);
  57. public abstract Result AddSource(
  58. IntPtr ctx,
  59. SourceMode sourceMode,
  60. float[] position,
  61. ref int sourceId,
  62. bool isAsync);
  63. public abstract Result AddSourceWithOrientation(
  64. IntPtr ctx,
  65. SourceMode mode,
  66. float[] position,
  67. float[] front,
  68. float[] up,
  69. float radius,
  70. ref int sourceId,
  71. bool isAsync);
  72. public abstract Result AddSourceWithConfig(
  73. IntPtr ctx,
  74. ref SourceConfig sourceConfig,
  75. ref int sourceId,
  76. bool isAsync);
  77. public abstract Result SetSourceConfig(IntPtr ctx, int sourceId, ref SourceConfig sourceConfig,
  78. uint propertyMask);
  79. public abstract Result SetSourceAttenuationMode(
  80. IntPtr ctx,
  81. int sourceId,
  82. SourceAttenuationMode mode,
  83. DistanceAttenuationCallback directDistanceAttenuationCallback,
  84. DistanceAttenuationCallback indirectDistanceAttenuationCallback);
  85. public abstract Result SetSourceRange(IntPtr ctx, int sourceId, float rangeMin, float rangeMax);
  86. public abstract Result RemoveSource(IntPtr ctx, int sourceId);
  87. public abstract Result SubmitSourceBuffer(
  88. IntPtr ctx,
  89. int sourceId,
  90. float[] inputBufferPtr,
  91. uint numFrames);
  92. public abstract Result SubmitAmbisonicChannelBuffer(
  93. IntPtr ctx,
  94. float[] ambisonicChannelBuffer,
  95. int order,
  96. int degree,
  97. AmbisonicNormalizationType normType,
  98. float gain);
  99. public abstract Result SubmitInterleavedAmbisonicBuffer(
  100. IntPtr ctx,
  101. float[] ambisonicBuffer,
  102. int ambisonicOrder,
  103. AmbisonicNormalizationType normType,
  104. float gain);
  105. public abstract Result SubmitMatrixInputBuffer(
  106. IntPtr ctx,
  107. float[] inputBuffer,
  108. int inputChannelIndex);
  109. public abstract Result GetInterleavedBinauralBuffer(
  110. IntPtr ctx,
  111. float[] outputBufferPtr,
  112. uint numFrames,
  113. bool isAccumulative);
  114. public abstract Result GetPlanarBinauralBuffer(
  115. IntPtr ctx,
  116. float[][] outputBufferPtr,
  117. uint numFrames,
  118. bool isAccumulative);
  119. public abstract Result GetInterleavedLoudspeakersBuffer(
  120. IntPtr ctx,
  121. float[] outputBufferPtr,
  122. uint numFrames);
  123. public abstract Result GetPlanarLoudspeakersBuffer(
  124. IntPtr ctx,
  125. float[][] outputBufferPtr,
  126. uint numFrames);
  127. public abstract Result UpdateScene(IntPtr ctx);
  128. public abstract Result SetDopplerEffect(IntPtr ctx, int sourceId, bool on);
  129. public abstract Result SetPlaybackMode(IntPtr ctx, PlaybackMode playbackMode);
  130. public abstract Result SetLoudspeakerArray(
  131. IntPtr ctx,
  132. float[] positions,
  133. int numLoudspeakers);
  134. public abstract Result SetMappingMatrix(
  135. IntPtr ctx,
  136. float[] matrix,
  137. int numInputChannels,
  138. int numOutputChannels);
  139. public abstract Result SetListenerPosition(
  140. IntPtr ctx,
  141. float[] position);
  142. public abstract Result SetListenerOrientation(
  143. IntPtr ctx,
  144. float[] front,
  145. float[] up);
  146. public abstract Result SetListenerPose(
  147. IntPtr ctx,
  148. float[] position,
  149. float[] front,
  150. float[] up);
  151. public abstract Result SetSourcePosition(
  152. IntPtr ctx,
  153. int sourceId,
  154. float[] position);
  155. public abstract Result SetSourceGain(
  156. IntPtr ctx,
  157. int sourceId,
  158. float gain);
  159. public abstract Result SetSourceSize(
  160. IntPtr ctx,
  161. int sourceId,
  162. float volumetricSize);
  163. public abstract Result UpdateSourceMode(
  164. IntPtr ctx,
  165. int sourceId,
  166. SourceMode mode);
  167. public abstract Result Destroy(IntPtr ctx);
  168. }
  169. public class ApiUnityImpl : Api
  170. {
  171. #if (UNITY_IPHONE || UNITY_WEBGL) && !UNITY_EDITOR
  172. private static string DLLNAME = "__Internal";
  173. #else
  174. private const string DLLNAME = "PicoSpatializer";
  175. #endif
  176. [DllImport(DLLNAME, EntryPoint = "yggdrasil_get_version")]
  177. private static extern string GetVersionImport(ref int major, ref int minor, ref int patch);
  178. public override string GetVersion(ref int major, ref int minor, ref int patch)
  179. {
  180. return GetVersionImport(ref major, ref minor, ref patch);
  181. }
  182. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_create_context")]
  183. private static extern Result CreateContextImport(
  184. ref IntPtr ctx,
  185. RenderingMode mode,
  186. uint framesPerBuffer,
  187. uint sampleRate);
  188. public override Result
  189. CreateContext(
  190. ref IntPtr ctx,
  191. RenderingMode mode,
  192. uint framesPerBuffer,
  193. uint sampleRate
  194. )
  195. {
  196. return CreateContextImport(ref ctx, mode, framesPerBuffer, sampleRate);
  197. }
  198. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_initialize_context")]
  199. private static extern Result InitializeContextImport(IntPtr ctx);
  200. public override Result InitializeContext(IntPtr ctx)
  201. {
  202. return InitializeContextImport(ctx);
  203. }
  204. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_submit_mesh")]
  205. private static extern Result SubmitMeshImport(
  206. IntPtr ctx,
  207. float[] vertices,
  208. int verticesCount,
  209. int[] indices,
  210. int indicesCount,
  211. AcousticsMaterial material,
  212. ref int geometryId);
  213. public override Result SubmitMesh(
  214. IntPtr ctx,
  215. float[] vertices,
  216. int verticesCount,
  217. int[] indices,
  218. int indicesCount,
  219. AcousticsMaterial material,
  220. ref int geometryId
  221. )
  222. {
  223. return SubmitMeshImport(ctx, vertices, verticesCount, indices, indicesCount, material, ref geometryId);
  224. }
  225. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_submit_mesh_and_material_factor")]
  226. private static extern Result SubmitMeshAndMaterialFactorImport(
  227. IntPtr ctx,
  228. float[] vertices,
  229. int verticesCount,
  230. int[] indices,
  231. int indicesCount,
  232. float[] absorptionFactor,
  233. float scatteringFactor,
  234. float transmissionFactor,
  235. ref int geometryId);
  236. public override Result SubmitMeshAndMaterialFactor(
  237. IntPtr ctx,
  238. float[] vertices,
  239. int verticesCount,
  240. int[] indices,
  241. int indicesCount,
  242. float[] absorptionFactor,
  243. float scatteringFactor,
  244. float transmissionFactor,
  245. ref int geometryId)
  246. {
  247. return SubmitMeshAndMaterialFactorImport(ctx, vertices, verticesCount, indices, indicesCount,
  248. absorptionFactor, scatteringFactor, transmissionFactor, ref geometryId);
  249. }
  250. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_submit_mesh_with_config")]
  251. private static extern Result SubmitMeshWithConfigImport(IntPtr ctx, float[] vertices, int verticesCount,
  252. int[] indices,
  253. int indicesCount,
  254. ref MeshConfig config, ref int geometryId);
  255. public override Result SubmitMeshWithConfig(IntPtr ctx, float[] vertices, int verticesCount, int[] indices,
  256. int indicesCount,
  257. ref MeshConfig config, ref int geometryId)
  258. {
  259. return SubmitMeshWithConfigImport(ctx, vertices, verticesCount, indices, indicesCount, ref config,
  260. ref geometryId);
  261. }
  262. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_remove_mesh")]
  263. private static extern Result RemoveMeshImport(IntPtr ctx, int geometryId);
  264. public override Result RemoveMesh(IntPtr ctx, int geometryId)
  265. {
  266. return RemoveMeshImport(ctx, geometryId);
  267. }
  268. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_set_mesh_config")]
  269. private static extern Result SetMeshConfigImport(IntPtr ctx, int geometryId, ref MeshConfig config,
  270. uint propertyMask);
  271. public override Result SetMeshConfig(IntPtr ctx, int geometryId, ref MeshConfig config, uint propertyMask)
  272. {
  273. return SetMeshConfigImport(ctx, geometryId, ref config, propertyMask);
  274. }
  275. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_get_absorption_factor")]
  276. private static extern Result GetAbsorptionFactorImport(
  277. AcousticsMaterial material,
  278. float[] absorptionFactor);
  279. public override Result GetAbsorptionFactor(
  280. AcousticsMaterial material,
  281. float[] absorptionFactor
  282. )
  283. {
  284. return GetAbsorptionFactorImport(material, absorptionFactor);
  285. }
  286. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_get_scattering_factor")]
  287. private static extern Result GetScatteringFactorImport(
  288. AcousticsMaterial material,
  289. ref float scatteringFactor);
  290. public override Result GetScatteringFactor(
  291. AcousticsMaterial material,
  292. ref float scatteringFactor
  293. )
  294. {
  295. return GetScatteringFactorImport(material, ref scatteringFactor);
  296. }
  297. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_get_transmission_factor")]
  298. private static extern Result GetTransmissionFactorImport(
  299. AcousticsMaterial material,
  300. ref float transmissionFactor);
  301. public override Result GetTransmissionFactor(
  302. AcousticsMaterial material,
  303. ref float transmissionFactor
  304. )
  305. {
  306. return GetTransmissionFactorImport(material, ref transmissionFactor);
  307. }
  308. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_commit_scene")]
  309. private static extern Result CommitSceneImport(IntPtr ctx);
  310. public override Result CommitScene(IntPtr ctx)
  311. {
  312. return CommitSceneImport(ctx);
  313. }
  314. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_add_source")]
  315. private static extern Result AddSourceImport(
  316. IntPtr ctx,
  317. SourceMode sourceMode,
  318. float[] position,
  319. ref int sourceId,
  320. bool isAsync);
  321. public override Result AddSource(
  322. IntPtr ctx,
  323. SourceMode sourceMode,
  324. float[] position,
  325. ref int sourceId,
  326. bool isAsync
  327. )
  328. {
  329. return AddSourceImport(ctx, sourceMode, position, ref sourceId, isAsync);
  330. }
  331. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_add_source_with_orientation")]
  332. private static extern Result AddSourceWithOrientationImport(
  333. IntPtr ctx,
  334. SourceMode mode,
  335. float[] position,
  336. float[] front,
  337. float[] up,
  338. float radius,
  339. ref int sourceId,
  340. bool isAsync);
  341. public override Result AddSourceWithOrientation(
  342. IntPtr ctx,
  343. SourceMode mode,
  344. float[] position,
  345. float[] front,
  346. float[] up,
  347. float radius,
  348. ref int sourceId,
  349. bool isAsync
  350. )
  351. {
  352. return AddSourceWithOrientationImport(ctx, mode, position, front, up, radius, ref sourceId, isAsync);
  353. }
  354. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_add_source_with_config")]
  355. private static extern Result AddSourceWithConfigImport(
  356. IntPtr ctx,
  357. ref SourceConfig sourceConfig,
  358. ref int sourceId,
  359. bool isAsync);
  360. public override Result AddSourceWithConfig(
  361. IntPtr ctx,
  362. ref SourceConfig sourceConfig,
  363. ref int sourceId,
  364. bool isAsync
  365. )
  366. {
  367. return AddSourceWithConfigImport(ctx, ref sourceConfig, ref sourceId, isAsync);
  368. }
  369. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_set_source_config")]
  370. private static extern Result SetSourceConfigImport(IntPtr ctx, int sourceId, ref SourceConfig sourceConfig,
  371. uint propertyMask);
  372. public override Result SetSourceConfig(IntPtr ctx, int sourceId, ref SourceConfig sourceConfig,
  373. uint propertyMask)
  374. {
  375. return SetSourceConfigImport(ctx, sourceId, ref sourceConfig, propertyMask);
  376. }
  377. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_set_source_attenuation_mode")]
  378. private static extern Result SetSourceAttenuationModeImport(IntPtr ctx,
  379. int sourceId,
  380. SourceAttenuationMode mode,
  381. DistanceAttenuationCallback directDistanceAttenuationCallback,
  382. DistanceAttenuationCallback indirectDistanceAttenuationCallback);
  383. public override Result SetSourceAttenuationMode(
  384. IntPtr ctx,
  385. int sourceId,
  386. SourceAttenuationMode mode,
  387. DistanceAttenuationCallback directDistanceAttenuationCallback,
  388. DistanceAttenuationCallback indirectDistanceAttenuationCallback
  389. )
  390. {
  391. return SetSourceAttenuationModeImport(ctx, sourceId, mode, directDistanceAttenuationCallback,
  392. indirectDistanceAttenuationCallback);
  393. }
  394. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_set_source_range")]
  395. private static extern Result SetSourceRangeImport(IntPtr ctx, int sourceId, float rangeMin, float rangeMax);
  396. public override Result SetSourceRange(IntPtr ctx, int sourceId, float rangeMin, float rangeMax)
  397. {
  398. return SetSourceRangeImport(ctx, sourceId, rangeMin, rangeMax);
  399. }
  400. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_remove_source")]
  401. private static extern Result RemoveSourceImport(IntPtr ctx, int sourceId, bool is_async);
  402. public override Result RemoveSource(IntPtr ctx, int sourceId)
  403. {
  404. return RemoveSourceImport(ctx, sourceId, true);
  405. }
  406. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_submit_source_buffer")]
  407. private static extern Result SubmitSourceBufferImport(
  408. IntPtr ctx,
  409. int sourceId,
  410. float[] inputBufferPtr,
  411. uint numFrames);
  412. public override Result SubmitSourceBuffer(
  413. IntPtr ctx,
  414. int sourceId,
  415. float[] inputBufferPtr,
  416. uint numFrames
  417. )
  418. {
  419. return SubmitSourceBufferImport(ctx, sourceId, inputBufferPtr, numFrames);
  420. }
  421. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_submit_ambisonic_channel_buffer")]
  422. private static extern Result SubmitAmbisonicChannelBufferImport(
  423. IntPtr ctx,
  424. float[] ambisonicChannelBuffer,
  425. int order,
  426. int degree,
  427. AmbisonicNormalizationType normType,
  428. float gain);
  429. public override Result SubmitAmbisonicChannelBuffer(
  430. IntPtr ctx,
  431. float[] ambisonicChannelBuffer,
  432. int order,
  433. int degree,
  434. AmbisonicNormalizationType normType,
  435. float gain
  436. )
  437. {
  438. return SubmitAmbisonicChannelBufferImport(ctx, ambisonicChannelBuffer, order, degree, normType, gain);
  439. }
  440. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_submit_interleaved_ambisonic_buffer")]
  441. private static extern Result SubmitInterleavedAmbisonicBufferImport(
  442. IntPtr ctx,
  443. float[] ambisonicBuffer,
  444. int ambisonicOrder,
  445. AmbisonicNormalizationType normType,
  446. float gain);
  447. public override Result SubmitInterleavedAmbisonicBuffer(
  448. IntPtr ctx,
  449. float[] ambisonicBuffer,
  450. int ambisonicOrder,
  451. AmbisonicNormalizationType normType,
  452. float gain
  453. )
  454. {
  455. return SubmitInterleavedAmbisonicBufferImport(ctx, ambisonicBuffer, ambisonicOrder, normType, gain);
  456. }
  457. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_submit_matrix_input_buffer")]
  458. private static extern Result SubmitMatrixInputBufferImport(
  459. IntPtr ctx,
  460. float[] inputBuffer,
  461. int inputChannelIndex);
  462. public override Result SubmitMatrixInputBuffer(
  463. IntPtr ctx,
  464. float[] inputBuffer,
  465. int inputChannelIndex
  466. )
  467. {
  468. return SubmitMatrixInputBufferImport(ctx, inputBuffer, inputChannelIndex);
  469. }
  470. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_get_interleaved_binaural_buffer")]
  471. private static extern Result GetInterleavedBinauralBufferImport(
  472. IntPtr ctx,
  473. float[] outputBufferPtr,
  474. uint numFrames,
  475. bool isAccumulative);
  476. public override Result GetInterleavedBinauralBuffer(
  477. IntPtr ctx,
  478. float[] outputBufferPtr,
  479. uint numFrames,
  480. bool isAccumulative
  481. )
  482. {
  483. return GetInterleavedBinauralBufferImport(ctx, outputBufferPtr, numFrames, isAccumulative);
  484. }
  485. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_get_planar_binaural_buffer")]
  486. private static extern Result GetPlanarBinauralBufferImport(
  487. IntPtr ctx,
  488. float[][] outputBufferPtr,
  489. uint numFrames,
  490. bool isAccumulative);
  491. public override Result GetPlanarBinauralBuffer(
  492. IntPtr ctx,
  493. float[][] outputBufferPtr,
  494. uint numFrames,
  495. bool isAccumulative
  496. )
  497. {
  498. return GetPlanarBinauralBufferImport(ctx, outputBufferPtr, numFrames, isAccumulative);
  499. }
  500. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_get_interleaved_loudspeakers_buffer")]
  501. private static extern Result GetInterleavedLoudspeakersBufferImport(
  502. IntPtr ctx,
  503. float[] outputBufferPtr,
  504. uint numFrames);
  505. public override Result GetInterleavedLoudspeakersBuffer(
  506. IntPtr ctx,
  507. float[] outputBufferPtr,
  508. uint numFrames
  509. )
  510. {
  511. return GetInterleavedLoudspeakersBufferImport(ctx, outputBufferPtr, numFrames);
  512. }
  513. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_get_planar_loudspeakers_buffer")]
  514. private static extern Result GetPlanarLoudspeakersBufferImport(
  515. IntPtr ctx,
  516. float[][] outputBufferPtr,
  517. uint numFrames);
  518. public override Result GetPlanarLoudspeakersBuffer(
  519. IntPtr ctx,
  520. float[][] outputBufferPtr,
  521. uint numFrames
  522. )
  523. {
  524. return GetPlanarLoudspeakersBufferImport(ctx, outputBufferPtr, numFrames);
  525. }
  526. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_update_scene")]
  527. private static extern Result UpdateSceneImport(IntPtr ctx);
  528. public override Result UpdateScene(IntPtr ctx)
  529. {
  530. AmbisonicDecoderUpdate();
  531. return UpdateSceneImport(ctx);
  532. }
  533. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_set_doppler_effect")]
  534. private static extern Result SetDopplerEffectImport(IntPtr ctx, int sourceId, bool on);
  535. public override Result SetDopplerEffect(IntPtr ctx, int sourceId, bool on)
  536. {
  537. return SetDopplerEffectImport(ctx, sourceId, on);
  538. }
  539. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_set_playback_mode")]
  540. private static extern Result SetPlaybackModeImport(
  541. IntPtr ctx,
  542. PlaybackMode playbackMode);
  543. public override Result SetPlaybackMode(IntPtr ctx, PlaybackMode playbackMode)
  544. {
  545. return SetPlaybackModeImport(ctx, playbackMode);
  546. }
  547. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_set_loudspeaker_array")]
  548. private static extern Result SetLoudspeakerArrayImport(
  549. IntPtr ctx,
  550. float[] positions,
  551. int numLoudspeakers);
  552. public override Result SetLoudspeakerArray(
  553. IntPtr ctx,
  554. float[] positions,
  555. int numLoudspeakers
  556. )
  557. {
  558. return SetLoudspeakerArrayImport(ctx, positions, numLoudspeakers);
  559. }
  560. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_set_mapping_matrix")]
  561. private static extern Result SetMappingMatrixImport(
  562. IntPtr ctx,
  563. float[] matrix,
  564. int numInputChannels,
  565. int numOutputChannels);
  566. public override Result SetMappingMatrix(
  567. IntPtr ctx,
  568. float[] matrix,
  569. int numInputChannels,
  570. int numOutputChannels
  571. )
  572. {
  573. return SetMappingMatrixImport(ctx, matrix, numInputChannels, numOutputChannels);
  574. }
  575. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_set_listener_position")]
  576. private static extern Result SetListenerPositionImport(
  577. IntPtr ctx,
  578. float[] position);
  579. public override Result SetListenerPosition(
  580. IntPtr ctx,
  581. float[] position
  582. )
  583. {
  584. return SetListenerPositionImport(ctx, position);
  585. }
  586. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_set_listener_orientation")]
  587. private static extern Result SetListenerOrientationImport(
  588. IntPtr ctx,
  589. float[] front,
  590. float[] up);
  591. public override Result SetListenerOrientation(
  592. IntPtr ctx,
  593. float[] front,
  594. float[] up
  595. )
  596. {
  597. return SetListenerOrientationImport(ctx, front, up);
  598. }
  599. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_set_listener_pose")]
  600. private static extern Result SetListenerPoseImport(
  601. IntPtr ctx,
  602. float[] position,
  603. float[] front,
  604. float[] up);
  605. public override Result SetListenerPose(
  606. IntPtr ctx,
  607. float[] position,
  608. float[] front,
  609. float[] up
  610. )
  611. {
  612. return SetListenerPoseImport(ctx, position, front, up);
  613. }
  614. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_set_source_position")]
  615. private static extern Result SetSourcePositionImport(
  616. IntPtr ctx,
  617. int sourceId,
  618. float[] position);
  619. public override Result SetSourcePosition(
  620. IntPtr ctx,
  621. int sourceId,
  622. float[] position
  623. )
  624. {
  625. return SetSourcePositionImport(ctx, sourceId, position);
  626. }
  627. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_set_source_gain")]
  628. private static extern Result SetSourceGainImport(
  629. IntPtr ctx,
  630. int sourceId,
  631. float gain);
  632. public override Result SetSourceGain(
  633. IntPtr ctx,
  634. int sourceId,
  635. float gain
  636. )
  637. {
  638. return SetSourceGainImport(ctx, sourceId, gain);
  639. }
  640. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_set_source_size")]
  641. private static extern Result SetSourceSizeImport(
  642. IntPtr ctx,
  643. int sourceId,
  644. float volumetricSize);
  645. public override Result SetSourceSize(
  646. IntPtr ctx,
  647. int sourceId,
  648. float volumetricSize
  649. )
  650. {
  651. return SetSourceSizeImport(ctx, sourceId, volumetricSize);
  652. }
  653. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_update_source_mode")]
  654. private static extern Result UpdateSourceModeImport(
  655. IntPtr ctx,
  656. int sourceId,
  657. SourceMode mode);
  658. public override Result UpdateSourceMode(
  659. IntPtr ctx,
  660. int sourceId,
  661. SourceMode mode
  662. )
  663. {
  664. return UpdateSourceModeImport(ctx, sourceId, mode);
  665. }
  666. [DllImport(DLLNAME, EntryPoint = "yggdrasil_audio_destroy")]
  667. private static extern Result DestroyImport(IntPtr ctx);
  668. public override Result Destroy(IntPtr ctx)
  669. {
  670. return DestroyImport(ctx);
  671. }
  672. // Call from Pico's unity native ambisonic decoder
  673. [DllImport("PicoAmbisonicDecoder", EntryPoint = "yggdrasil_audio_unity_ambisonic_decoder_update")]
  674. private static extern void AmbisonicDecoderUpdate();
  675. }
  676. public class ApiWwiseImpl : Api
  677. {
  678. #if (UNITY_IPHONE || UNITY_WEBGL) && !UNITY_EDITOR
  679. private static string DLLNAME = "__Internal";
  680. #else
  681. private const string DLLNAME = "PicoSpatializerWwise";
  682. #endif
  683. [DllImport(DLLNAME, EntryPoint = "yggdrasil_get_version")]
  684. private static extern string GetVersionImport(ref int major, ref int minor, ref int patch);
  685. public override string GetVersion(ref int major, ref int minor, ref int patch)
  686. {
  687. return GetVersionImport(ref major, ref minor, ref patch);
  688. }
  689. [DllImport(DLLNAME, EntryPoint = "CSharp_PicoSpatializerWwise_CreateContext")]
  690. private static extern Result CreateContextImport(ref IntPtr ctx,
  691. RenderingMode mode,
  692. uint framesPerBuffer,
  693. uint sampleRate);
  694. public override Result
  695. CreateContext(
  696. ref IntPtr ctx,
  697. RenderingMode mode,
  698. uint framesPerBuffer,
  699. uint sampleRate
  700. )
  701. {
  702. return CreateContextImport(ref ctx, mode, framesPerBuffer, sampleRate);
  703. }
  704. public override Result InitializeContext(IntPtr ctx)
  705. {
  706. Debug.Log("Wwise plugin will automatically initialize context after creating.");
  707. return Result.Success;
  708. }
  709. [DllImport(DLLNAME, EntryPoint = "CSharp_PicoSpatializerWwise_SubmitMesh")]
  710. private static extern Result SubmitMeshImport(
  711. IntPtr ctx,
  712. float[] vertices,
  713. int verticesCount,
  714. int[] indices,
  715. int indicesCount,
  716. AcousticsMaterial material,
  717. ref int geometryId);
  718. public override Result SubmitMesh(
  719. IntPtr ctx,
  720. float[] vertices,
  721. int verticesCount,
  722. int[] indices,
  723. int indicesCount,
  724. AcousticsMaterial material,
  725. ref int geometryId
  726. )
  727. {
  728. return SubmitMeshImport(ctx, vertices, verticesCount, indices, indicesCount, material, ref geometryId);
  729. }
  730. [DllImport(DLLNAME, EntryPoint = "CSharp_PicoSpatializerWwise_SubmitMeshAndMaterialFactor")]
  731. private static extern Result SubmitMeshAndMaterialFactorImport(
  732. IntPtr ctx,
  733. float[] vertices,
  734. int verticesCount,
  735. int[] indices,
  736. int indicesCount,
  737. float[] absorptionFactor,
  738. float scatteringFactor,
  739. float transmissionFactor,
  740. ref int geometryId);
  741. public override Result SubmitMeshAndMaterialFactor(
  742. IntPtr ctx,
  743. float[] vertices,
  744. int verticesCount,
  745. int[] indices,
  746. int indicesCount,
  747. float[] absorptionFactor,
  748. float scatteringFactor,
  749. float transmissionFactor,
  750. ref int geometryId)
  751. {
  752. return SubmitMeshAndMaterialFactorImport(ctx, vertices, verticesCount, indices, indicesCount,
  753. absorptionFactor, scatteringFactor, transmissionFactor, ref geometryId);
  754. }
  755. [DllImport(DLLNAME, EntryPoint = "CSharp_PicoSpatializerWwise_SubmitMeshWithConfig")]
  756. private static extern Result SubmitMeshWithConfigImport(IntPtr ctx, float[] vertices, int verticesCount,
  757. int[] indices,
  758. int indicesCount,
  759. ref MeshConfig config, ref int geometryId);
  760. public override Result SubmitMeshWithConfig(IntPtr ctx, float[] vertices, int verticesCount, int[] indices,
  761. int indicesCount,
  762. ref MeshConfig config, ref int geometryId)
  763. {
  764. return SubmitMeshWithConfigImport(ctx, vertices, verticesCount, indices, indicesCount, ref config,
  765. ref geometryId);
  766. }
  767. [DllImport(DLLNAME, EntryPoint = "CSharp_PicoSpatializerWwise_RemoveMesh")]
  768. private static extern Result RemoveMeshImport(IntPtr ctx, int geometryId);
  769. public override Result RemoveMesh(IntPtr ctx, int geometryId)
  770. {
  771. return RemoveMeshImport(ctx, geometryId);
  772. }
  773. [DllImport(DLLNAME, EntryPoint = "CSharp_PicoSpatializerWwise_SetMeshConfig")]
  774. private static extern Result SetMeshConfigImport(IntPtr ctx, int geometryId, ref MeshConfig config,
  775. uint propertyMask);
  776. public override Result SetMeshConfig(IntPtr ctx, int geometryId, ref MeshConfig config, uint propertyMask)
  777. {
  778. return SetMeshConfigImport(ctx, geometryId, ref config, propertyMask);
  779. }
  780. [DllImport(DLLNAME, EntryPoint = "CSharp_PicoSpatializerWwise_GetAbsorptionFactor")]
  781. private static extern Result GetAbsorptionFactorImport(
  782. AcousticsMaterial material,
  783. float[] absorptionFactor);
  784. public override Result GetAbsorptionFactor(
  785. AcousticsMaterial material,
  786. float[] absorptionFactor
  787. )
  788. {
  789. return GetAbsorptionFactorImport(material, absorptionFactor);
  790. }
  791. [DllImport(DLLNAME, EntryPoint = "CSharp_PicoSpatializerWwise_GetScatteringFactor")]
  792. private static extern Result GetScatteringFactorImport(
  793. AcousticsMaterial material,
  794. ref float scatteringFactor);
  795. public override Result GetScatteringFactor(
  796. AcousticsMaterial material,
  797. ref float scatteringFactor
  798. )
  799. {
  800. return GetScatteringFactorImport(material, ref scatteringFactor);
  801. }
  802. [DllImport(DLLNAME, EntryPoint = "CSharp_PicoSpatializerWwise_GetTransmissionFactor")]
  803. private static extern Result GetTransmissionFactorImport(
  804. AcousticsMaterial material,
  805. ref float transmissionFactor);
  806. public override Result GetTransmissionFactor(
  807. AcousticsMaterial material,
  808. ref float transmissionFactor
  809. )
  810. {
  811. return GetTransmissionFactorImport(material, ref transmissionFactor);
  812. }
  813. [DllImport(DLLNAME, EntryPoint = "CSharp_PicoSpatializerWwise_CommitScene")]
  814. private static extern Result CommitSceneImport(IntPtr ctx);
  815. public override Result CommitScene(IntPtr ctx)
  816. {
  817. return CommitSceneImport(ctx);
  818. }
  819. public override Result AddSource(
  820. IntPtr ctx,
  821. SourceMode sourceMode,
  822. float[] position,
  823. ref int sourceId,
  824. bool isAsync
  825. )
  826. {
  827. Debug.LogWarning("Unexpected API calling.");
  828. return Result.Error;
  829. }
  830. public override Result AddSourceWithOrientation(
  831. IntPtr ctx,
  832. SourceMode mode,
  833. float[] position,
  834. float[] front,
  835. float[] up,
  836. float radius,
  837. ref int sourceId,
  838. bool isAsync
  839. )
  840. {
  841. Debug.LogWarning("Unexpected API calling.");
  842. return Result.Error;
  843. }
  844. public override Result AddSourceWithConfig(
  845. IntPtr ctx,
  846. ref SourceConfig sourceConfig,
  847. ref int sourceId,
  848. bool isAsync
  849. )
  850. {
  851. Debug.LogWarning("Unexpected API calling.");
  852. return Result.Error;
  853. }
  854. public override Result SetSourceConfig(IntPtr ctx, int sourceId, ref SourceConfig sourceConfig,
  855. uint propertyMask)
  856. {
  857. Debug.LogWarning("Unexpected API calling.");
  858. return Result.Error;
  859. }
  860. public override Result SetSourceAttenuationMode(
  861. IntPtr ctx,
  862. int sourceId,
  863. SourceAttenuationMode mode,
  864. DistanceAttenuationCallback directDistanceAttenuationCallback,
  865. DistanceAttenuationCallback indirectDistanceAttenuationCallback
  866. )
  867. {
  868. Debug.LogWarning("Unexpected API calling.");
  869. return Result.Error;
  870. }
  871. public override Result SetSourceRange(IntPtr ctx, int sourceId, float rangeMin, float rangeMax)
  872. {
  873. Debug.LogWarning("Unexpected API calling.");
  874. return Result.Error;
  875. }
  876. public override Result RemoveSource(IntPtr ctx, int sourceId)
  877. {
  878. Debug.LogWarning("Unexpected API calling.");
  879. return Result.Error;
  880. }
  881. public override Result SubmitSourceBuffer(
  882. IntPtr ctx,
  883. int sourceId,
  884. float[] inputBufferPtr,
  885. uint numFrames
  886. )
  887. {
  888. Debug.LogWarning("Unexpected API calling.");
  889. return Result.Error;
  890. }
  891. public override Result SubmitAmbisonicChannelBuffer(
  892. IntPtr ctx,
  893. float[] ambisonicChannelBuffer,
  894. int order,
  895. int degree,
  896. AmbisonicNormalizationType normType,
  897. float gain
  898. )
  899. {
  900. Debug.LogWarning("Unexpected API calling.");
  901. return Result.Error;
  902. }
  903. public override Result SubmitInterleavedAmbisonicBuffer(
  904. IntPtr ctx,
  905. float[] ambisonicBuffer,
  906. int ambisonicOrder,
  907. AmbisonicNormalizationType normType,
  908. float gain
  909. )
  910. {
  911. Debug.LogWarning("Unexpected API calling.");
  912. return Result.Error;
  913. }
  914. public override Result SubmitMatrixInputBuffer(
  915. IntPtr ctx,
  916. float[] inputBuffer,
  917. int inputChannelIndex
  918. )
  919. {
  920. Debug.LogWarning("Unexpected API calling.");
  921. return Result.Error;
  922. }
  923. public override Result GetInterleavedBinauralBuffer(
  924. IntPtr ctx,
  925. float[] outputBufferPtr,
  926. uint numFrames,
  927. bool isAccumulative
  928. )
  929. {
  930. Debug.LogWarning("Unexpected API calling.");
  931. return Result.Error;
  932. }
  933. public override Result GetPlanarBinauralBuffer(
  934. IntPtr ctx,
  935. float[][] outputBufferPtr,
  936. uint numFrames,
  937. bool isAccumulative
  938. )
  939. {
  940. Debug.LogWarning("Unexpected API calling.");
  941. return Result.Error;
  942. }
  943. public override Result GetInterleavedLoudspeakersBuffer(
  944. IntPtr ctx,
  945. float[] outputBufferPtr,
  946. uint numFrames
  947. )
  948. {
  949. Debug.LogWarning("Unexpected API calling.");
  950. return Result.Error;
  951. }
  952. public override Result GetPlanarLoudspeakersBuffer(
  953. IntPtr ctx,
  954. float[][] outputBufferPtr,
  955. uint numFrames
  956. )
  957. {
  958. Debug.LogWarning("Unexpected API calling.");
  959. return Result.Error;
  960. }
  961. [DllImport(DLLNAME, EntryPoint = "CSharp_PicoSpatializerWwise_UpdateScene")]
  962. private static extern Result UpdateSceneImport(IntPtr ctx);
  963. public override Result UpdateScene(IntPtr ctx)
  964. {
  965. return UpdateSceneImport(ctx);
  966. }
  967. public override Result SetDopplerEffect(IntPtr ctx, int sourceId, bool on)
  968. {
  969. Debug.LogWarning("Unexpected API calling.");
  970. return Result.Error;
  971. }
  972. public override Result SetPlaybackMode(IntPtr ctx, PlaybackMode playbackMode)
  973. {
  974. Debug.LogWarning("Unexpected API calling.");
  975. return Result.Error;
  976. }
  977. public override Result SetLoudspeakerArray(
  978. IntPtr ctx,
  979. float[] positions,
  980. int numLoudspeakers
  981. )
  982. {
  983. Debug.LogWarning("Unexpected API calling.");
  984. return Result.Error;
  985. }
  986. public override Result SetMappingMatrix(
  987. IntPtr ctx,
  988. float[] matrix,
  989. int numInputChannels,
  990. int numOutputChannels
  991. )
  992. {
  993. Debug.LogWarning("Unexpected API calling.");
  994. return Result.Error;
  995. }
  996. public override Result SetListenerPosition(
  997. IntPtr ctx,
  998. float[] position
  999. )
  1000. {
  1001. Debug.LogWarning("Unexpected API calling.");
  1002. return Result.Error;
  1003. }
  1004. public override Result SetListenerOrientation(
  1005. IntPtr ctx,
  1006. float[] front,
  1007. float[] up
  1008. )
  1009. {
  1010. Debug.LogWarning("Unexpected API calling.");
  1011. return Result.Error;
  1012. }
  1013. public override Result SetListenerPose(
  1014. IntPtr ctx,
  1015. float[] position,
  1016. float[] front,
  1017. float[] up
  1018. )
  1019. {
  1020. Debug.LogWarning("Unexpected API calling.");
  1021. return Result.Error;
  1022. }
  1023. public override Result SetSourcePosition(
  1024. IntPtr ctx,
  1025. int sourceId,
  1026. float[] position
  1027. )
  1028. {
  1029. Debug.LogWarning("Unexpected API calling.");
  1030. return Result.Error;
  1031. }
  1032. public override Result SetSourceGain(
  1033. IntPtr ctx,
  1034. int sourceId,
  1035. float gain
  1036. )
  1037. {
  1038. Debug.LogWarning("Unexpected API calling.");
  1039. return Result.Error;
  1040. }
  1041. public override Result SetSourceSize(
  1042. IntPtr ctx,
  1043. int sourceId,
  1044. float volumetricSize
  1045. )
  1046. {
  1047. Debug.LogWarning("Unexpected API calling.");
  1048. return Result.Error;
  1049. }
  1050. public override Result UpdateSourceMode(
  1051. IntPtr ctx,
  1052. int sourceId,
  1053. SourceMode mode
  1054. )
  1055. {
  1056. Debug.LogWarning("Unexpected API calling.");
  1057. return Result.Error;
  1058. }
  1059. [DllImport(DLLNAME, EntryPoint = "CSharp_PicoSpatializerWwise_Destroy")]
  1060. private static extern Result DestroyImport(IntPtr ctx);
  1061. public override Result Destroy(IntPtr ctx)
  1062. {
  1063. return DestroyImport(ctx);
  1064. }
  1065. }
  1066. }
  1067. }
粤ICP备19079148号