#
# Set cmake internal variables from parameters.
#
+
+set(Compile.linux.sources
+ source/platform/linux/scheduler.cpp
+)
+
+# FIX: Add other platforms.
+if(Platform.name STREQUAL Linux)
+ set(Compile.platform.sources ${Compile.linux.sources})
+endif(Platform.name STREQUAL Linux)
+
set(Compile.sources
+ ${Compile.platform.sources}
source/audio_device.cpp
source/audio_input.cpp
source/audio_output.cpp
help(argv[0]);
exit(1);
}
+ set_scheduler();
return run(&i);
}
#endif
/// \param s The string to be copied.
/// \return The new copy. It's the caller's responsibility to free this data,
/// or a memory leak will occurr.
- char * copy_string(const char * s);
+ char * copy_string(const char * s);
+
+ /// Set the real-time parameters in the scheduler before running our main
+ /// loop.
+ void set_scheduler();
/// Virtual base class for all driver classes.
class Base {
--- /dev/null
+#include <unistd.h>
+#ifdef _POSIX_PRIORITY_SCHEDULING
+#include <errno.h>
+#include <sched.h>
+#include <cstring>
+#include <iostream>
+#endif
+#include "drivers.h"
+
+namespace FreeDV {
+ void
+ set_scheduler()
+ {
+#ifdef _POSIX_PRIORITY_SCHEDULING
+ sched_param p;
+ int policy = SCHED_RR;
+
+ p.sched_priority = sched_get_priority_min(policy);
+ const int result = sched_setscheduler(0, policy, &p);
+ if ( result < 0 ) {
+ if ( errno == EPERM ) {
+ std::cerr << "Insufficient privilege to set real-time priority. "
+ "Try runing as root." << std::endl;
+ }
+ else if ( errno == EINVAL ) {
+ std::cerr << "This kernel doesn't seem to have real-time facilities. "
+ "If audio is sometimes interrupted, try a newer kernel." << std::endl;
+ }
+ else {
+ std::cerr << "sched_setscheduler: " << strerror(errno) << std::endl;
+ }
+ }
+ }
+#endif
+}
else {
receive(i);
}
- usleep(10000);
+ usleep(20000);
}
}