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

Audio

开发平台:

Unix_Linux

  1. /*
  2. ** Copyright (C) 2008-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 <fcntl.h>
  21. #include <string.h>
  22. #include <ctype.h>
  23. #include "sndfile.h"
  24. #include "sfendian.h"
  25. #include "common.h"
  26. /*
  27. ** Info from Olivier Tristan <o.tristan@ultimatesoundbank.com>
  28. **
  29. ** HEADER
  30. ** 2 magic bytes: 1 and 4.
  31. ** 17 char for the name of the sample.
  32. ** 3 bytes: level, tune and channels (0 for channels is mono while 1 is stereo)
  33. ** 4 uint32: sampleStart, loopEnd, sampleFrames and loopLength
  34. ** 1 byte: loopMode (0 no loop, 1 forward looping)
  35. ** 1 byte: number of beat in loop
  36. ** 1 uint16: sampleRate
  37. **
  38. ** DATA
  39. ** Data are always non compressed 16 bits interleaved
  40. */
  41. #define HEADER_LENGTH 42 /* Sum of above data fields. */
  42. #define HEADER_NAME_LEN 17 /* Length of name string. */
  43. #define SFE_MPC_NO_MARKER 666
  44. /*------------------------------------------------------------------------------
  45. ** Private static functions.
  46. */
  47. static int mpc2k_close (SF_PRIVATE *psf) ;
  48. static int mpc2k_write_header (SF_PRIVATE *psf, int calc_length) ;
  49. static int mpc2k_read_header (SF_PRIVATE *psf) ;
  50. /*------------------------------------------------------------------------------
  51. ** Public function.
  52. */
  53. int
  54. mpc2k_open (SF_PRIVATE *psf)
  55. { int subformat ;
  56. int error = 0 ;
  57. if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
  58. { if ((error = mpc2k_read_header (psf)))
  59. return error ;
  60. } ;
  61. if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_MPC2K)
  62. return SFE_BAD_OPEN_FORMAT ;
  63. subformat = SF_CODEC (psf->sf.format) ;
  64. if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
  65. { if (mpc2k_write_header (psf, SF_FALSE))
  66. return psf->error ;
  67. psf->write_header = mpc2k_write_header ;
  68. } ;
  69. psf->container_close = mpc2k_close ;
  70. psf->blockwidth = psf->bytewidth * psf->sf.channels ;
  71. error = pcm_init (psf) ;
  72. return error ;
  73. } /* mpc2k_open */
  74. /*------------------------------------------------------------------------------
  75. */
  76. static int
  77. mpc2k_close (SF_PRIVATE *psf)
  78. {
  79. if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
  80. mpc2k_write_header (psf, SF_TRUE) ;
  81. return 0 ;
  82. } /* mpc2k_close */
  83. static int
  84. mpc2k_write_header (SF_PRIVATE *psf, int calc_length)
  85. { char sample_name [HEADER_NAME_LEN + 1] ;
  86. sf_count_t current ;
  87. if (psf->pipeoffset > 0)
  88. return 0 ;
  89. current = psf_ftell (psf) ;
  90. if (calc_length)
  91. { psf->filelength = psf_get_filelen (psf) ;
  92. psf->dataoffset = HEADER_LENGTH ;
  93. psf->datalength = psf->filelength - psf->dataoffset ;
  94. psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
  95. } ;
  96. /* Reset the current header length to zero. */
  97. psf->header [0] = 0 ;
  98. psf->headindex = 0 ;
  99. /*
  100. ** Only attempt to seek if we are not writng to a pipe. If we are
  101. ** writing to a pipe we shouldn't be here anyway.
  102. */
  103. if (psf->is_pipe == SF_FALSE)
  104. psf_fseek (psf, 0, SEEK_SET) ;
  105. snprintf (sample_name, sizeof (sample_name), "%s                    ", psf->file.name.c) ;
  106. psf_binheader_writef (psf, "e11b", 1, 4, sample_name, make_size_t (HEADER_NAME_LEN)) ;
  107. psf_binheader_writef (psf, "e111", 100, 0, (psf->sf.channels - 1) & 1) ;
  108. psf_binheader_writef (psf, "et4888", 0, psf->sf.frames, psf->sf.frames, psf->sf.frames) ;
  109. psf_binheader_writef (psf, "e112", 0, 1, (uint16_t) psf->sf.samplerate) ;
  110. /* Always 16 bit little endian data. */
  111. psf->bytewidth = 2 ;
  112. psf->endian = SF_ENDIAN_LITTLE ;
  113. psf_fwrite (psf->header, psf->headindex, 1, psf) ;
  114. if (psf->error)
  115. return psf->error ;
  116. psf->dataoffset = psf->headindex ;
  117. if (current > 0)
  118. psf_fseek (psf, current, SEEK_SET) ;
  119. return psf->error ;
  120. } /* mpc2k_write_header */
  121. static int
  122. mpc2k_read_header (SF_PRIVATE *psf)
  123. { char sample_name [HEADER_NAME_LEN + 1] ;
  124. unsigned char bytes [4] ;
  125. uint32_t sample_start, loop_end, sample_frames, loop_length ;
  126. uint16_t sample_rate ;
  127. psf_binheader_readf (psf, "pebb", 0, bytes, 2, sample_name, make_size_t (HEADER_NAME_LEN)) ;
  128. if (bytes [0] != 1 || bytes [1] != 4)
  129. return SFE_MPC_NO_MARKER ;
  130. sample_name [HEADER_NAME_LEN] = 0 ;
  131. psf_log_printf (psf, "MPC2000n  Name         : %sn", sample_name) ;
  132. psf_binheader_readf (psf, "eb4444", bytes, 3, &sample_start, &loop_end, &sample_frames, &loop_length) ;
  133. psf->sf.channels = bytes [2] ? 2 : 1 ;
  134. psf_log_printf (psf, "  Level        : %dn  Tune         : %dn  Stereo       : %sn", bytes [0], bytes [1], bytes [2] ? "Yes" : "No") ;
  135. psf_log_printf (psf, "  Sample start : %dn  Loop end     : %dn  Frames       : %dn  Length       : %dn", sample_start, loop_end, sample_frames, loop_length) ;
  136. psf_binheader_readf (psf, "eb2", bytes, 2, &sample_rate) ;
  137. psf_log_printf (psf, "  Loop mode    : %sn  Beats        : %dn  Sample rate  : %dnEndn", bytes [0] ? "None" : "Fwd", bytes [1], sample_rate) ;
  138. psf->sf.samplerate = sample_rate ;
  139. psf->sf.format = SF_FORMAT_MPC2K | SF_FORMAT_PCM_16 ;
  140. psf->dataoffset = psf_ftell (psf) ;
  141. /* Always 16 bit little endian data. */
  142. psf->bytewidth = 2 ;
  143. psf->endian = SF_ENDIAN_LITTLE ;
  144. psf->datalength = psf->filelength - psf->dataoffset ;
  145. psf->blockwidth = psf->sf.channels * psf->bytewidth ;
  146. psf->sf.frames = psf->datalength / psf->blockwidth ;
  147. psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ;
  148. return 0 ;
  149. } /* mpc2k_read_header */