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

Audio

开发平台:

Unix_Linux

  1. new_file_type.HOWTO
  2. ===================
  3.    Original : Wed May 23 19:05:07 EST 2001
  4.    Update 1 : Fri Jul 11 22:12:38 EST 2003
  5. This document will attempt to explain as fully as possible how to add code to 
  6. libsndfile to allow the reading and writing of new file types. By new file
  7. type I particularly mean a new header type rather than a new encoding method
  8. for an existing file type.
  9. This HOWTO will take the form of a step by step guide. It will assume that you 
  10. have all required tools including :
  11. - gcc
  12. - make (should really be the GNU version)
  13. - autoconf
  14. - automake 
  15. - libtool
  16. These should all be available on the GNU ftp site: ftp://ftp.gnu.org/pub/gnu/.
  17. To help make these steps clearer let's suppose we are adding support for the
  18. Whacky file format whose files contain 'W','A','C' and 'K' as the first four
  19. bytes of the file format. Lets also assume that Whacky files contain PCM encoded
  20. data. 
  21. Step 1
  22. ------
  23. Create a new .c file in the src/ directory of the libsndfile source tree. The 
  24. file name should be reasonable descriptive so that is is obvious that files of 
  25. the new type are handled by this file. In this particular case the file might
  26. be named 'whacky.c'.
  27. Step 2
  28. ------
  29. Add your new source code file to the build process.
  30. Edit the file src/Makefile.am and add the name of your file handler to the 
  31. FILESPECIFIC list of handlers. This list looks something like this:  
  32. FILESPECIFIC = aiff.c au.c au_g72x.c nist.c paf.c raw.c samplitude.c 
  33. svx.c wav.c wav_float.c wav_gsm610.c wav_ima_adpcm.c 
  34. wav_ms_adpcm.c
  35. Then, run the script named 'reconf' in the libsndfile top level directory,
  36. which will run autoconf and other associated tools. Finally run "./configure"
  37. in the top level directory. You may want to use the "--disable-gcc-opt" option
  38. to disable gcc optimisations and make debugging with gdb/ddd easier.
  39. Step 3
  40. ------
  41. Add a unique identifier for the new file type.
  42. Edit src/sndfile.h.in and find the enum containing the SF_FORMAT_XXX identifiers.
  43. Since you will be adding a major file type you should add your identifier to the
  44. top part of the list where the values are above 0x10000 in value. The easiest
  45. way to do this is to find the largest value in the list, add 0x10000 to it and
  46. make that your new identifier value. The identifier should be something like
  47. SF_FORMAT_WACK.
  48. Step 4
  49. ------
  50. Add code to the file type recogniser function.
  51. Edit src/sndfile.c and find the function guess_file_type (). This function 
  52. reads the first 3 ints of the file and from that makes a guess at the file 
  53. type. In our case we would add:
  54. if (buffer [0] == MAKE_MARKER ('W','A','C','K'))
  55. return SF_FORMAT_WACK ;
  56. The use of the MAKE_MARKER macro should be pretty obvious and it is defined at the 
  57. top of file should you need to have a look at it.
  58. Step 5
  59. ------
  60. Add a call to your open function from psf_open_file ().
  61. Edit src/sndfile.c and find the switch statement in psf_open_file (). It starts
  62. like this:
  63. switch (filetype)
  64. { case SF_FORMAT_WAV :
  65. error = wav_open (psf) ;
  66. break ;
  67. case SF_FORMAT_AIFF :
  68. error = aiff_open (psf) ;
  69. break ;
  70. Towards the bottom of this switch statement your should add one for the new file
  71. type. Something like:
  72. case SF_FORMAT_WACK :
  73. sf_errno = whacky_open (psf) ;
  74. break ;
  75. Setp 6
  76. ------
  77. Add prototypes for new open read and open write functions.
  78. Edit src/common.h, go to the bottom of the file and add something like
  79. int whacky_open   (SF_PRIVATE *psf) ;
  80. Step 7
  81. ------
  82. Implement your open read function. The best way to do this is by coding 
  83. something much like one of the other file formats. The file src/au.c might be 
  84. a good place to start.
  85. In src/whacky.c you should now implement the function whacky_open() which 
  86. was prototyped in src/common.h. This function should return 0 on success and 
  87. a non-zero number on error. 
  88. Error values are defined in src/common.h in a enum which starts at SFE_NO_ERROR.
  89. When adding a new error value, you also need to add an error string to the 
  90. SndfileErrors array in src/sndfile.c.
  91. To parse the header of your new file type you should avoid using standard read/
  92. write/seek functions (and the fread/fwrite/fseek etc) and instead use 
  93. psf_binheader_readf () which is implemented and documented in src/common.h.
  94. During the parsing process, you should also print logging information to 
  95. libsndfile's internal log buffer using the psf_log_printf() function.
  96. At the end of the open read process, you should have set a number of fields in the
  97. SF_PRIVATE structure pointed to by psf.
  98. *** THIS FILE IS INCOMPLETE ***