comparison libaf/af_format.c @ 12478:7f8eb5f6814a

support for 24 bit pcm/wav files
author reimar
date Sun, 16 May 2004 10:48:59 +0000
parents be1e7cfddc08
children dbbc25ea6403
comparison
equal deleted inserted replaced
12477:1550ef7117c4 12478:7f8eb5f6814a
129 // Helper functions to check sanity for input arguments 129 // Helper functions to check sanity for input arguments
130 130
131 // Sanity check for bytes per sample 131 // Sanity check for bytes per sample
132 int check_bps(int bps) 132 int check_bps(int bps)
133 { 133 {
134 if(bps != 4 && bps != 2 && bps != 1){ 134 if(bps != 4 && bps != 3 && bps != 2 && bps != 1){
135 af_msg(AF_MSG_ERROR,"[format] The number of bytes per sample" 135 af_msg(AF_MSG_ERROR,"[format] The number of bytes per sample"
136 " must be 1, 2 or 4. Current value is %i \n",bps); 136 " must be 1, 2, 3 or 4. Current value is %i \n",bps);
137 return AF_ERROR; 137 return AF_ERROR;
138 } 138 }
139 return AF_OK; 139 return AF_OK;
140 } 140 }
141 141
347 "", 347 "",
348 AF_FLAGS_REENTRANT, 348 AF_FLAGS_REENTRANT,
349 open 349 open
350 }; 350 };
351 351
352 static inline uint32_t load24bit(void* data, int pos) {
353 #if WORDS_BIGENDIAN
354 return (((uint32_t)((uint8_t*)data)[3*pos])<<24) |
355 (((uint32_t)((uint8_t*)data)[3*pos+1])<<16) |
356 (((uint32_t)((uint8_t*)data)[3*pos+2])<<8);
357 #else
358 return (((uint32_t)((uint8_t*)data)[3*pos])<<8) |
359 (((uint32_t)((uint8_t*)data)[3*pos+1])<<16) |
360 (((uint32_t)((uint8_t*)data)[3*pos+2])<<24);
361 #endif
362 }
363
364 static inline void store24bit(void* data, int pos, uint32_t expanded_value) {
365 #if WORDS_BIGENDIAN
366 ((uint8_t*)data)[3*pos]=expanded_value>>24;
367 ((uint8_t*)data)[3*pos+1]=expanded_value>>16;
368 ((uint8_t*)data)[3*pos+2]=expanded_value>>8;
369 #else
370 ((uint8_t*)data)[3*pos]=expanded_value>>8;
371 ((uint8_t*)data)[3*pos+1]=expanded_value>>16;
372 ((uint8_t*)data)[3*pos+2]=expanded_value>>24;
373 #endif
374 }
375
352 // Function implementations used by play 376 // Function implementations used by play
353 static void endian(void* in, void* out, int len, int bps) 377 static void endian(void* in, void* out, int len, int bps)
354 { 378 {
355 register int i; 379 register int i;
356 switch(bps){ 380 switch(bps){
357 case(2):{ 381 case(2):{
358 register uint16_t s; 382 register uint16_t s;
359 for(i=0;i<len;i++){ 383 for(i=0;i<len;i++){
360 s=((uint16_t*)in)[i]; 384 s=((uint16_t*)in)[i];
361 ((uint16_t*)out)[i]=(uint16_t)(((s&0x00FF)<<8) | (s&0xFF00)>>8); 385 ((uint16_t*)out)[i]=(uint16_t)(((s&0x00FF)<<8) | (s&0xFF00)>>8);
386 }
387 break;
388 }
389 case(3):{
390 register uint8_t s;
391 for(i=0;i<len;i++){
392 s=((uint8_t*)in)[3*i];
393 ((uint8_t*)out)[3*i]=((uint8_t*)in)[3*i+2];
394 ((uint8_t*)out)[3*i+2]=s;
362 } 395 }
363 break; 396 break;
364 } 397 }
365 case(4):{ 398 case(4):{
366 register uint32_t s; 399 register uint32_t s;
386 break; 419 break;
387 case(2): 420 case(2):
388 for(i=0;i<len;i++) 421 for(i=0;i<len;i++)
389 ((uint16_t*)out)[i]=(uint16_t)(SHRT_MAX+((int)((int16_t*)in)[i])); 422 ((uint16_t*)out)[i]=(uint16_t)(SHRT_MAX+((int)((int16_t*)in)[i]));
390 break; 423 break;
424 case(3):
425 for(i=0;i<len;i++)
426 store24bit(out, i, (uint32_t)(INT_MAX+(int32_t)load24bit(in, i)));
427 break;
391 case(4): 428 case(4):
392 for(i=0;i<len;i++) 429 for(i=0;i<len;i++)
393 ((uint32_t*)out)[i]=(uint32_t)(INT_MAX+((int32_t*)in)[i]); 430 ((uint32_t*)out)[i]=(uint32_t)(INT_MAX+((int32_t*)in)[i]);
394 break; 431 break;
395 } 432 }
404 ((int8_t*)out)[i]=(int8_t)(SCHAR_MIN+((int)((uint8_t*)in)[i])); 441 ((int8_t*)out)[i]=(int8_t)(SCHAR_MIN+((int)((uint8_t*)in)[i]));
405 break; 442 break;
406 case(2): 443 case(2):
407 for(i=0;i<len;i++) 444 for(i=0;i<len;i++)
408 ((int16_t*)out)[i]=(int16_t)(SHRT_MIN+((int)((uint16_t*)in)[i])); 445 ((int16_t*)out)[i]=(int16_t)(SHRT_MIN+((int)((uint16_t*)in)[i]));
446 break;
447 case(3):
448 for(i=0;i<len;i++)
449 store24bit(out, i, (int32_t)(INT_MIN+(uint32_t)load24bit(in, i)));
409 break; 450 break;
410 case(4): 451 case(4):
411 for(i=0;i<len;i++) 452 for(i=0;i<len;i++)
412 ((int32_t*)out)[i]=(int32_t)(INT_MIN+((uint32_t*)in)[i]); 453 ((int32_t*)out)[i]=(int32_t)(INT_MIN+((uint32_t*)in)[i]);
413 break; 454 break;
422 switch(outbps){ 463 switch(outbps){
423 case(2): 464 case(2):
424 for(i=0;i<len;i++) 465 for(i=0;i<len;i++)
425 ((uint16_t*)out)[i]=((uint16_t)((uint8_t*)in)[i])<<8; 466 ((uint16_t*)out)[i]=((uint16_t)((uint8_t*)in)[i])<<8;
426 break; 467 break;
468 case(3):
469 for(i=0;i<len;i++)
470 store24bit(out, i, ((uint32_t)((uint8_t*)in)[i])<<24);
471 break;
427 case(4): 472 case(4):
428 for(i=0;i<len;i++) 473 for(i=0;i<len;i++)
429 ((uint32_t*)out)[i]=((uint32_t)((uint8_t*)in)[i])<<24; 474 ((uint32_t*)out)[i]=((uint32_t)((uint8_t*)in)[i])<<24;
430 break; 475 break;
431 } 476 }
434 switch(outbps){ 479 switch(outbps){
435 case(1): 480 case(1):
436 for(i=0;i<len;i++) 481 for(i=0;i<len;i++)
437 ((uint8_t*)out)[i]=(uint8_t)((((uint16_t*)in)[i])>>8); 482 ((uint8_t*)out)[i]=(uint8_t)((((uint16_t*)in)[i])>>8);
438 break; 483 break;
484 case(3):
485 for(i=0;i<len;i++)
486 store24bit(out, i, ((uint32_t)((uint16_t*)in)[i])<<16);
487 break;
439 case(4): 488 case(4):
440 for(i=0;i<len;i++) 489 for(i=0;i<len;i++)
441 ((uint32_t*)out)[i]=((uint32_t)((uint16_t*)in)[i])<<16; 490 ((uint32_t*)out)[i]=((uint32_t)((uint16_t*)in)[i])<<16;
442 break; 491 break;
443 } 492 }
444 break; 493 break;
494 case(3):
495 switch(outbps){
496 case(1):
497 for(i=0;i<len;i++)
498 ((uint8_t*)out)[i]=(uint8_t)(load24bit(in, i)>>24);
499 break;
500 case(2):
501 for(i=0;i<len;i++)
502 ((uint16_t*)out)[i]=(uint16_t)(load24bit(in, i)>>16);
503 break;
504 case(4):
505 for(i=0;i<len;i++)
506 ((uint32_t*)out)[i]=(uint32_t)load24bit(in, i);
507 break;
508 }
509 break;
445 case(4): 510 case(4):
446 switch(outbps){ 511 switch(outbps){
447 case(1): 512 case(1):
448 for(i=0;i<len;i++) 513 for(i=0;i<len;i++)
449 ((uint8_t*)out)[i]=(uint8_t)((((uint32_t*)in)[i])>>24); 514 ((uint8_t*)out)[i]=(uint8_t)((((uint32_t*)in)[i])>>24);
450 break; 515 break;
451 case(2): 516 case(2):
452 for(i=0;i<len;i++) 517 for(i=0;i<len;i++)
453 ((uint16_t*)out)[i]=(uint16_t)((((uint32_t*)in)[i])>>16); 518 ((uint16_t*)out)[i]=(uint16_t)((((uint32_t*)in)[i])>>16);
454 break; 519 break;
520 case(3):
521 for(i=0;i<len;i++)
522 store24bit(out, i, ((uint32_t*)in)[i]);
523 break;
455 } 524 }
456 break; 525 break;
457 } 526 }
458 } 527 }
459 528
467 break; 536 break;
468 case(2): 537 case(2):
469 for(i=0;i<len;i++) 538 for(i=0;i<len;i++)
470 ((int16_t*)out)[i]=(int16_t)lrintf(SHRT_MAX*((float*)in)[i]); 539 ((int16_t*)out)[i]=(int16_t)lrintf(SHRT_MAX*((float*)in)[i]);
471 break; 540 break;
541 case(3):
542 for(i=0;i<len;i++)
543 store24bit(out, i, (int32_t)lrintf(INT_MAX*((float*)in)[i]));
544 break;
472 case(4): 545 case(4):
473 for(i=0;i<len;i++) 546 for(i=0;i<len;i++)
474 ((int32_t*)out)[i]=(int32_t)lrintf(INT_MAX*((float*)in)[i]); 547 ((int32_t*)out)[i]=(int32_t)lrintf(INT_MAX*((float*)in)[i]);
475 break; 548 break;
476 } 549 }
486 break; 559 break;
487 case(2): 560 case(2):
488 for(i=0;i<len;i++) 561 for(i=0;i<len;i++)
489 ((float*)out)[i]=(1.0/SHRT_MAX)*((float)((int16_t*)in)[i]); 562 ((float*)out)[i]=(1.0/SHRT_MAX)*((float)((int16_t*)in)[i]);
490 break; 563 break;
564 case(3):
565 for(i=0;i<len;i++)
566 ((float*)out)[i]=(1.0/INT_MAX)*((float)((int32_t)load24bit(in, i)));
567 break;
491 case(4): 568 case(4):
492 for(i=0;i<len;i++) 569 for(i=0;i<len;i++)
493 ((float*)out)[i]=(1.0/INT_MAX)*((float)((int32_t*)in)[i]); 570 ((float*)out)[i]=(1.0/INT_MAX)*((float)((int32_t*)in)[i]);
494 break; 571 break;
495 } 572 }