audio_detect.c
上传用户:shw771010
上传日期:2022-01-05
资源大小:991k
文件大小:3k
源码类别:

Audio

开发平台:

Unix_Linux

  1. /*
  2. ** Copyright (C) 1999-2009 Erik de Castro Lopo <erikd@mega-nerd.com>
  3. **
  4. ** This program is free software; you can redistribute it and/or modify
  5. ** it under the terms of the GNU Lesser General Public License as published by
  6. ** the Free Software Foundation; either version 2.1 of the License, or
  7. ** (at your option) any later version.
  8. **
  9. ** This program is distributed in the hope that it will be useful,
  10. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ** GNU Lesser General Public License for more details.
  13. **
  14. ** You should have received a copy of the GNU Lesser General Public License
  15. ** along with this program; if not, write to the Free Software
  16. ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  17. */
  18. #include "sfconfig.h"
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #if HAVE_UNISTD_H
  22. #include <unistd.h>
  23. #endif
  24. #include <string.h>
  25. #include <errno.h>
  26. #include "common.h"
  27. typedef struct
  28. { int le_float ;
  29. int be_float ;
  30. int le_int_24_32 ;
  31. int be_int_24_32 ;
  32. } VOTE ;
  33. static void vote_for_format (VOTE * vote, const unsigned char * data, int datalen) ;
  34. int
  35. audio_detect (SF_PRIVATE * psf, AUDIO_DETECT *ad, const unsigned char * data, int datalen)
  36. { VOTE vote ;
  37. if (psf == NULL)
  38. return 0 ;
  39. if (ad == NULL || datalen < 256)
  40. return 0 ;
  41. vote_for_format (&vote, data, datalen) ;
  42. psf_log_printf (psf, "audio_detect :n"
  43. "    le_float     : %dn"
  44. "    be_float     : %dn"
  45. "    le_int_24_32 : %dn"
  46. "    be_int_24_32 : %dn",
  47. vote.le_float, vote.be_float, vote.le_int_24_32, vote.be_int_24_32) ;
  48. if (0) puts (psf->logbuffer) ;
  49. if (ad->endianness == SF_ENDIAN_LITTLE && vote.le_float > (3 * datalen) / 4)
  50. { /* Almost certainly 32 bit floats. */
  51. return SF_FORMAT_FLOAT ;
  52. } ;
  53. if (ad->endianness == SF_ENDIAN_LITTLE && vote.le_int_24_32 > (3 * datalen) / 4)
  54. { /* Almost certainly 24 bit data stored in 32 bit ints. */
  55. return SF_FORMAT_PCM_32 ;
  56. } ;
  57. return 0 ;
  58. } /* data_detect */
  59. static void
  60. vote_for_format (VOTE * vote, const unsigned char * data, int datalen)
  61. {
  62. int k ;
  63. memset (vote, 0, sizeof (VOTE)) ;
  64. datalen -= datalen % 4 ;
  65. for (k = 0 ; k < datalen ; k ++)
  66. { if ((k % 4) == 0)
  67. { if (data [k] == 0 && data [k + 1] != 0)
  68. vote->le_int_24_32 += 4 ;
  69. if (data [2] != 0 && data [3] == 0)
  70. vote->le_int_24_32 += 4 ;
  71. if (data [0] != 0 && data [3] > 0x43 && data [3] < 0x4B)
  72. vote->le_float += 4 ;
  73. if (data [3] != 0 && data [0] > 0x43 && data [0] < 0x4B)
  74. vote->be_float += 4 ;
  75. } ;
  76. } ;
  77. return ;
  78. } /* vote_for_format */