~ubuntu-branches/ubuntu/oneiric/oss4/oneiric-proposed

« back to all changes in this revision

Viewing changes to lib/libsalsa/seq_output.c

  • Committer: Bazaar Package Importer
  • Author(s): Stefano Rivera
  • Date: 2011-06-16 20:37:48 UTC
  • mfrom: (5.1.3 sid)
  • Revision ID: james.westby@ubuntu.com-20110616203748-jbrxik6ql33z54co
Tags: 4.2-build2004-1ubuntu1
* Merge from Debian unstable.
  - Supports our current kernel (LP: #746048)
  Remaining changes:
  - debian/oss4-dkms.dkms.in: s/source/build/ in Kernel headers paths.
* ld-as-needed.patch: Re-order CC arguments to enable building with ld
  --as-needed (LP: #770972)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *  Copyright (c) 2004 by Hannu Savolainen < hannu@opensound.com>
 
3
 *
 
4
 *   This library is free software; you can redistribute it and/or modify
 
5
 *   it under the terms of the GNU Lesser General Public License version 2.1 as
 
6
 *   published by the Free Software Foundation.
 
7
 *
 
8
 *   This program is distributed in the hope that it will be useful,
 
9
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
 *   GNU Lesser General Public License for more details.
 
12
 *
 
13
 *   You should have received a copy of the GNU Lesser General Public
 
14
 *   License along with this library; if not, write to the Free Software
 
15
 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 
16
 *
 
17
 */
 
18
#include <stdio.h>
 
19
#include "local.h"
 
20
 
 
21
static int
 
22
midi_out3 (snd_seq_t * seq, int msg, int parm1, int parm2)
 
23
{
 
24
  unsigned char buf[3];
 
25
  int l;
 
26
 
 
27
  if (msg < 0 || msg >= 0xff)
 
28
    return -ERANGE;
 
29
  if (parm1 < 0 || parm1 > 0x7f)
 
30
    return -ERANGE;
 
31
  if (parm2 < 0 || parm2 > 0x7f)
 
32
    return -ERANGE;
 
33
 
 
34
  buf[0] = msg;
 
35
  buf[1] = parm1;
 
36
  buf[2] = parm2;
 
37
 
 
38
  if ((l = write (seq->fd, buf, 3)) != 3)
 
39
    {
 
40
      if (l == -1)
 
41
        return -errno;
 
42
 
 
43
#ifdef EBADE
 
44
      return -EBADE;            /* Randomly selected error */
 
45
#elif defined(EGRATUITOUS)
 
46
      return -EGRATUITOUS;      /* Randomly selected error */
 
47
#else
 
48
      return -EIO;              /* Randomly selected error */
 
49
#endif
 
50
    }
 
51
 
 
52
  return 0;
 
53
}
 
54
 
 
55
static int
 
56
midi_out2 (snd_seq_t * seq, int msg, int parm1)
 
57
{
 
58
  unsigned char buf[3];
 
59
  int l;
 
60
 
 
61
  if (msg < 0 || msg >= 0xff)
 
62
    return -ERANGE;
 
63
  if (parm1 < 0 || parm1 > 0x7f)
 
64
    return -ERANGE;
 
65
 
 
66
  buf[0] = msg;
 
67
  buf[1] = parm1;
 
68
 
 
69
  if ((l = write (seq->fd, buf, 2)) != 2)
 
70
    {
 
71
      if (l == -1)
 
72
        return -errno;
 
73
 
 
74
#ifdef EBADE
 
75
      return -EBADE;            /* Randomly selected error */
 
76
#elif defined(EGRATUITOUS)
 
77
      return -EGRATUITOUS;      /* Randomly selected error */
 
78
#else
 
79
      return -EIO;              /* Randomly selected error */
 
80
#endif
 
81
    }
 
82
 
 
83
  return 0;
 
84
}
 
85
 
 
86
int
 
87
convert_event (snd_seq_t * seq, snd_seq_event_t * ev)
 
88
{
 
89
  int value;
 
90
 
 
91
  dbg_printf3
 
92
    ("Event %2d: flags=%08x tag=%08x, q=%2d, time=%d, src=%x, dst=%x\n",
 
93
     ev->type, ev->flags, ev->tag, ev->queue, ev->time.tick, ev->source, ev->dest);
 
94
 
 
95
  switch (ev->type)
 
96
    {
 
97
    case SND_SEQ_EVENT_CONTROLLER:
 
98
      dbg_printf3 ("\tSND_SEQ_EVENT_CONTRLLER %2d, %3d, %3d\n",
 
99
                   ev->data.control.channel,
 
100
                   ev->data.control.param, ev->data.control.value);
 
101
      if (ev->data.control.channel > 15)
 
102
        return -ERANGE;
 
103
      return midi_out3 (seq, 0xB0 + ev->data.control.channel,
 
104
                        ev->data.control.param, ev->data.control.value);
 
105
      break;
 
106
 
 
107
    case SND_SEQ_EVENT_PGMCHANGE:
 
108
      dbg_printf3 ("\tSND_SEQ_EVENT_PGMCHANGE %2d, %3d, %3d\n",
 
109
                   ev->data.control.channel,
 
110
                   ev->data.control.param, ev->data.control.value);
 
111
      if (ev->data.control.channel > 15)
 
112
        return -ERANGE;
 
113
      return midi_out2 (seq, 0xC0 + ev->data.control.channel,
 
114
                        ev->data.control.value);
 
115
      break;
 
116
 
 
117
    case SND_SEQ_EVENT_CHANPRESS:
 
118
      dbg_printf3 ("\tSND_SEQ_EVENT_CHANPRESS %2d, %5d\n",
 
119
                   ev->data.control.channel, ev->data.control.value);
 
120
      value = ev->data.control.value + 8192;
 
121
      if (ev->data.control.channel > 15)
 
122
        return -ERANGE;
 
123
      return midi_out3 (seq, 0xD0 + ev->data.control.channel,
 
124
                        value & 0x7f, (value >> 7) & 0x7f);
 
125
      break;
 
126
 
 
127
    case SND_SEQ_EVENT_PITCHBEND:
 
128
      dbg_printf3 ("\tSND_SEQ_EVENT_PITCHBEND %2d, %5d\n",
 
129
                   ev->data.control.channel, ev->data.control.value);
 
130
      value = ev->data.control.value + 8192;
 
131
      if (ev->data.control.channel > 15)
 
132
        return -ERANGE;
 
133
      return midi_out3 (seq, 0xE0 + ev->data.control.channel,
 
134
                        value & 0x7f, (value >> 7) & 0x7f);
 
135
      break;
 
136
 
 
137
    case SND_SEQ_EVENT_NOTEON:
 
138
      dbg_printf3 ("\tSND_SEQ_EVENT_NOTEON  %2d, %3d, %d\n",
 
139
                   ev->data.note.channel,
 
140
                   ev->data.note.note, ev->data.note.velocity);
 
141
      if (ev->data.control.channel > 15)
 
142
        return -ERANGE;
 
143
      return midi_out3 (seq, 0x90 + ev->data.note.channel,
 
144
                        ev->data.note.note, ev->data.note.velocity);
 
145
      break;
 
146
 
 
147
    case SND_SEQ_EVENT_NOTEOFF:
 
148
      dbg_printf3 ("\tSND_SEQ_EVENT_NOTEOFF %2d, %3d, %d\n",
 
149
                   ev->data.note.channel,
 
150
                   ev->data.note.note, ev->data.note.velocity);
 
151
      if (ev->data.control.channel > 15)
 
152
        return -ERANGE;
 
153
      return midi_out3 (seq, 0x80 + ev->data.note.channel,
 
154
                        ev->data.note.note, ev->data.note.velocity);
 
155
      break;
 
156
 
 
157
    case SND_SEQ_EVENT_KEYPRESS:
 
158
      dbg_printf3 ("\tSND_SEQ_EVENT_KEYPRESS %2d, %3d, %d\n",
 
159
                   ev->data.note.channel,
 
160
                   ev->data.note.note, ev->data.note.velocity);
 
161
      if (ev->data.control.channel > 15)
 
162
        return -ERANGE;
 
163
      return midi_out3 (seq, 0xA0 + ev->data.note.channel,
 
164
                        ev->data.note.note, ev->data.note.velocity);
 
165
      break;
 
166
 
 
167
    case SND_SEQ_EVENT_SYSTEM:
 
168
      dbg_printf ("\tSND_SEQ_EVENT_SYSTEM\n");
 
169
      break;
 
170
    case SND_SEQ_EVENT_RESULT:
 
171
      dbg_printf ("\tSND_SEQ_EVENT_RESULT\n");
 
172
      break;
 
173
    case SND_SEQ_EVENT_NOTE:
 
174
      dbg_printf ("\tSND_SEQ_EVENT_NOTE\n");
 
175
      break;
 
176
    case SND_SEQ_EVENT_CONTROL14:
 
177
      dbg_printf ("\tSND_SEQ_EVENT_CONTROL14\n");
 
178
      break;
 
179
    case SND_SEQ_EVENT_NONREGPARAM:
 
180
      dbg_printf ("\tSND_SEQ_EVENT_NONREGPARAM\n");
 
181
      break;
 
182
    case SND_SEQ_EVENT_REGPARAM:
 
183
      dbg_printf ("\tSND_SEQ_EVENT_REGPARAM\n");
 
184
      break;
 
185
    case SND_SEQ_EVENT_SONGPOS:
 
186
      dbg_printf ("\tSND_SEQ_EVENT_SONGPOS\n");
 
187
      break;
 
188
    case SND_SEQ_EVENT_SONGSEL:
 
189
      dbg_printf ("\tSND_SEQ_EVENT_SONGSEL\n");
 
190
      break;
 
191
    case SND_SEQ_EVENT_QFRAME:
 
192
      dbg_printf ("\tSND_SEQ_EVENT_QFRAME\n");
 
193
      break;
 
194
    case SND_SEQ_EVENT_TIMESIGN:
 
195
      dbg_printf ("\tSND_SEQ_EVENT_TIMESIGN\n");
 
196
      break;
 
197
    case SND_SEQ_EVENT_KEYSIGN:
 
198
      dbg_printf ("\tSND_SEQ_EVENT_KEYSIGN\n");
 
199
      break;
 
200
    case SND_SEQ_EVENT_START:
 
201
      dbg_printf ("\tSND_SEQ_EVENT_START\n");
 
202
      break;
 
203
    case SND_SEQ_EVENT_CONTINUE:
 
204
      dbg_printf ("\tSND_SEQ_EVENT_CONTINUE\n");
 
205
      break;
 
206
    case SND_SEQ_EVENT_STOP:
 
207
      dbg_printf ("\tSND_SEQ_EVENT_STOP\n");
 
208
      break;
 
209
    case SND_SEQ_EVENT_SETPOS_TICK:
 
210
      dbg_printf ("\tSND_SEQ_EVENT_SETPOS_TICK\n");
 
211
      break;
 
212
    case SND_SEQ_EVENT_SETPOS_TIME:
 
213
      dbg_printf ("\tSND_SEQ_EVENT_SETPOS_TIME\n");
 
214
      break;
 
215
    case SND_SEQ_EVENT_TEMPO:
 
216
      dbg_printf ("\tSND_SEQ_EVENT_TEMPO\n");
 
217
      break;
 
218
    case SND_SEQ_EVENT_CLOCK:
 
219
      dbg_printf ("\tSND_SEQ_EVENT_CLOCK\n");
 
220
      break;
 
221
    case SND_SEQ_EVENT_TICK:
 
222
      dbg_printf ("\tSND_SEQ_EVENT_TICK\n");
 
223
      break;
 
224
    case SND_SEQ_EVENT_QUEUE_SKEW:
 
225
      dbg_printf ("\tSND_SEQ_EVENT_QUEUE_SKEW\n");
 
226
      break;
 
227
    case SND_SEQ_EVENT_SYNC_POS:
 
228
      dbg_printf ("\tSND_SEQ_EVENT_SYNC_POS\n");
 
229
      break;
 
230
    case SND_SEQ_EVENT_TUNE_REQUEST:
 
231
      dbg_printf ("\tSND_SEQ_EVENT_TUNE_REQUEST\n");
 
232
      break;
 
233
    case SND_SEQ_EVENT_RESET:
 
234
      dbg_printf ("\tSND_SEQ_EVENT_RESET\n");
 
235
      break;
 
236
    case SND_SEQ_EVENT_SENSING:
 
237
      dbg_printf ("\tSND_SEQ_EVENT_SENSING\n");
 
238
      break;
 
239
    case SND_SEQ_EVENT_ECHO:
 
240
      dbg_printf ("\tSND_SEQ_EVENT_ECHO\n");
 
241
      break;
 
242
    case SND_SEQ_EVENT_OSS:
 
243
      dbg_printf ("\tSND_SEQ_EVENT_OSS\n");
 
244
      break;
 
245
    case SND_SEQ_EVENT_CLIENT_START:
 
246
      dbg_printf ("\tSND_SEQ_EVENT_CLIENT_START\n");
 
247
      break;
 
248
    case SND_SEQ_EVENT_CLIENT_EXIT:
 
249
      dbg_printf ("\tSND_SEQ_EVENT_CLIENT_EXIT\n");
 
250
      break;
 
251
    case SND_SEQ_EVENT_CLIENT_CHANGE:
 
252
      dbg_printf ("\tSND_SEQ_EVENT_CLIENT_CHANGE\n");
 
253
      break;
 
254
    case SND_SEQ_EVENT_PORT_START:
 
255
      dbg_printf ("\tSND_SEQ_EVENT_PORT_START\n");
 
256
      break;
 
257
    case SND_SEQ_EVENT_PORT_EXIT:
 
258
      dbg_printf ("\tSND_SEQ_EVENT_PORT_EXIT\n");
 
259
      break;
 
260
    case SND_SEQ_EVENT_PORT_CHANGE:
 
261
      dbg_printf ("\tSND_SEQ_EVENT_PORT_CHANGE\n");
 
262
      break;
 
263
    case SND_SEQ_EVENT_PORT_SUBSCRIBED:
 
264
      dbg_printf ("\tSND_SEQ_EVENT_PORT_SUBSCRIBED\n");
 
265
      break;
 
266
    case SND_SEQ_EVENT_PORT_UNSUBSCRIBED:
 
267
      dbg_printf ("\tSND_SEQ_EVENT_PORT_UNSUBSCRIBED\n");
 
268
      break;
 
269
    case SND_SEQ_EVENT_USR0:
 
270
      dbg_printf ("\tSND_SEQ_EVENT_USR0\n");
 
271
      break;
 
272
    case SND_SEQ_EVENT_USR1:
 
273
      dbg_printf ("\tSND_SEQ_EVENT_USR1\n");
 
274
      break;
 
275
    case SND_SEQ_EVENT_USR2:
 
276
      dbg_printf ("\tSND_SEQ_EVENT_USR2\n");
 
277
      break;
 
278
    case SND_SEQ_EVENT_USR3:
 
279
      dbg_printf ("\tSND_SEQ_EVENT_USR3\n");
 
280
      break;
 
281
    case SND_SEQ_EVENT_USR4:
 
282
      dbg_printf ("\tSND_SEQ_EVENT_USR4\n");
 
283
      break;
 
284
    case SND_SEQ_EVENT_USR5:
 
285
      dbg_printf ("\tSND_SEQ_EVENT_USR5\n");
 
286
      break;
 
287
    case SND_SEQ_EVENT_USR6:
 
288
      dbg_printf ("\tSND_SEQ_EVENT_USR6\n");
 
289
      break;
 
290
    case SND_SEQ_EVENT_USR7:
 
291
      dbg_printf ("\tSND_SEQ_EVENT_USR7\n");
 
292
      break;
 
293
    case SND_SEQ_EVENT_USR8:
 
294
      dbg_printf ("\tSND_SEQ_EVENT_USR8\n");
 
295
      break;
 
296
    case SND_SEQ_EVENT_USR9:
 
297
      dbg_printf ("\tSND_SEQ_EVENT_USR9\n");
 
298
      break;
 
299
    case SND_SEQ_EVENT_SYSEX:
 
300
      dbg_printf ("\tSND_SEQ_EVENT_SYSEX\n");
 
301
      break;
 
302
    case SND_SEQ_EVENT_BOUNCE:
 
303
      dbg_printf ("\tSND_SEQ_EVENT_BOUNCE\n");
 
304
      break;
 
305
    case SND_SEQ_EVENT_USR_VAR0:
 
306
      dbg_printf ("\tSND_SEQ_EVENT_USR_VAR0\n");
 
307
      break;
 
308
    case SND_SEQ_EVENT_USR_VAR1:
 
309
      dbg_printf ("\tSND_SEQ_EVENT_USR_VAR1\n");
 
310
      break;
 
311
    case SND_SEQ_EVENT_USR_VAR2:
 
312
      dbg_printf ("\tSND_SEQ_EVENT_USR_VAR2\n");
 
313
      break;
 
314
    case SND_SEQ_EVENT_USR_VAR3:
 
315
      dbg_printf ("\tSND_SEQ_EVENT_USR_VAR3\n");
 
316
      break;
 
317
    case SND_SEQ_EVENT_USR_VAR4:
 
318
      dbg_printf ("\tSND_SEQ_EVENT_USR_VAR4\n");
 
319
      break;
 
320
    case SND_SEQ_EVENT_NONE:
 
321
      dbg_printf ("\tSND_SEQ_EVENT_NONE\n");
 
322
      break;
 
323
    default:
 
324
      dbg_printf ("\tUnknown event type %d\n", ev->type);
 
325
    }
 
326
  return 0;
 
327
}