Changeset 463:67ff080cf77a in roaraudio for libroararts/libartsc.c
- Timestamp:
- 08/12/08 08:17:51 (16 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroararts/libartsc.c
r462 r463 1 1 //libartsc.c: 2 2 3 #include <roaraudio.h> 4 #include <kde/artsc/artsc.h> 5 6 struct roar_connection _libroarartsc_connection[1]; 7 8 struct _libroarartsc_stream { 9 struct roar_stream stream; 10 int fh; 11 int blocking; 12 }; 13 14 int arts_init(void) { 15 return roar_simple_connect(_libroarartsc_connection, NULL, "libroarartsc client"); 16 } 17 18 void arts_free(void) { 19 roar_disconnect(_libroarartsc_connection); 20 } 21 22 /** 23 * asks aRtsd to free the DSP device and return 1 if it was successful, 24 * 0 if there were active non-suspendable modules 25 */ 26 int arts_suspend(void) { 27 return roar_set_standby(_libroarartsc_connection, ROAR_STANDBY_ACTIVE) == 0 ? 1 : 0; 28 } 29 30 /** 31 * asks aRtsd if the DSP device is free and return 1 if it is, 32 * 0 if not 33 */ 34 int arts_suspended(void) { 35 return roar_get_standby(_libroarartsc_connection) == ROAR_STANDBY_ACTIVE; 36 } 37 38 39 /** 40 * converts an error code to a human readable error message 41 * 42 * @param errorcode the errorcode (from another arts function that failed) 43 * @returns a text string with the error message 44 */ 45 const char *arts_error_text(int errorcode) { 46 return strerror(errorcode); 47 } 48 49 /** 50 * open a stream for playing 51 * 52 * @param rate the sampling rate (something like 44100) 53 * @param bits how many bits each sample has (8 or 16) 54 * @param channels how many channels, 1 is mono, 2 is stereo 55 * @param name the name of the stream (these will be used so that the user can 56 * assign streams to effects/mixer channels and similar) 57 * 58 * @return a stream 59 */ 60 arts_stream_t arts_play_stream(int rate, int bits, int channels, const char *name) { 61 struct _libroarartsc_stream * s = malloc(sizeof(struct _libroarartsc_stream)); 62 struct roar_meta meta; 63 64 if ( !s ) 65 return NULL; 66 67 if ( (s->fh = roar_simple_new_stream_obj(_libroarartsc_connection, &(s->stream), 68 rate, channels, bits, ROAR_CODEC_DEFAULT, ROAR_DIR_PLAY)) == -1 ) { 69 free(s); 70 return NULL; 71 } 72 73 s->blocking = 1; 74 75 if ( name && *name ) { 76 meta.value = (char*)name; 77 meta.key[0] = 0; 78 meta.type = ROAR_META_TYPE_DESCRIPTION; 79 80 roar_stream_meta_set(_libroarartsc_connection, &(s->stream), ROAR_META_MODE_SET, &meta); 81 } 82 83 return (arts_stream_t) s; 84 } 85 86 /** 87 * open a stream for recording 88 * 89 * @param rate the sampling rate (something like 44100) 90 * @param bits how many bits each sample has (8 or 16) 91 * @param channels how many channels, 1 is mono, 2 is stereo 92 * @param name the name of the stream (these will be used so that the user can 93 * assign streams to effects/mixer channels and similar) 94 * 95 * @return a stream 96 */ 97 arts_stream_t arts_record_stream(int rate, int bits, int channels, const char *name) { 98 struct _libroarartsc_stream * s = malloc(sizeof(struct _libroarartsc_stream)); 99 struct roar_meta meta; 100 101 if ( !s ) 102 return NULL; 103 104 if ( (s->fh = roar_simple_new_stream_obj(_libroarartsc_connection, &(s->stream), 105 rate, channels, bits, ROAR_CODEC_DEFAULT, ROAR_DIR_RECORD)) == -1 ) { 106 free(s); 107 return NULL; 108 } 109 110 s->blocking = 1; 111 112 if ( name && *name ) { 113 meta.value = (char*)name; 114 meta.key[0] = 0; 115 meta.type = ROAR_META_TYPE_DESCRIPTION; 116 117 roar_stream_meta_set(_libroarartsc_connection, &(s->stream), ROAR_META_MODE_SET, &meta); 118 } 119 120 return (arts_stream_t) s; 121 } 122 123 /** 124 * close a stream 125 */ 126 void arts_close_stream(arts_stream_t stream) { 127 struct _libroarartsc_stream * s = (struct _libroarartsc_stream *) stream; 128 if ( !stream ) 129 return; 130 131 close(s->fh); 132 133 free(stream); 134 } 135 136 /** 137 * read samples from stream 138 * 139 * @param stream a previously opened record stream 140 * @param buffer a buffer with sample data 141 * @param count the number of bytes contained in the buffer 142 * 143 * @returns number of read bytes on success or error code 144 */ 145 int arts_read(arts_stream_t stream, void *buffer, int count) { 146 struct _libroarartsc_stream * s = (struct _libroarartsc_stream *) stream; 147 if ( !stream ) 148 return -1; 149 150 return read(s->fh, buffer, count); 151 } 152 153 /** 154 * write samples to to stream 155 * 156 * @param stream a previously opened play stream 157 * @param buffer a buffer with sample data 158 * @param count the number of bytes contained in the buffer 159 * 160 * @returns number of written bytes on success or error code 161 */ 162 int arts_write(arts_stream_t stream, const void *buffer, int count) { 163 struct _libroarartsc_stream * s = (struct _libroarartsc_stream *) stream; 164 if ( !stream ) 165 return -1; 166 167 return write(s->fh, buffer, count); 168 } 169 170 /** 171 * configure a parameter of a stream 172 * 173 * @param stream an opened record or play stream 174 * @param parameter the parameter you want to modify 175 * @param value the new value 176 * 177 * @returns the new value of the parameter (which may or may not be the value 178 * you wanted to have), or an error code if something went wrong 179 */ 180 int arts_stream_set(arts_stream_t stream, arts_parameter_t param, int value) { 181 struct _libroarartsc_stream * s = (struct _libroarartsc_stream *) stream; 182 if ( !stream ) 183 return -1; 184 185 if ( param == ARTS_P_BLOCKING ) { 186 if ( roar_socket_nonblock(s->fh, value ? ROAR_SOCKET_BLOCK : ROAR_SOCKET_NONBLOCK) == -1 ) 187 return -1; 188 return arts_stream_get(stream, param); 189 } 190 191 return -1; 192 } 193 194 /** 195 * query a parameter of a stream 196 * 197 * @param stream an opened record or play stream 198 * @param parameter the parameter you want to query 199 * 200 * @returns the value of the parameter, or an error code 201 */ 202 int arts_stream_get(arts_stream_t stream, arts_parameter_t param) { 203 struct _libroarartsc_stream * s = (struct _libroarartsc_stream *) stream; 204 if ( !stream ) 205 return -1; 206 207 if ( param == ARTS_P_PACKET_SIZE ) { 208 return 2048; 209 } else if ( param == ARTS_P_PACKET_COUNT ) { 210 return 1; 211 } else if ( param == ARTS_P_BLOCKING ) { 212 return s->blocking; 213 } 214 215 return -1; 216 } 217 3 218 //ll
Note: See TracChangeset
for help on using the changeset viewer.