source: roaraudio/plugins/roard/dmx-strobe.c @ 5937:99bf6b3b3ebe

Last change on this file since 5937:99bf6b3b3ebe was 5937:99bf6b3b3ebe, checked in by phi, 11 years ago

get the strobe plugin working correctly

File size: 4.6 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 ROAR_DBG("__set_%s(val=%i): channel=%li", #type, val, (long int)g_state->channel_##type); \
54 if ( g_state->channel_##type != -1 ) \
55  light_dmxchannel_set(g_state->channel_##type, val); \
56}
57
58__set_XXX(brightness)
59__set_XXX(frequency)
60__set_XXX(trigger)
61
62static void __handle_event(uint8_t event) {
63 switch (event) {
64  case ROAR_ROARDMX_EVENT_STROBE|ROAR_ROARDMX_ETYPE_BEAT:
65    g_state->tigger_value += 7; // prime value > 3 for maximum 'random' effect.
66    __set_trigger(g_state->tigger_value);
67   break;
68  case ROAR_ROARDMX_EVENT_STROBE|ROAR_ROARDMX_ETYPE_OFF:
69    __set_frequency(0);
70   break;
71  case ROAR_ROARDMX_EVENT_STROBE|ROAR_ROARDMX_ETYPE_ON:
72  case ROAR_ROARDMX_EVENT_STROBE|ROAR_ROARDMX_ETYPE_HOLD:
73    __set_brightness(g_state->brightness);
74    __set_frequency(g_state->frequency);
75   break;
76 }
77}
78
79static int _init  (struct roar_dl_librarypara * para) {
80 struct roar_keyval * p;
81
82 p = roar_keyval_lookup(para->argv, "channel-brightness", para->argc, 1);
83 if ( p != NULL && p->value != NULL )
84  g_state->channel_brightness = atoi(p->value);
85
86 p = roar_keyval_lookup(para->argv, "channel-frequency", para->argc, 1);
87 if ( p != NULL && p->value != NULL )
88  g_state->channel_frequency = atoi(p->value);
89
90 p = roar_keyval_lookup(para->argv, "channel-trigger", para->argc, 1);
91 if ( p != NULL && p->value != NULL )
92  g_state->channel_trigger = atoi(p->value);
93
94 p = roar_keyval_lookup(para->argv, "brightness", para->argc, 1);
95 if ( p != NULL && p->value != NULL )
96  g_state->brightness = atoi(p->value);
97
98 p = roar_keyval_lookup(para->argv, "frequency", para->argc, 1);
99 if ( p != NULL && p->value != NULL )
100  g_state->frequency = atoi(p->value);
101
102 return 0;
103}
104
105static struct roar_dl_appsched sched = {
106 .init   = _init,
107 .free   = NULL,
108 .update = NULL,
109 .tick   = NULL,
110 .wait   = NULL
111};
112
113static void cb_event(struct roar_notify_core * core, struct roar_event * event, void * userdata) {
114 struct state * old = g_state;
115
116 (void)core, (void)userdata;
117
118 g_state = userdata;
119
120 __handle_event(event->arg0);
121
122 g_state = old;
123}
124
125static int init(struct roar_dl_librarypara * para, struct roar_dl_libraryinst * lib) {
126 struct roar_event event;
127
128 (void)para, (void)lib;
129
130 memset(&event, 0, sizeof(event));
131
132 event.event = ROAR_DATA_DMX512_EVENT;
133 event.emitter = -1;
134 event.target = -1;
135 event.target_type = ROAR_OT_STREAM;
136
137 g_state->subscription_event = roar_notify_core_subscribe(NULL, &event, cb_event, g_state);
138
139 return 0;
140}
141
142static int unload(struct roar_dl_librarypara * para, struct roar_dl_libraryinst * lib) {
143 (void)para, (void)lib;
144
145 roar_notify_core_unsubscribe(NULL, g_state->subscription_event);
146
147 return 0;
148}
149
150ROAR_DL_PLUGIN_START(dmx_strobe) {
151 ROARD_DL_CHECK_VERSIONS();
152
153 ROAR_DL_PLUGIN_META_PRODUCT_NIV("dmx-strobe", ROAR_VID_ROARAUDIO, ROAR_VNAME_ROARAUDIO);
154 ROAR_DL_PLUGIN_META_VERSION(ROAR_VERSION_STRING);
155 ROAR_DL_PLUGIN_META_LICENSE_TAG(GPLv3_0);
156 ROAR_DL_PLUGIN_META_CONTACT_FLNE("Philipp", "Schafft", "ph3-der-loewe", "lion@lion.leolix.org");
157 ROAR_DL_PLUGIN_META_DESC("Controls strobes using roard's DMX interface.");
158
159 ROAR_DL_PLUGIN_REG_GLOBAL_DATA(g_state, g_state_init);
160 ROAR_DL_PLUGIN_REG_APPSCHED(&sched);
161 ROAR_DL_PLUGIN_REG(ROAR_DL_FN_INIT, init);
162 ROAR_DL_PLUGIN_REG_UNLOAD(unload);
163} ROAR_DL_PLUGIN_END
164
165//ll
Note: See TracBrowser for help on using the repository browser.