source: roaraudio/libroareio/driver_oss.c @ 4890:de0302197762

Last change on this file since 4890:de0302197762 was 4890:de0302197762, checked in by phi, 13 years ago

undo stupid change, maybe I should read my own warnings...

File size: 4.0 KB
RevLine 
[2131]1//driver_oss.c:
2
3/*
[4708]4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2009-2011
[2131]5 *
6 *  This file is part of roarclients 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
[3517]21 *  the Free Software Foundation, 51 Franklin Street, Fifth Floor,
22 *  Boston, MA 02110-1301, USA.
[2131]23 *
24 */
25
26#include <roaraudio.h>
27#include "driver.h"
28
[2132]29#if defined(ROAR_HAVE_OSS_BSD) || defined(ROAR_HAVE_OSS)
30
31#if defined(__OpenBSD__) || defined(__NetBSD__)
32#include <soundcard.h>
33#else
34#include <sys/soundcard.h>
35#endif
36#include <sys/ioctl.h>
37
[2569]38#ifdef SNDCTL_DSP_SETFRAGMENT
[3853]39static void roar_cdriver_oss_try_buf_setups(struct roar_vio_calls * calls) {
40 struct roar_vio_sysio_ioctl ctl;
[2569]41 int blocksizes[] = {11, 12, 13};
42 int blocks[]     = {4, 5, 6, 3, 7, 2, 8};
43 int bs, b;
44 int tmp;
45
[3853]46 ctl.cmd  = SNDCTL_DSP_SETFRAGMENT;
47 ctl.argp = &tmp;
48
[2569]49 for (bs = 0; bs < sizeof(blocksizes)/sizeof(int); bs++) {
50  for (b = 0; b  < sizeof(blocks)    /sizeof(int); b++ ) {
51   tmp = blocksizes[bs] | (blocks[b] << 16);
[3853]52   if ( roar_vio_ctl(calls, ROAR_VIO_CTL_SYSIO_IOCTL, &ctl) == 0 )
[2569]53    return;
54  }
55 }
56}
57#endif
58
[2132]59#define _err() roar_vio_close(calls); return -1
60
[4604]61int roar_cdriver_oss(struct roar_vio_calls * calls, const char * name, char * dev, struct roar_audio_info * info, int dir) {
[3853]62 struct roar_vio_sysio_ioctl ctl;
[2132]63 int tmp, ctmp;
64
[3853]65 // preinit ctl struct, we always pass ints in tmp.
66 ctl.argp = &tmp;
67
[2135]68 ROAR_DBG("roar_cdriver_oss(*) = ?");
69
[2217]70#ifdef ROAR_DEFAULT_OSS_DEV
[2132]71 if ( dev == NULL )
72  dev = ROAR_DEFAULT_OSS_DEV;
[2217]73#endif
[2132]74
75 if ( dev == NULL )
76  return -1;
77
[2135]78 ROAR_DBG("roar_cdriver_oss(*) = ?");
79
[2136]80 switch (dir) {
81  case ROAR_DIR_PLAY:
82  case ROAR_DIR_MONITOR:
83  case ROAR_DIR_OUTPUT:
84    tmp = O_WRONLY;
85   break;
86  case ROAR_DIR_BIDIR:
87    tmp = O_RDWR;
88   break;
89  case ROAR_DIR_RECORD:
90    tmp = O_RDONLY;
[2301]91   break;
[2136]92  default:
93    return -1;
94 }
95
[2301]96 ROAR_DBG("roar_cdriver_oss(*) = ?");
97
[2136]98 if ( roar_vio_open_file(calls, dev, tmp, 0644) == -1 )
[2132]99  return -1;
100
101// channels:
102#ifdef SNDCTL_DSP_CHANNELS
103 tmp = info->channels;
104
[3853]105 ctl.cmd  = SNDCTL_DSP_CHANNELS;
106
107 if ( roar_vio_ctl(calls, ROAR_VIO_CTL_SYSIO_IOCTL, &ctl) == -1 ) {
[2132]108  _err();
109 }
110
111 if ( tmp != info->channels ) {
112  _err();
113 }
114#else
115 switch (info->channels) {
116  case  1: tmp = 0; break;
117  case  2: tmp = 1; break;
118  default: _err();
119 }
120
[3853]121 ctl.cmd = SNDCTL_DSP_STEREO;
122
123 if ( roar_vio_ctl(calls, ROAR_VIO_CTL_SYSIO_IOCTL, &ctl) == -1 ) {
[2132]124  _err();
125 }
126#endif
127
128// codec/bits:
129 if ( info->codec != ROAR_CODEC_ALAW && info->codec != ROAR_CODEC_MULAW && info->bits != 16 ) {
130  // other modes are currently not supported
131  _err();
132 }
133
134 switch (info->codec) {
135  case ROAR_CODEC_PCM_S_LE:
[2137]136    tmp = AFMT_S16_LE;
137   break;
[2132]138  case ROAR_CODEC_PCM_S_BE:
[2137]139    tmp = AFMT_S16_BE;
140   break;
[2132]141  case ROAR_CODEC_PCM_U_LE:
[2137]142    tmp = AFMT_U16_LE;
143   break;
[2132]144  case ROAR_CODEC_PCM_U_BE:
[2137]145    tmp = AFMT_U16_BE;
[2132]146   break;
147  case ROAR_CODEC_ALAW:
148    tmp = AFMT_A_LAW;
149   break;
150  case ROAR_CODEC_MULAW:
151    tmp = AFMT_MU_LAW;
152   break;
[2138]153  default:
154    _err();
[2132]155 }
156
157 ctmp = tmp;
158#ifdef SNDCTL_DSP_SETFMT
[3853]159 ctl.cmd = SNDCTL_DSP_SETFMT;
[2132]160#else
[3853]161 ctl.cmd = SNDCTL_DSP_SAMPLESIZE;
[2132]162#endif
[3853]163
164 if ( roar_vio_ctl(calls, ROAR_VIO_CTL_SYSIO_IOCTL, &ctl) == -1 ) {
[2132]165  _err();
166 }
167
168 if ( tmp != ctmp ) {
169  _err();
170 }
171
172// rate:
173 tmp = info->rate;
174
[3853]175 ctl.cmd = SNDCTL_DSP_SPEED;
176 if ( roar_vio_ctl(calls, ROAR_VIO_CTL_SYSIO_IOCTL, &ctl) == -1 ) {
[2132]177  _err();
178 }
179
180 if ( tmp != info->rate ) {
181  _err();
182 }
183
[2569]184#ifdef SNDCTL_DSP_SETFRAGMENT
[3853]185 roar_cdriver_oss_try_buf_setups(calls);
[2569]186#endif
187
[2132]188 return 0;
[2131]189}
190
[2132]191#endif
192
[2131]193//ll
Note: See TracBrowser for help on using the repository browser.