source: roaraudio/plugins/roard/dmx-strobe.c @ 5936:6b9dee5bea08

Last change on this file since 5936:6b9dee5bea08 was 5936:6b9dee5bea08, checked in by phi, 11 years ago

added plugin to control a strobe

File size: 4.5 KB
Line 
1//dmx-strobe.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2011-2013
5 *
6 *  This file is part of roard a part of RoarAudio,
7 *  a cross-platform sound system for both, home and professional use.
8 *  See README for details.
9 *
10 *  This file is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License version 3
12 *  as published by the Free Software Foundation.
13 *
14 *  RoarAudio is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this software; see the file COPYING.  If not, write to
21 *  the Free Software Foundation, 51 Franklin Street, Fifth Floor,
22 *  Boston, MA 02110-1301, USA.
23 *
24 */
25
26#include <roard/include/roard.h>
27
28struct state {
29 // config:
30 ssize_t channel_brightness;
31 ssize_t channel_frequency;
32 ssize_t channel_trigger;
33 uint8_t brightness;
34 uint8_t frequency;
35
36 // runtime:
37 uint8_t tigger_value;
38 struct roar_subscriber * subscription_event;
39};
40
41static struct state * g_state;
42static struct state   g_state_init = {
43 .channel_brightness = -1,
44 .channel_frequency  = -1,
45 .channel_trigger    = -1,
46 .brightness         = 255,
47 .frequency          = 64,
48 .tigger_value       = 0
49};
50
51#define __set_XXX(type) \
52static void __set_##type (uint8_t val) { \
53 if ( g_state->channel_##type != -1 ) \
54  light_dmxchannel_set(g_state->channel_##type, val); \
55}
56
57__set_XXX(brightness)
58__set_XXX(frequency)
59__set_XXX(trigger)
60
61static void __handle_event(uint8_t event) {
62 switch (event) {
63  case ROAR_ROARDMX_EVENT_STROBE|ROAR_ROARDMX_ETYPE_BEAT:
64    g_state->tigger_value += 7; // prime value > 3 for maximum 'random' effect.
65    __set_trigger(g_state->tigger_value);
66   break;
67  case ROAR_ROARDMX_EVENT_STROBE|ROAR_ROARDMX_ETYPE_OFF:
68    __set_frequency(0);
69   break;
70  case ROAR_ROARDMX_EVENT_STROBE|ROAR_ROARDMX_ETYPE_ON:
71  case ROAR_ROARDMX_EVENT_STROBE|ROAR_ROARDMX_ETYPE_HOLD:
72    __set_brightness(g_state->brightness);
73    __set_frequency(g_state->frequency);
74   break;
75 }
76}
77
78static int _init  (struct roar_dl_librarypara * para) {
79 struct roar_keyval * p;
80
81 p = roar_keyval_lookup(para->argv, "channel-brightness", para->argc, 1);
82 if ( p != NULL && p->value != NULL )
83  g_state->channel_brightness = atoi(p->value);
84
85 p = roar_keyval_lookup(para->argv, "channel-frequency", para->argc, 1);
86 if ( p != NULL && p->value != NULL )
87  g_state->channel_frequency = atoi(p->value);
88
89 p = roar_keyval_lookup(para->argv, "channel-trigger", para->argc, 1);
90 if ( p != NULL && p->value != NULL )
91  g_state->channel_trigger = atoi(p->value);
92
93 p = roar_keyval_lookup(para->argv, "brightness", para->argc, 1);
94 if ( p != NULL && p->value != NULL )
95  g_state->brightness = atoi(p->value);
96
97 p = roar_keyval_lookup(para->argv, "frequency", para->argc, 1);
98 if ( p != NULL && p->value != NULL )
99  g_state->frequency = atoi(p->value);
100
101 return 0;
102}
103
104static struct roar_dl_appsched sched = {
105 .init   = _init,
106 .free   = NULL,
107 .update = NULL,
108 .tick   = NULL,
109 .wait   = NULL
110};
111
112static void cb_event(struct roar_notify_core * core, struct roar_event * event, void * userdata) {
113 (void)core, (void)userdata;
114 __handle_event(event->arg0);
115}
116
117static int init(struct roar_dl_librarypara * para, struct roar_dl_libraryinst * lib) {
118 struct roar_event event;
119
120 (void)para, (void)lib;
121
122 memset(&event, 0, sizeof(event));
123
124 event.event = ROAR_DATA_DMX512_EVENT;
125 event.emitter = -1;
126 event.target = -1;
127 event.target_type = ROAR_OT_STREAM;
128
129 g_state->subscription_event = roar_notify_core_subscribe(NULL, &event, cb_event, NULL);
130
131 return 0;
132}
133
134static int unload(struct roar_dl_librarypara * para, struct roar_dl_libraryinst * lib) {
135 (void)para, (void)lib;
136
137 roar_notify_core_unsubscribe(NULL, g_state->subscription_event);
138
139 return 0;
140}
141
142ROAR_DL_PLUGIN_START(dmx_strobe) {
143 ROARD_DL_CHECK_VERSIONS();
144
145 ROAR_DL_PLUGIN_META_PRODUCT_NIV("dmx-strobe", ROAR_VID_ROARAUDIO, ROAR_VNAME_ROARAUDIO);
146 ROAR_DL_PLUGIN_META_VERSION(ROAR_VERSION_STRING);
147 ROAR_DL_PLUGIN_META_LICENSE_TAG(GPLv3_0);
148 ROAR_DL_PLUGIN_META_CONTACT_FLNE("Philipp", "Schafft", "ph3-der-loewe", "lion@lion.leolix.org");
149 ROAR_DL_PLUGIN_META_DESC("Controls strobes using roard's DMX interface.");
150
151 ROAR_DL_PLUGIN_REG_GLOBAL_DATA(g_state, g_state_init);
152 ROAR_DL_PLUGIN_REG_APPSCHED(&sched);
153 ROAR_DL_PLUGIN_REG(ROAR_DL_FN_INIT, init);
154 ROAR_DL_PLUGIN_REG_UNLOAD(unload);
155} ROAR_DL_PLUGIN_END
156
157//ll
Note: See TracBrowser for help on using the repository browser.