annotate src/audacious/flow.c @ 3688:8ab4cd5c6462

multifile plugins :(
author William Pitcock <nenolod@atheme.org>
date Tue, 02 Oct 2007 21:47:17 -0500
parents cc888ce7b6fb
children 6f4068a0f291
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3551
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
1 /*
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
2 * Audacious
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
3 * Copyright (c) 2007 William Pitcock
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
4 *
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
5 * flow.c: flow management API.
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
6 *
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
7 * This program is free software; you can redistribute it and/or modify
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
8 * it under the terms of the GNU General Public License as published by
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
9 * the Free Software Foundation; under version 3 of the License.
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
10 *
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
11 * This program is distributed in the hope that it will be useful,
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
14 * GNU General Public License for more details.
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
15 *
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
17 * along with this program. If not, see <http://www.gnu.org/licenses>.
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
18 *
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
19 * The Audacious team does not consider modular code linking to
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
20 * Audacious or using our public API to be a derived work.
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
21 */
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
22
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
23 #include "flow.h"
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
24
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
25 mowgli_object_class_t flow_klass;
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
26
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
27 static void
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
28 flow_destructor(Flow *flow)
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
29 {
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
30 FlowElement *element, *element2;
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
31
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
32 g_return_if_fail(flow != NULL);
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
33
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
34 MOWGLI_ITER_FOREACH_SAFE(element, element2, flow->head)
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
35 g_slice_free(FlowElement, element);
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
36
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
37 g_slice_free(Flow, flow);
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
38 }
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
39
3558
5aec9950c47a Add time to flow_execute() and friends.
William Pitcock <nenolod@atheme.org>
parents: 3551
diff changeset
40 void flow_execute(Flow *flow, gint time, gpointer data, gsize len, AFormat fmt,
3551
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
41 gint srate, gint channels)
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
42 {
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
43 FlowElement *element;
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
44 FlowContext context = {};
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
45
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
46 g_return_if_fail(flow != NULL);
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
47 g_return_if_fail(data != NULL);
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
48
3558
5aec9950c47a Add time to flow_execute() and friends.
William Pitcock <nenolod@atheme.org>
parents: 3551
diff changeset
49 context.time = time;
3551
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
50 context.data = data;
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
51 context.len = len;
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
52 context.fmt = fmt;
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
53 context.srate = srate;
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
54 context.channels = channels;
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
55 context.error = FALSE;
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
56
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
57 MOWGLI_ITER_FOREACH(element, flow->head)
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
58 {
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
59 element->func(&context);
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
60
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
61 if (context.error)
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
62 break;
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
63 }
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
64 }
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
65
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
66 Flow *
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
67 flow_new(void)
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
68 {
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
69 static int init = 0;
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
70 Flow *out;
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
71
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
72 if (!init)
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
73 {
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
74 mowgli_object_class_init(&flow_klass, "audacious.flow",
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
75 (mowgli_destructor_t) flow_destructor, FALSE);
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
76 ++init;
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
77 }
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
78
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
79 out = g_slice_new0(Flow);
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
80 mowgli_object_init(mowgli_object(out), NULL, &flow_klass, NULL);
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
81
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
82 return out;
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
83 }
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
84
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
85 void
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
86 flow_link_element(Flow *flow, FlowFunction func)
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
87 {
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
88 FlowElement *element;
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
89
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
90 g_return_if_fail(flow != NULL);
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
91 g_return_if_fail(func != NULL);
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
92
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
93 element = g_slice_new0(FlowElement);
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
94 element->func = func;
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
95 element->prev = flow->tail;
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
96
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
97 if (flow->tail)
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
98 flow->tail->next = element;
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
99
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
100 flow->tail = element;
3563
cc888ce7b6fb link/unlink fixes
William Pitcock <nenolod@atheme.org>
parents: 3558
diff changeset
101
cc888ce7b6fb link/unlink fixes
William Pitcock <nenolod@atheme.org>
parents: 3558
diff changeset
102 if (!flow->head)
cc888ce7b6fb link/unlink fixes
William Pitcock <nenolod@atheme.org>
parents: 3558
diff changeset
103 flow->head = element;
3551
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
104 }
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
105
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
106 /* TBD: unlink all elements of func, or just the first --nenolod */
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
107 void
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
108 flow_unlink_element(Flow *flow, FlowFunction func)
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
109 {
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
110 FlowElement *iter, *iter2;
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
111
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
112 g_return_if_fail(flow != NULL);
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
113 g_return_if_fail(func != NULL);
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
114
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
115 MOWGLI_ITER_FOREACH_SAFE(iter, iter2, flow->head)
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
116 if (iter->func == func)
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
117 {
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
118 if (iter->next)
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
119 iter->next->prev = iter->prev;
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
120
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
121 iter->prev->next = iter->next;
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
122
3563
cc888ce7b6fb link/unlink fixes
William Pitcock <nenolod@atheme.org>
parents: 3558
diff changeset
123 if (flow->tail == iter)
cc888ce7b6fb link/unlink fixes
William Pitcock <nenolod@atheme.org>
parents: 3558
diff changeset
124 flow->tail = iter->prev;
cc888ce7b6fb link/unlink fixes
William Pitcock <nenolod@atheme.org>
parents: 3558
diff changeset
125
cc888ce7b6fb link/unlink fixes
William Pitcock <nenolod@atheme.org>
parents: 3558
diff changeset
126 if (flow->head == iter)
cc888ce7b6fb link/unlink fixes
William Pitcock <nenolod@atheme.org>
parents: 3558
diff changeset
127 flow->head = iter->next;
cc888ce7b6fb link/unlink fixes
William Pitcock <nenolod@atheme.org>
parents: 3558
diff changeset
128
3551
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
129 g_slice_free(FlowElement, iter);
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
130 }
d4f9e45c1e27 Flow manager.
William Pitcock <nenolod@atheme.org>
parents:
diff changeset
131 }