Changeset 875:3df25f7ae32d in roaraudio for libroardsp/convert.c
- Timestamp:
- 10/21/08 22:31:28 (16 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroardsp/convert.c
r871 r875 331 331 } 332 332 333 int raor_conv_codec (void * out, void * in, int samples, int from, int to, int bits) { 334 int inbo = ROAR_CODEC_BYTE_ORDER(from), outbo = ROAR_CODEC_BYTE_ORDER(to); 335 int ins = ROAR_CODEC_IS_SIGNED(from), outs = ROAR_CODEC_IS_SIGNED(to); 336 void * nin = in; 337 338 if ( bits == 8 ) { 339 inbo = outbo = ROAR_CODEC_NATIVE_ENDIAN; 340 341 } else if ( bits == 16 ) { 342 if ( inbo == ROAR_CODEC_PDP ) 343 inbo = ROAR_CODEC_LE; 344 if ( outbo == ROAR_CODEC_PDP ) 345 outbo = ROAR_CODEC_LE; 346 } 347 348 ROAR_DBG("raor_conv_codec(out=%p, in=%p, samples=%i, from=%i(%s), to=%i(%s), bits=%i) = ?", 349 out, in, samples, from, roar_codec2str(from), to, roar_codec2str(to), bits); 350 351 if ( inbo != outbo ) { 352 if ( bits == 16 ) { 353 // in this case we can only have LE vs. BE, so, only need to swap: 354 roar_conv_endian_16(out, nin, samples); 355 nin = out; 356 } else if ( bits == 24 ) { 357 if ( (inbo == ROAR_CODEC_LE || inbo == ROAR_CODEC_BE) && (outbo == ROAR_CODEC_LE || outbo == ROAR_CODEC_BE) ) { 358 roar_conv_endian_24(out, nin, samples); 359 nin = out; 360 } else { // what the hell is PDP eddines in 24 bit mode? 361 return -1; 362 } 363 } else if ( bits == 32 ) { 364 if ( (inbo == ROAR_CODEC_LE || inbo == ROAR_CODEC_BE) && (outbo == ROAR_CODEC_LE || outbo == ROAR_CODEC_BE) ) { 365 roar_conv_endian_32(out, nin, samples); 366 nin = out; 367 } else { // need to handle 32 PDP eddines here? 368 return -1; 369 } 370 } else { 371 return -1; 372 } 373 } 374 375 if ( ins != outs ) { 376 if ( ins && !outs ) { 333 int roar_conv_signedness (void * out, void * in, int samples, int from, int to, int bits) { 334 335 if ( from != to ) { 336 if ( from && !to ) { 377 337 switch (bits) { 378 case 8: roar_conv_codec_s2u8( out, nin, samples); break;379 case 16: roar_conv_codec_s2u16(out, nin, samples); break;380 case 32: roar_conv_codec_s2u32(out, nin, samples); break;338 case 8: roar_conv_codec_s2u8( out, in, samples); break; 339 case 16: roar_conv_codec_s2u16(out, in, samples); break; 340 case 32: roar_conv_codec_s2u32(out, in, samples); break; 381 341 default: 382 342 errno = ENOSYS; 383 343 return -1; 384 344 } 385 } else if ( ! ins && outs) {345 } else if ( !from && to ) { 386 346 switch (bits) { 387 case 8: roar_conv_codec_u2s8( out, nin, samples); break;388 case 16: roar_conv_codec_u2s16(out, nin, samples); break;389 case 32: roar_conv_codec_u2s32(out, nin, samples); break;347 case 8: roar_conv_codec_u2s8( out, in, samples); break; 348 case 16: roar_conv_codec_u2s16(out, in, samples); break; 349 case 32: roar_conv_codec_u2s32(out, in, samples); break; 390 350 default: 391 351 errno = ENOSYS; … … 393 353 } 394 354 } else { 395 return -1; 396 } 397 } 398 399 return 0; 355 if ( out == in ) 356 return 0; 357 358 memcpy(out, in, samples * bits / 8); 359 return 0; 360 } 361 } 362 363 return -1; 364 } 365 366 int raor_conv_codec (void * out, void * in, int samples, int from, int to, int bits) { 367 int inbo = ROAR_CODEC_BYTE_ORDER(from), outbo = ROAR_CODEC_BYTE_ORDER(to); 368 int ins = ROAR_CODEC_IS_SIGNED(from), outs = ROAR_CODEC_IS_SIGNED(to); 369 void * nin = in; 370 371 372 ROAR_DBG("raor_conv_codec(out=%p, in=%p, samples=%i, from=%i(%s), to=%i(%s), bits=%i) = ?", 373 out, in, samples, from, roar_codec2str(from), to, roar_codec2str(to), bits); 374 375 roar_conv_endian(out, in, samples, inbo, outbo, bits); 376 nin = out; 377 378 return roar_conv_signedness(out, in, samples, ins, outs, bits); 400 379 } 401 380 … … 465 444 return 0; 466 445 } 446 447 448 int roar_conv_endian (void * out, void * in, int samples, int from, int to, int bits) { 449 450 if ( bits == 8 ) { 451 from = to = ROAR_CODEC_NATIVE_ENDIAN; 452 453 } else if ( bits == 16 ) { 454 if ( from == ROAR_CODEC_PDP ) 455 from = ROAR_CODEC_LE; 456 if ( to == ROAR_CODEC_PDP ) 457 to = ROAR_CODEC_LE; 458 } 459 460 if ( from == to ) { 461 if ( in != out ) { 462 memcpy(out, in, samples * bits / 8); 463 return 0; 464 } 465 466 if ( bits == 16 ) { 467 // in this case we can only have LE vs. BE, so, only need to swap: 468 return roar_conv_endian_16(out, in, samples); 469 } else if ( bits == 24 ) { 470 if ( (from == ROAR_CODEC_LE || from == ROAR_CODEC_BE) && (to == ROAR_CODEC_LE || to == ROAR_CODEC_BE) ) { 471 return roar_conv_endian_24(out, in, samples); 472 } else { // what the hell is PDP eddines in 24 bit mode? 473 return -1; 474 } 475 } else if ( bits == 32 ) { 476 if ( (from == ROAR_CODEC_LE || from == ROAR_CODEC_BE) && (to == ROAR_CODEC_LE || to == ROAR_CODEC_BE) ) { 477 return roar_conv_endian_32(out, in, samples); 478 } else { // need to handle 32 PDP eddines here? 479 return -1; 480 } 481 } else { 482 return -1; 483 } 484 } 485 486 return -1; 487 } 488 467 489 468 490 int roar_conv_endian_16 (void * out, void * in, int samples) { … … 552 574 // for the moment: guess out >= in 553 575 576 if ( ROAR_CODEC_BYTE_ORDER(from->codec) != ROAR_CODEC_NATIVE_ENDIAN ) { 577 if ( roar_conv_endian(out, ip, samples, ROAR_CODEC_BYTE_ORDER(from->codec), ROAR_CODEC_NATIVE_ENDIAN, to->bits) == -1 ) 578 return -1; 579 else 580 ip = out; 581 } 582 554 583 if ( from->bits != to->bits ) { 555 584 if ( roar_conv_bits(out, ip, samples, from->bits, to->bits) == -1 ) … … 559 588 } 560 589 590 if ( ROAR_CODEC_IS_SIGNED(from->codec) != ROAR_CODEC_IS_SIGNED(to->codec) ) { 591 if ( roar_conv_signedness(out, ip, samples, ROAR_CODEC_IS_SIGNED(from->codec), ROAR_CODEC_IS_SIGNED(to->codec), to->bits) == -1 ) 592 return -1; 593 else 594 ip = out; 595 } 596 597 /* 561 598 if ( from->codec != to->codec ) { 562 599 if ( raor_conv_codec (out, ip, samples, from->codec, to->codec, to->bits) == -1 ) … … 565 602 ip = out; 566 603 } 604 */ 567 605 568 606 if ( from->rate != to->rate ) { … … 575 613 if ( from->channels != to->channels ) { 576 614 if ( roar_conv_chans(out, ip, samples, from->channels, to->channels, to->bits) == -1 ) 615 return -1; 616 else 617 ip = out; 618 } 619 620 if ( ROAR_CODEC_BYTE_ORDER(to->codec) != ROAR_CODEC_NATIVE_ENDIAN ) { 621 if ( roar_conv_endian(out, ip, samples, ROAR_CODEC_NATIVE_ENDIAN, ROAR_CODEC_BYTE_ORDER(to->codec), to->bits) == -1 ) 577 622 return -1; 578 623 else
Note: See TracChangeset
for help on using the changeset viewer.