Changeset 1518:5d7a197eceb6 in roaraudio for roard/driver_oss.c
- Timestamp:
- 04/11/09 20:53:33 (15 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
roard/driver_oss.c
r1242 r1518 26 26 #if defined(ROAR_HAVE_OSS_BSD) || defined(ROAR_HAVE_OSS) 27 27 28 #define er() close(fh); return -1 29 30 int driver_oss_open(struct roar_vio_calls * inst, char * device, struct roar_audio_info * info, int fh) { 31 int tmp; 32 int ctmp; 33 char * es; 34 uint32_t tmp32; 28 struct driver_oss { 29 char * device; 30 int fh; 31 int blocks; 32 int blocksize; 33 struct roar_audio_info info; 34 }; 35 36 #define _get(vio,obj) (((struct driver_oss*)((vio)->inst))->obj) 37 38 ssize_t driver_oss_write (struct roar_vio_calls * vio, void *buf, size_t count); 39 int driver_oss_nonblock (struct roar_vio_calls * vio, int state); 40 int driver_oss_close_vio(struct roar_vio_calls * vio); 41 42 int driver_oss_init_vio(struct roar_vio_calls * vio, struct driver_oss * inst) { 43 if ( vio == NULL ) 44 return -1; 45 46 memset(vio, 0, sizeof(struct roar_vio_calls)); 47 48 vio->write = driver_oss_write; 49 vio->nonblock = driver_oss_nonblock; 50 vio->sync = driver_oss_sync; 51 vio->ctl = driver_oss_ctl; 52 vio->close = driver_oss_close_vio; 53 54 vio->inst = (void*) inst; 55 56 return 0; 57 } 58 59 int driver_oss_open_device(struct driver_oss * self) { 60 int fh = self->fh; 61 char * device = self->device; 62 63 if ( fh != -1 ) 64 return 0; 35 65 36 66 #ifdef ROAR_DEFAULT_OSS_DEV … … 40 70 41 71 if ( device == NULL ) { 42 ROAR_ERR("driver_oss_open(*): no default device found, you need to specify one manuelly"); 43 return -1; 44 } 45 46 roar_vio_init_calls(inst); 47 inst->sync = driver_oss_sync; 48 inst->ctl = driver_oss_ctl; 49 50 if ( fh == -1 ) { 51 if ( (fh = open(device, O_WRONLY, 0644)) == -1 ) { 52 ROAR_ERR("driver_oss_open(*): Can not open OSS device: %s: %s", device, strerror(errno)); 53 return -1; 54 } 55 } 56 57 roar_vio_set_fh(inst, fh); 58 59 72 ROAR_ERR("driver_oss_open_device(*): no default device found, you need to specify one manuelly"); 73 return -1; 74 } 75 76 if ( (fh = open(device, O_WRONLY, 0644)) == -1 ) { 77 ROAR_ERR("driver_oss_open_device(*): Can not open OSS device: %s: %s", device, strerror(errno)); 78 return -1; 79 } 80 81 self->fh = fh; 82 83 return 0; 84 } 85 86 int driver_oss_config_device(struct driver_oss * self) { 87 int fh = self->fh; 88 struct roar_audio_info * info = &(self->info); 89 int tmp, ctmp; 90 char * es; 91 92 if ( fh == -1 ) 93 return -1; 60 94 61 95 #ifdef SNDCTL_DSP_CHANNELS … … 64 98 if ( ioctl(fh, SNDCTL_DSP_CHANNELS, &tmp) == -1 ) { 65 99 ROAR_ERR("driver_oss_open(*): can not set number of channels"); 66 er();100 return -1; 67 101 } 68 102 69 103 if ( tmp != info->channels ) { 70 104 ROAR_ERR("driver_oss_open(*): can not set requested numer of channels, OSS suggested %i channels, to use this restart with -oO channels=%i or set codec manuelly via -oO channels=num", tmp, tmp); 71 er();105 return -1; 72 106 } 73 107 #else … … 75 109 case 1: tmp = 0; break; 76 110 case 2: tmp = 1; break; 77 default: er();111 default: return -1; 78 112 } 79 113 80 114 if ( ioctl(fh, SNDCTL_DSP_STEREO, &tmp) == -1 ) { 81 115 ROAR_ERR("driver_oss_open(*): can not set number of channels"); 82 er();116 return -1; 83 117 } 84 118 #endif … … 93 127 case 32: tmp = AFMT_S32_LE; break; 94 128 #endif 95 default: er();129 default: return -1; 96 130 } 97 131 break; … … 104 138 case 32: tmp = AFMT_S32_BE; break; 105 139 #endif 106 default: er();140 default: return -1; 107 141 } 108 142 break; … … 111 145 case 8: tmp = AFMT_U8; break; 112 146 case 16: tmp = AFMT_U16_LE; break; 113 default: er();147 default: return -1; 114 148 } 115 149 break; … … 118 152 case 8: tmp = AFMT_U8; break; 119 153 case 16: tmp = AFMT_U16_BE; break; 120 default: er();154 default: return -1; 121 155 } 122 156 case ROAR_CODEC_ALAW: … … 132 166 #endif 133 167 default: 134 er();168 return -1; 135 169 break; 136 170 } … … 143 177 #endif 144 178 ROAR_ERR("driver_oss_open(*): can not set sample format"); 145 er();179 return -1; 146 180 } 147 181 … … 173 207 ROAR_ERR("driver_oss_open(*): can not set requested codec, set codec manuelly via -oO codec=somecodec"); 174 208 } 175 er();209 return -1; 176 210 } 177 211 … … 180 214 if ( ioctl(fh, SNDCTL_DSP_SPEED, &tmp) == -1 ) { 181 215 ROAR_ERR("driver_oss_open(*): can not set sample rate"); 182 er();216 return -1; 183 217 } 184 218 185 219 if ( tmp < info->rate * 0.98 || tmp > info->rate * 1.02 ) { 186 220 ROAR_ERR("driver_oss_open(*): sample rate out of acceptable accuracy"); 221 return -1; 222 } 223 224 return 0; 225 } 226 227 #define er() close(self->fh); if ( self->device ) free(self->device); free(self); return -1 228 int driver_oss_open(struct roar_vio_calls * inst, char * device, struct roar_audio_info * info, int fh) { 229 struct driver_oss * self = NULL; 230 uint32_t tmp32; 231 232 if ( (self = malloc(sizeof(struct driver_oss))) == NULL ) { 233 ROAR_ERR("driver_oss_open(*): Can not malloc() instance data: %s", strerror(errno)); 234 return -1; 235 } 236 237 memset(self, 0, sizeof(struct driver_oss)); 238 memcpy(&(self->info), info, sizeof(struct roar_audio_info)); 239 240 self->fh = fh; 241 242 if ( device != NULL ) 243 self->device = strdup(device); 244 245 if ( driver_oss_init_vio(inst, self) == -1 ) { 246 ROAR_ERR("driver_oss_open(*): Can not init vio interface"); 187 247 er(); 188 248 } 189 249 250 if ( driver_oss_open_device(self) == -1 ) { 251 ROAR_ERR("driver_oss_open(*): Can not open audio device"); 252 er(); 253 } 254 255 if ( driver_oss_config_device(self) == -1 ) { 256 ROAR_ERR("driver_oss_open(*): Can not configure audio device"); 257 er(); 258 } 190 259 191 260 tmp32 = 4; … … 196 265 return 0; 197 266 } 267 #undef er 198 268 199 269 int driver_oss_close(DRIVER_USERDATA_T inst) { … … 201 271 } 202 272 273 int driver_oss_close_vio(struct roar_vio_calls * vio) { 274 close(_get(vio,fh)); 275 276 if ( _get(vio,device) != NULL ) 277 free(_get(vio,device)); 278 279 free(vio->inst); 280 return 0; 281 } 282 283 int driver_oss_nonblock(struct roar_vio_calls * vio, int state) { 284 if ( roar_socket_nonblock(_get(vio,fh), state) == -1 ) 285 return -1; 286 287 if ( state == ROAR_SOCKET_NONBLOCK ) 288 return 0; 289 290 roar_vio_sync(vio); 291 292 return 0; 293 } 294 203 295 int driver_oss_sync(struct roar_vio_calls * vio) { 204 296 #ifdef SNDCTL_DSP_SYNC 205 return ioctl( roar_vio_get_fh(vio), SNDCTL_DSP_SYNC, NULL);297 return ioctl(_get(vio,fh), SNDCTL_DSP_SYNC, NULL); 206 298 #else 207 299 return 0; … … 218 310 case ROAR_VIO_CTL_GET_DELAY: 219 311 #ifdef SNDCTL_DSP_GETODELAY 220 if ( ioctl( roar_vio_get_fh(vio), SNDCTL_DSP_GETODELAY, &d) == -1 )312 if ( ioctl(_get(vio,fh), SNDCTL_DSP_GETODELAY, &d) == -1 ) 221 313 return -1; 222 314 … … 231 323 #ifdef SNDCTL_DSP_SETFRAGMENT 232 324 d = (*(uint_least32_t *)data) << 16 | 11; // (*data) fragements of 2048 Bytes. 233 if ( ioctl( roar_vio_get_fh(vio), SNDCTL_DSP_SETFRAGMENT, &d) == -1 ) {325 if ( ioctl(_get(vio,fh), SNDCTL_DSP_SETFRAGMENT, &d) == -1 ) { 234 326 ROAR_WARN("driver_oss_ctl(*): Can not set fragment size, sorry :("); 235 327 } … … 249 341 } 250 342 343 ssize_t driver_oss_write (struct roar_vio_calls * vio, void *buf, size_t count) { 344 return write(_get(vio,fh), buf, count); 345 } 346 251 347 #endif 252 348 //ll
Note: See TracChangeset
for help on using the changeset viewer.