add soundio parameter to emit_rtprio_warning

closes #114
This commit is contained in:
Andrew Kelley 2016-10-23 19:40:37 -04:00
parent bef0df2f0b
commit c81fe43ac0
6 changed files with 21 additions and 21 deletions

View file

@ -381,7 +381,7 @@ struct SoundIo {
/// a message instructing the user how to configure their system to allow /// a message instructing the user how to configure their system to allow
/// real-time priority threads. This must be set to a function not NULL. /// real-time priority threads. This must be set to a function not NULL.
/// To silence the warning, assign this to a function that does nothing. /// To silence the warning, assign this to a function that does nothing.
void (*emit_rtprio_warning)(void); void (*emit_rtprio_warning)(struct SoundIo *);
/// Optional: JACK info callback. /// Optional: JACK info callback.
/// By default, libsoundio sets this to an empty function in order to /// By default, libsoundio sets this to an empty function in order to
@ -389,6 +389,9 @@ struct SoundIo {
/// setting this to `NULL` or providing your own function. This is /// setting this to `NULL` or providing your own function. This is
/// registered with JACK regardless of whether ::soundio_connect_backend /// registered with JACK regardless of whether ::soundio_connect_backend
/// succeeds. /// succeeds.
/// These functions are called globally from JACK and there is not a way
/// to provide access to the SoundIo instance. For more details, see
/// https://github.com/jackaudio/jack2/issues/235
void (*jack_info_callback)(const char *msg); void (*jack_info_callback)(const char *msg);
/// Optional: JACK error callback. /// Optional: JACK error callback.
/// See SoundIo::jack_info_callback /// See SoundIo::jack_info_callback

View file

@ -1447,7 +1447,7 @@ static enum SoundIoError outstream_start_alsa(struct SoundIoPrivate *si, struct
enum SoundIoError err; enum SoundIoError err;
SOUNDIO_ATOMIC_FLAG_TEST_AND_SET(osa->thread_exit_flag); SOUNDIO_ATOMIC_FLAG_TEST_AND_SET(osa->thread_exit_flag);
if ((err = soundio_os_thread_create(outstream_thread_run, os, soundio->emit_rtprio_warning, &osa->thread))) if ((err = soundio_os_thread_create(outstream_thread_run, os, soundio, &osa->thread)))
return err; return err;
return 0; return 0;
@ -1749,7 +1749,7 @@ static enum SoundIoError instream_start_alsa(struct SoundIoPrivate *si, struct S
SOUNDIO_ATOMIC_FLAG_TEST_AND_SET(isa->thread_exit_flag); SOUNDIO_ATOMIC_FLAG_TEST_AND_SET(isa->thread_exit_flag);
enum SoundIoError err; enum SoundIoError err;
if ((err = soundio_os_thread_create(instream_thread_run, is, soundio->emit_rtprio_warning, &isa->thread))) { if ((err = soundio_os_thread_create(instream_thread_run, is, soundio, &isa->thread))) {
instream_destroy_alsa(si, is); instream_destroy_alsa(si, is);
return err; return err;
} }

View file

@ -219,10 +219,8 @@ static enum SoundIoError outstream_start_dummy(struct SoundIoPrivate *si, struct
struct SoundIo *soundio = &si->pub; struct SoundIo *soundio = &si->pub;
assert(!osd->thread); assert(!osd->thread);
SOUNDIO_ATOMIC_FLAG_TEST_AND_SET(osd->abort_flag); SOUNDIO_ATOMIC_FLAG_TEST_AND_SET(osd->abort_flag);
int err; enum SoundIoError err;
if ((err = soundio_os_thread_create(playback_thread_run, os, if ((err = soundio_os_thread_create(playback_thread_run, os, soundio, &osd->thread))) {
soundio->emit_rtprio_warning, &osd->thread)))
{
return err; return err;
} }
return SoundIoErrorNone; return SoundIoErrorNone;
@ -334,10 +332,8 @@ static enum SoundIoError instream_start_dummy(struct SoundIoPrivate *si, struct
struct SoundIo *soundio = &si->pub; struct SoundIo *soundio = &si->pub;
assert(!isd->thread); assert(!isd->thread);
SOUNDIO_ATOMIC_FLAG_TEST_AND_SET(isd->abort_flag); SOUNDIO_ATOMIC_FLAG_TEST_AND_SET(isd->abort_flag);
int err; enum SoundIoError err;
if ((err = soundio_os_thread_create(capture_thread_run, is, if ((err = soundio_os_thread_create(capture_thread_run, is, soundio, &isd->thread))) {
soundio->emit_rtprio_warning, &isd->thread)))
{
return err; return err;
} }
return 0; return 0;

View file

@ -186,7 +186,7 @@ static void *run_pthread(void *userdata) {
int soundio_os_thread_create( int soundio_os_thread_create(
void (*run)(void *arg), void *arg, void (*run)(void *arg), void *arg,
void (*emit_rtprio_warning)(void), struct SoundIo *soundio,
struct SoundIoOsThread **out_thread) struct SoundIoOsThread **out_thread)
{ {
*out_thread = NULL; *out_thread = NULL;
@ -206,9 +206,9 @@ int soundio_os_thread_create(
soundio_os_thread_destroy(thread); soundio_os_thread_destroy(thread);
return SoundIoErrorSystemResources; return SoundIoErrorSystemResources;
} }
if (emit_rtprio_warning) { if (soundio) {
if (!SetThreadPriority(thread->handle, THREAD_PRIORITY_TIME_CRITICAL)) { if (!SetThreadPriority(thread->handle, THREAD_PRIORITY_TIME_CRITICAL)) {
emit_rtprio_warning(); soundio->emit_rtprio_warning(soundio);
} }
} }
#else #else
@ -219,7 +219,7 @@ int soundio_os_thread_create(
} }
thread->attr_init = true; thread->attr_init = true;
if (emit_rtprio_warning) { if (soundio) {
int max_priority = sched_get_priority_max(SCHED_FIFO); int max_priority = sched_get_priority_max(SCHED_FIFO);
if (max_priority == -1) { if (max_priority == -1) {
soundio_os_thread_destroy(thread); soundio_os_thread_destroy(thread);
@ -241,8 +241,8 @@ int soundio_os_thread_create(
} }
if ((err = pthread_create(&thread->id, &thread->attr, run_pthread, thread))) { if ((err = pthread_create(&thread->id, &thread->attr, run_pthread, thread))) {
if (err == EPERM && emit_rtprio_warning) { if (err == EPERM && soundio) {
emit_rtprio_warning(); soundio->emit_rtprio_warning(soundio);
err = pthread_create(&thread->id, NULL, run_pthread, thread); err = pthread_create(&thread->id, NULL, run_pthread, thread);
} }
if (err) { if (err) {

View file

@ -19,9 +19,10 @@ int soundio_os_init(void);
double soundio_os_get_time(void); double soundio_os_get_time(void);
struct SoundIoOsThread; struct SoundIoOsThread;
struct SoundIo;
int soundio_os_thread_create( int soundio_os_thread_create(
void (*run)(void *arg), void *arg, void (*run)(void *arg), void *arg,
void (*emit_rtprio_warning)(void), struct SoundIo *soundio, // pass NULL to disable real time priority
struct SoundIoOsThread **out_thread); struct SoundIoOsThread **out_thread);
void soundio_os_thread_destroy(struct SoundIoOsThread *thread); void soundio_os_thread_destroy(struct SoundIoOsThread *thread);

View file

@ -186,7 +186,7 @@ static void default_backend_disconnect_cb(struct SoundIo *soundio, enum SoundIoE
} }
static struct SoundIoAtomicFlag rtprio_seen = SOUNDIO_ATOMIC_FLAG_INIT; static struct SoundIoAtomicFlag rtprio_seen = SOUNDIO_ATOMIC_FLAG_INIT;
static void default_emit_rtprio_warning(void) { static void default_emit_rtprio_warning(struct SoundIo *soundio) {
if (!SOUNDIO_ATOMIC_FLAG_TEST_AND_SET(rtprio_seen)) { if (!SOUNDIO_ATOMIC_FLAG_TEST_AND_SET(rtprio_seen)) {
fprintf(stderr, "warning: unable to set high priority thread: Operation not permitted\n"); fprintf(stderr, "warning: unable to set high priority thread: Operation not permitted\n");
fprintf(stderr, "See " fprintf(stderr, "See "