ds3dutil.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. //
  2. // ds3dutil.cpp
  3. //
  4. // basic utilility functions used by the DirectSound3D wrappers.
  5. //
  6. #include "pch.h"
  7. #include "soundbase.h"
  8. #include "ds3dutil.h"
  9. #include <process.h>
  10. namespace SoundEngine {
  11. // the initialization of the worker thread
  12. void WorkerThread::ThreadInit()
  13. {
  14. }
  15. // any cleanup code
  16. void WorkerThread::ThreadCleanup()
  17. {
  18. }
  19. // a thread entry point
  20. unsigned __stdcall WorkerThread::ThreadStart(LPVOID lpvThis)
  21. {
  22. ((WorkerThread*)(lpvThis))->Execute();
  23. return 0;
  24. }
  25. // the thread's main loop
  26. void WorkerThread::Execute()
  27. {
  28. ThreadInit();
  29. bool bMoreToDo = true;
  30. while (bMoreToDo && WaitForSingleObject(m_hEventExit, m_nSleepTime) == WAIT_TIMEOUT)
  31. {
  32. bMoreToDo = ThreadIteration();
  33. }
  34. ThreadCleanup();
  35. }
  36. WorkerThread::WorkerThread() :
  37. m_hThread(NULL),
  38. m_hEventExit(NULL)
  39. {
  40. }
  41. WorkerThread::~WorkerThread()
  42. {
  43. StopThread();
  44. }
  45. // starts a thread with the given priority that sleeps for the given time
  46. // between each iteration.
  47. void WorkerThread::StartThread(int nPriority, int nSleepTime)
  48. {
  49. assert(!m_hEventExit);
  50. if (!m_hEventExit)
  51. {
  52. unsigned dwThreadId;
  53. m_nSleepTime = nSleepTime;
  54. m_hEventExit = CreateEvent(NULL, TRUE, FALSE, NULL);
  55. m_hThread = (HANDLE)_beginthreadex(NULL, 0, &ThreadStart, this, 0, &dwThreadId);
  56. SetThreadPriority(m_hThread, nPriority);
  57. }
  58. }
  59. // stops the thread.
  60. void WorkerThread::StopThread()
  61. {
  62. if (m_hEventExit)
  63. {
  64. SetEvent(m_hEventExit);
  65. WaitForSingleObject(m_hThread, INFINITE);
  66. CloseHandle(m_hThread);
  67. m_hThread = NULL;
  68. CloseHandle(m_hEventExit);
  69. m_hEventExit = NULL;
  70. }
  71. }
  72. // performs a single pass through the task list
  73. bool TaskListThread::ThreadIteration()
  74. {
  75. CriticalSectionLock lock(m_csTaskList);
  76. for (TaskList::iterator iterTask = m_listTasks.begin();
  77. iterTask != m_listTasks.end();)
  78. {
  79. if (!(*iterTask)->Execute())
  80. {
  81. iterTask = m_listTasks.erase(iterTask);
  82. }
  83. else
  84. {
  85. ++iterTask;
  86. }
  87. }
  88. return true;
  89. }
  90. // Adds a new task to the list.
  91. void TaskListThread::AddTask(Task* ptask)
  92. {
  93. CriticalSectionLock lock(m_csTaskList);
  94. m_listTasks.insert(ptask);
  95. }
  96. // removes a task from the list.
  97. void TaskListThread::RemoveTask(Task* ptask)
  98. {
  99. CriticalSectionLock lock(m_csTaskList);
  100. m_listTasks.erase(ptask);
  101. }
  102. // checks to see if we have the given task
  103. bool TaskListThread::HasTask(Task* ptask)
  104. {
  105. CriticalSectionLock lock(m_csTaskList);
  106. return (m_listTasks.find(ptask) != m_listTasks.end());
  107. }
  108. };