source: roaraudio/plugins/roard/protocol-esound.c @ 2522:bfca230702b0

Last change on this file since 2522:bfca230702b0 was 2522:bfca230702b0, checked in by phi, 15 years ago

wrote basic emul_esd_exec_command() and emul_esd_check_client()

File size: 4.8 KB
Line 
1//emul_esd.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2009
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, 675 Mass Ave, Cambridge, MA 02139, USA.
22 *
23 */
24
25#include "roard.h"
26
27#ifndef ROAR_WITHOUT_DCOMP_EMUL_ESD
28#ifdef ROAR_HAVE_ESD
29
30#if !defined(ROAR_TARGET_MICROCONTROLLER) && !defined(ROAR_MINIMAL)
31#define _NAME(x) (x)
32#else
33#define _NAME(x) ((char*)NULL)
34#endif
35
36#define _cmd_t   int
37#define _INTSIZE sizeof(_cmd_t)
38
39struct emul_esd_command g_emul_esd_commands[] = {
40 {ESD_PROTO_CONNECT,      ESD_KEY_LEN  +     _INTSIZE, _NAME("CONNECT"),      NULL},
41 {ESD_PROTO_LOCK,         ESD_KEY_LEN  +     _INTSIZE, _NAME("LOCK"),         NULL},
42 {ESD_PROTO_UNLOCK,       ESD_KEY_LEN  +     _INTSIZE, _NAME("UNLOCK"),       NULL},
43 {ESD_PROTO_STREAM_PLAY,  ESD_NAME_MAX + 2 * _INTSIZE, _NAME("STREAM_PLAY"),  NULL},
44 {ESD_PROTO_STREAM_REC,   ESD_NAME_MAX + 2 * _INTSIZE, _NAME("STREAM_REC"),   NULL},
45 {ESD_PROTO_STREAM_MON,   ESD_NAME_MAX + 2 * _INTSIZE, _NAME("STREAM_MON"),   NULL},
46 {ESD_PROTO_SAMPLE_CACHE, ESD_NAME_MAX + 3 * _INTSIZE, _NAME("SAMPLE_CACHE"), NULL},
47 {ESD_PROTO_SAMPLE_FREE,                     _INTSIZE, _NAME("SAMPLE_FREE"),  NULL},
48 {ESD_PROTO_SAMPLE_PLAY,                     _INTSIZE, _NAME("SAMPLE_PLAY"),  NULL},
49 {ESD_PROTO_SAMPLE_LOOP,                     _INTSIZE, _NAME("SAMPLE_LOOP"),  NULL},
50 {ESD_PROTO_SAMPLE_STOP,                     _INTSIZE, _NAME("SAMPLE_STOP"),  NULL},
51 {ESD_PROTO_SAMPLE_KILL,  0                          , _NAME("SAMPLE_KILL"),  NULL},
52 {ESD_PROTO_STANDBY,      ESD_KEY_LEN +      _INTSIZE, _NAME("STANDBY"),      NULL},
53 {ESD_PROTO_RESUME,       ESD_KEY_LEN +      _INTSIZE, _NAME("RESUME"),       NULL},
54 {ESD_PROTO_SAMPLE_GETID, ESD_NAME_MAX               , _NAME("SAMPLE_GETID"), NULL},
55 {ESD_PROTO_STREAM_FILT,  ESD_NAME_MAX + 2 * _INTSIZE, _NAME("STREAM_FILT"),  NULL},
56 {ESD_PROTO_SERVER_INFO,                     _INTSIZE, _NAME("SERVER_INFO"),  NULL},
57 {ESD_PROTO_ALL_INFO,                        _INTSIZE, _NAME("ALL_INFO"),     NULL},
58 {ESD_PROTO_SUBSCRIBE,    0                          , _NAME("SUBSCRIBE"),    NULL},
59 {ESD_PROTO_UNSUBSCRIBE,  0                          , _NAME("UNSUBSCRIBE"),  NULL},
60 {ESD_PROTO_STREAM_PAN,                  3 * _INTSIZE, _NAME("STREAM_PAN"),   NULL},
61 {ESD_PROTO_SAMPLE_PAN,                  3 * _INTSIZE, _NAME("SAMPLE_PAN"),   NULL},
62 {ESD_PROTO_STANDBY_MODE,                    _INTSIZE, _NAME("STANDBY_MODE"), NULL},
63 {ESD_PROTO_LATENCY,      0                          , _NAME("LATENCY"),      NULL},
64 {ESD_PROTO_MAX,          0                          , _NAME("MAX"),          NULL},
65 {-1, 0, _NAME("END OF LIST"), NULL}
66};
67
68int emul_esd_exec_command(int client, int cmd, struct roar_vio_calls * vio) {
69 struct emul_esd_command * cur;
70 void * data = NULL;
71 int r;
72 int i;
73
74 if ( client == -1 || cmd < ESD_PROTO_CONNECT || cmd > ESD_PROTO_MAX || vio == NULL )
75  return -1;
76
77 for (i = 0; (cur = &(g_emul_esd_commands[i]))->cmd != -1; i++) {
78  if ( cur->cmd == cmd ) {
79   if ( cur->datalen > 0 ) {
80    if ( (data = malloc(cur->datalen)) == NULL ) {
81     // we will do a protocol error in case we do not drop the client
82     clients_delete(client);
83     return -1;
84    }
85
86    if ( roar_vio_read(vio, data, cur->datalen) != cur->datalen ) {
87     free(data);
88     clients_delete(client);
89     return -1;
90    }
91   }
92
93   if ( cur->handler == NULL ) {
94    ROAR_WARN("emul_esd_exec_command(client=%i, cmd=%s(%i), vio=%p): client uses unimplemted command",
95               client, cur->name, cmd, vio
96             );
97    r = -1;
98   } else {
99    r = cur->handler(client, cur, data, vio);
100   }
101
102   if ( data != NULL )
103    free(data);
104
105   return r;
106  }
107 }
108
109 return -1;
110}
111
112int emul_esd_check_client(int client, struct roar_vio_calls * vio) {
113 struct roar_vio_calls calls;
114 _cmd_t cmd;
115
116 if ( client == -1 )
117  return -1;
118
119 if ( vio == NULL ) {
120  vio = &calls;
121  if ( roar_vio_open_fh(vio, clients_get_fh(client)) == -1 )
122   return -1;
123 }
124
125 if ( roar_vio_read(vio, &cmd, _INTSIZE) != _INTSIZE ) {
126  // really bad protocol error
127  clients_delete(client);
128  return -1;
129 }
130
131 return emul_esd_exec_command(client, cmd, vio);
132}
133
134#endif
135#endif
136
137//ll
Note: See TracBrowser for help on using the repository browser.