Advertisement
7Bpencil

FMODaudioCorrect

Oct 25th, 2020
2,096
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.23 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Runtime.CompilerServices;
  4. using FMOD;
  5. using FMOD.Studio;
  6. using Vector3 = System.Numerics.Vector3;
  7.  
  8. namespace Engine.Audio
  9. {
  10.     public static class AudioEngine
  11.     {
  12.         private static FMOD.Studio.System system;
  13.         private static Dictionary<string, EventDescription> cachedEventDescriptions;
  14.  
  15.         public static void Initialize()
  16.         {
  17.             CheckResult(FMOD.Studio.System.create(out system));
  18.             CheckResult(system.initialize(512, FMOD.Studio.INITFLAGS.NORMAL, FMOD.INITFLAGS.NORMAL, IntPtr.Zero));
  19.             CheckResult(system.getCoreSystem(out var coreSystem));
  20.             CheckResult(coreSystem.loadPlugin(@"libs\resonanceaudio.dll", out var pluginHandle));
  21.  
  22.             cachedEventDescriptions = new Dictionary<string, EventDescription>();
  23.             CheckResult(system.loadBankFile(@"assets\Audio\Desktop\Master.bank", LOAD_BANK_FLAGS.NORMAL, out var masterBank));
  24.             CheckResult(system.loadBankFile(@"assets\Audio\Desktop\Master.strings.bank", LOAD_BANK_FLAGS.NORMAL, out var masterBankStrings));
  25.         }
  26.  
  27.         /// <summary>
  28.         /// Creates and plays instance that has position in world
  29.         /// </summary>
  30.         /// <param name="path"></param>
  31.         /// <param name="instancePosition"></param>
  32.         public static void PlayNewInstance(string path, Vector3 instancePosition)
  33.         {
  34.             PlayInstance(CreateEventInstance(path, instancePosition));
  35.         }
  36.  
  37.         /// <summary>
  38.         /// Creates and plays instance without position - position doesn't affect sound
  39.         /// </summary>
  40.         /// <param name="path"></param>
  41.         public static void PlayNewInstance(string path)
  42.         {
  43.             PlayInstance(CreateEventInstance(path));
  44.         }
  45.  
  46.         /// <summary>
  47.         /// Creates instance that has position in world
  48.         /// </summary>
  49.         /// <param name="path"></param>
  50.         /// <param name="instancePosition"></param>
  51.         /// <returns></returns>
  52.         private static EventInstance CreateEventInstance(string path, Vector3 instancePosition)
  53.         {
  54.             var eventDescription = GetEventDescription(path);
  55.             eventDescription.createInstance(out var instance);
  56.             eventDescription.is3D(out var is3D);
  57.             if (is3D) PositionEvent(ref instance, instancePosition);
  58.             else
  59.             {
  60.                 Logger.Log($"{path} is not 3D");
  61.                 throw new ArgumentException();
  62.             }
  63.             return instance;
  64.         }
  65.  
  66.         /// <summary>
  67.         /// Creates instance without position - position doesn't affect sound
  68.         /// </summary>
  69.         /// <param name="path"></param>
  70.         /// <returns></returns>
  71.         private static EventInstance CreateEventInstance(string path)
  72.         {
  73.             var eventDescription = GetEventDescription(path);
  74.             eventDescription.createInstance(out var instance);
  75.             eventDescription.is3D(out var is3D);
  76.             if (is3D)
  77.             {
  78.                 Logger.Log($"{path} is not 2D");
  79.                 throw new ArgumentException();
  80.             }
  81.             return instance;
  82.         }
  83.  
  84.         private static void PlayInstance(EventInstance instance)
  85.         {
  86.             instance.start();
  87.             instance.release();
  88.         }
  89.  
  90.         private static void PositionEvent(ref EventInstance instance, Vector3 position)
  91.         {
  92.             var attributes3d = new ATTRIBUTES_3D {position = Convert(position)};
  93.             instance.set3DAttributes(attributes3d);
  94.         }
  95.  
  96.         public static void UpdateListenerPosition(Vector3 newPosition, Vector3 newForward, Vector3 newUp)
  97.         {
  98.             var attributes3d = new ATTRIBUTES_3D
  99.             {
  100.                 forward = Convert(newForward),
  101.                 position = Convert(newPosition),
  102.                 up = Convert(newUp)
  103.             };
  104.             system.setListenerAttributes(0, attributes3d);
  105.         }
  106.  
  107.         private static EventDescription GetEventDescription(string path)
  108.         {
  109.             if (cachedEventDescriptions.ContainsKey(path))
  110.                 return cachedEventDescriptions[path];
  111.             CheckResult(system.getEvent(path, out var description));
  112.             description.loadSampleData();
  113.             cachedEventDescriptions.Add(path, description);
  114.             return description;
  115.         }
  116.  
  117.         [MethodImpl (MethodImplOptions.AggressiveInlining)]
  118.         private static void CheckResult(RESULT result)
  119.         {
  120.             if (result != RESULT.OK)
  121.             {
  122.                 Logger.Log($"FMOD Failed: {result}: {Error.String(result)}");
  123.                 throw new Exception();
  124.             }
  125.         }
  126.  
  127.         public static void Update()
  128.         {
  129.             system.update();
  130.         }
  131.  
  132.         public static void Release()
  133.         {
  134.             system.release();
  135.         }
  136.  
  137.         [MethodImpl (MethodImplOptions.AggressiveInlining)]
  138.         private static VECTOR Convert(Vector3 vector)
  139.         {
  140.             return new VECTOR
  141.             {
  142.                 x = vector.X,
  143.                 y = vector.Y,
  144.                 z = -vector.Z  // OpenGL style coordinate system
  145.             };
  146.         }
  147.  
  148.     }
  149. }
  150.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement