AudioComponent.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // ----------------------------------------------------------------
  2. // From Game Programming in C++ by Sanjay Madhav
  3. // Copyright (C) 2017 Sanjay Madhav. All rights reserved.
  4. //
  5. // Released under the BSD License
  6. // See LICENSE in root directory for full details.
  7. // ----------------------------------------------------------------
  8. #include "AudioComponent.h"
  9. #include "Actor.h"
  10. #include "Game.h"
  11. #include "AudioSystem.h"
  12. AudioComponent::AudioComponent(Actor* owner, int updateOrder)
  13. :Component(owner, updateOrder)
  14. {
  15. }
  16. AudioComponent::~AudioComponent()
  17. {
  18. StopAllEvents();
  19. }
  20. void AudioComponent::Update(float deltaTime)
  21. {
  22. Component::Update(deltaTime);
  23. // Remove invalid 2D events
  24. auto iter = mEvents2D.begin();
  25. while (iter != mEvents2D.end())
  26. {
  27. if (!iter->IsValid())
  28. {
  29. iter = mEvents2D.erase(iter);
  30. }
  31. else
  32. {
  33. ++iter;
  34. }
  35. }
  36. // Remove invalid 3D events
  37. iter = mEvents3D.begin();
  38. while (iter != mEvents3D.end())
  39. {
  40. if (!iter->IsValid())
  41. {
  42. iter = mEvents3D.erase(iter);
  43. }
  44. else
  45. {
  46. ++iter;
  47. }
  48. }
  49. }
  50. void AudioComponent::OnUpdateWorldTransform()
  51. {
  52. // Update 3D events' world transforms
  53. Matrix4 world = mOwner->GetWorldTransform();
  54. for (auto& event : mEvents3D)
  55. {
  56. if (event.IsValid())
  57. {
  58. event.Set3DAttributes(world);
  59. }
  60. }
  61. }
  62. SoundEvent AudioComponent::PlayEvent(const std::string& name)
  63. {
  64. SoundEvent e = mOwner->GetGame()->GetAudioSystem()->PlayEvent(name);
  65. // Is this 2D or 3D?
  66. if (e.Is3D())
  67. {
  68. mEvents3D.emplace_back(e);
  69. // Set initial 3D attributes
  70. e.Set3DAttributes(mOwner->GetWorldTransform());
  71. }
  72. else
  73. {
  74. mEvents2D.emplace_back(e);
  75. }
  76. return e;
  77. }
  78. void AudioComponent::StopAllEvents()
  79. {
  80. // Stop all sounds
  81. for (auto& e : mEvents2D)
  82. {
  83. e.Stop();
  84. }
  85. for (auto& e : mEvents3D)
  86. {
  87. e.Stop();
  88. }
  89. // Clear events
  90. mEvents2D.clear();
  91. mEvents3D.clear();
  92. }