spek

Acoustic spectrum analyser
git clone http://git.hanabi.in/repos/spek.git
Log | Files | Refs | README

commit 28ade26079755807921599ecb47aa9af9c8d6273
parent 65fcc182e136965e4c80dbe3df8bf9c560eead83
Author: Alexander Kojevnikov <alexander@kojevnikov.com>
Date:   Tue,  4 May 2010 23:16:41 +1000

Add a callback to the source

Diffstat:
Msrc/spek-source.vala | 23+++++++++++++++--------
Msrc/spek-window.vala | 10+++++++++-
2 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/src/spek-source.vala b/src/spek-source.vala @@ -6,14 +6,20 @@ namespace Spek { public string file_name { get; construct; } public int bands { get; construct; } public int samples { get; construct; } + // TODO: file a bug, cannot s/set/construct/ + public Callback callback {get; set; } + + public delegate void Callback (int sample, float[] values); private Pipeline pipeline = null; private Element spectrum = null; private Pad pad = null; - private static int sample = 0; + private int sample; + private float[] values; - public Source (string file_name, int bands, int samples) { + public Source (string file_name, int bands, int samples, Callback callback) { GLib.Object (file_name: file_name, bands: bands, samples: samples); + this.callback = callback; } ~Source () { @@ -21,6 +27,9 @@ namespace Spek { } construct { + sample = 0; + values = new float[bands]; + // TODO: catch errors pipeline = new Pipeline ("pipeline"); var filesrc = ElementFactory.make ("filesrc", null); @@ -75,16 +84,14 @@ namespace Spek { fakesink.set_state (State.PAUSED); } - private static bool on_bus_watch (Bus bus, Message message) { + private bool on_bus_watch (Bus bus, Message message) { var structure = message.get_structure (); if (message.type == MessageType.ELEMENT && structure.get_name () == "spectrum") { - stdout.printf ("%d:", sample++); var magnitudes = structure.get_value ("magnitude"); - for (int i=0; i<10; i++) { - var mag = magnitudes.list_get_value (i); - stdout.printf (" %.2f", mag.get_float ()); + for (int i = 0; i < bands; i++) { + values[i] = magnitudes.list_get_value (i).get_float (); } - stdout.printf ("\n"); + callback (sample++, values); } return true; } diff --git a/src/spek-window.vala b/src/spek-window.vala @@ -30,9 +30,17 @@ namespace Spek { STOCK_CANCEL, ResponseType.CANCEL, STOCK_OPEN, ResponseType.ACCEPT, null); if (chooser.run () == ResponseType.ACCEPT) { - source = new Source (chooser.get_filename (), 10, 100); + source = new Source (chooser.get_filename (), 10, 100, source_callback); } chooser.destroy (); } + + private void source_callback (int sample, float[] values) { + stdout.printf ("%d:", sample); + foreach (var value in values) { + stdout.printf (" %.2f", value); + } + stdout.printf ("\n"); + } } }