mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.4 KiB
62 lines
1.4 KiB
// SPDX-License-Identifier: GPL-2.0 |
|
#include <linux/kthread.h> |
|
#include <linux/wait.h> |
|
|
|
#include "spk_types.h" |
|
#include "speakup.h" |
|
#include "spk_priv.h" |
|
|
|
DECLARE_WAIT_QUEUE_HEAD(speakup_event); |
|
EXPORT_SYMBOL_GPL(speakup_event); |
|
|
|
int speakup_thread(void *data) |
|
{ |
|
unsigned long flags; |
|
int should_break; |
|
struct bleep our_sound; |
|
|
|
our_sound.active = 0; |
|
our_sound.freq = 0; |
|
our_sound.jiffies = 0; |
|
|
|
mutex_lock(&spk_mutex); |
|
while (1) { |
|
DEFINE_WAIT(wait); |
|
|
|
while (1) { |
|
spin_lock_irqsave(&speakup_info.spinlock, flags); |
|
our_sound = spk_unprocessed_sound; |
|
spk_unprocessed_sound.active = 0; |
|
prepare_to_wait(&speakup_event, &wait, |
|
TASK_INTERRUPTIBLE); |
|
should_break = kthread_should_stop() || |
|
our_sound.active || |
|
(synth && synth->catch_up && synth->alive && |
|
(speakup_info.flushing || |
|
!synth_buffer_empty())); |
|
spin_unlock_irqrestore(&speakup_info.spinlock, flags); |
|
if (should_break) |
|
break; |
|
mutex_unlock(&spk_mutex); |
|
schedule(); |
|
mutex_lock(&spk_mutex); |
|
} |
|
finish_wait(&speakup_event, &wait); |
|
if (kthread_should_stop()) |
|
break; |
|
|
|
if (our_sound.active) |
|
kd_mksound(our_sound.freq, our_sound.jiffies); |
|
if (synth && synth->catch_up && synth->alive) { |
|
/* |
|
* It is up to the callee to take the lock, so that it |
|
* can sleep whenever it likes |
|
*/ |
|
synth->catch_up(synth); |
|
} |
|
|
|
speakup_start_ttys(); |
|
} |
|
mutex_unlock(&spk_mutex); |
|
return 0; |
|
}
|
|
|