Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

120 строки
2.0 KiB

  1. //
  2. // Lol Engine
  3. //
  4. // Copyright: © 2010—2015 Sam Hocevar <sam@hocevar.net>
  5. //
  6. // This library is free software; you can redistribute it and/or
  7. // modify it under the terms of the Do What The Fuck You Want To
  8. // Public License, Version 2, as published by Sam Hocevar. See
  9. // http://www.wtfpl.net/ for more details.
  10. //
  11. #include <lol/engine-internal.h>
  12. #include <cstdlib>
  13. #include <cstdio>
  14. #include <cstring>
  15. #if defined USE_SDL_MIXER
  16. # if defined HAVE_SDL_SDL_H
  17. # include <SDL/SDL.h>
  18. # else
  19. # include <SDL.h>
  20. # endif
  21. # if defined HAVE_SDL_SDL_MIXER_H
  22. # include <SDL/SDL_mixer.h>
  23. # else
  24. # include <SDL_mixer.h>
  25. # endif
  26. #endif
  27. namespace lol
  28. {
  29. /*
  30. * Sample implementation class
  31. */
  32. class SampleData
  33. {
  34. friend class Sample;
  35. private:
  36. String m_name;
  37. #if defined USE_SDL_MIXER
  38. Mix_Chunk *m_chunk;
  39. int m_channel;
  40. #endif
  41. };
  42. /*
  43. * Public Sample class
  44. */
  45. Sample::Sample(char const *path)
  46. : data(new SampleData())
  47. {
  48. data->m_name = String("<sample> ") + path;
  49. #if defined USE_SDL_MIXER
  50. for (auto candidate : System::GetPathList(path))
  51. {
  52. data->m_chunk = Mix_LoadWAV(candidate.C());
  53. if (data->m_chunk)
  54. break;
  55. }
  56. if (!data->m_chunk)
  57. {
  58. msg::error("could not load sample %s: %s\n", path, Mix_GetError());
  59. }
  60. data->m_channel = -1;
  61. #endif
  62. }
  63. Sample::~Sample()
  64. {
  65. #if defined USE_SDL_MIXER
  66. if (data->m_chunk)
  67. Mix_FreeChunk(data->m_chunk);
  68. #endif
  69. delete data;
  70. }
  71. void Sample::TickGame(float seconds)
  72. {
  73. Entity::TickGame(seconds);
  74. }
  75. char const *Sample::GetName()
  76. {
  77. return data->m_name.C();
  78. }
  79. void Sample::Play()
  80. {
  81. #if defined USE_SDL_MIXER
  82. if (data->m_chunk)
  83. data->m_channel = Mix_PlayChannel(-1, data->m_chunk, 0);
  84. #endif
  85. }
  86. void Sample::Loop()
  87. {
  88. #if defined USE_SDL_MIXER
  89. if (data->m_chunk)
  90. data->m_channel = Mix_PlayChannel(-1, data->m_chunk, -1);
  91. #endif
  92. }
  93. void Sample::Stop()
  94. {
  95. #if defined USE_SDL_MIXER
  96. if (data->m_channel >= 0)
  97. Mix_HaltChannel(data->m_channel);
  98. data->m_channel = -1;
  99. #endif
  100. }
  101. } /* namespace lol */