git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1349 0c269be4-1314-0410-8aa9-9f06e86f4224tags/0.61
| @@ -26,6 +26,13 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
| #include "JackGlobals.h" | #include "JackGlobals.h" | ||||
| #include "JackTime.h" | #include "JackTime.h" | ||||
| #include "JackExports.h" | #include "JackExports.h" | ||||
| #ifdef __APPLE__ | |||||
| #include "JackMachThread.h" | |||||
| #elif WIN32 | |||||
| #include "JackWinThread.h" | |||||
| #else | |||||
| #include "JackPosixThread.h" | |||||
| #endif | |||||
| #include <math.h> | #include <math.h> | ||||
| using namespace Jack; | using namespace Jack; | ||||
| @@ -1073,8 +1080,13 @@ EXPORT void jack_reset_max_delayed_usecs(jack_client_t* ext_client) | |||||
| EXPORT int jack_acquire_real_time_scheduling(pthread_t thread, int priority) | EXPORT int jack_acquire_real_time_scheduling(pthread_t thread, int priority) | ||||
| { | { | ||||
| JackLog("jack_acquire_real_time_scheduling: not yet implemented\n"); | |||||
| return -1; | |||||
| #ifdef __APPLE__ | |||||
| return JackMachThread::AcquireRealTimeImp(thread, 0, 500 * 1000, 500 * 1000); | |||||
| #elif WIN32 | |||||
| return JackWinThread::AcquireRealTimeImp(thread, priority); | |||||
| #else | |||||
| return JackPosixThread::AcquireRealTimeImp(thread, priority); | |||||
| #endif | |||||
| } | } | ||||
| EXPORT int jack_client_create_thread(jack_client_t* client, | EXPORT int jack_client_create_thread(jack_client_t* client, | ||||
| @@ -1084,14 +1096,24 @@ EXPORT int jack_client_create_thread(jack_client_t* client, | |||||
| void *(*start_routine)(void*), | void *(*start_routine)(void*), | ||||
| void *arg) | void *arg) | ||||
| { | { | ||||
| JackLog("jack_client_create_thread: not yet implemented\n"); | |||||
| return -1; | |||||
| #ifdef __APPLE__ | |||||
| return JackPosixThread::StartImp(thread, priority, realtime, start_routine, arg); | |||||
| #elif WIN32 | |||||
| return JackWinThread::StartImp(thread, priority, realtime, start_routine, arg); | |||||
| #else | |||||
| return JackPosixThread::StartImp(thread, priority, realtime, start_routine, arg); | |||||
| #endif | |||||
| } | } | ||||
| EXPORT int jack_drop_real_time_scheduling(pthread_t thread) | EXPORT int jack_drop_real_time_scheduling(pthread_t thread) | ||||
| { | { | ||||
| JackLog("jack_drop_real_time_scheduling: not yet implemented\n"); | |||||
| return -1; | |||||
| #ifdef __APPLE__ | |||||
| return JackMachThread::DropRealTimeImp(thread); | |||||
| #elif WIN32 | |||||
| return JackWinThread::DropRealTimeImp(thread); | |||||
| #else | |||||
| return JackPosixThread::DropRealTimeImp(thread); | |||||
| #endif | |||||
| } | } | ||||
| // intclient.h | // intclient.h | ||||
| @@ -56,10 +56,22 @@ void* JackPosixThread::ThreadHandler(void* arg) | |||||
| int JackPosixThread::Start() | int JackPosixThread::Start() | ||||
| { | { | ||||
| int res; | |||||
| fRunning = true; | |||||
| fRunning = true; | |||||
| // Check if the thread was correctly started | |||||
| if (StartImp(&fThread, fPriority, fRealTime, ThreadHandler, this) < 0) { | |||||
| fRunning = false; | |||||
| return -1; | |||||
| } else { | |||||
| return 0; | |||||
| } | |||||
| } | |||||
| if (fRealTime) { | |||||
| int JackPosixThread::StartImp(pthread_t* thread, int priority, int realtime, void*(*start_routine)(void*), void* arg) | |||||
| { | |||||
| int res; | |||||
| if (realtime) { | |||||
| JackLog("Create RT thread\n"); | JackLog("Create RT thread\n"); | ||||
| @@ -98,14 +110,14 @@ int JackPosixThread::Start() | |||||
| } | } | ||||
| memset(&rt_param, 0, sizeof(rt_param)); | memset(&rt_param, 0, sizeof(rt_param)); | ||||
| rt_param.sched_priority = fPriority; | |||||
| rt_param.sched_priority = priority; | |||||
| if ((res = pthread_attr_setschedparam(&attributes, &rt_param))) { | if ((res = pthread_attr_setschedparam(&attributes, &rt_param))) { | ||||
| jack_error("Cannot set scheduling priority for RT thread %d %s", res, strerror(errno)); | jack_error("Cannot set scheduling priority for RT thread %d %s", res, strerror(errno)); | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| if ((res = pthread_create(&fThread, &attributes, ThreadHandler, this))) { | |||||
| if ((res = pthread_create(thread, &attributes, start_routine, arg))) { | |||||
| jack_error("Cannot set create thread %d %s", res, strerror(errno)); | jack_error("Cannot set create thread %d %s", res, strerror(errno)); | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -114,7 +126,7 @@ int JackPosixThread::Start() | |||||
| } else { | } else { | ||||
| JackLog("Create non RT thread\n"); | JackLog("Create non RT thread\n"); | ||||
| if ((res = pthread_create(&fThread, 0, ThreadHandler, this))) { | |||||
| if ((res = pthread_create(thread, 0, start_routine, arg))) { | |||||
| jack_error("Cannot set create thread %d %s", res, strerror(errno)); | jack_error("Cannot set create thread %d %s", res, strerror(errno)); | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -159,18 +171,25 @@ int JackPosixThread::Stop() | |||||
| int JackPosixThread::AcquireRealTime() | int JackPosixThread::AcquireRealTime() | ||||
| { | { | ||||
| struct sched_param rtparam; | |||||
| int res; | |||||
| return (fThread) ? AcquireRealTimeImp(fThread, fPriority) : -1; | |||||
| } | |||||
| if (!fThread) | |||||
| return -1; | |||||
| int JackPosixThread::AcquireRealTime(int priority) | |||||
| { | |||||
| fPriority = priority; | |||||
| return AcquireRealTime(); | |||||
| } | |||||
| int JackPosixThread::AcquireRealTimeImp(pthread_t thread, int priority) | |||||
| { | |||||
| struct sched_param rtparam; | |||||
| int res; | |||||
| memset(&rtparam, 0, sizeof(rtparam)); | memset(&rtparam, 0, sizeof(rtparam)); | ||||
| rtparam.sched_priority = fPriority; | |||||
| rtparam.sched_priority = priority; | |||||
| //if ((res = pthread_setschedparam(fThread, SCHED_FIFO, &rtparam)) != 0) { | //if ((res = pthread_setschedparam(fThread, SCHED_FIFO, &rtparam)) != 0) { | ||||
| if ((res = pthread_setschedparam(fThread, SCHED_RR, &rtparam)) != 0) { | |||||
| if ((res = pthread_setschedparam(thread, SCHED_RR, &rtparam)) != 0) { | |||||
| jack_error("Cannot use real-time scheduling (FIFO/%d) " | jack_error("Cannot use real-time scheduling (FIFO/%d) " | ||||
| "(%d: %s)", rtparam.sched_priority, res, | "(%d: %s)", rtparam.sched_priority, res, | ||||
| strerror(res)); | strerror(res)); | ||||
| @@ -179,24 +198,19 @@ int JackPosixThread::AcquireRealTime() | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| int JackPosixThread::AcquireRealTime(int priority) | |||||
| int JackPosixThread::DropRealTime() | |||||
| { | { | ||||
| fPriority = priority; | |||||
| return AcquireRealTime(); | |||||
| return (fThread) ? DropRealTimeImp(fThread) : -1; | |||||
| } | } | ||||
| int JackPosixThread::DropRealTime() | |||||
| int JackPosixThread::DropRealTimeImp(pthread_t thread) | |||||
| { | { | ||||
| struct sched_param rtparam; | |||||
| struct sched_param rtparam; | |||||
| int res; | int res; | ||||
| if (!fThread) | |||||
| return -1; | |||||
| memset(&rtparam, 0, sizeof(rtparam)); | memset(&rtparam, 0, sizeof(rtparam)); | ||||
| rtparam.sched_priority = 0; | rtparam.sched_priority = 0; | ||||
| if ((res = pthread_setschedparam(fThread, SCHED_OTHER, &rtparam)) != 0) { | |||||
| if ((res = pthread_setschedparam(thread, SCHED_OTHER, &rtparam)) != 0) { | |||||
| jack_error("Cannot switch to normal scheduling priority(%s)\n", strerror(errno)); | jack_error("Cannot switch to normal scheduling priority(%s)\n", strerror(errno)); | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -37,7 +37,6 @@ class JackPosixThread : public JackThread | |||||
| protected: | protected: | ||||
| pthread_t fThread; | pthread_t fThread; | ||||
| static void* ThreadHandler(void* arg); | static void* ThreadHandler(void* arg); | ||||
| public: | public: | ||||
| @@ -65,6 +64,11 @@ class JackPosixThread : public JackThread | |||||
| virtual int DropRealTime(); | virtual int DropRealTime(); | ||||
| pthread_t GetThreadID(); | pthread_t GetThreadID(); | ||||
| static int AcquireRealTimeImp(pthread_t thread, int priority); | |||||
| static int DropRealTimeImp(pthread_t thread); | |||||
| static int StartImp(pthread_t* thread, int priority, int realtime, void*(*start_routine)(void*), void* arg); | |||||
| }; | }; | ||||
| } // end of namespace | } // end of namespace | ||||
| @@ -2567,7 +2567,7 @@ extern "C" | |||||
| capture = TRUE; | capture = TRUE; | ||||
| if (strcmp (param->value.str, "none") != 0) { | if (strcmp (param->value.str, "none") != 0) { | ||||
| capture_pcm_name = strdup (param->value.str); | capture_pcm_name = strdup (param->value.str); | ||||
| printf("capture device %s\n", capture_pcm_name); | |||||
| printf("capture device %s\n", capture_pcm_name); | |||||
| } | } | ||||
| break; | break; | ||||
| @@ -2575,7 +2575,7 @@ extern "C" | |||||
| playback = TRUE; | playback = TRUE; | ||||
| if (strcmp (param->value.str, "none") != 0) { | if (strcmp (param->value.str, "none") != 0) { | ||||
| playback_pcm_name = strdup (param->value.str); | playback_pcm_name = strdup (param->value.str); | ||||
| printf("playback device %s\n", playback_pcm_name); | |||||
| printf("playback device %s\n", playback_pcm_name); | |||||
| } | } | ||||
| break; | break; | ||||
| @@ -2587,8 +2587,8 @@ extern "C" | |||||
| case 'd': | case 'd': | ||||
| playback_pcm_name = strdup (param->value.str); | playback_pcm_name = strdup (param->value.str); | ||||
| capture_pcm_name = strdup (param->value.str); | capture_pcm_name = strdup (param->value.str); | ||||
| printf("playback device %s\n", playback_pcm_name); | |||||
| printf("capture device %s\n", capture_pcm_name); | |||||
| printf("playback device %s\n", playback_pcm_name); | |||||
| printf("capture device %s\n", capture_pcm_name); | |||||
| break; | break; | ||||
| case 'H': | case 'H': | ||||
| @@ -152,34 +152,33 @@ int JackMachThread::Kill() | |||||
| } | } | ||||
| } | } | ||||
| /* | |||||
| int JackMachThread::AcquireRealTime() | int JackMachThread::AcquireRealTime() | ||||
| { | { | ||||
| JackLog("JackMachThread::AcquireRealTime fPeriod = %ld fComputation = %ld fConstraint = %ld\n", | JackLog("JackMachThread::AcquireRealTime fPeriod = %ld fComputation = %ld fConstraint = %ld\n", | ||||
| long(fPeriod / 1000), long(fComputation / 1000), long(fConstraint / 1000)); | long(fPeriod / 1000), long(fComputation / 1000), long(fConstraint / 1000)); | ||||
| return (fThread) ? SetThreadToPriority(fThread, 96, true, fPeriod, fComputation, fConstraint) : -1; | |||||
| return (fThread) ? AcquireRealTimeImp(fThread, fPeriod, fComputation, fConstraint) : -1; | |||||
| } | } | ||||
| */ | |||||
| int JackMachThread::AcquireRealTime() | |||||
| int JackMachThread::AcquireRealTimeImp(pthread_t thread, UInt64 period, UInt64 computation, UInt64 constraint) | |||||
| { | { | ||||
| JackLog("JackMachThread::AcquireRealTime fPeriod = %ld fComputation = %ld fConstraint = %ld\n", | |||||
| long(fPeriod / 1000), long(fComputation / 1000), long(fConstraint / 1000)); | |||||
| if (fThread) { | |||||
| SetThreadToPriority(fThread, 96, true, fPeriod, fComputation, fConstraint); | |||||
| UInt64 fPeriod; | |||||
| UInt64 fComputation; | |||||
| UInt64 fConstraint; | |||||
| GetParams(&fPeriod, &fComputation, &fConstraint); | |||||
| return 0; | |||||
| } else | |||||
| return -1; | |||||
| SetThreadToPriority(thread, 96, true, period, computation, constraint); | |||||
| UInt64 int_period; | |||||
| UInt64 int_computation; | |||||
| UInt64 int_constraint; | |||||
| GetParams(&int_period, &int_computation, &int_constraint); | |||||
| return 0; | |||||
| } | } | ||||
| int JackMachThread::DropRealTime() | int JackMachThread::DropRealTime() | ||||
| { | { | ||||
| //return (fThread) ? SetThreadToPriority(fThread, 31, false, 0, 0, 0) : -1; | |||||
| return (fThread) ? SetThreadToPriority(fThread, 63, false, 0, 0, 0) : -1; | |||||
| return (fThread) ? DropRealTimeImp(fThread) : -1; | |||||
| } | |||||
| int JackMachThread::DropRealTimeImp(pthread_t thread) | |||||
| { | |||||
| SetThreadToPriority(thread, 63, false, 0, 0, 0); | |||||
| return 0; | |||||
| } | } | ||||
| void JackMachThread::SetParams(UInt64 period, UInt64 computation, UInt64 constraint) | void JackMachThread::SetParams(UInt64 period, UInt64 computation, UInt64 constraint) | ||||
| @@ -114,6 +114,9 @@ class JackMachThread : public JackPosixThread | |||||
| void SetParams(UInt64 period, UInt64 computation, UInt64 constraint); | void SetParams(UInt64 period, UInt64 computation, UInt64 constraint); | ||||
| static int GetParams(UInt64* period, UInt64* computation, UInt64* constraint); | static int GetParams(UInt64* period, UInt64* computation, UInt64* constraint); | ||||
| static int SetThreadToPriority(pthread_t thread, UInt32 inPriority, Boolean inIsFixed, UInt64 period, UInt64 computation, UInt64 constraint); | static int SetThreadToPriority(pthread_t thread, UInt32 inPriority, Boolean inIsFixed, UInt64 period, UInt64 computation, UInt64 constraint); | ||||
| static int AcquireRealTimeImp(pthread_t thread, UInt64 period, UInt64 computation, UInt64 constraint); | |||||
| static int DropRealTimeImp(pthread_t thread); | |||||
| }; | }; | ||||
| } // end of namespace | } // end of namespace | ||||
| @@ -68,98 +68,109 @@ JackWinThread::~JackWinThread() | |||||
| CloseHandle(fEvent); | CloseHandle(fEvent); | ||||
| } | } | ||||
| int JackWinThread::Start() | |||||
| { | |||||
| DWORD id; | |||||
| fEvent = CreateEvent(NULL, FALSE, FALSE, NULL); | |||||
| if (fEvent == NULL) { | |||||
| jack_error("Cannot create event error = %d", GetLastError()); | |||||
| return -1; | |||||
| } | |||||
| fRunning = true; | |||||
| if (fRealTime) { | |||||
| JackLog("Create RT thread\n"); | |||||
| fThread = CreateThread(NULL, 0, ThreadHandler, (void*)this, 0, &id); | |||||
| if (fThread == NULL) { | |||||
| jack_error("Cannot create thread error = %d", GetLastError()); | |||||
| return -1; | |||||
| } | |||||
| if (!SetThreadPriority(fThread, THREAD_PRIORITY_TIME_CRITICAL)) { | |||||
| jack_error("Cannot set priority class = %d", GetLastError()); | |||||
| return -1; | |||||
| } | |||||
| return 0; | |||||
| } else { | |||||
| JackLog("Create non RT thread\n"); | |||||
| fThread = CreateThread(NULL, 0, ThreadHandler, (void*)this, 0, &id); | |||||
| if (fThread == NULL) { | |||||
| jack_error("Cannot create thread error = %d", GetLastError()); | |||||
| return -1; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| } | |||||
| int JackWinThread::StartSync() | |||||
| { | |||||
| DWORD id; | |||||
| fEvent = CreateEvent(NULL, FALSE, FALSE, NULL); | |||||
| if (fEvent == NULL) { | |||||
| jack_error("Cannot create event error = %d", GetLastError()); | |||||
| return -1; | |||||
| } | |||||
| if (fRealTime) { | |||||
| JackLog("Create RT thread\n"); | |||||
| fThread = CreateThread(NULL, 0, ThreadHandler, (void*)this, 0, &id); | |||||
| if (fThread == NULL) { | |||||
| jack_error("Cannot create thread error = %d", GetLastError()); | |||||
| return -1; | |||||
| } | |||||
| if (WaitForSingleObject(fEvent, 3000) != WAIT_OBJECT_0) { // wait 3 sec | |||||
| jack_error("Thread has not started"); | |||||
| return -1; | |||||
| } | |||||
| if (!SetThreadPriority(fThread, THREAD_PRIORITY_TIME_CRITICAL)) { | |||||
| jack_error("Cannot set priority class = %d", GetLastError()); | |||||
| return -1; | |||||
| } | |||||
| return 0; | |||||
| } else { | |||||
| JackLog("Create non RT thread\n"); | |||||
| fThread = CreateThread(NULL, 0, ThreadHandler, (void*)this, 0, &id); | |||||
| if (fThread == NULL) { | |||||
| jack_error("Cannot create thread error = %d", GetLastError()); | |||||
| return -1; | |||||
| } | |||||
| if (WaitForSingleObject(fEvent, 3000) != WAIT_OBJECT_0) { // wait 3 sec | |||||
| jack_error("Thread has not started"); | |||||
| return -1; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| int JackWinThread::Start() | |||||
| { | |||||
| fEvent = CreateEvent(NULL, FALSE, FALSE, NULL); | |||||
| if (fEvent == NULL) { | |||||
| jack_error("Cannot create event error = %d", GetLastError()); | |||||
| return -1; | |||||
| } | |||||
| fRunning = true; | |||||
| // Check if the thread was correctly started | |||||
| if (StartImp(&fThread, fPriority, fRealTime, ThreadHandler, this) < 0) { | |||||
| fRunning = false; | |||||
| return -1; | |||||
| } else { | |||||
| return 0; | |||||
| } | |||||
| } | |||||
| int JackWinThread::StartImp(pthread_t* thread, int priority, int realtime, void*(*start_routine)(void*), void* arg); | |||||
| { | |||||
| DWORD id; | |||||
| if (realtime) { | |||||
| JackLog("Create RT thread\n"); | |||||
| *thread = CreateThread(NULL, 0, start_routine, arg, 0, &id); | |||||
| if (*thread == NULL) { | |||||
| jack_error("Cannot create thread error = %d", GetLastError()); | |||||
| return -1; | |||||
| } | |||||
| if (!SetThreadPriority(*thread, THREAD_PRIORITY_TIME_CRITICAL)) { | |||||
| jack_error("Cannot set priority class = %d", GetLastError()); | |||||
| return -1; | |||||
| } | |||||
| return 0; | |||||
| } else { | |||||
| JackLog("Create non RT thread\n"); | |||||
| *thread = CreateThread(NULL, 0, start_routine, arg, 0, &id); | |||||
| if (fThread == NULL) { | |||||
| jack_error("Cannot create thread error = %d", GetLastError()); | |||||
| return -1; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| } | |||||
| int JackWinThread::StartSync() | |||||
| { | |||||
| DWORD id; | |||||
| fEvent = CreateEvent(NULL, FALSE, FALSE, NULL); | |||||
| if (fEvent == NULL) { | |||||
| jack_error("Cannot create event error = %d", GetLastError()); | |||||
| return -1; | |||||
| } | |||||
| if (fRealTime) { | |||||
| JackLog("Create RT thread\n"); | |||||
| fThread = CreateThread(NULL, 0, ThreadHandler, (void*)this, 0, &id); | |||||
| if (fThread == NULL) { | |||||
| jack_error("Cannot create thread error = %d", GetLastError()); | |||||
| return -1; | |||||
| } | |||||
| if (WaitForSingleObject(fEvent, 3000) != WAIT_OBJECT_0) { // wait 3 sec | |||||
| jack_error("Thread has not started"); | |||||
| return -1; | |||||
| } | |||||
| if (!SetThreadPriority(fThread, THREAD_PRIORITY_TIME_CRITICAL)) { | |||||
| jack_error("Cannot set priority class = %d", GetLastError()); | |||||
| return -1; | |||||
| } | |||||
| return 0; | |||||
| } else { | |||||
| JackLog("Create non RT thread\n"); | |||||
| fThread = CreateThread(NULL, 0, ThreadHandler, (void*)this, 0, &id); | |||||
| if (fThread == NULL) { | |||||
| jack_error("Cannot create thread error = %d", GetLastError()); | |||||
| return -1; | |||||
| } | |||||
| if (WaitForSingleObject(fEvent, 3000) != WAIT_OBJECT_0) { // wait 3 sec | |||||
| jack_error("Thread has not started"); | |||||
| return -1; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| } | } | ||||
| // voir http://www.microsoft.com/belux/msdn/nl/community/columns/ldoc/multithread1.mspx | // voir http://www.microsoft.com/belux/msdn/nl/community/columns/ldoc/multithread1.mspx | ||||
| @@ -167,9 +178,9 @@ int JackWinThread::StartSync() | |||||
| int JackWinThread::Kill() | int JackWinThread::Kill() | ||||
| { | { | ||||
| if (fThread) { // If thread has been started | if (fThread) { // If thread has been started | ||||
| TerminateThread(fThread, 0); | |||||
| TerminateThread(fThread, 0); | |||||
| WaitForSingleObject(fThread, INFINITE); | WaitForSingleObject(fThread, INFINITE); | ||||
| CloseHandle(fThread); | |||||
| CloseHandle(fThread); | |||||
| JackLog("JackWinThread::Kill 2\n"); | JackLog("JackWinThread::Kill 2\n"); | ||||
| fThread = NULL; | fThread = NULL; | ||||
| fRunning = false; | fRunning = false; | ||||
| @@ -195,6 +206,7 @@ int JackWinThread::Stop() | |||||
| int JackWinThread::AcquireRealTime() | int JackWinThread::AcquireRealTime() | ||||
| { | { | ||||
| /* | |||||
| JackLog("JackWinThread::AcquireRealTime\n"); | JackLog("JackWinThread::AcquireRealTime\n"); | ||||
| if (fThread) { | if (fThread) { | ||||
| @@ -207,14 +219,33 @@ int JackWinThread::AcquireRealTime() | |||||
| } else { | } else { | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| */ | |||||
| return (fThread) ? AcquireRealTimeImp(fThread, fPriority) : -1; | |||||
| } | } | ||||
| int JackWinThread::AcquireRealTime(int priority) | int JackWinThread::AcquireRealTime(int priority) | ||||
| { | { | ||||
| JackLog("JackWinThread::AcquireRealTime priority = %ld\n", priority); | |||||
| return AcquireRealTime(); | |||||
| //JackLog("JackWinThread::AcquireRealTime priority = %ld\n", priority); | |||||
| //return AcquireRealTime(); | |||||
| fPriority = priority; | |||||
| return AcquireRealTime(); | |||||
| } | |||||
| int JackWinThread::AcquireRealTimeImp(pthread_t thread, int priority) | |||||
| { | |||||
| JackLog("JackWinThread::AcquireRealTime\n"); | |||||
| if (SetThreadPriority(thread, THREAD_PRIORITY_TIME_CRITICAL)) { | |||||
| JackLog("JackWinThread::AcquireRealTime OK\n"); | |||||
| return 0; | |||||
| } else { | |||||
| jack_error("Cannot set thread priority = %d", GetLastError()); | |||||
| return -1; | |||||
| } | |||||
| } | } | ||||
| /* | |||||
| int JackWinThread::DropRealTime() | int JackWinThread::DropRealTime() | ||||
| { | { | ||||
| if (fThread) { | if (fThread) { | ||||
| @@ -227,6 +258,21 @@ int JackWinThread::DropRealTime() | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| } | } | ||||
| */ | |||||
| int JackWinThread::DropRealTime() | |||||
| { | |||||
| return DropRealTime(fThread); | |||||
| } | |||||
| int JackWinThread::DropRealTime(pthread_t thread) | |||||
| { | |||||
| if (SetThreadPriority(thread, THREAD_PRIORITY_NORMAL)) { | |||||
| return 0; | |||||
| } else { | |||||
| jack_error("Cannot set thread priority = %d", GetLastError()); | |||||
| return -1; | |||||
| } | |||||
| } | |||||
| pthread_t JackWinThread::GetThreadID() | pthread_t JackWinThread::GetThreadID() | ||||
| { | { | ||||
| @@ -57,6 +57,11 @@ class JackWinThread : public JackThread | |||||
| int DropRealTime(); | int DropRealTime(); | ||||
| pthread_t GetThreadID(); | pthread_t GetThreadID(); | ||||
| static int AcquireRealTimeImp(pthread_t thread, int priority); | |||||
| static int DropRealTimeImp(pthread_t thread); | |||||
| static int StartImp(pthread_t* thread, int priority, int realtime, void*(*start_routine)(void*), void* arg); | |||||
| }; | }; | ||||
| } // end of namespace | } // end of namespace | ||||