sfconvert.c
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:5k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /*
  2. ** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
  3. **  
  4. ** This program is free software; you can redistribute it and/or modify
  5. ** it under the terms of the GNU General Public License as published by
  6. ** the Free Software Foundation; either version 2 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 General Public License for more details.
  13. ** 
  14. ** You should have received a copy of the GNU 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 <stdio.h>
  19. #include <string.h>
  20. #include <ctype.h>
  21. #include <sndfile.h>
  22. #define  BUFFER_LEN      1024
  23. typedef struct
  24. { char *infilename, *outfilename ;
  25. SF_INFO infileinfo, outfileinfo ;
  26. } OptionData ;
  27. static
  28. void    copy_data (SNDFILE *outfile, SNDFILE *infile, unsigned int len, double normfactor)
  29. { static double data [BUFFER_LEN] ;
  30. unsigned int readcount, k ;
  31. readcount = len ;
  32. while (readcount == len)
  33. { readcount = sf_read_double (infile, data, len, 0) ;
  34. for (k = 0 ; k < readcount ; k++)
  35. data [k] *= normfactor ;
  36. sf_write_double (outfile, data, readcount, 0) ;
  37. } ;
  38. return ;
  39. } /* copy_data */
  40. static
  41. int guess_output_file_type (char *str, unsigned int format)
  42. { char buffer [16], *cptr ;
  43. int k ;
  44. format &= SF_FORMAT_SUBMASK ;
  45. if (! (cptr = strrchr (str, '.')))
  46. return 0 ;
  47. strncpy (buffer, cptr + 1, 15) ;
  48. buffer [15] = 0 ;
  49. for (k = 0 ; buffer [k] ; k++)
  50. buffer [k] = tolower ((buffer [k])) ;
  51. if (! strncmp (buffer, "aif", 3))
  52. return (SF_FORMAT_AIFF | format) ;
  53. if (! strcmp (buffer, "wav"))
  54. return (SF_FORMAT_WAV | format) ;
  55. if (! strcmp (buffer, "au") || ! strcmp (buffer, "snd"))
  56. return (SF_FORMAT_AU | format) ;
  57. return 0 ;
  58. } /* guess_output_file_type */
  59. static
  60. void print_usage (char *progname)
  61. { printf ("nUsage : %s [options] <input file> <output file>n", progname) ;
  62. printf ("n        where [options] may be one of the following:n") ;
  63. printf ("            -pcm16     : force the output to 16 bit pcmn") ;
  64. printf ("            -pcm24     : force the output to 24 bit pcmn") ;
  65. printf ("            -pcm32     : force the output to 32 bit pcmn") ;
  66. printf ("n        with one of the following extra specifiers:n") ;
  67. printf ("            -fullscale : force the output signal to the full bit widthn") ;
  68. printf ("n") ;
  69. } /* print_usage */
  70. int     main (int argc, char *argv[])
  71. { char  *progname, *infilename, *outfilename ;
  72. SNDFILE   *infile, *outfile ;
  73. SF_INFO   sfinfo ;
  74. int k, outfilemajor ;
  75. int outfileminor = 0, outfilebits = 0, fullscale = 0 ;
  76. double normfactor ;
  77. progname = strrchr (argv [0], '/') ;
  78. progname = progname ? progname + 1 : argv [0] ;
  79. if (argc < 3 || argc > 5)
  80. { print_usage (progname) ;
  81. return  1 ;
  82. } ;
  83. infilename = argv [argc-2] ;
  84. outfilename = argv [argc-1] ;
  85. if (! strcmp (infilename, outfilename))
  86. { printf ("Error : Input and output filenames are the same.nn") ;
  87. print_usage (progname) ;
  88. return  1 ;
  89. } ;
  90. if (infilename [0] == '-')
  91. { printf ("Error : Input filename (%s) looks like an option.nn", infilename) ;
  92. print_usage (progname) ;
  93. return  1 ;
  94. } ;
  95. if (outfilename [0] == '-')
  96. { printf ("Error : Output filename (%s) looks like an option.nn", outfilename) ;
  97. print_usage (progname) ;
  98. return  1 ;
  99. } ;
  100. for (k = 1 ; k < argc - 2 ; k++)
  101. { printf ("%sn", argv [k]) ;
  102. if (! strcmp (argv [k], "-pcm16"))
  103. { outfileminor = SF_FORMAT_PCM ;
  104. outfilebits = 16 ;
  105. continue ;
  106. } ;
  107. if (! strcmp (argv [k], "-pcm24"))
  108. { outfileminor = SF_FORMAT_PCM ;
  109. outfilebits = 24 ;
  110. continue ;
  111. } ;
  112. if (! strcmp (argv [k], "-pcm32"))
  113. { outfileminor = SF_FORMAT_PCM ;
  114. outfilebits = 32 ;
  115. continue ;
  116. } ;
  117. if (! strcmp (argv [k], "-fullscale"))
  118. fullscale = 1 ;
  119. } ;
  120. if (! (infile = sf_open_read (infilename, &sfinfo)))
  121. { printf ("Not able to open input file %s.n", infilename) ;
  122. sf_perror (NULL) ;
  123. return  1 ;
  124. } ;
  125. if (! (sfinfo.format = guess_output_file_type (outfilename, sfinfo.format)))
  126. { printf ("Error : Not able to determine output file type for %s.n", outfilename) ;
  127. return 1 ;
  128. } ;
  129. outfilemajor = sfinfo.format & SF_FORMAT_TYPEMASK ;
  130. if (outfileminor)
  131. { sfinfo.format = outfilemajor | outfileminor ;
  132. printf ("asdasdasdadn") ;
  133. }
  134. else
  135. sfinfo.format = outfilemajor | (sfinfo.format & SF_FORMAT_SUBMASK) ;
  136. if (outfilebits)
  137. sfinfo.pcmbitwidth = outfilebits ;
  138. if (! sf_format_check (&sfinfo))
  139. { printf ("Error : output file format is invalid (0x%08X).n", sfinfo.format) ;
  140. return 1 ;
  141. } ;
  142. normfactor = sf_signal_max (infile) ;
  143. if (normfactor < 1.0 && normfactor > 0.0)
  144. normfactor = fullscale ? 2.0 / normfactor * ((double) (1 << (sfinfo.pcmbitwidth - 2))) : 
  145. 2.0 * ((double) (1 << (sfinfo.pcmbitwidth - 2))) ;
  146. else
  147. normfactor = 1.0 ;
  148. printf ("normfactor : %gn", normfactor) ;
  149. if (! (outfile = sf_open_write (outfilename, &sfinfo)))
  150. { printf ("Not able to open output file %s.n", outfilename) ;
  151. return  1 ;
  152. } ;
  153. copy_data (outfile, infile, BUFFER_LEN / sfinfo.channels, normfactor) ;
  154. sf_close (infile) ;
  155. sf_close (outfile) ;
  156. return 0 ;
  157. } /* main */