BsAudioClip.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsCorePrerequisites.h"
  5. #include "BsResource.h"
  6. namespace BansheeEngine
  7. {
  8. /** @addtogroup Audio
  9. * @{
  10. */
  11. /** Valid internal engine audio formats. */
  12. enum class AudioFormat
  13. {
  14. PCM, /**< Pulse code modulation audio ("raw" uncompressed audio). */
  15. VORBIS /**< Vorbis compressed audio. */
  16. };
  17. /** Modes that determine how and when is audio data read. */
  18. enum class AudioReadMode
  19. {
  20. /** Entire audio clip will be loaded and decompressed. Uses most memory but has lowest CPU impact. */
  21. LoadDecompressed,
  22. /**
  23. * Entire audio clip will be loaded, but will be decompressed while playing. Uses medium amount of memory and has
  24. * the highest CPU impact.
  25. */
  26. LoadCompressed,
  27. /**
  28. * Audio will be slowly streamed from the disk, and decompressed if needed. Uses very little memory, and has either
  29. * low or high CPU impact depending if the audio is in a compressed format. Since data is streamed from the disk,
  30. * read speeds could also be a bottleneck.
  31. */
  32. Stream
  33. };
  34. /** Descriptor used for initializing an audio clip. */
  35. struct AUDIO_CLIP_DESC
  36. {
  37. /** Determines how is audio data read. */
  38. AudioReadMode readMode = AudioReadMode::LoadDecompressed;
  39. /** Determines in which format is the audio data in. */
  40. AudioFormat format = AudioFormat::PCM;
  41. /** Sample rate (frequency) of the audio data. */
  42. UINT32 frequency = 44100;
  43. /** Number of bits per sample. Not used for compressed formats. */
  44. UINT32 bitDepth = 16;
  45. /** Number of channels. Each channel has its own step of samples. */
  46. UINT32 numChannels = 2;
  47. };
  48. /**
  49. * Audio clip stores audio data in a compressed or uncompressed format. Clips can be provided to audio sources or
  50. * or other audio methods to be played.
  51. */
  52. class BS_CORE_EXPORT AudioClip : public Resource
  53. {
  54. public:
  55. static HAudioClip create(UINT32 numSamples, const AUDIO_CLIP_DESC& desc);
  56. static HAudioClip create(const SPtr<DataStream>& samples, UINT32 numSamples, const AUDIO_CLIP_DESC& desc);
  57. UINT32 getBitDepth() const { return mDesc.bitDepth; }
  58. UINT32 getFrequency() const { return mDesc.frequency; }
  59. UINT32 getNumChannels() const { return mDesc.numChannels; }
  60. AudioFormat getFormat() const { return mDesc.format; }
  61. AudioReadMode getReadMode() const { return mDesc.readMode; }
  62. UINT32 getLength() const { return mNumSamples / mDesc.frequency; }
  63. UINT32 getNumSamples() const { return mNumSamples; }
  64. virtual UINT32 getDataSize() const = 0;
  65. virtual UINT8* getData() const = 0;
  66. // Note: This will convert internal audio read mode to LoadCompressed (if ogg) or LoadDecompressed (if PCM)
  67. virtual void setData(UINT8* samples, UINT32 numSamples) = 0;
  68. public: // ***** INTERNAL ******
  69. /** @name Internal
  70. * @{
  71. */
  72. static SPtr<AudioClip> _createPtr(const SPtr<DataStream>& samples, UINT32 numSamples, const AUDIO_CLIP_DESC& desc);
  73. /** @} */
  74. private:
  75. AudioClip(const SPtr<DataStream>& samples, UINT32 numSamples, const AUDIO_CLIP_DESC& desc);
  76. protected:
  77. AUDIO_CLIP_DESC mDesc;
  78. UINT32 mNumSamples;
  79. SPtr<DataStream> mStreamData;
  80. /************************************************************************/
  81. /* SERIALIZATION */
  82. /************************************************************************/
  83. public:
  84. friend class AudioClipRTTI;
  85. static RTTITypeBase* getRTTIStatic();
  86. RTTITypeBase* getRTTI() const override;
  87. };
  88. /** @} */
  89. }