Run pipeline in a separate thread

This commit is contained in:
Alexander Kojevnikov 2010-07-04 13:08:37 +10:00
parent 2e8355ee84
commit 00b385d6d7
3 changed files with 37 additions and 2 deletions

@ -18,6 +18,7 @@ INCLUDES = \
-DPKGLIBDIR=\""$(pkglibdir)"\"
VALAFLAGS = \
--thread \
--vapidir=$(srcdir)/../vapi \
--pkg config \
--pkg spek-audio \

@ -42,6 +42,9 @@ namespace Spek {
private float[] input;
private float[] output;
private unowned Thread thread = null;
private bool quit = false;
public Pipeline (string file_name, int bands, int samples, int threshold, Callback cb) {
this.cx = new Audio.Context (file_name);
this.bands = bands;
@ -85,7 +88,31 @@ namespace Spek {
this.cx.start (samples);
}
~Pipeline () {
stop ();
}
public void start () {
stop ();
try {
thread = Thread.create (thread_func, true);
thread.set_priority (ThreadPriority.LOW);
} catch (ThreadError e) {
assert_not_reached ();
}
}
public void stop () {
if (thread != null) {
quit = true;
thread.join ();
quit = false;
thread = null;
}
}
private void * thread_func () {
int pos = 0;
int sample = 0;
int64 frames = 0;
@ -99,6 +126,9 @@ namespace Spek {
uint8 *buffer = (uint8 *) this.buffer;
var block_size = cx.width * cx.channels / 8;
while (size >= block_size) {
if (quit) {
return null;
}
input[pos] = average_input (buffer);
buffer += block_size;
size -= block_size;
@ -139,6 +169,9 @@ namespace Spek {
}
cb (sample++, output);
if (sample == samples) {
return null;
}
Posix.memset (output, 0, sizeof (float) * bands);
frames = 0;
num_fft = 0;
@ -146,6 +179,7 @@ namespace Spek {
}
assert (size == 0);
}
return null;
}
private float average_input (uint8 *buffer) {

@ -74,7 +74,7 @@ namespace Spek {
private void start () {
if (pipeline != null) {
// pipeline.stop ();
pipeline.stop ();
}
// The number of samples is the number of pixels available for the image.
@ -108,7 +108,7 @@ namespace Spek {
1.0, Math.log10 (1.0 - THRESHOLD + values[y]) / Math.log10 (-THRESHOLD));
put_pixel (image, sample, y, get_color (level));
}
queue_draw_area (LPAD + sample, TPAD, 1, allocation.height - TPAD - BPAD);
Idle.add (() => { queue_draw (); return false; });
}
private override bool expose_event (EventExpose event) {