source: roaraudio/roard/driver_rsound.c @ 5055:db7a96528119

Last change on this file since 5055:db7a96528119 was 5012:b263759832f1, checked in by phi, 13 years ago

Updated drivers to use new sync stream selection logic correctly (Closes: #136)

File size: 4.0 KB
Line 
1//driver_rsound.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2010-2011
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#define _DRV_NEED_RSOUND_H
27#include "roard.h"
28
29#ifdef ROAR_HAVE_LIBRSOUND
30
31int     driver_rsound_open         (struct roar_vio_calls * inst, char * device, struct roar_audio_info * info, int fh, struct roar_stream_server * sstream) {
32 rsound_t * self;
33 int tmp, tmp2;
34
35 if ( fh != -1 )
36  return -1;
37
38 if ( rsd_init(&self) == -1 ) {
39  ROAR_DBG("driver_rsound_open(*): rsd_init(&self) failed.");
40  return -1;
41 }
42
43 if ( device != NULL ) {
44  if ( rsd_set_param(self, RSD_HOST, device) == -1 ) {
45   ROAR_DBG("driver_rsound_open(*): rsd_set_param(self, RSD_HOST, device) failed.");
46   rsd_free(self);
47   return -1;
48  }
49 }
50
51 tmp = info->channels;
52 if ( rsd_set_param(self, RSD_CHANNELS, &tmp) == -1 ) {
53  ROAR_DBG("driver_rsound_open(*): rsd_set_param(self, RSD_CHANNELS, &tmp) failed.");
54  rsd_free(self);
55  return -1;
56 }
57
58 if ( tmp != info->channels ) {
59  rsd_free(self);
60  return -1;
61 }
62
63 tmp = info->rate;
64 if ( rsd_set_param(self, RSD_SAMPLERATE, &tmp) == -1 ) {
65  ROAR_DBG("driver_rsound_open(*): rsd_set_param(self, RSD_SAMPLERATE, &tmp) failed.");
66  rsd_free(self);
67  return -1;
68 }
69
70 if ( tmp != info->rate ) {
71  rsd_free(self);
72  return -1;
73 }
74
75 tmp = -1; // unknown by RSound
76
77 switch (info->codec) {
78  case ROAR_CODEC_PCM_S_LE:
79    switch (info->bits) {
80     case  8: tmp = RSD_S8;     break;
81     case 16: tmp = RSD_S16_LE; break;
82    }
83   break;
84  case ROAR_CODEC_PCM_S_BE:
85    switch (info->bits) {
86     case  8: tmp = RSD_S8;     break;
87     case 16: tmp = RSD_S16_BE; break;
88    }
89   break;
90  case ROAR_CODEC_PCM_S_PDP:
91    switch (info->bits) {
92     case  8: tmp = RSD_S8;     break;
93    }
94   break;
95  case ROAR_CODEC_PCM_U_LE:
96    switch (info->bits) {
97     case  8: tmp = RSD_U8;     break;
98     case 16: tmp = RSD_U16_LE; break;
99    }
100   break;
101  case ROAR_CODEC_PCM_U_BE:
102    switch (info->bits) {
103     case  8: tmp = RSD_U8;     break;
104     case 16: tmp = RSD_U16_BE; break;
105    }
106   break;
107  case ROAR_CODEC_PCM_U_PDP:
108    switch (info->bits) {
109     case  8: tmp = RSD_U8;     break;
110    }
111   break;
112 }
113
114 if ( tmp == -1 ) {
115  ROAR_DBG("driver_rsound_open(*): Codec/Bits not supported by RSound");
116  rsd_free(self);
117  return -1;
118 }
119
120 tmp2 = tmp;
121
122 if ( rsd_set_param(self, RSD_FORMAT, &tmp) == -1 ) {
123  ROAR_DBG("driver_rsound_open(*): rsd_set_param(self, RSD_FORMAT, &tmp={0x%x->0x%x}) failed.", tmp2, tmp);
124  rsd_free(self);
125  return -1;
126 }
127
128 if ( tmp != tmp2 ) {
129  rsd_free(self);
130  return -1;
131 }
132
133 if ( rsd_start(self) == -1 ) {
134  ROAR_DBG("driver_rsound_open(*): rsd_start(self) failed.");
135  rsd_free(self);
136  return -1;
137 }
138
139 memset(inst, 0, sizeof(struct roar_vio_calls));
140
141 inst->inst     = self;
142 inst->close    = driver_rsound_close;
143 inst->write    = driver_rsound_write;
144 inst->nonblock = driver_dummy_nonblock;
145
146 return 0;
147}
148
149int     driver_rsound_close        (struct roar_vio_calls * vio) {
150 int r = 0;
151
152 if ( rsd_stop(vio->inst) == -1 )
153  r = -1;
154
155 if ( rsd_free(vio->inst) == -1 )
156  r = -1;
157
158 return r;
159}
160
161ssize_t driver_rsound_write        (struct roar_vio_calls * vio, void *buf, size_t count) {
162 size_t ret;
163
164 ret = rsd_write(vio->inst, buf, count);
165
166 if ( ret == 0 )
167  return -1;
168
169 return ret;
170}
171
172#endif
173
174//ll
Note: See TracBrowser for help on using the repository browser.