source: roaraudio/libroarsndio/para.c @ 3240:85102db7186d

Last change on this file since 3240:85102db7186d was 3240:85102db7186d, checked in by phi, 14 years ago

support for sio_getpar()

File size: 4.8 KB
Line 
1//para.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2009
5 *  The code (may) include prototypes and comments (and maybe
6 *  other code fragements) from EsounD.
7 *  They are mostly copyrighted by Eric B. Mitchell (aka 'Ricdude)
8 *  <ericmit@ix.netcom.com>. For more information see AUTHORS.esd.
9 *
10 *  This file is part of libroaresd a part of RoarAudio,
11 *  a cross-platform sound system for both, home and professional use.
12 *  See README for details.
13 *
14 *  This file is free software; you can redistribute it and/or modify
15 *  it under the terms of the GNU General Public License version 3
16 *  as published by the Free Software Foundation.
17 *
18 *  RoarAudio is distributed in the hope that it will be useful,
19 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
20 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 *  GNU General Public License for more details.
22 *
23 *  You should have received a copy of the GNU General Public License
24 *  along with this software; see the file COPYING.  If not, write to
25 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
26 *
27 *  NOTE for everyone want's to change something and send patches:
28 *  read README and HACKING! There a addition information on
29 *  the license of this document you need to read before you send
30 *  any patches.
31 */
32
33#define ROAR_USE_OWN_SNDIO_HDL
34#include "libroarsndio.h"
35
36//#ifndef DEBUG
37//#define DEBUG
38//#endif
39
40void   sio_initpar(struct sio_par * par) {
41 if ( par == NULL )
42  return;
43
44 memset(par, 0, sizeof(struct sio_par));
45
46 par->bits  = ROAR_BITS_DEFAULT;
47 par->sig   = 1;
48 par->le    = SIO_LE_NATIVE;
49 par->msb   = 1;
50 par->rchan = 0;
51 par->pchan = ROAR_CHANNELS_DEFAULT;
52 par->rate  = ROAR_RATE_DEFAULT;
53 par->bufsz = ROAR_BITS_DEFAULT * ROAR_CHANNELS_DEFAULT * ROAR_RATE_DEFAULT / 800.0;
54 par->round = 1;
55 par->xrun  = SIO_IGNORE;
56
57 return;
58}
59
60int    sio_setpar (struct sio_hdl * hdl, struct sio_par * par) {
61 if ( hdl == NULL || par == NULL ) {
62  ROAR_DBG("sio_setpar(*): Invalid handle or parameter pointer");
63  return 0;
64 }
65
66 if ( par->bits == 0 || par->bits > ROAR_BITS_MAX ) {
67  ROAR_DBG("sio_setpar(*): Invalid number of bits: %i Bit", par->bits);
68  return 0;
69 }
70
71 if ( par->bps == 0 )
72  par->bps = SIO_BPS(par->bits);
73
74 if ( par->bps > ROAR_BITS_MAX/8 ) {
75  ROAR_DBG("sio_setpar(*): Invalid number of bytes: %i Byte", par->bps);
76  return 0;
77 }
78
79 if ( SIO_BPS(par->bits) > par->bps ) {
80  ROAR_DBG("sio_setpar(*): Number of bits/8 > number of bytes: %i/8 > %i", par->bits, par->bps);
81  return 0;
82 }
83
84 hdl->info.bits = par->bps * 8;
85
86 switch ((par->sig << 4) | par->le) {
87  case 0x00:
88    hdl->info.codec = ROAR_CODEC_PCM_U_BE;
89   break;
90  case 0x01:
91    hdl->info.codec = ROAR_CODEC_PCM_U_LE;
92   break;
93  case 0x10:
94    hdl->info.codec = ROAR_CODEC_PCM_S_BE;
95   break;
96  case 0x11:
97    hdl->info.codec = ROAR_CODEC_PCM_S_LE;
98   break;
99  default:
100    ROAR_DBG("sio_setpar(*): Invalid codec: sig=%i, le=%i", par->sig, par->le);
101    return 0;
102 }
103
104 if ( par->msb == 0 ) {
105  ROAR_DBG("sio_setpar(*): LSM alignment not supported");
106  return 0;
107 }
108
109 if ( par->rchan != 0 ) { /* not supported yet */
110  ROAR_DBG("sio_setpar(*): Recording not supported");
111  return 0;
112 }
113
114 if ( par->pchan == 0 || par->pchan > ROAR_MAX_CHANNELS ) {
115  ROAR_DBG("sio_setpar(*): Invalid number of playback channels: %i", par->pchan);
116  return 0;
117 }
118
119 hdl->info.channels = par->pchan;
120
121 if ( par->rate == 0 ) {
122  ROAR_DBG("sio_setpar(*): Invalid sample rate: %iHz", par->rate);
123  return 0;
124 }
125
126 hdl->info.rate = par->rate;
127
128 if ( par->xrun != SIO_IGNORE ) {
129  ROAR_DBG("sio_setpar(*): Unsupported xrun mode: %i", par->xrun);
130  return 0;
131 }
132
133 memcpy(&(hdl->para), par, sizeof(struct sio_par));
134
135 return 1;
136}
137
138int    sio_getpar (struct sio_hdl * hdl, struct sio_par * par) {
139 if ( hdl == NULL || par == NULL )
140  return 0;
141
142 memcpy(par, &(hdl->para), sizeof(struct sio_par));
143
144 return 1;
145}
146
147int    sio_getcap (struct sio_hdl * hdl, struct sio_cap * cap) {
148 struct roar_stream s;
149 int i;
150 int bytes;
151 int sign;
152 int le;
153 unsigned mask = 0;
154
155 if ( cap == NULL )
156  return 0;
157
158 if ( roar_server_oinfo(&(hdl->con), &s) == -1 )
159  return 0;
160
161 i = 0;
162 for (bytes = 1; bytes <= s.info.bits/8; bytes++) {
163  for (sign = 0; sign  < 2; sign++) {
164   for (le  = 0; le    < 2; le++) {
165    cap->enc[i].bits =   8*bytes;
166    cap->enc[i].bps  =     bytes;
167    cap->enc[i].sig  =     sign;
168    cap->enc[i].le   =     le;
169    cap->enc[i].msb  =   1;
170    mask |= 1 << i;
171    i++;
172   }
173  }
174 }
175
176 // TODO: fix this (at least include server channels,
177 //                 do nit include confusing setups)
178 if ( s.info.channels > SIO_NCHAN ) {
179  s.info.channels = SIO_NCHAN;
180 }
181
182 for (i = 0; i < s.info.channels; i++) {
183  cap->rchan[i] = i+1;
184  cap->pchan[i] = i+1;
185 }
186
187 cap->rate[0] = s.info.rate;
188
189 cap->nconf = 1;
190
191 cap->confs[0].enc   = mask;
192 cap->confs[0].rchan = mask;
193 cap->confs[0].pchan = mask;
194 cap->confs[0].rate  = 0x0001;
195
196 return 1;
197}
198
199
200//ll
Note: See TracBrowser for help on using the repository browser.