Changeset 4175:c8a616dfbb8a in roaraudio
- Timestamp:
- 08/14/10 06:25:27 (14 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/vs.c
r4174 r4175 38 38 #define FLAG_NONE 0x0000 39 39 #define FLAG_STREAM 0x0001 40 #define FLAG_NONBLOCK 0x0002 40 41 41 42 #define _seterr(x) do { if ( error != NULL ) *error = (x); } while(1) … … 222 223 } 223 224 225 int roar_vs_sync (roar_vs_t * vss, int wait, int * error) { 226 if ( !(vss->flags & FLAG_STREAM) ) { 227 _seterr(ROAR_ERROR_INVAL); 228 return -1; 229 } 230 231 if ( wait != ROAR_VS_NOWAIT ) { 232 _seterr(ROAR_ERROR_INVAL); 233 return -1; 234 } 235 236 roar_vio_sync(&(vss->vio)); 237 238 return 0; 239 } 240 241 int roar_vs_blocking (roar_vs_t * vss, int val, int * error) { 242 int old = -1; 243 244 if ( !(vss->flags & FLAG_STREAM) ) { 245 _seterr(ROAR_ERROR_INVAL); 246 return -1; 247 } 248 249 old = vss->flags & FLAG_NONBLOCK ? ROAR_VS_FALSE : ROAR_VS_TRUE; 250 251 switch (val) { 252 case ROAR_VS_TRUE: 253 if ( roar_vio_nonblock(&(vss->vio), ROAR_SOCKET_BLOCK) == -1 ) { 254 _seterr(ROAR_ERROR_UNKNOWN); 255 return -1; 256 } 257 vss->flags |= FLAG_NONBLOCK; 258 vss->flags -= FLAG_NONBLOCK; 259 return old; 260 break; 261 case ROAR_VS_FALSE: 262 if ( roar_vio_nonblock(&(vss->vio), ROAR_SOCKET_NONBLOCK) == -1 ) { 263 _seterr(ROAR_ERROR_UNKNOWN); 264 return -1; 265 } 266 vss->flags |= FLAG_NONBLOCK; 267 return old; 268 break; 269 case ROAR_VS_TOGGLE: 270 if ( old == ROAR_VS_TRUE ) { 271 return roar_vs_blocking(vss, ROAR_VS_FALSE, error); 272 } else { 273 return roar_vs_blocking(vss, ROAR_VS_TRUE, error); 274 } 275 break; 276 case ROAR_VS_ASK: 277 return old; 278 break; 279 } 280 281 _seterr(ROAR_ERROR_INVAL); 282 return -1; 283 } 284 285 // .................... 286 ssize_t roar_vs_latency(roar_vs_t * vss, int backend, int * error) { 287 _seterr(ROAR_ERROR_NOTSUP); 288 return -1; 289 } 290 291 static int roar_vs_flag(roar_vs_t * vss, int flag, int val, int * error) { 292 struct roar_stream_info info; 293 int old = -1; 294 295 if ( !(vss->flags & FLAG_STREAM) ) { 296 _seterr(ROAR_ERROR_INVAL); 297 return -1; 298 } 299 300 if ( val != ROAR_VS_ASK ) 301 old = roar_vs_flag(vss, flag, ROAR_VS_ASK, error); 302 303 switch (val) { 304 case ROAR_VS_TRUE: 305 case ROAR_VS_FALSE: 306 if ( roar_stream_set_flags(vss->con, &(vss->stream), flag, 307 val == ROAR_VS_TRUE ? ROAR_SET_FLAG : ROAR_RESET_FLAG) == -1 ) { 308 _seterr(ROAR_ERROR_UNKNOWN); 309 return -1; 310 } 311 return old; 312 break; 313 case ROAR_VS_TOGGLE: 314 return roar_vs_flag(vss, flag, old == ROAR_VS_TRUE ? ROAR_VS_FALSE : ROAR_VS_TRUE, error); 315 break; 316 case ROAR_VS_ASK: 317 if ( roar_stream_get_info(vss->con, &(vss->stream), &info) == -1 ) { 318 _seterr(ROAR_ERROR_UNKNOWN); 319 return -1; 320 } 321 return info.flags & flag ? ROAR_VS_TRUE : ROAR_VS_FALSE; 322 break; 323 } 324 325 _seterr(ROAR_ERROR_NOTSUP); 326 return -1; 327 } 328 329 int roar_vs_pause(roar_vs_t * vss, int val, int * error) { 330 return roar_vs_flag(vss, ROAR_FLAG_PAUSE, val, error); 331 } 332 333 int roar_vs_mute (roar_vs_t * vss, int val, int * error) { 334 return roar_vs_flag(vss, ROAR_FLAG_MUTE, val, error); 335 } 336 337 static int roar_vs_volume (roar_vs_t * vss, float * c, size_t channels, int * error) { 338 struct roar_mixer_settings mixer; 339 size_t i; 340 341 if ( !(vss->flags & FLAG_STREAM) ) { 342 _seterr(ROAR_ERROR_INVAL); 343 return -1; 344 } 345 346 if ( channels > ROAR_MAX_CHANNELS ) { 347 _seterr(ROAR_ERROR_INVAL); 348 return -1; 349 } 350 351 for (i = 0; i < channels; i++) 352 mixer.mixer[i] = c[i] * 65535.0; 353 354 mixer.scale = 65535; 355 mixer.rpg_mul = 1; 356 mixer.rpg_div = 1; 357 358 if ( roar_set_vol(vss->con, roar_stream_get_id(&(vss->stream)), &mixer, channels) == -1 ) { 359 _seterr(ROAR_ERROR_UNKNOWN); 360 return -1; 361 } 362 363 return 0; 364 } 365 366 int roar_vs_volume_mono (roar_vs_t * vss, float c, int * error) { 367 return roar_vs_volume(vss, &c, 1, error); 368 } 369 370 int roar_vs_volume_stereo (roar_vs_t * vss, float l, float r, int * error) { 371 float c[2] = {l, r}; 372 return roar_vs_volume(vss, c, 2, error); 373 } 374 375 int roar_vs_volume_get (roar_vs_t * vss, float * l, float * r, int * error) { 376 struct roar_mixer_settings mixer; 377 int channels; 378 379 if ( vss == NULL || l == NULL || r == NULL ) { 380 _seterr(ROAR_ERROR_INVAL); 381 return -1; 382 } 383 384 if ( !(vss->flags & FLAG_STREAM) ) { 385 _seterr(ROAR_ERROR_INVAL); 386 return -1; 387 } 388 389 if ( roar_get_vol(vss->con, roar_stream_get_id(&(vss->stream)), &mixer, &channels) == -1 ) { 390 _seterr(ROAR_ERROR_UNKNOWN); 391 return -1; 392 } 393 394 if ( channels == 1 ) 395 mixer.mixer[1] = mixer.mixer[0]; 396 397 *l = mixer.mixer[0] / (float)mixer.scale; 398 *r = mixer.mixer[1] / (float)mixer.scale; 399 400 return 0; 401 } 402 403 int roar_vs_meta (roar_vs_t * vss, struct roar_keyval * kv, size_t len, int * error); 224 404 225 405 //ll
Note: See TracChangeset
for help on using the changeset viewer.