Merge branch 'license-fix' of https://github.com/adiknoth/ardour
This commit is contained in:
commit
ebb1271b6f
@ -1,586 +0,0 @@
|
|||||||
/* Image item type for GnomeCanvas widget
|
|
||||||
*
|
|
||||||
* GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
|
|
||||||
* copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1998 The Free Software Foundation
|
|
||||||
*
|
|
||||||
* Author: Federico Mena <federico@nuclecu.unam.mx>
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include <string.h> /* for memcpy() */
|
|
||||||
#include <math.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "libart_lgpl/art_misc.h"
|
|
||||||
#include "libart_lgpl/art_affine.h"
|
|
||||||
#include "libart_lgpl/art_pixbuf.h"
|
|
||||||
#include "libart_lgpl/art_rgb_pixbuf_affine.h"
|
|
||||||
#include "canvas-imageframe.h"
|
|
||||||
#include <libgnomecanvas/gnome-canvas-util.h>
|
|
||||||
#include "gettext.h"
|
|
||||||
#define _(Text) dgettext (PACKAGE,Text)
|
|
||||||
|
|
||||||
//GTK2FIX
|
|
||||||
//#include <libgnomecanvas/gnome-canvastypebuiltins.h>
|
|
||||||
|
|
||||||
|
|
||||||
enum {
|
|
||||||
PROP_0,
|
|
||||||
PROP_PIXBUF,
|
|
||||||
PROP_X,
|
|
||||||
PROP_Y,
|
|
||||||
PROP_WIDTH,
|
|
||||||
PROP_HEIGHT,
|
|
||||||
PROP_DRAWWIDTH,
|
|
||||||
PROP_ANCHOR
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static void gnome_canvas_imageframe_class_init(GnomeCanvasImageFrameClass* class) ;
|
|
||||||
static void gnome_canvas_imageframe_init(GnomeCanvasImageFrame* image) ;
|
|
||||||
static void gnome_canvas_imageframe_destroy(GtkObject* object) ;
|
|
||||||
static void gnome_canvas_imageframe_set_property(GObject* object,
|
|
||||||
guint prop_id,
|
|
||||||
const GValue *value,
|
|
||||||
GParamSpec *pspec);
|
|
||||||
static void gnome_canvas_imageframe_get_property(GObject* object,
|
|
||||||
guint prop_id,
|
|
||||||
GValue *value,
|
|
||||||
GParamSpec *pspec);
|
|
||||||
static void gnome_canvas_imageframe_update(GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags) ;
|
|
||||||
static void gnome_canvas_imageframe_realize(GnomeCanvasItem *item) ;
|
|
||||||
static void gnome_canvas_imageframe_unrealize(GnomeCanvasItem *item) ;
|
|
||||||
static void gnome_canvas_imageframe_draw(GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height) ;
|
|
||||||
static double gnome_canvas_imageframe_point(GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item) ;
|
|
||||||
static void gnome_canvas_imageframe_bounds(GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2) ;
|
|
||||||
static void gnome_canvas_imageframe_render(GnomeCanvasItem *item, GnomeCanvasBuf *buf) ;
|
|
||||||
|
|
||||||
static GnomeCanvasItemClass *parent_class;
|
|
||||||
|
|
||||||
|
|
||||||
GType
|
|
||||||
gnome_canvas_imageframe_get_type (void)
|
|
||||||
{
|
|
||||||
static GType imageframe_type = 0;
|
|
||||||
|
|
||||||
if (!imageframe_type) {
|
|
||||||
GtkTypeInfo imageframe_info = {
|
|
||||||
"GnomeCanvasImageFrame",
|
|
||||||
sizeof (GnomeCanvasImageFrame),
|
|
||||||
sizeof (GnomeCanvasImageFrameClass),
|
|
||||||
(GtkClassInitFunc) gnome_canvas_imageframe_class_init,
|
|
||||||
(GtkObjectInitFunc) gnome_canvas_imageframe_init,
|
|
||||||
NULL, /* reserved_1 */
|
|
||||||
NULL, /* reserved_2 */
|
|
||||||
(GtkClassInitFunc) NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
imageframe_type = gtk_type_unique (gnome_canvas_item_get_type (), &imageframe_info);
|
|
||||||
}
|
|
||||||
|
|
||||||
return imageframe_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gnome_canvas_imageframe_class_init (GnomeCanvasImageFrameClass *class)
|
|
||||||
{
|
|
||||||
GObjectClass *gobject_class;
|
|
||||||
GtkObjectClass *object_class;
|
|
||||||
GnomeCanvasItemClass *item_class;
|
|
||||||
|
|
||||||
gobject_class = (GObjectClass *) class;
|
|
||||||
object_class = (GtkObjectClass *) class;
|
|
||||||
item_class = (GnomeCanvasItemClass *) class;
|
|
||||||
|
|
||||||
parent_class = gtk_type_class (gnome_canvas_item_get_type ());
|
|
||||||
|
|
||||||
gobject_class->set_property = gnome_canvas_imageframe_set_property;
|
|
||||||
gobject_class->get_property = gnome_canvas_imageframe_get_property;
|
|
||||||
|
|
||||||
g_object_class_install_property (gobject_class,
|
|
||||||
PROP_PIXBUF,
|
|
||||||
g_param_spec_pointer ("pixbuf",
|
|
||||||
_("pixbuf"),
|
|
||||||
_("the pixbuf"),
|
|
||||||
G_PARAM_WRITABLE));
|
|
||||||
g_object_class_install_property (gobject_class,
|
|
||||||
PROP_X,
|
|
||||||
g_param_spec_double ("x",
|
|
||||||
_("x"),
|
|
||||||
_("x coordinate of upper left corner of rect"),
|
|
||||||
-G_MAXDOUBLE,
|
|
||||||
G_MAXDOUBLE,
|
|
||||||
0.0,
|
|
||||||
G_PARAM_READWRITE));
|
|
||||||
|
|
||||||
g_object_class_install_property (gobject_class,
|
|
||||||
PROP_Y,
|
|
||||||
g_param_spec_double ("y",
|
|
||||||
_("y"),
|
|
||||||
_("y coordinate of upper left corner of rect "),
|
|
||||||
-G_MAXDOUBLE,
|
|
||||||
G_MAXDOUBLE,
|
|
||||||
0.0,
|
|
||||||
G_PARAM_READWRITE));
|
|
||||||
g_object_class_install_property (gobject_class,
|
|
||||||
PROP_WIDTH,
|
|
||||||
g_param_spec_double ("width",
|
|
||||||
_("width"),
|
|
||||||
_("the width"),
|
|
||||||
-G_MAXDOUBLE,
|
|
||||||
G_MAXDOUBLE,
|
|
||||||
0.0,
|
|
||||||
G_PARAM_READWRITE));
|
|
||||||
|
|
||||||
g_object_class_install_property (gobject_class,
|
|
||||||
PROP_DRAWWIDTH,
|
|
||||||
g_param_spec_double ("drawwidth",
|
|
||||||
_("drawwidth"),
|
|
||||||
_("drawn width"),
|
|
||||||
-G_MAXDOUBLE,
|
|
||||||
G_MAXDOUBLE,
|
|
||||||
0.0,
|
|
||||||
G_PARAM_READWRITE));
|
|
||||||
g_object_class_install_property (gobject_class,
|
|
||||||
PROP_HEIGHT,
|
|
||||||
g_param_spec_double ("height",
|
|
||||||
_("height"),
|
|
||||||
_("the height"),
|
|
||||||
-G_MAXDOUBLE,
|
|
||||||
G_MAXDOUBLE,
|
|
||||||
0.0,
|
|
||||||
G_PARAM_READWRITE));
|
|
||||||
g_object_class_install_property (gobject_class,
|
|
||||||
PROP_ANCHOR,
|
|
||||||
g_param_spec_enum ("anchor",
|
|
||||||
_("anchor"),
|
|
||||||
_("the anchor"),
|
|
||||||
GTK_TYPE_ANCHOR_TYPE,
|
|
||||||
GTK_ANCHOR_NW,
|
|
||||||
G_PARAM_READWRITE));
|
|
||||||
|
|
||||||
object_class->destroy = gnome_canvas_imageframe_destroy;
|
|
||||||
|
|
||||||
item_class->update = gnome_canvas_imageframe_update;
|
|
||||||
item_class->realize = gnome_canvas_imageframe_realize;
|
|
||||||
item_class->unrealize = gnome_canvas_imageframe_unrealize;
|
|
||||||
item_class->draw = gnome_canvas_imageframe_draw;
|
|
||||||
item_class->point = gnome_canvas_imageframe_point;
|
|
||||||
item_class->bounds = gnome_canvas_imageframe_bounds;
|
|
||||||
item_class->render = gnome_canvas_imageframe_render;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gnome_canvas_imageframe_init (GnomeCanvasImageFrame *image)
|
|
||||||
{
|
|
||||||
image->x = 0.0;
|
|
||||||
image->y = 0.0;
|
|
||||||
image->width = 0.0;
|
|
||||||
image->height = 0.0;
|
|
||||||
image->drawwidth = 0.0;
|
|
||||||
image->anchor = GTK_ANCHOR_CENTER;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gnome_canvas_imageframe_destroy (GtkObject *object)
|
|
||||||
{
|
|
||||||
GnomeCanvasImageFrame *image;
|
|
||||||
|
|
||||||
g_return_if_fail (object != NULL);
|
|
||||||
g_return_if_fail (GNOME_CANVAS_IS_CANVAS_IMAGEFRAME (object));
|
|
||||||
|
|
||||||
image = GNOME_CANVAS_IMAGEFRAME (object);
|
|
||||||
|
|
||||||
image->cwidth = 0;
|
|
||||||
image->cheight = 0;
|
|
||||||
|
|
||||||
if (image->pixbuf)
|
|
||||||
{
|
|
||||||
art_pixbuf_free (image->pixbuf);
|
|
||||||
image->pixbuf = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(GTK_OBJECT_CLASS (parent_class)->destroy)
|
|
||||||
{
|
|
||||||
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get's the image bounds expressed as item-relative coordinates. */
|
|
||||||
static void
|
|
||||||
get_bounds_item_relative (GnomeCanvasImageFrame *image, double *px1, double *py1, double *px2, double *py2)
|
|
||||||
{
|
|
||||||
GnomeCanvasItem *item;
|
|
||||||
double x, y;
|
|
||||||
|
|
||||||
item = GNOME_CANVAS_ITEM (image);
|
|
||||||
|
|
||||||
/* Get item coordinates */
|
|
||||||
|
|
||||||
x = image->x;
|
|
||||||
y = image->y;
|
|
||||||
|
|
||||||
/* Anchor image */
|
|
||||||
|
|
||||||
switch (image->anchor) {
|
|
||||||
case GTK_ANCHOR_NW:
|
|
||||||
case GTK_ANCHOR_W:
|
|
||||||
case GTK_ANCHOR_SW:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GTK_ANCHOR_N:
|
|
||||||
case GTK_ANCHOR_CENTER:
|
|
||||||
case GTK_ANCHOR_S:
|
|
||||||
x -= image->width / 2;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GTK_ANCHOR_NE:
|
|
||||||
case GTK_ANCHOR_E:
|
|
||||||
case GTK_ANCHOR_SE:
|
|
||||||
x -= image->width;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (image->anchor) {
|
|
||||||
case GTK_ANCHOR_NW:
|
|
||||||
case GTK_ANCHOR_N:
|
|
||||||
case GTK_ANCHOR_NE:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GTK_ANCHOR_W:
|
|
||||||
case GTK_ANCHOR_CENTER:
|
|
||||||
case GTK_ANCHOR_E:
|
|
||||||
y -= image->height / 2;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GTK_ANCHOR_SW:
|
|
||||||
case GTK_ANCHOR_S:
|
|
||||||
case GTK_ANCHOR_SE:
|
|
||||||
y -= image->height;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Bounds */
|
|
||||||
|
|
||||||
*px1 = x;
|
|
||||||
*py1 = y;
|
|
||||||
*px2 = x + image->width;
|
|
||||||
*py2 = y + image->height;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gnome_canvas_imageframe_set_property (GObject *object,
|
|
||||||
guint prop_id,
|
|
||||||
const GValue *value,
|
|
||||||
GParamSpec *pspec)
|
|
||||||
{
|
|
||||||
GnomeCanvasItem *item;
|
|
||||||
GnomeCanvasImageFrame *image;
|
|
||||||
int update;
|
|
||||||
int calc_bounds;
|
|
||||||
|
|
||||||
item = GNOME_CANVAS_ITEM (object);
|
|
||||||
image = GNOME_CANVAS_IMAGEFRAME (object);
|
|
||||||
|
|
||||||
update = FALSE;
|
|
||||||
calc_bounds = FALSE;
|
|
||||||
|
|
||||||
switch (prop_id) {
|
|
||||||
case PROP_PIXBUF:
|
|
||||||
if (item->canvas->aa && g_value_get_pointer (value)) {
|
|
||||||
if (image->pixbuf != NULL)
|
|
||||||
art_pixbuf_free (image->pixbuf);
|
|
||||||
image->pixbuf = g_value_get_pointer (value);
|
|
||||||
}
|
|
||||||
update = TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_X:
|
|
||||||
image->x = g_value_get_double (value);
|
|
||||||
update = TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_Y:
|
|
||||||
image->y = g_value_get_double (value);
|
|
||||||
update = TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_WIDTH:
|
|
||||||
image->width = fabs (g_value_get_double (value));
|
|
||||||
update = TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_HEIGHT:
|
|
||||||
image->height = fabs (g_value_get_double (value));
|
|
||||||
update = TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_DRAWWIDTH:
|
|
||||||
image->drawwidth = fabs (g_value_get_double (value));
|
|
||||||
update = TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_ANCHOR:
|
|
||||||
image->anchor = g_value_get_enum (value);
|
|
||||||
update = TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (update)
|
|
||||||
gnome_canvas_item_request_update (item);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gnome_canvas_imageframe_get_property (GObject *object,
|
|
||||||
guint prop_id,
|
|
||||||
GValue *value,
|
|
||||||
GParamSpec *pspec)
|
|
||||||
{
|
|
||||||
GnomeCanvasImageFrame *image;
|
|
||||||
|
|
||||||
image = GNOME_CANVAS_IMAGEFRAME (object);
|
|
||||||
|
|
||||||
switch (prop_id) {
|
|
||||||
|
|
||||||
case PROP_X:
|
|
||||||
g_value_set_double (value, image->x);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_Y:
|
|
||||||
g_value_set_double (value, image->y);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_WIDTH:
|
|
||||||
g_value_set_double (value, image->width);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_HEIGHT:
|
|
||||||
g_value_set_double (value, image->height);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_DRAWWIDTH:
|
|
||||||
g_value_set_double (value, image->drawwidth);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_ANCHOR:
|
|
||||||
g_value_set_enum (value, image->anchor);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gnome_canvas_imageframe_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
|
|
||||||
{
|
|
||||||
GnomeCanvasImageFrame *image;
|
|
||||||
ArtDRect i_bbox, c_bbox;
|
|
||||||
int w = 0;
|
|
||||||
int h = 0;
|
|
||||||
|
|
||||||
image = GNOME_CANVAS_IMAGEFRAME (item);
|
|
||||||
|
|
||||||
if (parent_class->update)
|
|
||||||
(* parent_class->update) (item, affine, clip_path, flags);
|
|
||||||
|
|
||||||
/* only works for non-rotated, non-skewed transforms */
|
|
||||||
image->cwidth = (int) (image->width * affine[0] + 0.5);
|
|
||||||
image->cheight = (int) (image->height * affine[3] + 0.5);
|
|
||||||
|
|
||||||
if (image->pixbuf) {
|
|
||||||
image->need_recalc = TRUE ;
|
|
||||||
}
|
|
||||||
|
|
||||||
get_bounds_item_relative (image, &i_bbox.x0, &i_bbox.y0, &i_bbox.x1, &i_bbox.y1);
|
|
||||||
art_drect_affine_transform (&c_bbox, &i_bbox, affine);
|
|
||||||
|
|
||||||
/* these values only make sense in the non-rotated, non-skewed case */
|
|
||||||
image->cx = c_bbox.x0;
|
|
||||||
image->cy = c_bbox.y0;
|
|
||||||
|
|
||||||
/* add a fudge factor */
|
|
||||||
c_bbox.x0--;
|
|
||||||
c_bbox.y0--;
|
|
||||||
c_bbox.x1++;
|
|
||||||
c_bbox.y1++;
|
|
||||||
|
|
||||||
gnome_canvas_update_bbox (item, c_bbox.x0, c_bbox.y0, c_bbox.x1, c_bbox.y1);
|
|
||||||
|
|
||||||
if (image->pixbuf) {
|
|
||||||
w = image->pixbuf->width;
|
|
||||||
h = image->pixbuf->height;
|
|
||||||
}
|
|
||||||
|
|
||||||
image->affine[0] = (affine[0] * image->width) / w;
|
|
||||||
image->affine[1] = (affine[1] * image->height) / h;
|
|
||||||
image->affine[2] = (affine[2] * image->width) / w;
|
|
||||||
image->affine[3] = (affine[3] * image->height) / h;
|
|
||||||
image->affine[4] = i_bbox.x0 * affine[0] + i_bbox.y0 * affine[2] + affine[4];
|
|
||||||
image->affine[5] = i_bbox.x0 * affine[1] + i_bbox.y0 * affine[3] + affine[5];
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gnome_canvas_imageframe_realize (GnomeCanvasItem *item)
|
|
||||||
{
|
|
||||||
GnomeCanvasImageFrame *image;
|
|
||||||
|
|
||||||
image = GNOME_CANVAS_IMAGEFRAME (item);
|
|
||||||
|
|
||||||
if (parent_class->realize)
|
|
||||||
(* parent_class->realize) (item);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gnome_canvas_imageframe_unrealize (GnomeCanvasItem *item)
|
|
||||||
{
|
|
||||||
GnomeCanvasImageFrame *image;
|
|
||||||
|
|
||||||
image = GNOME_CANVAS_IMAGEFRAME(item);
|
|
||||||
|
|
||||||
if (parent_class->unrealize)
|
|
||||||
(* parent_class->unrealize) (item);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
recalc_if_needed (GnomeCanvasImageFrame *image)
|
|
||||||
{}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gnome_canvas_imageframe_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
|
|
||||||
int x, int y, int width, int height)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static double
|
|
||||||
gnome_canvas_imageframe_point (GnomeCanvasItem *item, double x, double y,
|
|
||||||
int cx, int cy, GnomeCanvasItem **actual_item)
|
|
||||||
{
|
|
||||||
GnomeCanvasImageFrame *image;
|
|
||||||
int x1, y1, x2, y2;
|
|
||||||
int dx, dy;
|
|
||||||
|
|
||||||
image = GNOME_CANVAS_IMAGEFRAME (item);
|
|
||||||
|
|
||||||
*actual_item = item;
|
|
||||||
|
|
||||||
recalc_if_needed (image);
|
|
||||||
|
|
||||||
x1 = image->cx - item->canvas->close_enough;
|
|
||||||
y1 = image->cy - item->canvas->close_enough;
|
|
||||||
x2 = image->cx + image->cwidth - 1 + item->canvas->close_enough;
|
|
||||||
y2 = image->cy + image->cheight - 1 + item->canvas->close_enough;
|
|
||||||
|
|
||||||
/* Hard case: is point inside image's gravity region? */
|
|
||||||
|
|
||||||
//if ((cx >= x1) && (cy >= y1) && (cx <= x2) && (cy <= y2))
|
|
||||||
//return dist_to_mask (image, cx, cy) / item->canvas->pixels_per_unit;
|
|
||||||
|
|
||||||
/* Point is outside image */
|
|
||||||
|
|
||||||
x1 += item->canvas->close_enough;
|
|
||||||
y1 += item->canvas->close_enough;
|
|
||||||
x2 -= item->canvas->close_enough;
|
|
||||||
y2 -= item->canvas->close_enough;
|
|
||||||
|
|
||||||
if (cx < x1)
|
|
||||||
dx = x1 - cx;
|
|
||||||
else if (cx > x2)
|
|
||||||
dx = cx - x2;
|
|
||||||
else
|
|
||||||
dx = 0;
|
|
||||||
|
|
||||||
if (cy < y1)
|
|
||||||
dy = y1 - cy;
|
|
||||||
else if (cy > y2)
|
|
||||||
dy = cy - y2;
|
|
||||||
else
|
|
||||||
dy = 0;
|
|
||||||
|
|
||||||
return sqrt (dx * dx + dy * dy) / item->canvas->pixels_per_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gnome_canvas_imageframe_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2)
|
|
||||||
{
|
|
||||||
GnomeCanvasImageFrame *image;
|
|
||||||
|
|
||||||
image = GNOME_CANVAS_IMAGEFRAME (item);
|
|
||||||
|
|
||||||
*x1 = image->x;
|
|
||||||
*y1 = image->y;
|
|
||||||
|
|
||||||
switch (image->anchor) {
|
|
||||||
case GTK_ANCHOR_NW:
|
|
||||||
case GTK_ANCHOR_W:
|
|
||||||
case GTK_ANCHOR_SW:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GTK_ANCHOR_N:
|
|
||||||
case GTK_ANCHOR_CENTER:
|
|
||||||
case GTK_ANCHOR_S:
|
|
||||||
*x1 -= image->width / 2.0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GTK_ANCHOR_NE:
|
|
||||||
case GTK_ANCHOR_E:
|
|
||||||
case GTK_ANCHOR_SE:
|
|
||||||
*x1 -= image->width;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (image->anchor) {
|
|
||||||
case GTK_ANCHOR_NW:
|
|
||||||
case GTK_ANCHOR_N:
|
|
||||||
case GTK_ANCHOR_NE:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GTK_ANCHOR_W:
|
|
||||||
case GTK_ANCHOR_CENTER:
|
|
||||||
case GTK_ANCHOR_E:
|
|
||||||
*y1 -= image->height / 2.0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GTK_ANCHOR_SW:
|
|
||||||
case GTK_ANCHOR_S:
|
|
||||||
case GTK_ANCHOR_SE:
|
|
||||||
*y1 -= image->height;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
*x2 = *x1 + image->width;
|
|
||||||
*y2 = *y1 + image->height;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gnome_canvas_imageframe_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf)
|
|
||||||
{
|
|
||||||
GnomeCanvasImageFrame *image;
|
|
||||||
|
|
||||||
image = GNOME_CANVAS_IMAGEFRAME (item);
|
|
||||||
|
|
||||||
gnome_canvas_buf_ensure_buf (buf);
|
|
||||||
|
|
||||||
#ifdef VERBOSE
|
|
||||||
{
|
|
||||||
char str[128];
|
|
||||||
art_affine_to_string (str, image->affine);
|
|
||||||
g_print ("gnome_canvas_imageframe_render %s\n", str);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
art_rgb_pixbuf_affine (buf->buf,
|
|
||||||
buf->rect.x0, buf->rect.y0, buf->rect.x1, buf->rect.y1,
|
|
||||||
buf->buf_rowstride,
|
|
||||||
image->pixbuf,
|
|
||||||
image->affine,
|
|
||||||
ART_FILTER_NEAREST, NULL);
|
|
||||||
|
|
||||||
buf->is_bg = 0;
|
|
||||||
}
|
|
@ -1,87 +0,0 @@
|
|||||||
/* Image item type for GnomeCanvas widget
|
|
||||||
*
|
|
||||||
* GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
|
|
||||||
* copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1998 The Free Software Foundation
|
|
||||||
*
|
|
||||||
* Author: Federico Mena <federico@nuclecu.unam.mx>
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __GNOME_CANVAS_IMAGEFRAME_H__
|
|
||||||
#define __GNOME_CANVAS_IMAGEFRAME_H__
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include <libgnomecanvas/libgnomecanvas.h>
|
|
||||||
#include <gtk/gtkenums.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
#include <libart_lgpl/art_misc.h>
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <libart_lgpl/art_pixbuf.h>
|
|
||||||
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
|
|
||||||
/* Image item for the canvas. Images are positioned by anchoring them to a point.
|
|
||||||
* The following arguments are available:
|
|
||||||
*
|
|
||||||
* name type read/write description
|
|
||||||
* ------------------------------------------------------------------------------------------
|
|
||||||
* pixbuf ArtPixBuf* W Pointer to an ArtPixBuf (aa-mode)
|
|
||||||
* x double RW X coordinate of anchor point
|
|
||||||
* y double RW Y coordinate of anchor point
|
|
||||||
* width double RW Width to scale image to, in canvas units
|
|
||||||
* height double RW Height to scale image to, in canvas units
|
|
||||||
* drawwidth double RW Width to scale image to, in canvas units
|
|
||||||
* anchor GtkAnchorType RW Anchor side for the image
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define GNOME_CANVAS_TYPE_CANVAS_IMAGEFRAME (gnome_canvas_imageframe_get_type ())
|
|
||||||
#define GNOME_CANVAS_IMAGEFRAME(obj) (GTK_CHECK_CAST ((obj), GNOME_CANVAS_TYPE_CANVAS_IMAGEFRAME, GnomeCanvasImageFrame))
|
|
||||||
#define GNOME_CANVAS_IMAGEFRAME_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GNOME_CANVAS_TYPE_CANVAS_IMAGEFRAME, GnomeCanvasImageFrameClass))
|
|
||||||
#define GNOME_CANVAS_IS_CANVAS_IMAGEFRAME(obj) (GTK_CHECK_TYPE ((obj), GNOME_CANVAS_TYPE_CANVAS_IMAGEFRAME))
|
|
||||||
#define GNOME_CANVAS_IS_CANVAS_IMAGEFRAME_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GNOME_CANVAS_TYPE_CANVAS_IMAGEFRAME))
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct _GnomeCanvasImageFrame GnomeCanvasImageFrame;
|
|
||||||
typedef struct _GnomeCanvasImageFrameClass GnomeCanvasImageFrameClass;
|
|
||||||
|
|
||||||
struct _GnomeCanvasImageFrame {
|
|
||||||
GnomeCanvasItem item;
|
|
||||||
|
|
||||||
double x, y; /* Position at anchor, item relative */
|
|
||||||
double width, height; /* Size of image, item relative */
|
|
||||||
double drawwidth ; /* the amount of the image we draw width-wise (0-drawwidth)*/
|
|
||||||
GtkAnchorType anchor; /* Anchor side for image */
|
|
||||||
|
|
||||||
int cx, cy; /* Top-left canvas coordinates for display */
|
|
||||||
int cwidth, cheight; /* Rendered size in pixels */
|
|
||||||
|
|
||||||
uint32_t need_recalc : 1; /* Do we need to rescale the image? */
|
|
||||||
|
|
||||||
ArtPixBuf *pixbuf; /* A pixbuf, for aa rendering */
|
|
||||||
double affine[6]; /* The item -> canvas affine */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _GnomeCanvasImageFrameClass {
|
|
||||||
GnomeCanvasItemClass parent_class;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* Standard Gtk function */
|
|
||||||
GtkType gnome_canvas_imageframe_get_type (void);
|
|
||||||
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,190 +0,0 @@
|
|||||||
// Generated by gtkmmproc -- DO NOT MODIFY!
|
|
||||||
|
|
||||||
#include "imageframe.h"
|
|
||||||
#include "imageframe_p.h"
|
|
||||||
#include <libgnomecanvasmm/private/shape_p.h>
|
|
||||||
|
|
||||||
|
|
||||||
/* rect.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1998 EMC Capital Management Inc.
|
|
||||||
* Developed by Havoc Pennington <hp@pobox.com>
|
|
||||||
*
|
|
||||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Gnome
|
|
||||||
{
|
|
||||||
|
|
||||||
namespace Canvas
|
|
||||||
{
|
|
||||||
|
|
||||||
ImageFrame::ImageFrame(Group& parentx, ArtPixBuf* pbuf, double x, double y, Gtk::AnchorType anchor, double w, double h)
|
|
||||||
: Item(GNOME_CANVAS_ITEM(g_object_new(get_type(),0)))
|
|
||||||
{
|
|
||||||
item_construct(parentx);
|
|
||||||
set("pixbuf", pbuf, "x", x,"y", y,"width", w,"height", h, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
ImageFrame::ImageFrame(Group& parentx)
|
|
||||||
: Item(GNOME_CANVAS_ITEM(g_object_new(get_type(),0)))
|
|
||||||
{
|
|
||||||
item_construct(parentx);
|
|
||||||
}
|
|
||||||
|
|
||||||
} /* namespace Canvas */
|
|
||||||
} /* namespace Gnome */
|
|
||||||
|
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
} // anonymous namespace
|
|
||||||
|
|
||||||
|
|
||||||
namespace Glib
|
|
||||||
{
|
|
||||||
|
|
||||||
Gnome::Canvas::ImageFrame* wrap(GnomeCanvasImageFrame* object, bool take_copy)
|
|
||||||
{
|
|
||||||
return dynamic_cast<Gnome::Canvas::ImageFrame *> (Glib::wrap_auto ((GObject*)(object), take_copy));
|
|
||||||
}
|
|
||||||
|
|
||||||
} /* namespace Glib */
|
|
||||||
|
|
||||||
namespace Gnome
|
|
||||||
{
|
|
||||||
|
|
||||||
namespace Canvas
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
/* The *_Class implementation: */
|
|
||||||
|
|
||||||
const Glib::Class& ImageFrame_Class::init()
|
|
||||||
{
|
|
||||||
if(!gtype_) // create the GType if necessary
|
|
||||||
{
|
|
||||||
// Glib::Class has to know the class init function to clone custom types.
|
|
||||||
class_init_func_ = &ImageFrame_Class::class_init_function;
|
|
||||||
|
|
||||||
// This is actually just optimized away, apparently with no harm.
|
|
||||||
// Make sure that the parent type has been created.
|
|
||||||
//CppClassParent::CppObjectType::get_type();
|
|
||||||
|
|
||||||
// Create the wrapper type, with the same class/instance size as the base type.
|
|
||||||
register_derived_type(gnome_canvas_imageframe_get_type());
|
|
||||||
|
|
||||||
// Add derived versions of interfaces, if the C type implements any interfaces:
|
|
||||||
}
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ImageFrame_Class::class_init_function(void* g_class, void* class_data)
|
|
||||||
{
|
|
||||||
BaseClassType *const klass = static_cast<BaseClassType*>(g_class);
|
|
||||||
CppClassParent::class_init_function(klass, class_data);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
Glib::ObjectBase* ImageFrame_Class::wrap_new(GObject* o)
|
|
||||||
{
|
|
||||||
return manage(new ImageFrame((GnomeCanvasImageFrame*)(o)));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The implementation: */
|
|
||||||
|
|
||||||
ImageFrame::ImageFrame(const Glib::ConstructParams& construct_params)
|
|
||||||
: Item(construct_params)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
ImageFrame::ImageFrame(GnomeCanvasImageFrame* castitem)
|
|
||||||
: Item ((GnomeCanvasItem*)(castitem))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
ImageFrame::~ImageFrame()
|
|
||||||
{
|
|
||||||
destroy_();
|
|
||||||
}
|
|
||||||
|
|
||||||
ImageFrame::CppClassType ImageFrame::rect_class_; // initialize static member
|
|
||||||
|
|
||||||
GType ImageFrame::get_type()
|
|
||||||
{
|
|
||||||
return rect_class_.init().get_type();
|
|
||||||
}
|
|
||||||
|
|
||||||
GType ImageFrame::get_base_type()
|
|
||||||
{
|
|
||||||
return gnome_canvas_imageframe_get_type();
|
|
||||||
}
|
|
||||||
|
|
||||||
Glib::PropertyProxy<double> ImageFrame::property_x()
|
|
||||||
{
|
|
||||||
return Glib::PropertyProxy<double> (this, "x");
|
|
||||||
}
|
|
||||||
Glib::PropertyProxy_ReadOnly<double> ImageFrame::property_x() const
|
|
||||||
{
|
|
||||||
return Glib::PropertyProxy_ReadOnly<double> (this, "x");
|
|
||||||
}
|
|
||||||
Glib::PropertyProxy<double> ImageFrame::property_y()
|
|
||||||
{
|
|
||||||
return Glib::PropertyProxy<double> (this, "y");
|
|
||||||
}
|
|
||||||
Glib::PropertyProxy_ReadOnly<double> ImageFrame::property_y() const
|
|
||||||
{
|
|
||||||
return Glib::PropertyProxy_ReadOnly<double> (this, "y");
|
|
||||||
}
|
|
||||||
Glib::PropertyProxy<double> ImageFrame::property_width()
|
|
||||||
{
|
|
||||||
return Glib::PropertyProxy<double> (this, "width");
|
|
||||||
}
|
|
||||||
Glib::PropertyProxy_ReadOnly<double> ImageFrame::property_width() const
|
|
||||||
{
|
|
||||||
return Glib::PropertyProxy_ReadOnly<double> (this, "width");
|
|
||||||
}
|
|
||||||
Glib::PropertyProxy<double> ImageFrame::property_drawwidth()
|
|
||||||
{
|
|
||||||
return Glib::PropertyProxy<double> (this, "drawwidth");
|
|
||||||
}
|
|
||||||
Glib::PropertyProxy_ReadOnly<double> ImageFrame::property_drawwidth() const
|
|
||||||
{
|
|
||||||
return Glib::PropertyProxy_ReadOnly<double> (this, "drawwidth");
|
|
||||||
}
|
|
||||||
Glib::PropertyProxy<double> ImageFrame::property_height()
|
|
||||||
{
|
|
||||||
return Glib::PropertyProxy<double> (this, "height");
|
|
||||||
}
|
|
||||||
Glib::PropertyProxy_ReadOnly<double> ImageFrame::property_height() const
|
|
||||||
{
|
|
||||||
return Glib::PropertyProxy_ReadOnly<double> (this, "height");
|
|
||||||
}
|
|
||||||
Glib::PropertyProxy<Gtk::AnchorType> ImageFrame::property_anchor()
|
|
||||||
{
|
|
||||||
return Glib::PropertyProxy<Gtk::AnchorType>(this, "anchor");
|
|
||||||
}
|
|
||||||
Glib::PropertyProxy_ReadOnly<Gtk::AnchorType> ImageFrame::property_anchor() const
|
|
||||||
{
|
|
||||||
return Glib::PropertyProxy_ReadOnly<Gtk::AnchorType>(this, "anchor");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace Canvas
|
|
||||||
|
|
||||||
} // namespace Gnome
|
|
@ -27,10 +27,23 @@
|
|||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
#include <libgnomecanvasmm/item.h>
|
#include <libgnomecanvasmm/item.h>
|
||||||
#include <libgnomecanvasmm/group.h>
|
#include <libgnomecanvasmm/group.h>
|
||||||
#include <libgnomecanvasmm/shape.h>
|
#include <libgnomecanvasmm/shape.h>
|
||||||
#include "canvas-imageframe.h"
|
|
||||||
|
#include <libgnomecanvas/libgnomecanvas.h>
|
||||||
|
#include <gtk/gtkenums.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#include <libart_lgpl/art_misc.h>
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <libart_lgpl/art_pixbuf.h>
|
||||||
|
|
||||||
|
|
||||||
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
||||||
|
@ -1,158 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Session version="3001" name="rec_enabled" sample-rate="48000" id-counter="121" event-counter="0">
|
|
||||||
<Config>
|
|
||||||
<Option name="xfade-model" value="FullCrossfade"/>
|
|
||||||
<Option name="xfade-choice" value="ConstantPowerMinus3dB"/>
|
|
||||||
<Option name="auto-xfade" value="1"/>
|
|
||||||
<Option name="short-xfade-seconds" value="0.015"/>
|
|
||||||
<Option name="destructive-xfade-msecs" value="2"/>
|
|
||||||
<Option name="use-region-fades" value="1"/>
|
|
||||||
<Option name="show-region-fades" value="1"/>
|
|
||||||
<Option name="native-file-data-format" value="FormatFloat"/>
|
|
||||||
<Option name="native-file-header-format" value="WAVE"/>
|
|
||||||
<Option name="auto-play" value="0"/>
|
|
||||||
<Option name="auto-return" value="0"/>
|
|
||||||
<Option name="auto-input" value="1"/>
|
|
||||||
<Option name="punch-in" value="0"/>
|
|
||||||
<Option name="punch-out" value="0"/>
|
|
||||||
<Option name="subframes-per-frame" value="100"/>
|
|
||||||
<Option name="timecode-format" value="timecode_30"/>
|
|
||||||
<Option name="raid-path" value=""/>
|
|
||||||
<Option name="audio-search-path" value=""/>
|
|
||||||
<Option name="midi-search-path" value=""/>
|
|
||||||
<Option name="auditioner-output-left" value="default"/>
|
|
||||||
<Option name="auditioner-output-right" value="default"/>
|
|
||||||
<Option name="timecode-source-is-synced" value="1"/>
|
|
||||||
<Option name="jack-time-master" value="1"/>
|
|
||||||
<Option name="use-video-sync" value="0"/>
|
|
||||||
<Option name="video-pullup" value="0"/>
|
|
||||||
<Option name="show-summary" value="1"/>
|
|
||||||
<Option name="show-group-tabs" value="1"/>
|
|
||||||
<Option name="external-sync" value="0"/>
|
|
||||||
<Option name="sync-source" value="JACK"/>
|
|
||||||
<Option name="insert-merge-policy" value="InsertMergeRelax"/>
|
|
||||||
<Option name="timecode-offset" value="0"/>
|
|
||||||
<Option name="timecode-offset-negative" value="1"/>
|
|
||||||
<Option name="glue-new-markers-to-bars-and-beats" value="0"/>
|
|
||||||
<Option name="midi-copy-is-fork" value="0"/>
|
|
||||||
<Option name="glue-new-regions-to-bars-and-beats" value="0"/>
|
|
||||||
</Config>
|
|
||||||
<Metadata/>
|
|
||||||
<Sources/>
|
|
||||||
<Regions/>
|
|
||||||
<Locations>
|
|
||||||
<Location id="86" name="Loop" start="0" end="1" flags="IsAutoLoop,IsHidden" locked="no" position-lock-style="AudioTime"/>
|
|
||||||
<Location id="87" name="Punch" start="0" end="1" flags="IsAutoPunch,IsHidden" locked="no" position-lock-style="AudioTime"/>
|
|
||||||
</Locations>
|
|
||||||
<Bundles/>
|
|
||||||
<Routes>
|
|
||||||
<Route id="88" name="Audio 1" default-type="audio" active="yes" phase-invert="0" denormal-protection="no" meter-point="MeterPostFader" order-keys="" self-solo="no" soloed-by-upstream="0" soloed-by-downstream="0" solo-isolated="no" solo-safe="no" monitoring="" saved-meter-point="MeterPostFader" mode="Normal">
|
|
||||||
<IO name="Audio 1" id="105" direction="Input" default-type="audio" user-latency="0">
|
|
||||||
<Port type="audio" name="Audio 1/audio_in 1">
|
|
||||||
<Connection other="system:capture_1"/>
|
|
||||||
</Port>
|
|
||||||
</IO>
|
|
||||||
<IO name="Audio 1" id="106" direction="Output" default-type="audio" user-latency="0">
|
|
||||||
<Port type="audio" name="Audio 1/audio_out 1">
|
|
||||||
<Connection other="master/audio_in 1"/>
|
|
||||||
</Port>
|
|
||||||
<Port type="audio" name="Audio 1/audio_out 2">
|
|
||||||
<Connection other="master/audio_in 2"/>
|
|
||||||
</Port>
|
|
||||||
</IO>
|
|
||||||
<Controllable name="solo" id="90" flags="Toggle" value="0.000000000000"/>
|
|
||||||
<Controllable name="mute" id="92" flags="Toggle" value="0.000000000000"/>
|
|
||||||
<MuteMaster mute-point="PreFader,PostFader,Listen,Main" muted="no"/>
|
|
||||||
<Pannable>
|
|
||||||
<Controllable name="pan-azimuth" id="96" flags="" value="0.500000000000"/>
|
|
||||||
<Controllable name="pan-width" id="100" flags="" value="0.000000000000"/>
|
|
||||||
<Controllable name="pan-elevation" id="98" flags="" value="0.000000000000"/>
|
|
||||||
<Controllable name="pan-frontback" id="102" flags="" value="0.000000000000"/>
|
|
||||||
<Controllable name="pan-lfe" id="104" flags="" value="0.000000000000"/>
|
|
||||||
<Automation/>
|
|
||||||
</Pannable>
|
|
||||||
<Processor id="107" name="Amp" active="yes" user-latency="0" type="amp">
|
|
||||||
<Controllable name="gaincontrol" id="109" flags="GainLike" value="1.000000000000"/>
|
|
||||||
</Processor>
|
|
||||||
<Processor id="110" name="Meter" active="yes" user-latency="0" type="meter"/>
|
|
||||||
<Processor id="111" name="Audio 1" active="yes" user-latency="0" own-input="yes" own-output="no" output="Audio 1" type="main-outs" role="Main">
|
|
||||||
<PannerShell bypassed="no">
|
|
||||||
<Panner type="Mono to Stereo Panner"/>
|
|
||||||
</PannerShell>
|
|
||||||
</Processor>
|
|
||||||
<Controllable name="recenable" id="113" flags="Toggle" value="0.000000000000"/>
|
|
||||||
<Diskstream flags="Recordable" playlist="Audio 1.1" name="Audio 1" id="115" speed="1.000000" capture-alignment="Automatic" channels="1"/>
|
|
||||||
</Route>
|
|
||||||
<Route id="21" name="master" default-type="audio" flags="MasterOut" active="yes" phase-invert="00" denormal-protection="no" meter-point="MeterPostFader" order-keys="EditorSort=318:MixerSort=318" self-solo="no" soloed-by-upstream="0" soloed-by-downstream="0" solo-isolated="no" solo-safe="no">
|
|
||||||
<IO name="master" id="38" direction="Input" default-type="audio" user-latency="0">
|
|
||||||
<Port type="audio" name="master/audio_in 1">
|
|
||||||
<Connection other="Audio 1/audio_out 1"/>
|
|
||||||
</Port>
|
|
||||||
<Port type="audio" name="master/audio_in 2">
|
|
||||||
<Connection other="Audio 1/audio_out 2"/>
|
|
||||||
</Port>
|
|
||||||
</IO>
|
|
||||||
<IO name="master" id="39" direction="Output" default-type="audio" user-latency="0">
|
|
||||||
<Port type="audio" name="master/audio_out 1">
|
|
||||||
<Connection other="system:playback_1"/>
|
|
||||||
</Port>
|
|
||||||
<Port type="audio" name="master/audio_out 2">
|
|
||||||
<Connection other="system:playback_2"/>
|
|
||||||
</Port>
|
|
||||||
</IO>
|
|
||||||
<Controllable name="solo" id="23" flags="Toggle" value="0.000000000000"/>
|
|
||||||
<Controllable name="mute" id="25" flags="Toggle" value="0.000000000000"/>
|
|
||||||
<MuteMaster mute-point="PreFader,PostFader,Listen,Main" muted="no"/>
|
|
||||||
<Pannable>
|
|
||||||
<Controllable name="pan-azimuth" id="29" flags="" value="0.500000000000"/>
|
|
||||||
<Controllable name="pan-width" id="33" flags="" value="1.000000000000"/>
|
|
||||||
<Controllable name="pan-elevation" id="31" flags="" value="0.000000000000"/>
|
|
||||||
<Controllable name="pan-frontback" id="35" flags="" value="0.000000000000"/>
|
|
||||||
<Controllable name="pan-lfe" id="37" flags="" value="0.000000000000"/>
|
|
||||||
<Automation/>
|
|
||||||
</Pannable>
|
|
||||||
<Processor id="40" name="Amp" active="yes" user-latency="0" type="amp">
|
|
||||||
<Controllable name="gaincontrol" id="42" flags="GainLike" value="1.000000000000"/>
|
|
||||||
</Processor>
|
|
||||||
<Processor id="43" name="Meter" active="yes" user-latency="0" type="meter"/>
|
|
||||||
<Processor id="44" name="master" active="yes" user-latency="0" own-input="yes" own-output="no" output="master" type="main-outs" role="Main">
|
|
||||||
<PannerShell bypassed="no">
|
|
||||||
<Panner type="Equal Power Stereo"/>
|
|
||||||
</PannerShell>
|
|
||||||
</Processor>
|
|
||||||
</Route>
|
|
||||||
</Routes>
|
|
||||||
<Playlists>
|
|
||||||
<Playlist id="116" name="Audio 1.1" type="audio" orig-track-id="88" frozen="no" combine-ops="0"/>
|
|
||||||
</Playlists>
|
|
||||||
<UnusedPlaylists/>
|
|
||||||
<RouteGroups/>
|
|
||||||
<Click>
|
|
||||||
<IO name="click" id="46" direction="Output" default-type="audio" user-latency="0">
|
|
||||||
<Port type="audio" name="click/audio_out 1">
|
|
||||||
<Connection other="system:playback_1"/>
|
|
||||||
</Port>
|
|
||||||
<Port type="audio" name="click/audio_out 2">
|
|
||||||
<Connection other="system:playback_2"/>
|
|
||||||
</Port>
|
|
||||||
</IO>
|
|
||||||
<Processor id="47" name="Amp" active="yes" user-latency="0" type="amp">
|
|
||||||
<Controllable name="gaincontrol" id="49" flags="GainLike" value="1.000000000000"/>
|
|
||||||
</Processor>
|
|
||||||
</Click>
|
|
||||||
<Speakers>
|
|
||||||
<Speaker azimuth="0" elevation="0" distance="1"/>
|
|
||||||
<Speaker azimuth="180" elevation="0" distance="0"/>
|
|
||||||
</Speakers>
|
|
||||||
<TempoMap>
|
|
||||||
<Tempo start="1|1|0" beats-per-minute="120.000000" note-type="4.000000" movable="no"/>
|
|
||||||
<Meter start="1|1|0" note-type="4.000000" divisions-per-bar="4.000000" movable="no"/>
|
|
||||||
</TempoMap>
|
|
||||||
<ControlProtocols>
|
|
||||||
<Protocol name="Open Sound Control (OSC)" active="no"/>
|
|
||||||
<Protocol name="Generic MIDI" feedback="0" feedback-interval="10000" active="yes">
|
|
||||||
<Controls/>
|
|
||||||
</Protocol>
|
|
||||||
<Protocol name="Mackie" bank="0" ipmidi-base="21928" device-profile="" device-name="Mackie Control Universal Pro" active="yes"/>
|
|
||||||
</ControlProtocols>
|
|
||||||
</Session>
|
|
@ -1,2 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<UndoHistory/>
|
|
@ -1,148 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Session version="3001" name="1region" sample-rate="48000" id-counter="120" event-counter="0">
|
|
||||||
<Config>
|
|
||||||
<Option name="xfade-model" value="FullCrossfade"/>
|
|
||||||
<Option name="xfade-choice" value="ConstantPowerMinus3dB"/>
|
|
||||||
<Option name="auto-xfade" value="1"/>
|
|
||||||
<Option name="short-xfade-seconds" value="0.015"/>
|
|
||||||
<Option name="destructive-xfade-msecs" value="2"/>
|
|
||||||
<Option name="use-region-fades" value="1"/>
|
|
||||||
<Option name="show-region-fades" value="1"/>
|
|
||||||
<Option name="native-file-data-format" value="FormatFloat"/>
|
|
||||||
<Option name="native-file-header-format" value="WAVE"/>
|
|
||||||
<Option name="auto-play" value="0"/>
|
|
||||||
<Option name="auto-return" value="0"/>
|
|
||||||
<Option name="auto-input" value="1"/>
|
|
||||||
<Option name="punch-in" value="0"/>
|
|
||||||
<Option name="punch-out" value="0"/>
|
|
||||||
<Option name="subframes-per-frame" value="100"/>
|
|
||||||
<Option name="timecode-format" value="timecode_30"/>
|
|
||||||
<Option name="raid-path" value=""/>
|
|
||||||
<Option name="audio-search-path" value=""/>
|
|
||||||
<Option name="midi-search-path" value=""/>
|
|
||||||
<Option name="auditioner-output-left" value="default"/>
|
|
||||||
<Option name="auditioner-output-right" value="default"/>
|
|
||||||
<Option name="timecode-source-is-synced" value="1"/>
|
|
||||||
<Option name="jack-time-master" value="1"/>
|
|
||||||
<Option name="use-video-sync" value="0"/>
|
|
||||||
<Option name="video-pullup" value="0"/>
|
|
||||||
<Option name="show-summary" value="1"/>
|
|
||||||
<Option name="show-group-tabs" value="1"/>
|
|
||||||
<Option name="external-sync" value="0"/>
|
|
||||||
<Option name="sync-source" value="JACK"/>
|
|
||||||
<Option name="insert-merge-policy" value="InsertMergeRelax"/>
|
|
||||||
<Option name="timecode-offset" value="0"/>
|
|
||||||
<Option name="timecode-offset-negative" value="1"/>
|
|
||||||
<Option name="glue-new-markers-to-bars-and-beats" value="0"/>
|
|
||||||
<Option name="midi-copy-is-fork" value="0"/>
|
|
||||||
<Option name="glue-new-regions-to-bars-and-beats" value="0"/>
|
|
||||||
</Config>
|
|
||||||
<Metadata/>
|
|
||||||
<Sources/>
|
|
||||||
<Regions/>
|
|
||||||
<Locations>
|
|
||||||
<Location id="86" name="Loop" start="0" end="1" flags="IsAutoLoop,IsHidden" locked="no" position-lock-style="AudioTime"/>
|
|
||||||
<Location id="87" name="Punch" start="0" end="1" flags="IsAutoPunch,IsHidden" locked="no" position-lock-style="AudioTime"/>
|
|
||||||
</Locations>
|
|
||||||
<Bundles/>
|
|
||||||
<Routes>
|
|
||||||
<Route id="21" name="master" default-type="audio" flags="MasterOut" active="yes" phase-invert="00" denormal-protection="no" meter-point="MeterPostFader" order-keys="editor=0:signal=0" self-solo="no" soloed-by-upstream="0" soloed-by-downstream="0" solo-isolated="no" solo-safe="no">
|
|
||||||
<IO name="master" id="38" direction="Input" default-type="audio" user-latency="0">
|
|
||||||
<Port type="audio" name="master/audio_in 1"/>
|
|
||||||
<Port type="audio" name="master/audio_in 2"/>
|
|
||||||
</IO>
|
|
||||||
<IO name="master" id="39" direction="Output" default-type="audio" user-latency="0">
|
|
||||||
<Port type="audio" name="master/audio_out 1">
|
|
||||||
<Connection other="system:playback_1"/>
|
|
||||||
</Port>
|
|
||||||
<Port type="audio" name="master/audio_out 2">
|
|
||||||
<Connection other="system:playback_2"/>
|
|
||||||
</Port>
|
|
||||||
</IO>
|
|
||||||
<Controllable name="solo" id="23" flags="Toggle" value="0.000000000000"/>
|
|
||||||
<Controllable name="mute" id="25" flags="Toggle" value="0.000000000000"/>
|
|
||||||
<MuteMaster mute-point="PreFader,PostFader,Listen,Main" muted="no"/>
|
|
||||||
<RemoteControl id="318"/>
|
|
||||||
<Pannable>
|
|
||||||
<Controllable name="pan-azimuth" id="29" flags="" value="0.500000000000"/>
|
|
||||||
<Controllable name="pan-width" id="33" flags="" value="1.000000000000"/>
|
|
||||||
<Controllable name="pan-elevation" id="31" flags="" value="0.000000000000"/>
|
|
||||||
<Controllable name="pan-frontback" id="35" flags="" value="0.000000000000"/>
|
|
||||||
<Controllable name="pan-lfe" id="37" flags="" value="0.000000000000"/>
|
|
||||||
<Automation/>
|
|
||||||
</Pannable>
|
|
||||||
<Processor id="40" name="Amp" active="yes" user-latency="0" type="amp">
|
|
||||||
<Controllable name="gaincontrol" id="42" flags="GainLike" value="1.000000000000"/>
|
|
||||||
</Processor>
|
|
||||||
<Processor id="43" name="Meter" active="yes" user-latency="0" type="meter"/>
|
|
||||||
<Processor id="44" name="master" active="yes" user-latency="0" own-input="yes" own-output="no" output="master" type="main-outs" role="Main">
|
|
||||||
<PannerShell bypassed="no">
|
|
||||||
<Panner type="Equal Power Stereo"/>
|
|
||||||
</PannerShell>
|
|
||||||
</Processor>
|
|
||||||
</Route>
|
|
||||||
<Route id="88" name="MIDI 1" default-type="midi" active="yes" phase-invert="" denormal-protection="no" meter-point="MeterPostFader" order-keys="signal=2" self-solo="no" soloed-by-upstream="0" soloed-by-downstream="0" solo-isolated="no" solo-safe="no" monitoring="" saved-meter-point="MeterPostFader" note-mode="Sustained" step-editing="no" input-active="yes">
|
|
||||||
<IO name="MIDI 1" id="105" direction="Input" default-type="midi" user-latency="0">
|
|
||||||
<Port type="midi" name="MIDI 1/midi_in 1"/>
|
|
||||||
</IO>
|
|
||||||
<IO name="MIDI 1" id="106" direction="Output" default-type="midi" user-latency="0">
|
|
||||||
<Port type="midi" name="MIDI 1/midi_out 1"/>
|
|
||||||
</IO>
|
|
||||||
<Controllable name="solo" id="90" flags="Toggle" value="0.000000000000"/>
|
|
||||||
<Controllable name="mute" id="92" flags="Toggle" value="0.000000000000"/>
|
|
||||||
<MuteMaster mute-point="PreFader,PostFader,Listen,Main" muted="no"/>
|
|
||||||
<RemoteControl id="2"/>
|
|
||||||
<Pannable>
|
|
||||||
<Controllable name="pan-azimuth" id="96" flags="" value="0.500000000000"/>
|
|
||||||
<Controllable name="pan-width" id="100" flags="" value="0.000000000000"/>
|
|
||||||
<Controllable name="pan-elevation" id="98" flags="" value="0.000000000000"/>
|
|
||||||
<Controllable name="pan-frontback" id="102" flags="" value="0.000000000000"/>
|
|
||||||
<Controllable name="pan-lfe" id="104" flags="" value="0.000000000000"/>
|
|
||||||
<Automation/>
|
|
||||||
</Pannable>
|
|
||||||
<Processor id="107" name="Amp" active="yes" user-latency="0" type="amp">
|
|
||||||
<Controllable name="gaincontrol" id="109" flags="GainLike" value="1.000000000000"/>
|
|
||||||
</Processor>
|
|
||||||
<Processor id="110" name="Meter" active="yes" user-latency="0" type="meter"/>
|
|
||||||
<Processor id="111" name="MIDI 1" active="yes" user-latency="0" own-input="yes" own-output="no" output="MIDI 1" type="main-outs" role="Main">
|
|
||||||
<PannerShell bypassed="no"/>
|
|
||||||
</Processor>
|
|
||||||
<Controllable name="recenable" id="113" flags="Toggle" value="0.000000000000"/>
|
|
||||||
<Diskstream flags="Recordable" playlist="MIDI 1.1" name="MIDI 1" id="115" speed="1.000000" capture-alignment="Automatic" channel-mode="AllChannels" channel-mask="0xffff"/>
|
|
||||||
</Route>
|
|
||||||
</Routes>
|
|
||||||
<Playlists>
|
|
||||||
<Playlist id="116" name="MIDI 1.1" type="midi" orig-track-id="88" frozen="no" combine-ops="0"/>
|
|
||||||
</Playlists>
|
|
||||||
<UnusedPlaylists/>
|
|
||||||
<RouteGroups/>
|
|
||||||
<Click>
|
|
||||||
<IO name="click" id="46" direction="Output" default-type="audio" user-latency="0">
|
|
||||||
<Port type="audio" name="click/audio_out 1">
|
|
||||||
<Connection other="system:playback_1"/>
|
|
||||||
</Port>
|
|
||||||
<Port type="audio" name="click/audio_out 2">
|
|
||||||
<Connection other="system:playback_2"/>
|
|
||||||
</Port>
|
|
||||||
</IO>
|
|
||||||
<Processor id="47" name="Amp" active="yes" user-latency="0" type="amp">
|
|
||||||
<Controllable name="gaincontrol" id="49" flags="GainLike" value="1.000000000000"/>
|
|
||||||
</Processor>
|
|
||||||
</Click>
|
|
||||||
<NamedSelections/>
|
|
||||||
<Speakers>
|
|
||||||
<Speaker azimuth="0" elevation="0" distance="1"/>
|
|
||||||
<Speaker azimuth="180" elevation="0" distance="0"/>
|
|
||||||
</Speakers>
|
|
||||||
<TempoMap>
|
|
||||||
<Tempo start="1|1|0" beats-per-minute="120.000000" note-type="4.000000" movable="no"/>
|
|
||||||
<Meter start="1|1|0" note-type="4.000000" divisions-per-bar="4.000000" movable="no"/>
|
|
||||||
</TempoMap>
|
|
||||||
<ControlProtocols>
|
|
||||||
<Protocol name="Open Sound Control (OSC)" active="no"/>
|
|
||||||
<Protocol name="Generic MIDI" feedback="0" feedback-interval="10000" active="yes">
|
|
||||||
<Controls/>
|
|
||||||
</Protocol>
|
|
||||||
<Protocol name="Mackie" bank="0" ipmidi-base="21928" device-profile="" device-name="Mackie Control Universal Pro" active="yes"/>
|
|
||||||
</ControlProtocols>
|
|
||||||
</Session>
|
|
@ -1,2 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<UndoHistory/>
|
|
File diff suppressed because it is too large
Load Diff
@ -1,2 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<UndoHistory/>
|
|
@ -1,102 +0,0 @@
|
|||||||
/*
|
|
||||||
* file that facilitates C++ program debugging.
|
|
||||||
*
|
|
||||||
* Copyright 1995 by Gray Watson
|
|
||||||
*
|
|
||||||
* This file is part of the dmalloc package.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
|
||||||
* NON-COMMERCIAL purpose and without fee is hereby granted, provided
|
|
||||||
* that the above copyright notice and this permission notice appear
|
|
||||||
* in all copies, and that the name of Gray Watson not be used in
|
|
||||||
* advertising or publicity pertaining to distribution of the document
|
|
||||||
* or software without specific, written prior permission.
|
|
||||||
*
|
|
||||||
* Please see the PERMISSIONS file or contact the author for information
|
|
||||||
* about commercial licenses.
|
|
||||||
*
|
|
||||||
* Gray Watson makes no representations about the suitability of the
|
|
||||||
* software described herein for any purpose. It is provided "as is"
|
|
||||||
* without express or implied warranty.
|
|
||||||
*
|
|
||||||
* The author may be contacted via http://www.letters.com/~gray/
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is used to effectively redirect new to the more familiar
|
|
||||||
* malloc and delete to the more familiar free so they can be debugged
|
|
||||||
* with the debug malloc library.. They also give the known error
|
|
||||||
* behavior, too.
|
|
||||||
*
|
|
||||||
* Compile and link this in with the C++ program you want to debug.
|
|
||||||
*
|
|
||||||
* NOTE: I am not a C++ hacker so feedback in the form of other hints
|
|
||||||
* and ideas for C++ users would be much appreciated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef DEBUG_MALLOC
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <dmalloc.h>
|
|
||||||
#include "/usr/local/src/dmalloc-4.1.2/return.h"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An overload function for the C++ new.
|
|
||||||
*/
|
|
||||||
void *
|
|
||||||
operator new(size_t size)
|
|
||||||
{
|
|
||||||
char *file;
|
|
||||||
GET_RET_ADDR(file);
|
|
||||||
|
|
||||||
/* handle correct C++ semantics for an alloc of size 0 */
|
|
||||||
|
|
||||||
if (size == 0) size = 1;
|
|
||||||
|
|
||||||
return _malloc_leap(file, 0, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An overload function for the C++ new[].
|
|
||||||
*/
|
|
||||||
void *
|
|
||||||
operator new[](size_t size)
|
|
||||||
{
|
|
||||||
char *file;
|
|
||||||
GET_RET_ADDR(file);
|
|
||||||
|
|
||||||
/* handle correct C++ semantics for an alloc of size 0 */
|
|
||||||
|
|
||||||
if (size == 0) size = 1;
|
|
||||||
|
|
||||||
return _malloc_leap(file, 0, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An overload function for the C++ delete.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
operator delete(void *pnt)
|
|
||||||
{
|
|
||||||
char *file;
|
|
||||||
GET_RET_ADDR(file);
|
|
||||||
_free_leap(file, 0, pnt);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An overload function for the C++ delete[]. Thanks to Jens Krinke
|
|
||||||
* <j.krinke@gmx.de>
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
operator delete[](void *pnt)
|
|
||||||
{
|
|
||||||
char *file;
|
|
||||||
GET_RET_ADDR(file);
|
|
||||||
_free_leap(file, 0, pnt);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,6 +1,10 @@
|
|||||||
/* Copyright unknown. Code by Laurent de Soras <laurent@ohmforce.com>.
|
/*
|
||||||
*/
|
Copyright © 2013 Laurent de Soras <laurent.de.soras@free.fr>
|
||||||
|
|
||||||
|
This work is free. You can redistribute it and/or modify it under the
|
||||||
|
terms of the Do What The Fuck You Want To Public License, Version 2,
|
||||||
|
as published by Sam Hocevar. See http://www.wtfpl.net/ for more details.
|
||||||
|
*/
|
||||||
#ifndef __pbd_fastlog_h__
|
#ifndef __pbd_fastlog_h__
|
||||||
#define __pbd_fastlog_h__
|
#define __pbd_fastlog_h__
|
||||||
|
|
||||||
|
@ -43,7 +43,6 @@ libpbd_sources = [
|
|||||||
'debug.cc',
|
'debug.cc',
|
||||||
'enumwriter.cc',
|
'enumwriter.cc',
|
||||||
'event_loop.cc',
|
'event_loop.cc',
|
||||||
'dmalloc.cc',
|
|
||||||
'enums.cc',
|
'enums.cc',
|
||||||
'epa.cc',
|
'epa.cc',
|
||||||
'error.cc',
|
'error.cc',
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
|
|
||||||
This module works with the Griffin Powermate and allows some basic transport control.
|
|
||||||
|
|
||||||
It autodetects the Powermate on any input device of the form "/dev/input/event*". This means you must have the powermate module in your kernel. It works out-of-the-box with 64Studio and presumably lots of other modern distributions.
|
|
||||||
|
|
||||||
Turning the wheel left and right will act as a "Shuttle" wheel, adjusting playback speed up and down
|
|
||||||
Pushing the knob will switch between play and stop
|
|
||||||
Pushing the knob while turning will jump to the next or previous markers
|
|
||||||
|
|
||||||
|
|
||||||
In order for the powermate to work, you have to have permission to open the input device for reading.
|
|
||||||
In debian, I changed /etc/udev/rules.d/0_permissions.rules to have the line:
|
|
||||||
KERNEL=="event[0-9]*", MODE="0666"
|
|
||||||
but there are other ways to achieve this
|
|
||||||
|
|
||||||
|
|
||||||
Feedback, tweaks, bug fixes and feature ideas are encouraged
|
|
||||||
|
|
||||||
-Ben Loftis, ben@benloftis.com
|
|
||||||
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
|||||||
#ifndef __i18n_h__
|
|
||||||
#define __i18n_h__
|
|
||||||
|
|
||||||
#include "pbd/compose.h"
|
|
||||||
#include "pbd/convert.h"
|
|
||||||
#include "gettext.h"
|
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#define _(Text) dgettext (PACKAGE,Text)
|
|
||||||
#define N_(Text) gettext_noop (Text)
|
|
||||||
#define X_(Text) Text
|
|
||||||
#define I18N(Array) PBD::internationalize (PACKAGE, Array)
|
|
||||||
|
|
||||||
#endif // __i18n_h__
|
|
@ -1,57 +0,0 @@
|
|||||||
/*
|
|
||||||
Ardour9pin interface file
|
|
||||||
Ben Loftis
|
|
||||||
Created: 05/18/06 11:07:56
|
|
||||||
Copyright Harrison Audio, LLC, 2007
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "powermate.h"
|
|
||||||
|
|
||||||
using namespace ARDOUR;
|
|
||||||
|
|
||||||
ControlProtocol*
|
|
||||||
new_powermate_protocol (ControlProtocolDescriptor* /*descriptor*/, Session* s)
|
|
||||||
{
|
|
||||||
PowermateControlProtocol* pcp = new PowermateControlProtocol (*s);
|
|
||||||
|
|
||||||
if (pcp->set_active (true)) {
|
|
||||||
delete pcp;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return pcp;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
delete_powermate_protocol (ControlProtocolDescriptor* /*descriptor*/, ControlProtocol* cp)
|
|
||||||
{
|
|
||||||
delete cp;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
probe_powermate_protocol (ControlProtocolDescriptor* /*descriptor*/)
|
|
||||||
{
|
|
||||||
return PowermateControlProtocol::probe ();
|
|
||||||
}
|
|
||||||
|
|
||||||
static ControlProtocolDescriptor powermate_descriptor = {
|
|
||||||
name : "powermate",
|
|
||||||
id : "uri://ardour.org/ardour/powermate:0",
|
|
||||||
ptr : 0,
|
|
||||||
module : 0,
|
|
||||||
mandatory : 0,
|
|
||||||
supports_feedback : false,
|
|
||||||
probe : probe_powermate_protocol,
|
|
||||||
initialize : new_powermate_protocol,
|
|
||||||
destroy : delete_powermate_protocol
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
ControlProtocolDescriptor*
|
|
||||||
protocol_descriptor () {
|
|
||||||
return &powermate_descriptor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,258 +0,0 @@
|
|||||||
/*
|
|
||||||
powermate.cc
|
|
||||||
Ben Loftis
|
|
||||||
Created: 03/26/07 20:07:56
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include <linux/input.h>
|
|
||||||
#include <cstring>
|
|
||||||
#include <cerrno>
|
|
||||||
#include <cstdio>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
|
|
||||||
#include <glibmm.h>
|
|
||||||
|
|
||||||
#include "pbd/pthread_utils.h"
|
|
||||||
#include "pbd/xml++.h"
|
|
||||||
#include "pbd/error.h"
|
|
||||||
|
|
||||||
#include "ardour/debug.h"
|
|
||||||
|
|
||||||
#include "powermate.h"
|
|
||||||
#include "i18n.h"
|
|
||||||
|
|
||||||
using namespace ARDOUR;
|
|
||||||
using namespace std;
|
|
||||||
using namespace sigc;
|
|
||||||
using namespace PBD;
|
|
||||||
|
|
||||||
#define NUM_VALID_PREFIXES 2
|
|
||||||
|
|
||||||
static const char *valid_prefix[NUM_VALID_PREFIXES] = {
|
|
||||||
"Griffin PowerMate",
|
|
||||||
"Griffin SoundKnob"
|
|
||||||
};
|
|
||||||
|
|
||||||
#define NUM_EVENT_DEVICES 16
|
|
||||||
|
|
||||||
int open_powermate (const char *dev, int mode)
|
|
||||||
{
|
|
||||||
if (!Glib::file_test (dev, Glib::FILE_TEST_EXISTS)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int fd = open(dev, mode);
|
|
||||||
int i;
|
|
||||||
char name[255];
|
|
||||||
|
|
||||||
if (fd < 0) {
|
|
||||||
if (errno != EACCES) {
|
|
||||||
error << string_compose ("Unable to open \"%1\": %2", dev, strerror(errno)) << endmsg;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* placate valgrind */
|
|
||||||
name[0] = '\0';
|
|
||||||
|
|
||||||
if (ioctl (fd, EVIOCGNAME (sizeof(name)), name) < 0) {
|
|
||||||
error << string_compose ("\"%1\": EVIOCGNAME failed: %2", dev, strerror(errno)) << endmsg;
|
|
||||||
close (fd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// it's the correct device if the prefix matches what we expect it to be:
|
|
||||||
for (i = 0; i < NUM_VALID_PREFIXES; ++i) {
|
|
||||||
if (!strncasecmp (name, valid_prefix[i], strlen (valid_prefix[i]))) {
|
|
||||||
return fd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
close (fd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int find_powermate(int mode)
|
|
||||||
{
|
|
||||||
char devname[256];
|
|
||||||
int i, r;
|
|
||||||
|
|
||||||
for (i = 0; i < NUM_EVENT_DEVICES; i++) {
|
|
||||||
sprintf (devname, "/dev/input/event%d", i);
|
|
||||||
r = open_powermate (devname, mode);
|
|
||||||
if (r >= 0) {
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
PowermateControlProtocol::PowermateControlProtocol (Session& s)
|
|
||||||
: ControlProtocol (s, "powermate")
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
PowermateControlProtocol::~PowermateControlProtocol ()
|
|
||||||
{
|
|
||||||
set_active (false);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
PowermateControlProtocol::probe ()
|
|
||||||
{
|
|
||||||
int port = find_powermate( O_RDONLY );
|
|
||||||
|
|
||||||
if (port < 0) {
|
|
||||||
if (errno == ENOENT) {
|
|
||||||
DEBUG_TRACE (DEBUG::ControlProtocols, "Powermate device not found; perhaps you have no powermate connected");
|
|
||||||
} else {
|
|
||||||
DEBUG_TRACE (DEBUG::ControlProtocols, string_compose ("powermate: Opening of powermate failed - %1\n", strerror(errno)));
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
close (port);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
PowermateControlProtocol::set_active (bool inActivate)
|
|
||||||
{
|
|
||||||
if (inActivate != _active) {
|
|
||||||
|
|
||||||
if (inActivate) {
|
|
||||||
|
|
||||||
mPort = find_powermate(O_RDONLY);
|
|
||||||
|
|
||||||
if ( mPort < 0 ) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pthread_create_and_store ("Powermate", &mThread, SerialThreadEntry, this) == 0) {
|
|
||||||
_active = true;
|
|
||||||
} else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("Powermate Control Protocol activated\n");
|
|
||||||
|
|
||||||
} else {
|
|
||||||
pthread_cancel (mThread);
|
|
||||||
close (mPort);
|
|
||||||
_active = false;
|
|
||||||
printf("Powermate Control Protocol deactivated\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
XMLNode&
|
|
||||||
PowermateControlProtocol::get_state ()
|
|
||||||
{
|
|
||||||
XMLNode* node = new XMLNode (X_("Protocol"));
|
|
||||||
node->add_property (X_("name"), _name);
|
|
||||||
return *node;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
PowermateControlProtocol::set_state (const XMLNode& /*node*/, int /*version*/)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void*
|
|
||||||
PowermateControlProtocol::SerialThreadEntry (void* arg)
|
|
||||||
{
|
|
||||||
static_cast<PowermateControlProtocol*>(arg)->register_thread ("Powermate");
|
|
||||||
return static_cast<PowermateControlProtocol*>(arg)->SerialThread ();
|
|
||||||
}
|
|
||||||
|
|
||||||
#define BUFFER_SIZE 32
|
|
||||||
|
|
||||||
bool held = false;
|
|
||||||
bool skippingMarkers = false;
|
|
||||||
|
|
||||||
void
|
|
||||||
PowermateControlProtocol::ProcessEvent(struct input_event *ev)
|
|
||||||
{
|
|
||||||
#ifdef VERBOSE
|
|
||||||
fprintf(stderr, "type=0x%04x, code=0x%04x, value=%d\n",
|
|
||||||
ev->type, ev->code, (int)ev->value);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
switch(ev->type){
|
|
||||||
case EV_MSC:
|
|
||||||
printf("The LED pulse settings were changed; code=0x%04x, value=0x%08x\n", ev->code, ev->value);
|
|
||||||
break;
|
|
||||||
case EV_REL:
|
|
||||||
if(ev->code != REL_DIAL)
|
|
||||||
fprintf(stderr, "Warning: unexpected rotation event; ev->code = 0x%04x\n", ev->code);
|
|
||||||
else{
|
|
||||||
if (held) {
|
|
||||||
//click and hold to skip forward and back by markers
|
|
||||||
skippingMarkers = true;;
|
|
||||||
if (ev->value > 0)
|
|
||||||
next_marker();
|
|
||||||
else
|
|
||||||
prev_marker();
|
|
||||||
} else {
|
|
||||||
//scale the range so that we can go from +/-8x within 180 degrees, with less precision at the higher speeds
|
|
||||||
float speed = get_transport_speed();
|
|
||||||
speed += (float)ev->value * 0.05;
|
|
||||||
if (speed > 1.5 || speed < -1.5 )
|
|
||||||
speed += ev->value;
|
|
||||||
set_transport_speed( speed );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case EV_KEY:
|
|
||||||
if(ev->code != BTN_0)
|
|
||||||
fprintf(stderr, "Warning: unexpected key event; ev->code = 0x%04x\n", ev->code);
|
|
||||||
else
|
|
||||||
if (ev->value)
|
|
||||||
held = true;
|
|
||||||
else {
|
|
||||||
held = false;
|
|
||||||
if (skippingMarkers) {
|
|
||||||
skippingMarkers = false;
|
|
||||||
} else {
|
|
||||||
if (get_transport_speed() == 0.0) {
|
|
||||||
set_transport_speed(1.0);
|
|
||||||
} else {
|
|
||||||
set_transport_speed(0.0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
fflush(stdout);
|
|
||||||
}
|
|
||||||
|
|
||||||
void*
|
|
||||||
PowermateControlProtocol::SerialThread ()
|
|
||||||
{
|
|
||||||
struct input_event ibuffer[BUFFER_SIZE];
|
|
||||||
int r, events, i;
|
|
||||||
|
|
||||||
while(1){
|
|
||||||
r = read(mPort, ibuffer, sizeof(struct input_event) * BUFFER_SIZE);
|
|
||||||
if( r > 0 ){
|
|
||||||
events = r / sizeof(struct input_event);
|
|
||||||
for(i=0; i<events; i++)
|
|
||||||
ProcessEvent(&ibuffer[i]);
|
|
||||||
}else{
|
|
||||||
fprintf(stderr, "read() failed: %s\n", strerror(errno));
|
|
||||||
return (void*) 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (void*) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
|||||||
#ifndef ardour_powermate_h
|
|
||||||
#define ardour_powermate_h
|
|
||||||
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
|
|
||||||
#include "control_protocol/control_protocol.h"
|
|
||||||
|
|
||||||
class PowermateControlProtocol : public ARDOUR::ControlProtocol
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
PowermateControlProtocol (ARDOUR::Session&);
|
|
||||||
virtual ~PowermateControlProtocol();
|
|
||||||
|
|
||||||
int set_active (bool yn);
|
|
||||||
static bool probe ();
|
|
||||||
|
|
||||||
XMLNode& get_state ();
|
|
||||||
int set_state (const XMLNode&, int version);
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
static void* SerialThreadEntry (void* arg);
|
|
||||||
void* SerialThread ();
|
|
||||||
|
|
||||||
void ProcessEvent(struct input_event *ev);
|
|
||||||
|
|
||||||
int mPort;
|
|
||||||
pthread_t mThread;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,37 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
from waflib.extras import autowaf as autowaf
|
|
||||||
import os
|
|
||||||
|
|
||||||
# Library version (UNIX style major, minor, micro)
|
|
||||||
# major increment <=> incompatible changes
|
|
||||||
# minor increment <=> compatible changes (additions)
|
|
||||||
# micro increment <=> no interface changes
|
|
||||||
LIBARDOUR_POWERMATE_LIB_VERSION = '4.1.0'
|
|
||||||
|
|
||||||
# Mandatory variables
|
|
||||||
top = '.'
|
|
||||||
out = 'build'
|
|
||||||
|
|
||||||
def options(opt):
|
|
||||||
autowaf.set_options(opt)
|
|
||||||
|
|
||||||
def configure(conf):
|
|
||||||
autowaf.configure(conf)
|
|
||||||
|
|
||||||
def build(bld):
|
|
||||||
obj = bld(features = 'cxx cxxshlib')
|
|
||||||
obj.source = '''
|
|
||||||
interface.cc
|
|
||||||
powermate.cc
|
|
||||||
'''
|
|
||||||
obj.export_includes = ['.']
|
|
||||||
obj.cxxflags = '-DPACKAGE="ardour_powermate"'
|
|
||||||
obj.includes = ['.' ]
|
|
||||||
obj.name = 'libpowermate'
|
|
||||||
obj.target = 'powermate'
|
|
||||||
obj.use = 'libardour libardour_cp'
|
|
||||||
obj.vnum = LIBARDOUR_POWERMATE_LIB_VERSION
|
|
||||||
obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3', 'surfaces')
|
|
||||||
|
|
||||||
def shutdown():
|
|
||||||
autowaf.shutdown()
|
|
@ -25,7 +25,6 @@ children = [
|
|||||||
'generic_midi',
|
'generic_midi',
|
||||||
'mackie',
|
'mackie',
|
||||||
'osc',
|
'osc',
|
||||||
'powermate',
|
|
||||||
'tranzport',
|
'tranzport',
|
||||||
'wiimote'
|
'wiimote'
|
||||||
]
|
]
|
||||||
@ -48,7 +47,6 @@ def configure(conf):
|
|||||||
#if Options.options.tranzport and conf.is_defined('HAVE_USB'):
|
#if Options.options.tranzport and conf.is_defined('HAVE_USB'):
|
||||||
# conf.define('BUILD_TRANZPORT', 1)
|
# conf.define('BUILD_TRANZPORT', 1)
|
||||||
|
|
||||||
conf.check_cc (header_name='linux/input.h', define_name='BUILD_POWERMATE',mandatory=False)
|
|
||||||
autowaf.check_pkg (conf, 'liblo', mandatory=False, uselib_store="LO", atleast_version="0.24")
|
autowaf.check_pkg (conf, 'liblo', mandatory=False, uselib_store="LO", atleast_version="0.24")
|
||||||
|
|
||||||
conf.check_cc (header_name='cwiid.h', define_name='HAVE_CWIID_H',mandatory=False)
|
conf.check_cc (header_name='cwiid.h', define_name='HAVE_CWIID_H',mandatory=False)
|
||||||
@ -68,8 +66,6 @@ def build(bld):
|
|||||||
bld.recurse('mackie')
|
bld.recurse('mackie')
|
||||||
if bld.is_defined ('HAVE_LO'):
|
if bld.is_defined ('HAVE_LO'):
|
||||||
bld.recurse('osc')
|
bld.recurse('osc')
|
||||||
if bld.is_defined('BUILD_POWERMATE'):
|
|
||||||
bld.recurse('powermate')
|
|
||||||
if bld.is_defined('BUILD_WIIMOTE'):
|
if bld.is_defined('BUILD_WIIMOTE'):
|
||||||
bld.recurse('wiimote')
|
bld.recurse('wiimote')
|
||||||
if bld.is_defined('BUILD_TRANZPORT'):
|
if bld.is_defined('BUILD_TRANZPORT'):
|
||||||
|
Loading…
Reference in New Issue
Block a user