Loop.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include <iostream>
  2. #include <thread>
  3. #include <mutex>
  4. #include <chrono>
  5. class Loop
  6. {
  7. std::thread loopThread;
  8. std::chrono::milliseconds lastBeatTime;
  9. unsigned short bpm;
  10. std::mutex bpmLock;
  11. bool stopNext;
  12. public:
  13. bool enabled;
  14. Loop()
  15. : bpm(60), stopNext(false), enabled(false), loopThread(&Loop::loop, this)
  16. {
  17. }
  18. ~Loop()
  19. {
  20. stopNext = true;
  21. loopThread.join();
  22. }
  23. void setBpm(unsigned short b)
  24. {
  25. bpmLock.lock();
  26. bpm = b;
  27. bpmLock.unlock();
  28. }
  29. unsigned short getBpm()
  30. {
  31. bpmLock.lock();
  32. unsigned short r = bpm;
  33. bpmLock.unlock();
  34. return r;
  35. }
  36. std::chrono::milliseconds getBeatDuration()
  37. {
  38. return std::chrono::milliseconds(
  39. (long long)((double)60 * 1000 / bpm)
  40. );
  41. }
  42. void start()
  43. {
  44. enabled = true;
  45. }
  46. void stop()
  47. {
  48. enabled = false;
  49. }
  50. private:
  51. std::chrono::milliseconds getMillisecondsSinceEpoch()
  52. {
  53. std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
  54. std::chrono::system_clock::duration duration = now.time_since_epoch();
  55. return std::chrono::duration_cast<std::chrono::milliseconds>(duration);
  56. }
  57. void beat()
  58. {
  59. std::cout << "\a" << lastBeatTime.count() << std::endl;
  60. }
  61. void loop()
  62. {
  63. while(!stopNext) {
  64. if((getMillisecondsSinceEpoch() - lastBeatTime) >= getBeatDuration()) {
  65. lastBeatTime = getMillisecondsSinceEpoch();
  66. beat();
  67. }
  68. }
  69. }
  70. };