Changeset 4815:df2ef6edb97f in roaraudio
- Timestamp:
- 03/27/11 20:04:27 (13 years ago)
- Branch:
- default
- Phase:
- public
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
ChangeLog
r4811 r4815 6 6 * Added aRts (artsc) driver to roard. 7 7 * Removed old -d and friends from roard (Closes: #122) 8 * added support to roard for record streams. 8 9 9 10 v. 0.4beta4 - Sun Mar 20 2011 12:15 CET -
include/libroar/vio_ctl.h
r4718 r4815 121 121 #define ROAR_VIO_CTL_GET_VOLUME (ROAR_VIO_CTL_DRIVER|ROAR_VIO_CTL_GET|0x10) 122 122 #define ROAR_VIO_CTL_SET_VOLUME (ROAR_VIO_CTL_DRIVER|ROAR_VIO_CTL_SET|0x10) 123 #define ROAR_VIO_CTL_GET_RECORD (ROAR_VIO_CTL_DRIVER|ROAR_VIO_CTL_GET|0x20) /* int */ 124 #define ROAR_VIO_CTL_SET_RECORD (ROAR_VIO_CTL_DRIVER|ROAR_VIO_CTL_SET|0x20) /* int */ 123 125 124 126 // consts for ROAR_VIO_CTL_SHUTDOWN: -
roard/clients.c
r4713 r4815 360 360 int have_stream; 361 361 362 ROAR_DBG("clients_check_all(void) = ?"); 363 362 364 FD_ZERO(&r); 363 365 FD_ZERO(&w); … … 371 373 continue; 372 374 375 ROAR_DBG("clients_check_all(void): i(client)=%i", i); 376 373 377 if ( (fh = c->fh) != -1 ) { 374 378 have++; … … 390 394 391 395 for (j = 0; j < ROAR_CLIENTS_MAX_STREAMS_PER_CLIENT; j++) { 396 ROAR_DBG("clients_check_all(void): i(client)=%i, j(stream)=%i", i, j); 392 397 if ( (fh = streams_get_fh(c->streams[j])) != -1 ) { 393 398 ROAR_DBG("clients_check_all(*): g_clients[i=%i]->streams[j=%i] = %i, fh = %i", i, j, c->streams[j], fh); … … 412 417 } 413 418 } 419 420 ROAR_DBG("clients_check_all(void): max_fh=%i", max_fh); 414 421 415 422 if ( max_fh == -1 ) … … 513 520 return have; 514 521 #else 522 ROAR_DBG("clients_check_all(void) = -1"); 515 523 return -1; 516 524 #endif -
roard/driver.c
r4812 r4815 50 50 #define ROAR_DEFAULT_OSS_DEV "no default device" 51 51 #endif 52 { "oss", "Open Sound System", ROAR_DEFAULT_OSS_DEV, STREAM_DIR_ OUT, DRV_FLAG_FHSEC, ROAR_SUBSYS_WAVEFORM,52 { "oss", "Open Sound System", ROAR_DEFAULT_OSS_DEV, STREAM_DIR_BIDIR, DRV_FLAG_FHSEC, ROAR_SUBSYS_WAVEFORM, 53 53 NULL, NULL, driver_oss_open}, 54 54 #endif … … 203 203 } 204 204 205 // if this driver does not support input we need to check if it is used in input mode. 206 if ( !(g_driver[i].mode & STREAM_DIR_IN) ) { 207 if ( sstream == NULL ) 208 return -1; 209 210 if ( streams_get_flag(ROAR_STREAM(sstream)->id, ROAR_FLAG_RECSOURCE) ) { 211 if ( streams_get_flag(ROAR_STREAM(sstream)->id, ROAR_FLAG_AUTOCONF) == 1 ) { 212 if ( streams_reset_flag(ROAR_STREAM(sstream)->id, ROAR_FLAG_RECSOURCE) == -1 ) 213 return -1; 214 } else { 215 ROAR_WARN("driver_openvio(*): driver(%s) is not abled to record data and autoconf flag is not set.", driver); 216 return -1; 217 } 218 } 219 } 220 205 221 ROAR_DBG("driver_openvio(*): Opening VIO driver %s(%i)...", driver, i); 206 222 return g_driver[i].vio_init(calls, device, info, fh, sstream); -
roard/driver_oss.c
r4708 r4815 37 37 38 38 vio->write = driver_oss_write; 39 vio->read = driver_oss_read; 39 40 vio->nonblock = driver_oss_nonblock; 40 41 vio->sync = driver_oss_sync; … … 48 49 49 50 int driver_oss_open_device(struct driver_oss * self) { 51 int flags = 0; 52 int rw = 0; 50 53 int fh = self->fh; 51 54 char * device = self->device; … … 64 67 } 65 68 66 if ( (fh = open(device, O_WRONLY, 0644)) == -1 ) { 69 if ( self->ssid != -1 ) { 70 rw = streams_get_flag(self->ssid, ROAR_FLAG_RECSOURCE); 71 } 72 73 if ( rw ) { 74 flags |= O_RDWR; 75 } else { 76 flags |= O_WRONLY; 77 } 78 79 if ( (fh = open(device, flags, 0644)) == -1 ) { 67 80 ROAR_ERR("driver_oss_open_device(*): Can not open OSS device: %s: %s", device, strerror(errno)); 68 81 return -1; … … 324 337 } 325 338 339 ROAR_DBG("driver_oss_config_device(*): self->ssid=%i, fh=%i", self->ssid, fh); 340 streams_set_fh(self->ssid, -2); 326 341 self->need_config = 0; 327 342 343 ROAR_DBG("driver_oss_config_device(*) = 0"); 328 344 return 0; 329 345 } … … 343 359 self->ssid = -1; 344 360 self->fh = fh; 361 362 if ( sstream != NULL ) 363 self->ssid = ROAR_STREAM(sstream)->id; 345 364 346 365 if ( fh != -1 ) { … … 528 547 } 529 548 549 ssize_t driver_oss_read (struct roar_vio_calls * vio, void *buf, size_t count) { 550 if ( _get(vio,fh) == -1 ) 551 return -1; 552 553 if ( _get(vio,need_config) ) { 554 if ( driver_oss_config_device(vio->inst) == -1 ) { 555 return -1; 556 } 557 } 558 559 return read(_get(vio,fh), buf, count); 560 } 561 530 562 #endif 531 563 //ll -
roard/include/driver.h
r4812 r4815 147 147 #define DRV_FLAG_FHSEC 0x01 148 148 149 #define ROAR_DRIVER_CTL_NOOP ROAR_STREAM_CTL_COMP_DRV|0x0000 /* noop... */ 150 #define ROAR_DRIVER_CTL_BASE ROAR_STREAM_CTL_COMP_DRV|0x0000 /* Base ops... */ 151 152 #define ROAR_DRIVER_CTL_SET 0x0002 153 #define ROAR_DRIVER_CTL_GET 0x0003 154 155 #define ROAR_DRIVER_CTL_RECORD 0x0010 156 #define ROAR_DRIVER_CTL_SET_RECORD ROAR_DRIVER_CTL_BASE|ROAR_DRIVER_CTL_RECORD|ROAR_DRIVER_CTL_SET 157 158 159 #define ROAR_DRIVER_CTL2CMD(x) ((x) & (~ROAR_STREAM_CTL_COMP_DRV)) 160 161 162 149 163 struct roar_driver { 150 164 char * name; -
roard/include/driver_oss.h
r4708 r4815 45 45 46 46 ssize_t driver_oss_write (struct roar_vio_calls * vio, void *buf, size_t count); 47 ssize_t driver_oss_read (struct roar_vio_calls * vio, void *buf, size_t count); 47 48 int driver_oss_nonblock (struct roar_vio_calls * vio, int state); 48 49 int driver_oss_close_vio(struct roar_vio_calls * vio); -
roard/include/streams.h
r4753 r4815 210 210 ssize_t stream_vio_read (int stream, void *buf, size_t count); 211 211 ssize_t stream_vio_write(int stream, void *buf, size_t count); 212 int stream_vio_ctl (int stream, int cmd, void * data); 212 213 ssize_t stream_vio_s_read (struct roar_stream_server * stream, void *buf, size_t count); 213 214 ssize_t stream_vio_s_write(struct roar_stream_server * stream, void *buf, size_t count); 215 int stream_vio_s_ctl (struct roar_stream_server * stream, int cmd, void * data); 214 216 215 217 #endif -
roard/roard.c
r4811 r4815 940 940 } else if ( !strcmp(k, "passmixer") ) { 941 941 flag = ROAR_FLAG_PASSMIXER; 942 } else if ( !strcmp(k, "recsource") ) { 943 flag = ROAR_FLAG_RECSOURCE; 942 944 } else { 943 945 return -1; … … 1158 1160 } else if ( strcmp(k, "passmixer") == 0 ) { 1159 1161 streams_set_flag(stream, ROAR_FLAG_PASSMIXER); 1162 } else if ( strcmp(k, "recsource") == 0 ) { 1163 streams_set_flag(stream, ROAR_FLAG_RECSOURCE); 1160 1164 } else { 1161 1165 ROAR_ERR("add_output(*): unknown option '%s'", k); -
roard/streams.c
r4753 r4815 590 590 return -1; 591 591 592 if ( ss->ready ) {592 if ( ss->ready && !(s->fh == -1 && fh == -2) ) { 593 593 ROAR_DBG("streams_set_fh(id=%i, fh=%i) = -1 // try to set fh for stream which is already ready", id, fh); 594 594 return -1; 595 595 } 596 596 597 dir = ROAR_STREAM(ss)->dir;597 dir = s->dir; 598 598 599 599 ROAR_DBG("streams_set_fh(id=%i, fh=%i): g_streams[id]->id=%i", id, fh, s->id); … … 902 902 int streams_set_flag (int id, uint32_t flag) { 903 903 int parent; 904 int tmp; 904 905 905 906 _CHECK_SID(id); … … 978 979 } 979 980 981 if ( g_streams[id]->ready ) { 982 tmp = 1; 983 if ( stream_vio_ctl(id, ROAR_VIO_CTL_SET_RECORD, &tmp) == -1 ) 984 return -1; 985 } 986 980 987 streams_recsource_id = id; 981 988 } … … 1000 1007 1001 1008 int streams_reset_flag (int id, uint32_t flag) { 1009 int tmp; 1010 1002 1011 _CHECK_SID(id); 1003 1012 … … 1011 1020 } 1012 1021 1013 if ( flag & ROAR_FLAG_RECSOURCE ) 1014 if ( streams_recsource_id == id ) 1015 streams_recsource_id = -1; 1022 if ( (flag & ROAR_FLAG_RECSOURCE) && streams_recsource_id == id ) { 1023 if ( g_streams[id]->ready ) { 1024 tmp = 0; 1025 if ( stream_vio_ctl(id, ROAR_VIO_CTL_SET_RECORD, &tmp) == -1 ) 1026 return -1; 1027 } 1028 1029 streams_recsource_id = -1; 1030 } 1031 1016 1032 1017 1033 if ( flag & ROAR_FLAG_MMAP ) { … … 1959 1975 case ROAR_DIR_BIDIR: 1960 1976 break; 1977 case ROAR_DIR_OUTPUT: 1978 if ( !streams_get_flag(id, ROAR_FLAG_RECSOURCE) ) 1979 return 0; 1980 break; 1961 1981 default: 1962 1982 /* … … 2057 2077 struct roar_buffer * bufbuf = NULL; 2058 2078 struct roar_remove_state removalstate; 2059 void * ip ;2079 void * ip = g_output_buffer; 2060 2080 void * obuf; 2061 2081 int olen; … … 2130 2150 break; 2131 2151 2152 case ROAR_DIR_RECORD: 2153 ip = g_input_buffer; 2154 break; 2132 2155 default: 2133 2156 return 0; … … 2161 2184 ROAR_DBG("streams_send_mon(id=%i): obuf=%p, olen=%i", id, obuf, olen); 2162 2185 } else { 2163 obuf = g_output_buffer;2186 obuf = ip; 2164 2187 olen = g_output_buffer_len; 2165 2188 } 2166 2167 ip = g_output_buffer;2168 2189 2169 2190 if ( antiecho ) { … … 2335 2356 } 2336 2357 2358 int stream_vio_ctl (int stream, int cmd, void * data) { 2359 _CHECK_SID(stream); 2360 2361 return stream_vio_s_ctl(g_streams[stream], cmd, data); 2362 } 2337 2363 2338 2364 ssize_t stream_vio_s_read (struct roar_stream_server * stream, void *buf, size_t count) { … … 2443 2469 } 2444 2470 2471 int stream_vio_s_ctl (struct roar_stream_server * stream, int cmd, void * data) { 2472 if ( stream == NULL ) 2473 return -1; 2474 2475 return roar_vio_ctl(stream->viop, cmd, data); 2476 } 2477 2445 2478 //ll -
roard/waveform.c
r4708 r4815 62 62 63 63 int waveform_update_mixer (void) { 64 size_t len; 65 66 // read recorded data...: 67 if ( streams_recsource_id != -1 ) { 68 len = g_input_buffer_len; 69 if ( stream_shift_out_buffer(streams_recsource_id, g_input_buffer, &len) == -1 ) { 70 ROAR_WARN("waveform_update_mixer(void): can not read record buffer."); 71 memset(g_input_buffer, 0, g_input_buffer_len); 72 } else { 73 if ( len < g_input_buffer_len ) 74 memset(g_input_buffer+len, 0, g_input_buffer_len-len); 75 } 76 } 77 64 78 if ( streams_get_flag(g_waveform_mixer.stream, ROAR_FLAG_MUTE) == 1 ) { 65 79 memset(g_output_buffer, 0, (g_sa->bits*ROAR_OUTPUT_BUFFER_SAMPLES*g_sa->channels)/8);
Note: See TracChangeset
for help on using the changeset viewer.