Duration ruler (start and end only)

This commit is contained in:
Alexander Kojevnikov 2010-05-16 18:11:14 +10:00
parent 64d19bd837
commit f625d32a6e
2 changed files with 25 additions and 1 deletions

View File

@ -27,6 +27,7 @@ namespace Spek {
public int threshold { get; construct; } public int threshold { get; construct; }
// TODO: file a bug, cannot s/set/construct/ // TODO: file a bug, cannot s/set/construct/
public Callback callback {get; set; } public Callback callback {get; set; }
public int64 duration { get; private set; }
public delegate void Callback (int sample, float[] values); public delegate void Callback (int sample, float[] values);
@ -84,6 +85,7 @@ namespace Spek {
Format format; Format format;
int64 duration; int64 duration;
query.parse_duration (out format, out duration); query.parse_duration (out format, out duration);
this.duration = duration;
spectrum.set ("interval", duration / (samples + 1)); spectrum.set ("interval", duration / (samples + 1));
pipeline.set_state (State.PLAYING); pipeline.set_state (State.PLAYING);

View File

@ -108,13 +108,35 @@ namespace Spek {
cr.set_source_rgb (0, 0, 0); cr.set_source_rgb (0, 0, 0);
cr.paint (); cr.paint ();
// Draw the spectrogram.
if (image != null) { if (image != null) {
// Draw the spectrogram.
cr.translate (PADDING, h - PADDING); cr.translate (PADDING, h - PADDING);
cr.scale (1, -(h - 2 * PADDING) / image.get_height ()); cr.scale (1, -(h - 2 * PADDING) / image.get_height ());
cr.set_source_surface (image, 0, 0); cr.set_source_surface (image, 0, 0);
cr.paint (); cr.paint ();
cr.identity_matrix (); cr.identity_matrix ();
// Time ruler.
int64[] time_points = {0, source.duration};
cr.set_source_rgb (1, 1, 1);
cr.set_line_width (1);
cr.set_antialias (Antialias.NONE);
cr.select_font_face ("sans-serif", FontSlant.NORMAL, FontWeight.NORMAL);
cr.set_font_size (10.0);
TextExtents ext;
cr.text_extents ("00:00", out ext);
double tick_width = ext.width;
foreach (var pt in time_points) {
var seconds = (int) (pt / 1000000000);
var label = "%d:%02d".printf (seconds / 60, seconds % 60);
var pos = PADDING + (w - 2 * PADDING) * pt / source.duration;
cr.text_extents (label, out ext);
cr.move_to (pos - ext.width / 2, h - PADDING + GAP + ext.height);
cr.show_text (label);
cr.move_to (pos, h - PADDING);
cr.rel_line_to (0, 4);
cr.stroke ();
}
} }
// Border around the spectrogram. // Border around the spectrogram.