summaryrefslogtreecommitdiff
path: root/gtk2_ardour/canvas-waveview.h
blob: 3d7b02946d572f0696a4d4328e175d15a47fe2b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/* libgnomecanvas/gnome-canvas-waveview.h: GnomeCanvas item for displaying wave data
 *
 * Copyright (C) 2001 Paul Davis <pbd@op.net>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 *
 */

#ifndef __GNOME_CANVAS_WAVEVIEW_H__
#define __GNOME_CANVAS_WAVEVIEW_H__

#include <stdint.h>

#include <libgnomecanvas/libgnomecanvas.h>

G_BEGIN_DECLS

/* Wave viewer item for canvas.
 */

#define GNOME_TYPE_CANVAS_WAVEVIEW            (gnome_canvas_waveview_get_type ())
#define GNOME_CANVAS_WAVEVIEW(obj)            (GTK_CHECK_CAST ((obj), GNOME_TYPE_CANVAS_WAVEVIEW, GnomeCanvasWaveView))
#define GNOME_CANVAS_WAVEVIEW_CLASS(klass)    (GTK_CHECK_CLASS_CAST ((klass), GNOME_TYPE_CANVAS_WAVEVIEW, GnomeCanvasWaveViewClass))
#define GNOME_IS_CANVAS_WAVEVIEW(obj)         (GTK_CHECK_TYPE ((obj), GNOME_TYPE_CANVAS_WAVEVIEW))
#define GNOME_IS_CANVAS_WAVEVIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_CANVAS_WAVEVIEW))
#define GNOME_CANVAS_WAVEVIEW_GET_CLASS(obj)  (GTK_CHECK_GET_CLASS ((obj), GNOME_TYPE_CANVAS_WAVEVIEW, GnomeCanvasWaveViewClass))

typedef struct _GnomeCanvasWaveView            GnomeCanvasWaveView;
typedef struct _GnomeCanvasWaveViewClass       GnomeCanvasWaveViewClass;
typedef struct _GnomeCanvasWaveViewChannelInfo GnomeCanvasWaveViewChannelInfo;
typedef struct _GnomeCanvasWaveViewCacheEntry  GnomeCanvasWaveViewCacheEntry;
typedef struct _GnomeCanvasWaveViewCache       GnomeCanvasWaveViewCache;

/* XXX this needs to be synced with ardour/source.h PeakData */

struct _GnomeCanvasWaveViewCacheEntry
{
    float  min;
    float  max;
};

struct _GnomeCanvasWaveViewCache
{
    GnomeCanvasWaveViewCacheEntry* data;
    gint32                       allocated;
    gint64                       data_size;
    gulong                       start;
    gulong                       end;
};    

GnomeCanvasWaveViewCache* gnome_canvas_waveview_cache_new ();
void                    gnome_canvas_waveview_cache_destroy (GnomeCanvasWaveViewCache*);

struct _GnomeCanvasWaveView
{
    GnomeCanvasItem item;
    
    GnomeCanvasWaveViewCache *cache;
    gboolean                cache_updater;
    gint                    screen_width;

    void *data_src;
    guint32 channel;
	void (*peak_function)(void*,gulong,gulong,gulong,gpointer,guint32,double);
    gulong (*length_function)(void *);
    gulong (*sourcefile_length_function)(void*,double);
    void (*gain_curve_function)(void *arg, double start, double end, float* vector, gint64 veclen);
    void *gain_src;

    /** x-axis: samples per canvas unit. */
    double samples_per_unit;
    
    /** y-axis: amplitude_above_axis.
     * 
     * the default is that an (scaled, normalized -1.0 ... +1.0) amplitude of 1.0
     * corresponds to the top of the area assigned to the waveview.
     *
     * larger values will expand the vertical scale, cutting off the peaks/troughs.
     * smaller values will decrease the vertical scale, moving peaks/troughs toward
     * the middle of the area assigned to the waveview.
     */
    double amplitude_above_axis;

    double x;
    double y;
    double height;
    double half_height;
    uint32_t wave_color;
    uint32_t clip_color;
    uint32_t zero_color;
    uint32_t fill_color;

    char filled;
    char rectified;
    char zero_line;
    char logscaled;
	
    /* These are updated by the update() routine
       to optimize the render() routine, which may
       be called several times after a single update().
    */

    int32_t bbox_ulx;
    int32_t bbox_uly;
    int32_t bbox_lrx;
    int32_t bbox_lry;
    unsigned char wave_r, wave_g, wave_b, wave_a;
    unsigned char clip_r, clip_g, clip_b, clip_a;
    unsigned char fill_r, fill_g, fill_b, fill_a;
    uint32_t samples;
    uint32_t region_start;
    int32_t reload_cache_in_render;
};

struct _GnomeCanvasWaveViewClass {
	GnomeCanvasItemClass parent_class;
};

GType gnome_canvas_waveview_get_type (void) G_GNUC_CONST;

G_END_DECLS

#endif /* __GNOME_CANVAS_WAVEVIEW_H__ */